index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template>
  2. <z-paging ref="paging" v-model="list" bgColor="#f7f7f7" @query="query" safe-area-inset-bottom>
  3. <template #top>
  4. <ut-navbar title="添加管理记录" :fixed="false"></ut-navbar>
  5. </template>
  6. <view class="pt-24">
  7. <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
  8. <view class="startline-title pl-24 ml-24 mb-16">管理记录信息</view>
  9. <view class="bg-#fff pd-24 mb-20">
  10. <!-- 操作日期 -->
  11. <view class="h-1" id="operationDatepppp"></view>
  12. <up-form-item :borderBottom="false" label="操作日期" required prop="operationDate">
  13. <ut-datetime-picker v-model="form.operationDate.activityStart" mode="date" dateFields="day">
  14. <view class="d-flex mr-20">
  15. <up-input v-model="form.operationDate.activityStart" placeholder="请选择操作开始时间" border="bottom" :customStyle="{ paddingLeft: '0rpx' }"></up-input>
  16. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill" style="margin-left: -20rpx"></up-icon>
  17. </view>
  18. </ut-datetime-picker>
  19. <ut-datetime-picker v-model="form.operationDate.activityEnd" mode="date" dateFields="day">
  20. <view class="d-flex">
  21. <up-input v-model="form.operationDate.activityEnd" placeholder="请选择操作结束时间" border="bottom" :customStyle="{ paddingLeft: '0rpx' }"></up-input>
  22. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill" style="margin-left: -20rpx"></up-icon>
  23. </view>
  24. </ut-datetime-picker>
  25. </up-form-item>
  26. <!-- 操作类型 -->
  27. <ut-action-sheet v-model="form.opMethod" :tabs="pt_op_method" title="选择操作类型" mode="custom">
  28. <up-form-item borderBottom label="操作类型" required prop="opMethod" id="opMethodpppp">
  29. <view v-if="form.opMethod" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_op_method, form.opMethod) }}</view>
  30. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择操作类型</view>
  31. <template #right>
  32. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  33. </template>
  34. </up-form-item>
  35. </ut-action-sheet>
  36. <!-- 自填操作类型 -->
  37. <up-form-item v-if="form.opMethod == '99'" borderBottom label="自填操作类型" required prop="cusOp" id="cusOppppp">
  38. <up-input v-model="form.cusOp" placeholder="请输入自填操作类型" border="none"></up-input>
  39. </up-form-item>
  40. <!-- 操作地块 -->
  41. <up-form-item :borderBottom="false" label="操作地块" required prop="landIds" id="baseIdpppp">
  42. <view v-if="!deawerData" class="w-100% d-flex a-c j-c pd-24 b-radius bg-#FBFDFB border-#AFDDBB" @click="goSelectBase()">
  43. <view class=""></view>
  44. <view class="f-s-34 c-primary">请选择操作地块</view>
  45. </view>
  46. <view class="w-100%" v-else>
  47. <Baseinfo :modeValue="deawerData" @close="handleBaseinfoClose" :baseType="'1'" />
  48. </view>
  49. </up-form-item>
  50. <!-- 操作方式 -->
  51. <up-form-item borderBottom label="操作方式" prop="opRemark" id="opRemarkpppp">
  52. <up-input v-model="form.opRemark" placeholder="如:人工锄草、机械中耕、喷雾器叶面喷施等" border="none"></up-input>
  53. </up-form-item>
  54. <!-- 记录人 -->
  55. <up-form-item borderBottom label="记录人" required prop="mgName" id="mgNamepppp">
  56. <up-input v-model="form.mgName" placeholder="请输入记录人" border="none"></up-input>
  57. </up-form-item>
  58. <!-- 是否使用物料 -->
  59. <up-form-item borderBottom label="是否使用物料" required prop="inputFlag" id="inputFlagpppp">
  60. <view class="d-flex flex-cln">
  61. <view v-if="!+isAdd" class="c-#B52B21 f-s-24">因物料修改涉及退库操作,不支持修改物料信息如有错误,请删除此条管理记录,重新添加。</view>
  62. <up-radio-group v-model="form.inputFlag">
  63. <up-radio :disabled="!+isAdd" :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
  64. </up-radio-group>
  65. </view>
  66. </up-form-item>
  67. <!-- 使用物料 -->
  68. <up-form-item v-if="+form.inputFlag" borderBottom label="使用物料" required prop="inputFlag" id="inputFlagpppp">
  69. <view v-if="!Material" class="w-100% d-flex a-c j-c pd-24 b-radius bg-#FBFDFB border-#AFDDBB" @click="goMaterial()">
  70. <view class=""></view>
  71. <view class="f-s-34 c-primary">请选择此次农事使用的物料</view>
  72. </view>
  73. <view v-else class="w-100%">
  74. <Materialinfo :showClose="true" />
  75. </view>
  76. </up-form-item>
  77. <!-- 备注 -->
  78. <up-form-item borderBottom label="备注/说明" prop="remark" id="remarkpppp">
  79. <up-input v-model="form.remark" placeholder="如:“防治阔叶杂草”、“花期追肥”" border="none"></up-input>
  80. </up-form-item>
  81. <up-form-item label="过程图片" prop="imgs" borderBottom id="imgspppp">
  82. <ut-upload v-model="form.imgs" :max-count="9" accept="image"></ut-upload>
  83. </up-form-item>
  84. <up-form-item label="过程视频" prop="videos" borderBottom id="videospppp">
  85. <ut-upload v-model="form.videos" :max-count="9" accept="video"></ut-upload>
  86. </up-form-item>
  87. </view>
  88. </up-form>
  89. </view>
  90. <template #bottom>
  91. <view class="pd-24 d-flex j-c gap-20 base-bottom-wrap">
  92. <up-button v-if="+isAdd" type="primary" @click="save()">确认添加</up-button>
  93. <up-button v-else type="primary" @click="change()">确认修改</up-button>
  94. </view>
  95. </template>
  96. </z-paging>
  97. </template>
  98. <script setup lang="ts">
  99. import { ref, reactive, computed, getCurrentInstance, type ComponentInternalInstance } from 'vue';
  100. import { useClientRequest } from '@/utils/request';
  101. import { useInfoStore } from '@/store';
  102. import Baseinfo from '../models/baseinfo.vue';
  103. import Materialinfo from '../models/materialinfo.vue';
  104. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  105. const { yes_no, pt_op_method } = toRefs<any>(proxy?.useDict('yes_no', 'pt_op_method'));
  106. const deawerData = ref();
  107. const infoStore = useInfoStore();
  108. // 表单数据
  109. const form = ref({
  110. taskId: '',
  111. //管理类型 1-农事管理 2-投料
  112. activityType: '1',
  113. operationDate: {
  114. activityStart: null as string | null,
  115. activityEnd: null as string | null,
  116. },
  117. //作用对象类型 1-地块 2-动物
  118. targetType: '1',
  119. opMethod: null as string | null,
  120. cusOp: null as string | null,
  121. //操作地块
  122. landIds: [],
  123. opRemark: '',
  124. mgName: infoStore.userInfo?.name,
  125. //是否使用物料
  126. inputFlag: '0' as '0' | '1',
  127. //物料列表
  128. inputs: [],
  129. remark: '',
  130. imgs: null as string | null,
  131. videos: null as string | null,
  132. landFlag: '0' as '0' | '1',
  133. });
  134. const baseId = ref('');
  135. const Material = ref();
  136. //判断是新增还是修改
  137. const isAdd = ref(true);
  138. // 自定义校验函数:操作日期校验
  139. const validateOperationDate = (rule: any, value: any, callback: any) => {
  140. if (!value) {
  141. callback(new Error('请选择操作日期'));
  142. return;
  143. }
  144. const { activityStart, activityEnd } = value;
  145. if (!activityStart) {
  146. callback(new Error('请选择操作开始时间'));
  147. return;
  148. }
  149. if (!activityEnd) {
  150. callback(new Error('请选择操作结束时间'));
  151. return;
  152. }
  153. const start = new Date(activityStart);
  154. const end = new Date(activityEnd);
  155. if (end <= start) {
  156. callback(new Error('操作结束时间必须晚于开始时间'));
  157. return;
  158. }
  159. callback();
  160. };
  161. // 自定义校验函数:自填操作类型校验(当opMethod为99时必填)
  162. const validateCusOp = (rule: any, value: any, callback: any) => {
  163. if (form.value.opMethod === '99' && !value) {
  164. callback(new Error('请输入自填操作类型'));
  165. return;
  166. }
  167. callback();
  168. };
  169. // 表单验证规则
  170. const rules = reactive({
  171. operationDate: [{ validator: validateOperationDate, trigger: 'blur' }],
  172. opMethod: [{ required: true, message: '请选择操作类型' }],
  173. cusOp: [{ validator: validateCusOp, trigger: 'blur' }],
  174. opRemark: [{ required: false, message: '请输入操作方式' }],
  175. mgName: [{ required: true, message: '请输入记录人' }],
  176. inputFlag: [{ required: true, message: '请选择是否使用物料' }],
  177. remark: [{ required: false, message: '请输入备注' }],
  178. });
  179. const paging = ref();
  180. const list = ref();
  181. const upFormRef = ref<any>();
  182. const query = async (pageNo: number, pageSize: number) => {
  183. const res = await useClientRequest.get('/plt-api/app/plantationTask/list', {
  184. pageNo,
  185. pageSize,
  186. });
  187. // return res.data;
  188. };
  189. const handleBaseinfoClose = () => {
  190. deawerData.value = null;
  191. };
  192. // 提交表单
  193. const save = () => {
  194. uni.$u.debounce(
  195. async () => {
  196. try {
  197. console.log('开始提交管理记录');
  198. await upFormRef.value?.validate();
  199. console.log('校验完成');
  200. const params = {
  201. ...form.value,
  202. ...form.value.operationDate,
  203. landFlag: deawerData?.value.aloneChecked ? '1' : '0',
  204. };
  205. console.log('提交参数:', params);
  206. // 这里需要根据实际 API 进行调整
  207. const res = await useClientRequest.post('/plt-api/app/plantationActivity/saveActivity', params);
  208. if (res.code == 200) {
  209. uni.showToast({
  210. title: '提交成功',
  211. icon: 'success',
  212. duration: 2000,
  213. });
  214. setTimeout(() => {
  215. //发送emit
  216. uni.$emit('updatesuperviselist');
  217. uni.navigateBack({
  218. delta: 1,
  219. });
  220. }, 1000);
  221. }
  222. } catch (error: any) {
  223. console.log('表单验证错误:', error);
  224. // 滚动到第一个错误字段
  225. if (error && error[0]?.field) {
  226. const firstErrorField = error[0].field + 'pppp';
  227. paging.value?.scrollIntoViewById(firstErrorField, 30, true);
  228. }
  229. return;
  230. }
  231. },
  232. 1000,
  233. true,
  234. );
  235. };
  236. //修改提交表单
  237. const change = () => {
  238. uni.$u.debounce(
  239. async () => {
  240. try {
  241. console.log('开始提交管理记录');
  242. await upFormRef.value?.validate();
  243. console.log('校验完成');
  244. const params = {
  245. ...form.value,
  246. ...form.value.operationDate,
  247. landFlag: deawerData?.value.aloneChecked ? '1' : '0',
  248. };
  249. console.log('提交参数:', params);
  250. // 这里需要根据实际 API 进行调整
  251. const res = await useClientRequest.post('/plt-api/app/plantationActivity/updateActivity', params);
  252. if (res.code == 200) {
  253. uni.showToast({
  254. title: '提交成功',
  255. icon: 'success',
  256. duration: 2000,
  257. });
  258. setTimeout(() => {
  259. //发送emit
  260. uni.$emit('updatesuperviselist');
  261. uni.navigateBack({
  262. delta: 1,
  263. });
  264. }, 1000);
  265. }
  266. } catch (error: any) {
  267. console.log('表单验证错误:', error);
  268. // 滚动到第一个错误字段
  269. if (error && error[0]?.field) {
  270. const firstErrorField = error[0].field + 'pppp';
  271. paging.value?.scrollIntoViewById(firstErrorField, 30, true);
  272. }
  273. return;
  274. }
  275. },
  276. 1000,
  277. true,
  278. );
  279. };
  280. //去操作地块页面选择地块
  281. const goSelectBase = () => {
  282. uni.$once('updatelands', function (data) {
  283. deawerData.value = data;
  284. console.log(deawerData.value);
  285. form.value.landIds = deawerData.value.checkBox;
  286. });
  287. uni.$u.route({ type: 'navigateTo', url: '/tools/supervise-plot/index', params: { baseId: baseId.value } });
  288. };
  289. //去选择物料
  290. const goMaterial = () => {
  291. if (!+isAdd.value) {
  292. return;
  293. }
  294. };
  295. onLoad(async (options: any) => {
  296. baseId.value = options?.baseId;
  297. form.value.taskId = options?.taskId;
  298. isAdd.value = options?.add;
  299. if (!+isAdd.value) {
  300. const res = await useClientRequest.get(`/plt-api/app/plantationActivity/getInfo/${options.id}`);
  301. if (!res || res.code !== 200) return;
  302. form.value = res.data;
  303. form.value.operationDate = {
  304. activityStart: res.data.activityStart,
  305. activityEnd: res.data.activityEnd,
  306. };
  307. deawerData.value = {
  308. ...res.data.baseInfo,
  309. area: res?.data?.baseInfo?.gapInfo?.area,
  310. areaUnit: res?.data?.baseInfo?.gapInfo?.areaUnit,
  311. adcodeName: res?.data?.baseInfo?.gapInfo?.adcodeName,
  312. medicineName: res?.data?.baseInfo?.gapInfo?.medicineName,
  313. aloneChecked: res?.data?.inputFlag == '1' ? true : false,
  314. data: res.data.lands,
  315. checkBox: res.data.landIds,
  316. };
  317. }
  318. });
  319. </script>