index.vue 38 KB

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