index.vue 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. <template>
  2. <z-paging ref="paging" bgColor="#F7F7F7" safe-area-inset-bottom paging-class="paging-btm-shadow" scroll-with-animation>
  3. <template #top>
  4. <ut-navbar title="添加基地" :fixed="false" border></ut-navbar>
  5. <view class="bg-fff mb-20">
  6. <view class="pd-5"></view>
  7. <ut-tabs v-model="activeTab" :tabs="tabs" mode="btw" @change="changeActiveTab"></ut-tabs>
  8. </view>
  9. </template>
  10. <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
  11. <!-- 基本信息 -->
  12. <view ref="baseRef" class="pd-24" id="base12345">
  13. <view class="startline-title">基本信息</view>
  14. </view>
  15. <view class="pd-24 bg-#fff mb-10">
  16. <up-alert type="primary" fontSize="24rpx" description="注意:基地不强制与品种挂钩!基地地址以行政村为界,可成片集中或相对集中,跨村则视为另一基地(连片跨村除外)。"></up-alert>
  17. <view class="pd-10"></view>
  18. <view class="h-1" id="baseTypepppp"></view>
  19. <up-form-item borderBottom label="基地类型" required prop="baseType">
  20. <view v-if="form.baseInfo.baseType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_base_type, form.baseInfo.baseType) }}</view>
  21. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择基地类型</view>
  22. </up-form-item>
  23. <!-- 基地名称 -->
  24. <view class="h-1" id="baseNamepppp"></view>
  25. <up-form-item borderBottom label="基地名称" required prop="baseInfo.baseName">
  26. <up-input v-model="form.baseInfo.baseName" placeholder="请输入基地名称" border="none" clearable></up-input>
  27. </up-form-item>
  28. <!-- 基地编号 -->
  29. <view class="h-1" id="baseCodepppp"></view>
  30. <up-form-item borderBottom label="基地编号" prop="baseInfo.baseCode">
  31. <up-input v-model="form.baseInfo.baseCode" placeholder="请输入基地编号" border="none" clearable></up-input>
  32. </up-form-item>
  33. <!-- 校验定位:建设时间 -->
  34. <view class="h-1" id="buildDatepppp"></view>
  35. <ut-datetime-picker v-model="form.baseInfo.buildDate" mode="date" dateFields="month">
  36. <up-form-item borderBottom label="建设时间" required prop="baseInfo.buildDate">
  37. <up-input v-model="form.baseInfo.buildDate" placeholder="请选择基地建设年份" border="none" clearable></up-input>
  38. </up-form-item>
  39. </ut-datetime-picker>
  40. <!-- 选择基地组织方式 -->
  41. <view class="h-1" id="orgTypepppp"></view>
  42. <ut-action-sheet v-model="form.baseInfo.orgType" :tabs="pt_org_type" title="选择基地组织方式">
  43. <up-form-item borderBottom label="基地组织方式" required prop="baseInfo.orgType">
  44. <view v-if="form.baseInfo.orgType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_org_type, form.baseInfo.orgType) }}</view>
  45. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择基地组织方式</view>
  46. <template #right>
  47. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  48. </template>
  49. </up-form-item>
  50. </ut-action-sheet>
  51. <!-- 选择基地负责人 -->
  52. <!-- 校验定位:基地负责人 -->
  53. <view class="h-1" id="contactIdpppp"></view>
  54. <up-form-item @click="selectCpyMember" borderBottom label="基地负责人" required prop="baseInfo.contactId">
  55. <view v-if="form.baseInfo.contactId" class="f-s-30 c-333 f-w-5 flex1">{{ form.baseInfo.contactName }}</view>
  56. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择基地负责人</view>
  57. <template #right>
  58. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  59. </template>
  60. </up-form-item>
  61. <!-- 填写基地联系电话 -->
  62. <view class="h-1" id="contactTelpppp"></view>
  63. <up-form-item borderBottom label="基地联系电话" required prop="baseInfo.contactTel">
  64. <up-input v-model="form.baseInfo.contactTel" placeholder="请输入基地联系电话" border="none" clearable></up-input>
  65. </up-form-item>
  66. <!-- 是否Gap基地 -->
  67. <view class="h-1" id="gapFlagpppp"></view>
  68. <template v-if="['1', '2'].includes(form.baseInfo.baseType)">
  69. <up-form-item borderBottom label="是否为Gap基地" required prop="baseInfo.gapFlag">
  70. <up-radio-group v-model="form.baseInfo.gapFlag">
  71. <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
  72. </up-radio-group>
  73. </up-form-item>
  74. <!-- 关联的GAP获评信息 -->
  75. <template v-if="+form.baseInfo.gapFlag">
  76. <up-form-item borderBottom label="关联的GAP获评信息" prop="baseInfo.gapId">
  77. <up-button @click="selectGapInfo" type="primary" text="确定" plain>
  78. <up-icon class="mr-10" name="plus" color="#37A954"></up-icon>
  79. <span>请选择要关联的GAP基地获评信息</span>
  80. </up-button>
  81. </up-form-item>
  82. </template>
  83. </template>
  84. <template v-if="!+form.baseInfo.gapFlag && !form.baseInfo.gapId">
  85. <view class="h-1" id="adcodepppp"></view>
  86. <up-form-item @click="showArea = true" borderBottom label="基地具体地址" required prop="baseInfo.gapInfo.adcode">
  87. <!-- <up-input v-model="form.address" placeholder="请选择基地所在省/市/县/镇(乡)" border="none" clearable></up-input> -->
  88. <view v-if="form?.baseInfo?.gapInfo?.adcode" class="f-s-30 c-333 f-w-5 flex1">{{ form?.baseInfo?.gapInfo?.adcodeName }} </view>
  89. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择基地所在省/市/县/镇(乡)</view>
  90. <template #right>
  91. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  92. </template>
  93. </up-form-item>
  94. <up-form-item borderBottom prop="baseInfo.gapInfo.address">
  95. <up-input v-model="form.baseInfo.gapInfo.address" placeholder="请填写村级以下的具体地址信息" border="none" clearable></up-input>
  96. </up-form-item>
  97. <up-form-item v-if="['1', '2'].includes(form.baseInfo.baseType)" borderBottom prop="baseInfo.gapInfo.basePic" required>
  98. <view class="flex1 ov-hd">
  99. <view class="d-flex a-c mb-10" style="margin-bottom: 5px">
  100. <view class="f-s-30 c-#666">基地范围</view>
  101. </view>
  102. <view class="bg-#ccc d-flex ov-hd p-rtv" @click="mapDrawArea">
  103. <image class="w-full h-380" v-if="form.baseInfo.gapInfo?.basePic" :src="form.baseInfo.gapInfo.basePic" mode="widthFix" />
  104. <image class="w-full h-380" v-else src="@/static/images/plant/base/select_base_gap.png" mode="widthFix" />
  105. <view v-if="!form.baseInfo.gapInfo?.basePic" class="btn-aree-center d-flex flex-cln a-c j-c">
  106. <image class="w-52 h-52 mb-10" src="@/static/images/plant/base/draw_area_icon.png" mode="widthFix" />
  107. <view class="c-primary f-s-28 f-w-400">点击绘制基地范围</view>
  108. </view>
  109. </view>
  110. </view>
  111. </up-form-item>
  112. <up-form-item v-if="['3'].includes(form.baseInfo.baseType)" borderBottom>
  113. <view class="flex1 ov-hd">
  114. <view class="d-flex a-c mb-10" style="margin-bottom: 5px">
  115. <view class="f-s-30 c-#666">基地范围</view>
  116. </view>
  117. <view class="bg-#ccc d-flex ov-hd p-rtv" @click="mapDrawArea">
  118. <image class="w-full h-380" v-if="form.baseInfo.gapInfo?.basePic" :src="form.baseInfo.gapInfo.basePic" mode="widthFix" />
  119. <image class="w-full h-380" v-else src="@/static/images/plant/base/select_base_gap.png" mode="widthFix" />
  120. <view v-if="!form.baseInfo.gapInfo?.basePic" class="btn-aree-center d-flex flex-cln a-c j-c">
  121. <image class="w-52 h-52 mb-10" src="@/static/images/plant/base/draw_area_icon.png" mode="widthFix" />
  122. <view class="c-primary f-s-28 f-w-400">点击绘制基地范围</view>
  123. </view>
  124. </view>
  125. </view>
  126. </up-form-item>
  127. <view class="h-1" id="areaPppp"></view>
  128. <up-form-item required borderBottom label="基地面积" prop="baseInfo.gapInfo.area">
  129. <up-input v-model="form.baseInfo.gapInfo.area" placeholder="地块绘制后自动带出可修改" border="none" clearable></up-input>
  130. <template #right>
  131. <span>{{ form.baseInfo.gapInfo.areaUnit }}</span>
  132. </template>
  133. </up-form-item>
  134. <!-- 基地经纬度 -->
  135. <view class="h-1" id="lngpppp"></view>
  136. <view class="h-1" id="latpppp"></view>
  137. <up-form-item required label="基地经纬度" class="form-item-wrap-column">
  138. <view class="d-flex" style="margin-top: -10px">
  139. <up-form-item prop="baseInfo.gapInfo.lng">
  140. <up-input v-model="form.baseInfo.gapInfo.lng" border="bottom" placeholder="70-150内的经度数值" clearable></up-input>
  141. </up-form-item>
  142. <view class="pd-5"></view>
  143. <up-form-item prop="baseInfo.gapInfo.lat">
  144. <up-input v-model="form.baseInfo.gapInfo.lat" placeholder="4-53内的纬度数值" border="bottom" clearable></up-input>
  145. </up-form-item>
  146. </view>
  147. </up-form-item>
  148. </template>
  149. </view>
  150. <!-- 地块/圈舍/组培架信息 -->
  151. <view ref="plotRef" class="h-1" id="plot12345"></view>
  152. <template v-if="form.baseInfo.baseType == '1'">
  153. <view class="pd-24">
  154. <view class="startline-title">地块信息</view>
  155. </view>
  156. <view class="pd-24 bg-#fff">
  157. <up-swipe-action>
  158. <template v-for="(item, index) in form.landInfoList" :key="index">
  159. <up-swipe-action-item class="mb-20" :options="options" @click="clickPlotSwipe($event, item, index, '编辑地块信息')">
  160. <view class="plot-item pd-24">
  161. <view class="d-flex mb-16">
  162. <view class="f-s-32 f-w-5 c-#333 flex1 mr-10">{{ item?.landName || '-' }}</view>
  163. <view v-if="item?.contactName" class="f-s-24 c-#333">负责人:{{ item?.contactName }}</view>
  164. </view>
  165. <view class="f-s-28 c-#666">
  166. <span class="">面积:</span>
  167. <span class="c-#333 f-w-5">{{ item?.area || '-' }}{{ item?.areaUnit || '-' }}</span>
  168. </view>
  169. </view>
  170. </up-swipe-action-item>
  171. </template>
  172. </up-swipe-action>
  173. <up-button @click="addPlot({ landType: form.baseInfo.baseType, areaUnit: form.baseInfo.gapInfo.areaUnit }, '添加地块')" type="primary" text="确定" plain>
  174. <up-icon class="mr-10" name="plus" color="#37A954"></up-icon>
  175. <span>添加地块信息</span>
  176. </up-button>
  177. </view>
  178. </template>
  179. <template v-if="form.baseInfo.baseType == '2'">
  180. <view class="pd-24">
  181. <view class="startline-title">圈舍信息</view>
  182. </view>
  183. <view class="pd-24 bg-#fff">
  184. <up-swipe-action>
  185. <template v-for="(item, index) in form.landInfoList" :key="index">
  186. <up-swipe-action-item class="mb-20" :options="options" @click="clickPlotSwipe($event, item, index, '编辑圈舍信息')">
  187. <view class="plot-item pd-24">
  188. <view class="d-flex mb-16">
  189. <view class="f-s-32 f-w-5 c-#333 flex1 mr-10">{{ item?.landName || '-' }}</view>
  190. <view v-if="item?.contactName" class="f-s-24 c-#333">负责人:{{ item?.contactName }}</view>
  191. </view>
  192. <view class="f-s-28 c-#666">
  193. <span class="">面积:</span>
  194. <span class="c-#333 f-w-5">{{ item?.area || '-' }}{{ item?.areaUnit || '-' }}</span>
  195. </view>
  196. </view>
  197. </up-swipe-action-item>
  198. </template>
  199. </up-swipe-action>
  200. <up-button @click="addPlot({ landType: form.baseInfo.baseType, areaUnit: form.baseInfo.gapInfo.areaUnit }, '添加圈舍')" type="primary" text="确定" plain>
  201. <up-icon class="mr-10" name="plus" color="#37A954"></up-icon>
  202. <span>添加圈舍信息</span>
  203. </up-button>
  204. </view>
  205. </template>
  206. <template v-if="form.baseInfo.baseType == '3'">
  207. <view class="pd-24">
  208. <view class="startline-title">组培架信息</view>
  209. </view>
  210. <view class="pd-24 bg-#fff">
  211. <up-swipe-action>
  212. <template v-for="(item, index) in form.landInfoList" :key="index">
  213. <up-swipe-action-item class="mb-20" :options="options" @click="clickPlotSwipe($event, item, index, '编辑组培架信息')">
  214. <view class="plot-item pd-24">
  215. <view class="d-flex mb-16">
  216. <view class="f-s-32 f-w-5 c-#333 flex1 mr-10">{{ item?.landName || '-' }}</view>
  217. <view v-if="item?.contactName" class="f-s-24 c-#333">负责人:{{ item?.contactName }}</view>
  218. </view>
  219. <view class="d-flex flex-wrap gap-10">
  220. <view class="f-s-28 c-#666 w-310">
  221. <span class="">层数:</span>
  222. <span class="c-#333 f-w-5">{{ item?.layers || '-' }}</span>
  223. </view>
  224. <view class="f-s-28 c-#666 w-310">
  225. <span class="">每层容量:</span>
  226. <span class="c-#333 f-w-5">{{ item?.capacityAmount || '-' }}{{ item?.capacityUnit || '-' }}</span>
  227. </view>
  228. <view class="f-s-28 c-#666 w-310">
  229. <span class="">总容量:</span>
  230. <span class="c-#333 f-w-5">{{ item?.capacityAmount * item?.layers || '-' }}{{ item?.capacityUnit || '-' }}</span>
  231. </view>
  232. <view class="f-s-28 c-#666 w-310">
  233. <span v-if="item?.lightType" class="mr-10">{{ selectDictLabel(pt_light_type, item?.lightType) }}</span>
  234. <span v-if="item?.tempeStatus">{{ +item?.tempeStatus ? '有独立温控' : '无独立温控' }}</span>
  235. </view>
  236. </view>
  237. </view>
  238. </up-swipe-action-item>
  239. </template>
  240. </up-swipe-action>
  241. <up-button @click="addPlot({ landType: form.baseInfo.baseType, areaUnit: form.baseInfo.gapInfo.areaUnit, capacityUnit: '瓶' }, '添加组培架')" type="primary" text="确定" plain>
  242. <up-icon class="mr-10" name="plus" color="#37A954"></up-icon>
  243. <span>添加组培架信息</span>
  244. </up-button>
  245. </view>
  246. </template>
  247. <view class="pd-24" id="environment12345">
  248. <view class="startline-title">选址依据及环境信息</view>
  249. </view>
  250. <template v-if="form.baseInfo.baseType == '1'">
  251. <view class="pd-24 bg-#fff mb-10">
  252. <view class="f-s-32 c-#333 f-w-600">选址依据</view>
  253. <up-form-item label="是否道地产区">
  254. <up-radio-group v-model="form.environmentInfo.daoStatus">
  255. <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
  256. </up-radio-group>
  257. </up-form-item>
  258. <up-form-item label="基地选址依据/标准" prop="environmentInfo.accordFile" borderBottom>
  259. <ut-upload v-model="form.environmentInfo.accordFile" :max-count="9" valueType="array" accept="file"></ut-upload>
  260. </up-form-item>
  261. <up-form-item label="文献或科学数据等选址适应性证明材料" prop="environmentInfo.adaptFile" borderBottom>
  262. <ut-upload v-model="form.environmentInfo.adaptFile" :max-count="9" valueType="array" accept="file"></ut-upload>
  263. </up-form-item>
  264. </view>
  265. <view class="pd-24 bg-#fff mb-10">
  266. <view class="f-s-32 c-#333 f-w-600">环境信息</view>
  267. <!-- 土壤类型选择 -->
  268. <ut-action-sheet v-model="form.environmentInfo.soilType" :tabs="pt_soil_type" title="选择土壤类型">
  269. <up-form-item borderBottom label="土壤类型" prop="soilType">
  270. <view v-if="form.environmentInfo.soilType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_soil_type, form.environmentInfo.soilType) }}</view>
  271. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择土壤类型</view>
  272. <template #right>
  273. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  274. </template>
  275. </up-form-item>
  276. </ut-action-sheet>
  277. <!-- 字典 -->
  278. <ut-action-sheet v-model="form.environmentInfo.soilTexture" :tabs="pt_soil_texture" title="选择土壤质地">
  279. <up-form-item borderBottom label="土壤质地" prop="soilTexture">
  280. <view v-if="form.environmentInfo.soilTexture" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_soil_texture, form.environmentInfo.soilTexture) }}</view>
  281. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择土壤质地</view>
  282. <template #right>
  283. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  284. </template>
  285. </up-form-item>
  286. </ut-action-sheet>
  287. <up-form-item label="有机质含量" prop="environmentInfo.organic" borderBottom>
  288. <up-input v-model="form.environmentInfo.organic" placeholder="请输入有机质含量" border="none" clearable></up-input>
  289. </up-form-item>
  290. <up-form-item label="土壤PH值" prop="environmentInfo.soilPh" borderBottom>
  291. <up-input v-model="form.environmentInfo.soilPh" placeholder="请输入土壤PH值" border="none" clearable></up-input>
  292. </up-form-item>
  293. <ut-action-sheet v-model="form.environmentInfo.waterType" :tabs="pt_water_type" title="选择水源类型">
  294. <up-form-item borderBottom label="水源类型" prop="waterType">
  295. <view v-if="form.environmentInfo.waterType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_water_type, form.environmentInfo.waterType) }}</view>
  296. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择水源类型</view>
  297. <template #right>
  298. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  299. </template>
  300. </up-form-item>
  301. </ut-action-sheet>
  302. <up-form-item label="无霜期" prop="environmentInfo.notFrost" borderBottom>
  303. <up-input v-model="form.environmentInfo.notFrost" placeholder="请输入无霜期" border="none" clearable></up-input>
  304. <template #right>
  305. <span>天</span>
  306. </template>
  307. </up-form-item>
  308. <up-form-item label="年降水量" prop="environmentInfo.precipitation" borderBottom>
  309. <up-input v-model="form.environmentInfo.precipitation" placeholder="请输入年降水量" border="none" clearable></up-input>
  310. <template #right>
  311. <span>mm</span>
  312. </template>
  313. </up-form-item>
  314. <up-form-item label="年平均气温" prop="environmentInfo.avgTem" borderBottom>
  315. <up-input v-model="form.environmentInfo.avgTem" placeholder="请输入年平均气温" border="none" clearable></up-input>
  316. <template #right>
  317. <span>℃</span>
  318. </template>
  319. </up-form-item>
  320. <up-form-item label="年绝对最高气温" prop="environmentInfo.maxTem" borderBottom>
  321. <up-input v-model="form.environmentInfo.maxTem" placeholder="请输入年绝对最高气温" border="none" clearable></up-input>
  322. <template #right>
  323. <span>℃</span>
  324. </template>
  325. </up-form-item>
  326. <up-form-item label="年绝对最低气温" prop="environmentInfo.minTem" borderBottom>
  327. <up-input v-model="form.environmentInfo.minTem" placeholder="请输入年绝对最低气温" border="none" clearable></up-input>
  328. <template #right>
  329. <span>℃</span>
  330. </template>
  331. </up-form-item>
  332. <up-form-item label="年日照时数" prop="environmentInfo.sunshineHours" borderBottom>
  333. <up-input v-model="form.environmentInfo.sunshineHours" placeholder="请输入年日照时数" border="none" clearable></up-input>
  334. <template #right>
  335. <span>小时</span>
  336. </template>
  337. </up-form-item>
  338. <up-form-item label="海拔" prop="environmentInfo.altitude" borderBottom>
  339. <up-input v-model="form.environmentInfo.altitude" placeholder="请输入海拔" border="none" clearable></up-input>
  340. <template #right>
  341. <span>米</span>
  342. </template>
  343. </up-form-item>
  344. <!-- 水、土壤、大气等环评报告 -->
  345. <up-form-item label="水、土壤、大气等环评报告" prop="environmentInfo.report" borderBottom>
  346. <ut-upload v-model="form.environmentInfo.report" :max-count="9" valueType="array" accept="file"></ut-upload>
  347. </up-form-item>
  348. <!-- 基地图片 -->
  349. <up-form-item label="基地图片" prop="environmentInfo.basePic" borderBottom>
  350. <ut-upload v-model="form.environmentInfo.basePic" :max-count="9"></ut-upload>
  351. </up-form-item>
  352. <!-- 基地视频 -->
  353. <up-form-item label="基地视频" prop="environmentInfo.baseVideo" borderBottom>
  354. <ut-upload v-model="form.environmentInfo.baseVideo" :max-count="1" valueType="array" accept="video"></ut-upload>
  355. </up-form-item>
  356. </view>
  357. </template>
  358. <template v-if="form.baseInfo.baseType == '2'">
  359. <view class="pd-24 bg-#fff mb-10">
  360. <view class="f-s-32 c-#333 f-w-600">选址依据</view>
  361. <up-form-item label="是否道地产区">
  362. <up-radio-group v-model="form.environmentInfo.daoStatus">
  363. <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
  364. </up-radio-group>
  365. </up-form-item>
  366. <up-form-item label="基地选址依据/标准" prop="environmentInfo.accordFile" borderBottom>
  367. <ut-upload v-model="form.environmentInfo.accordFile" :max-count="9" valueType="array" accept="file"></ut-upload>
  368. </up-form-item>
  369. <up-form-item label="文献或科学数据等选址适应性证明材料" prop="environmentInfo.adaptFile" borderBottom>
  370. <ut-upload v-model="form.environmentInfo.adaptFile" :max-count="9" valueType="array" accept="file"></ut-upload>
  371. </up-form-item>
  372. </view>
  373. <view class="pd-24 bg-#fff mb-10">
  374. <view class="f-s-32 c-#333 f-w-600">环境信息</view>
  375. <ut-action-sheet v-model="form.environmentInfo.waterType" :tabs="pt_water_type" title="选择水源类型">
  376. <up-form-item borderBottom label="水源类型" prop="waterType">
  377. <view v-if="form.environmentInfo.waterType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_water_type, form.environmentInfo.waterType) }}</view>
  378. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择水源类型</view>
  379. <template #right>
  380. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  381. </template>
  382. </up-form-item>
  383. </ut-action-sheet>
  384. <up-form-item label="无霜期" prop="environmentInfo.notFrost" borderBottom>
  385. <up-input v-model="form.environmentInfo.notFrost" placeholder="请输入无霜期" border="none" clearable></up-input>
  386. <template #right>
  387. <span>天</span>
  388. </template>
  389. </up-form-item>
  390. <up-form-item label="年降水量" prop="environmentInfo.precipitation" borderBottom>
  391. <up-input v-model="form.environmentInfo.precipitation" placeholder="请输入年降水量" border="none" clearable></up-input>
  392. <template #right>
  393. <span>mm</span>
  394. </template>
  395. </up-form-item>
  396. <up-form-item label="年平均气温" prop="environmentInfo.avgTem" borderBottom>
  397. <up-input v-model="form.environmentInfo.avgTem" placeholder="请输入年平均气温" border="none" clearable></up-input>
  398. <template #right>
  399. <span>℃</span>
  400. </template>
  401. </up-form-item>
  402. <up-form-item label="年绝对最高气温" prop="environmentInfo.maxTem" borderBottom>
  403. <up-input v-model="form.environmentInfo.maxTem" placeholder="请输入年绝对最高气温" border="none" clearable></up-input>
  404. <template #right>
  405. <span>℃</span>
  406. </template>
  407. </up-form-item>
  408. <up-form-item label="年绝对最低气温" prop="environmentInfo.minTem" borderBottom>
  409. <up-input v-model="form.environmentInfo.minTem" placeholder="请输入年绝对最低气温" border="none" clearable></up-input>
  410. <template #right>
  411. <span>℃</span>
  412. </template>
  413. </up-form-item>
  414. <up-form-item label="年日照时数" prop="environmentInfo.sunshineHours" borderBottom>
  415. <up-input v-model="form.environmentInfo.sunshineHours" placeholder="请输入年日照时数" border="none" clearable></up-input>
  416. <template #right>
  417. <span>小时</span>
  418. </template>
  419. </up-form-item>
  420. <up-form-item label="海拔" prop="environmentInfo.altitude" borderBottom>
  421. <up-input v-model="form.environmentInfo.altitude" placeholder="请输入海拔" border="none" clearable></up-input>
  422. <template #right>
  423. <span>米</span>
  424. </template>
  425. </up-form-item>
  426. <!-- 水、土壤、大气等环评报告 -->
  427. <up-form-item label="水、大气等环评报告" prop="environmentInfo.report" borderBottom>
  428. <ut-upload v-model="form.environmentInfo.report" :max-count="9" valueType="array" accept="file"></ut-upload>
  429. </up-form-item>
  430. <!-- 基地图片 -->
  431. <up-form-item label="基地图片" prop="environmentInfo.basePic" borderBottom>
  432. <ut-upload v-model="form.environmentInfo.basePic" :max-count="9"></ut-upload>
  433. </up-form-item>
  434. <!-- 基地视频 -->
  435. <up-form-item label="基地视频" prop="environmentInfo.baseVideo" borderBottom>
  436. <ut-upload v-model="form.environmentInfo.baseVideo" :max-count="1" valueType="array" accept="video"></ut-upload>
  437. </up-form-item>
  438. </view>
  439. </template>
  440. <template v-if="form.baseInfo.baseType == '3'">
  441. <view class="pd-24 bg-#fff mb-10">
  442. <up-form-item label="温度" prop="environmentInfo.avgTem" borderBottom>
  443. <up-input v-model="form.environmentInfo.avgTem" placeholder="请输入温度" border="none" clearable></up-input>
  444. <template #right>
  445. <span>℃</span>
  446. </template>
  447. </up-form-item>
  448. <up-form-item label="湿度" prop="environmentInfo.avgTem" borderBottom>
  449. <up-input v-model="form.environmentInfo.avgTem" placeholder="请输入湿度" border="none" clearable></up-input>
  450. <template #right>
  451. <span>%</span>
  452. </template>
  453. </up-form-item>
  454. <up-form-item label="洁净度" prop="environmentInfo.avgTem" borderBottom>
  455. <up-input v-model="form.environmentInfo.avgTem" placeholder="请输入洁净度" border="none" clearable></up-input>
  456. </up-form-item>
  457. <up-form-item label="光照" prop="environmentInfo.avgTem" borderBottom>
  458. <up-input v-model="form.environmentInfo.avgTem" placeholder="请输入光照" border="none" clearable></up-input>
  459. </up-form-item>
  460. <up-form-item label="光照周期" prop="environmentInfo.avgTem" borderBottom>
  461. <up-input v-model="form.environmentInfo.avgTem" placeholder="请输入光照周期" border="none" clearable></up-input>
  462. </up-form-item>
  463. </view>
  464. </template>
  465. </up-form>
  466. <template #bottom>
  467. <view class="pd-20 d-flex">
  468. <up-button @click="saveBaseInfo" class="mr-30" color="#F19F18" type="primary">暂存</up-button>
  469. <up-button @click="submitForm" type="primary">提交</up-button>
  470. </view>
  471. </template>
  472. </z-paging>
  473. <ut-picker-area v-model:show="showArea" v-model="form.baseInfo.gapInfo.adcode" @confirm="confirmArea"></ut-picker-area>
  474. <FormPlot v-if="showPlot" v-model:show="showPlot" v-model="rowForm" :title="plotTitle" :dict="{ pt_light_type, pt_capacity_unit, yes_no }" @submit="submitFormPlotAdd"></FormPlot>
  475. <FormPlot v-if="showPlotEdit" v-model:show="showPlotEdit" v-model="rowFormEdit" :title="plotTitle" :dict="{ pt_light_type, pt_capacity_unit, yes_no }" @submit="submitFormPlotEdit"></FormPlot>
  476. </template>
  477. <script setup lang="ts">
  478. import { useUserStore } from '@/store';
  479. import { useClientRequest } from '@/utils/request';
  480. import { getRect, isOpenSetting } from '@/utils/common';
  481. import { generateUniqueId } from '@/utils/public';
  482. import FormPlot from './models/form-plot.vue';
  483. // import { $uGetRect } from 'uview-plus'
  484. const tabs = reactive([
  485. { label: '基本信息', value: 'base' },
  486. { label: '地块信息', value: 'plot' },
  487. { label: '选址依据及环境信息', value: 'environment' },
  488. ]);
  489. const activeTab = ref('base');
  490. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  491. const { yes_no, pt_org_type, pt_base_type, pt_water_type, pt_soil_type, pt_soil_texture, pt_light_type, pt_capacity_unit } = toRefs<any>(proxy?.useDict('yes_no', 'pt_org_type', 'pt_base_type', 'pt_water_type', 'pt_soil_type', 'pt_soil_texture', 'pt_light_type', 'pt_capacity_unit'));
  492. const paging = ref<any>(null);
  493. const upFormRef = ref<any>(null);
  494. const showArea = ref(false);
  495. const showPlot = ref(false);
  496. const showPlotEdit = ref(false);
  497. const plotTitle = ref('添加地块信息');
  498. const rowEidtIdx = ref<number | string>(-1);
  499. const rowForm = ref<any>(null);
  500. const rowFormEdit = ref<any>(null);
  501. const form = ref<any>({
  502. baseInfo: {
  503. baseType: '',
  504. baseName: '',
  505. baseCode: '',
  506. gapFlag: '',
  507. buildDate: '',
  508. orgType: '',
  509. contactId: '',
  510. contactName: '',
  511. gapId: undefined,
  512. gapInfo: {
  513. adcode: '',
  514. adcodeName: '',
  515. address: '',
  516. areaUnit: '亩',
  517. area: undefined,
  518. },
  519. randomCode: generateUniqueId(),
  520. // 当前位置经纬度
  521. longitudeLatitude: {
  522. lng: '',
  523. lat: '',
  524. },
  525. coordinates: [],
  526. }, // 基地信息
  527. landInfoList: [], // 地块/圈舍/组培架信息
  528. environmentInfo: {}, // 基地环境信息
  529. });
  530. const options = ref([
  531. {
  532. text: '编辑',
  533. name: 'edit',
  534. style: {
  535. backgroundColor: '#37a954',
  536. color: '#fff',
  537. },
  538. },
  539. {
  540. text: '删除',
  541. name: 'delete',
  542. style: {
  543. backgroundColor: '#FF3B30',
  544. color: '#fff',
  545. },
  546. },
  547. ]);
  548. const rules = reactive({
  549. 'baseInfo.baseName': [{ required: true, message: '请输入基地名称' }],
  550. 'baseInfo.baseCode': [{ required: true, message: '请输入基地编号' }],
  551. 'baseInfo.buildDate': [{ required: true, message: '请选择建设时间' }],
  552. 'baseInfo.orgType': [{ required: true, message: '请选择基地组织方式' }],
  553. 'baseInfo.contactId': [{ required: true, message: '请选择基地负责人' }],
  554. 'baseInfo.contactTel': [{ required: true, message: '请输入基地联系电话' }],
  555. 'baseInfo.gapInfo.adcode': [{ required: true, message: '请选择基地具体地址' }],
  556. 'baseInfo.gapFlag': [{ required: true, message: '请选择是否为Gap基地' }],
  557. 'baseInfo.gapInfo.basePic': [{ required: true, message: '请绘制基地范围' }],
  558. 'baseInfo.gapInfo.area': [{ required: true, message: '请输入基地面积' }],
  559. 'baseInfo.gapInfo.lng': [{ required: true, message: '请输入基地经纬度' }],
  560. 'baseInfo.gapInfo.lat': [{ required: true, message: '请输入基地经纬度' }],
  561. });
  562. // saveInfo和submitForm防抖
  563. // 暂存基地信息
  564. const saveBaseInfo = async () => {
  565. uni.$u.debounce(
  566. async () => {
  567. // 提交表单
  568. uni.showLoading({
  569. title: '保存中...',
  570. });
  571. try {
  572. const res = await useClientRequest.post('/plt-api/app/base/temp', form.value);
  573. uni.hideLoading();
  574. if (!res || res !== 200) return;
  575. uni.showToast({
  576. title: '保存成功',
  577. icon: 'success',
  578. });
  579. } catch (error) {
  580. uni.hideLoading();
  581. }
  582. },
  583. 500,
  584. true
  585. );
  586. };
  587. const submitForm = async () => {
  588. uni.$u.debounce(
  589. async () => {
  590. try {
  591. await upFormRef.value?.validate();
  592. } catch (error: any) {
  593. // 滚动到第一个错误字段
  594. console.log(error);
  595. const firstErrorField = error && error[0].field + 'pppp';
  596. paging.value?.scrollIntoViewById(firstErrorField, 30, true);
  597. return;
  598. }
  599. // 提交表单
  600. uni.showLoading({
  601. title: '提交中...',
  602. });
  603. try {
  604. const res = await useClientRequest.post('/plt-api/app/base/add', form.value);
  605. uni.hideLoading();
  606. if (!res || res !== 200) return;
  607. uni.hideLoading();
  608. uni.showToast({
  609. title: '提交成功',
  610. icon: 'success',
  611. });
  612. // 返回上一页
  613. setTimeout(() => {
  614. uni.navigateBack();
  615. }, 1500);
  616. } catch (error) {
  617. uni.hideLoading();
  618. }
  619. },
  620. 500,
  621. true
  622. );
  623. };
  624. const mapDrawArea = async () => {
  625. uni.$on('mapAreaData', (data: any) => {
  626. console.log(data);
  627. // 这里可以将 data 赋值给 form 中的相应字段
  628. form.value.baseInfo.gapInfo.basePic = data.gapInfo.basePic;
  629. form.value.baseInfo.gapInfo.area = String(data.gapInfo.area);
  630. form.value.baseInfo.gapInfo.areaUnit = data.gapInfo.areaUnit;
  631. form.value.baseInfo.coordinates = data.coordinates;
  632. form.value.baseInfo.gapInfo.lng = data.mapInfo.lng;
  633. form.value.baseInfo.gapInfo.lat = data.mapInfo.lat;
  634. form.value.baseInfo.lnglat = `${data.mapInfo.lng},${data.mapInfo.lat}`;
  635. form.value.baseInfo.zoom = data.mapInfo.zoom;
  636. uni.$off('mapAreaData');
  637. });
  638. if (form.value.baseInfo.gapInfo?.basePic) {
  639. // 暂存地图当前数据后跳转
  640. await useClientRequest.post('/plt-api/app/gapCertificationInfo/painting', {
  641. randomCode: form.value.id || form.value.baseInfo.randomCode,
  642. value: JSON.stringify({
  643. gapInfo: form.value.baseInfo.gapInfo,
  644. coordinates: form.value.baseInfo.coordinates,
  645. }),
  646. });
  647. }
  648. uni.$u.route({
  649. type: 'navigateTo',
  650. url: '/tools/map-draw-area/index',
  651. params: {
  652. drawId: form.value.id || form.value.baseInfo.randomCode,
  653. unit: form.value.baseInfo.gapInfo.areaUnit || '亩',
  654. lng: form.value.baseInfo.gapInfo.lng || form.value.longitudeLatitude.lng || '',
  655. lat: form.value.baseInfo.gapInfo.lat || form.value.longitudeLatitude.lat || '',
  656. zoom: form.value.baseInfo.zoom,
  657. },
  658. });
  659. };
  660. const clickPlotSwipe = (e: any, item: any, idx: number | string, title = '编辑地块') => {
  661. console.log(e, item);
  662. const index = e.index;
  663. if (index == 0) {
  664. // 编辑
  665. plotTitle.value = title;
  666. rowFormEdit.value = item;
  667. rowEidtIdx.value = idx;
  668. showPlotEdit.value = true;
  669. }
  670. if (index == 1) {
  671. // 删除
  672. form.value.landInfoList.splice(idx, 1);
  673. }
  674. };
  675. const submitFormPlotEdit = (data: any) => {
  676. if (rowEidtIdx.value === -1) return;
  677. form.value.landInfoList[rowEidtIdx.value] = {
  678. ...data,
  679. };
  680. };
  681. const selectCpyMember = () => {
  682. uni.$on('selectCpyMember', (item: any) => {
  683. form.value.baseInfo.contactId = item.userInfo?.id;
  684. form.value.baseInfo.contactName = item.userInfo?.name;
  685. form.value.baseInfo.contactTel = item.userInfo?.phone;
  686. uni.$off('selectCpyMember');
  687. });
  688. uni.$u.route({
  689. type: 'navigateTo',
  690. url: '/tools/select-cpy-member/index',
  691. });
  692. };
  693. const selectGapInfo = () => {
  694. uni.$on('selectGapInfo', (item: any) => {
  695. console.log(item);
  696. form.value.baseInfo.gapId = item.id || undefined;
  697. form.value.baseInfo.gapBaseInfo = item;
  698. uni.$off('selectGapInfo');
  699. });
  700. uni.$u.route({
  701. type: 'navigateTo',
  702. url: '/tools/select-gap-info/index',
  703. params: {
  704. baseType: form.value.baseInfo.baseType,
  705. },
  706. });
  707. };
  708. const confirmArea = (area: any) => {
  709. form.value.baseInfo.gapInfo.adcodeName = area.fullName;
  710. };
  711. // value label value
  712. const changeActiveTab = (value: any) => {
  713. let scrollId = `${value.value}12345`;
  714. paging.value?.scrollIntoViewById(scrollId, 30, true);
  715. };
  716. onLoad((options: any) => {
  717. form.value.baseInfo.baseType = options.baseType || '1';
  718. form.value.baseInfo.gapInfo.areaUnit = mapUnitByBaseType[options.baseType || '1'];
  719. if (options.id) {
  720. } else {
  721. getLocationByAddress();
  722. }
  723. });
  724. onMounted(() => {});
  725. // 获取当前经纬度返回地址
  726. const getLocationByAddress = async () => {
  727. const info = await uni.getSystemInfo();
  728. let locationEnabled = info.locationEnabled; //判断手机定位服务是否开启
  729. let locationAuthorized = info.locationAuthorized; //判断定位服务是否允许微信授权
  730. if (locationEnabled == false || locationAuthorized == false) {
  731. //手机定位服务(GPS)未授权
  732. uni.showModal({
  733. title: '提示',
  734. content: '请打开定位服务功能',
  735. showCancel: false, // 不显示取消按钮
  736. });
  737. return;
  738. }
  739. const scope = await isOpenSetting('scope.userLocation');
  740. if (!scope) return;
  741. const location = await uni.getLocation({ type: 'gcj02', isHighAccuracy: true });
  742. form.value.longitudeLatitude = {
  743. lng: location.longitude,
  744. lat: location.latitude,
  745. };
  746. };
  747. const addPlot = (rowItem: any, title = '添加地块') => {
  748. rowForm.value = {
  749. ...rowItem,
  750. };
  751. plotTitle.value = title;
  752. showPlot.value = true;
  753. };
  754. const submitFormPlotAdd = (data: any) => {
  755. form.value.landInfoList.push({
  756. ...data,
  757. });
  758. };
  759. const mapUnitByBaseType: any = {
  760. '1': '亩',
  761. '2': '平方米',
  762. '3': '平方米',
  763. };
  764. </script>
  765. <style lang="scss" scoped>
  766. .z-paging-wrap {
  767. position: absolute;
  768. right: 0;
  769. top: 0;
  770. bottom: 0;
  771. left: 0;
  772. }
  773. .btn-aree-center {
  774. position: absolute;
  775. top: 0;
  776. right: 0;
  777. bottom: 0;
  778. left: 0;
  779. }
  780. .plot-item {
  781. border: 1rpx solid rgba($u-primary, 0.4);
  782. border-radius: 10rpx;
  783. }
  784. </style>