index.vue 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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>
  7. <view class="pd-24 bg-#fff">
  8. <up-alert title="注意:投入物料记录可用于记录此次任务投入过的物料,不分管理具体事务、圈舍和时间记录。" type="info" class="b-radius"></up-alert>
  9. </view>
  10. <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
  11. <view class="bg-#fff pd-24 pt-0 mb-20">
  12. <!-- 使用物料 -->
  13. <up-form-item borderBottom label="使用物料" required prop="inputs" id="inputsgpppp">
  14. <view class="d-flex flex-cln w-100%">
  15. <view v-if="!isAdd" class="c-#F19F18 f-s-24">因物料修改涉及退库操作,不支持修改!物料信息如有错误,请删除此条管理记录,重新添加。</view>
  16. <view class="w-100%">
  17. <Materialinfo :showClose="isAdd" v-model:datas="MaterialData" v-model:inputs="form.inputs" />
  18. </view>
  19. <view v-if="isAdd" class="d-flex a-c j-c pd-24 b-radius bg-#FBFDFB border-#AFDDBB" @click="goMaterial()">
  20. <view class=""></view>
  21. <view class="f-s-34 c-primary">请选择此次农事使用的物料</view>
  22. </view>
  23. </view>
  24. </up-form-item>
  25. <!-- 操作日期 -->
  26. <view class="h-1" id="operationDatepppp"></view>
  27. <!-- 记录人 -->
  28. <up-form-item borderBottom label="记录人" required prop="mgName" id="mgNamepppp">
  29. <up-input v-model="form.mgName" placeholder="请输入记录人" border="none"></up-input>
  30. </up-form-item>
  31. <!-- 备注 -->
  32. <up-form-item borderBottom label="备注/说明" prop="remark" id="remarkpppp">
  33. <up-input v-model="form.remark" placeholder="如:“防治阔叶杂草”、“花期追肥”" border="none"></up-input>
  34. </up-form-item>
  35. <up-form-item label="过程图片" prop="imgs" borderBottom id="imgspppp">
  36. <ut-upload v-model="form.imgs" :max-count="9" accept="image"></ut-upload>
  37. </up-form-item>
  38. <up-form-item label="过程视频" prop="videos" borderBottom id="videospppp">
  39. <ut-upload v-model="form.videos" :max-count="9" accept="video"></ut-upload>
  40. </up-form-item>
  41. </view>
  42. </up-form>
  43. </view>
  44. <template #bottom>
  45. <view class="pd-24 d-flex j-c gap-20 base-bottom-wrap">
  46. <up-button v-if="+isAdd" type="primary" @click="save()">确认添加</up-button>
  47. <up-button v-else type="primary" @click="change()">确认修改</up-button>
  48. </view>
  49. </template>
  50. </z-paging>
  51. </template>
  52. <script setup lang="ts">
  53. import { ref, reactive, computed, getCurrentInstance, type ComponentInternalInstance } from 'vue';
  54. import { useClientRequest } from '@/utils/request';
  55. import { useInfoStore } from '@/store';
  56. import Baseinfo from '../models/baseinfo.vue';
  57. import Materialinfo from '../models/materialinfo.vue';
  58. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  59. const { yes_no, pt_activity_input_material } = toRefs<any>(proxy?.useDict('yes_no', 'pt_activity_input_material'));
  60. const deawerData = ref();
  61. const infoStore = useInfoStore();
  62. // 表单数据
  63. const form = ref({
  64. taskId: '',
  65. //管理类型 1-农事管理 2-投料
  66. activityType: '2',
  67. opRemark: '',
  68. mgName: infoStore.userInfo?.name,
  69. inputFlag: '1',
  70. //物料列表
  71. inputs: [] as any,
  72. remark: '',
  73. imgs: null as string | null,
  74. videos: null as string | null,
  75. });
  76. const baseId = ref('');
  77. const Material = ref();
  78. //判断是新增还是修改
  79. const isAdd = ref(true);
  80. // 自定义inputs校验函数
  81. const validateInputs = (rule: any, value: any, callback: any) => {
  82. // value 应该是 inputs 数组
  83. if (!value || !Array.isArray(value) || value.length === 0) {
  84. callback(new Error('请至少添加一个物料并填写用量'));
  85. return;
  86. }
  87. // 检查每个物料
  88. for (const item of value) {
  89. if (!item || typeof item !== 'object') {
  90. callback(new Error('物料数据格式错误'));
  91. return;
  92. }
  93. const { id, inputAmount } = item;
  94. if (!id) {
  95. callback(new Error('物料ID缺失'));
  96. return;
  97. }
  98. if (inputAmount === undefined || inputAmount === null || inputAmount === '') {
  99. callback(new Error('请填写物料用量'));
  100. return;
  101. }
  102. const amount = Number(inputAmount);
  103. if (isNaN(amount) || amount <= 0) {
  104. callback(new Error('物料用量必须大于0'));
  105. return;
  106. }
  107. }
  108. callback();
  109. };
  110. // 表单验证规则
  111. const rules = reactive({
  112. mgName: [{ required: true, message: '请输入记录人' }],
  113. remark: [{ required: false, message: '请输入备注' }],
  114. inputs: [{ validator: validateInputs, trigger: 'blur' }],
  115. });
  116. const paging = ref();
  117. const list = ref();
  118. const upFormRef = ref<any>();
  119. const query = async (pageNo: number, pageSize: number) => {
  120. const res = await useClientRequest.get('/plt-api/app/plantationTask/list', {
  121. pageNo,
  122. pageSize,
  123. });
  124. // return res.data;
  125. };
  126. const MaterialData = ref([]);
  127. // 提交表单
  128. const save = () => {
  129. uni.$u.debounce(
  130. async () => {
  131. try {
  132. console.log('开始提交管理记录');
  133. await upFormRef.value?.validate();
  134. console.log('校验完成');
  135. const params = {
  136. ...form.value,
  137. };
  138. console.log('提交参数:', params);
  139. // 这里需要根据实际 API 进行调整
  140. const res = await useClientRequest.post('/plt-api/app/plantationActivity/saveActivity', params);
  141. if (res.code == 200) {
  142. uni.showToast({
  143. title: '提交成功',
  144. icon: 'success',
  145. duration: 2000,
  146. });
  147. setTimeout(() => {
  148. //发送emit
  149. uni.$emit('updatesuperviselist');
  150. uni.navigateBack({
  151. delta: 1,
  152. });
  153. }, 1000);
  154. }
  155. } catch (error: any) {
  156. console.log('表单验证错误:', error);
  157. // 滚动到第一个错误字段
  158. if (error && error[0]?.field) {
  159. const firstErrorField = error[0].field + 'pppp';
  160. paging.value?.scrollIntoViewById(firstErrorField, 30, true);
  161. }
  162. return;
  163. }
  164. },
  165. 1000,
  166. true,
  167. );
  168. };
  169. //修改提交表单
  170. const change = () => {
  171. uni.$u.debounce(
  172. async () => {
  173. try {
  174. console.log('开始提交管理记录');
  175. await upFormRef.value?.validate();
  176. console.log('校验完成');
  177. const params = {
  178. ...form.value,
  179. };
  180. console.log('提交参数:', params);
  181. // 这里需要根据实际 API 进行调整
  182. const res = await useClientRequest.post('/plt-api/app/plantationActivity/updateActivity', params);
  183. if (res.code == 200) {
  184. uni.showToast({
  185. title: '提交成功',
  186. icon: 'success',
  187. duration: 2000,
  188. });
  189. setTimeout(() => {
  190. //发送emit
  191. uni.$emit('updatesuperviselist');
  192. uni.navigateBack({
  193. delta: 1,
  194. });
  195. }, 1000);
  196. }
  197. } catch (error: any) {
  198. console.log('表单验证错误:', error);
  199. // 滚动到第一个错误字段
  200. if (error && error[0]?.field) {
  201. const firstErrorField = error[0].field + 'pppp';
  202. paging.value?.scrollIntoViewById(firstErrorField, 30, true);
  203. }
  204. return;
  205. }
  206. },
  207. 1000,
  208. true,
  209. );
  210. };
  211. const goMaterial = () => {
  212. if (!+isAdd.value) {
  213. return;
  214. }
  215. uni.$once('updateMaterial', function (data) {
  216. MaterialData.value = data?.data;
  217. data?.data.forEach((i) => {
  218. //判断 MaterialData.value中的id是否有i.id
  219. if (!MaterialData.value.find((item) => item.id === i.id)) {
  220. MaterialData.value.push(i);
  221. }
  222. });
  223. });
  224. uni.$u.route({ type: 'navigateTo', url: '/tools/supervise-material/index', params: { baseId: baseId.value } });
  225. };
  226. onLoad(async (options: any) => {
  227. baseId.value = options?.baseId;
  228. form.value.taskId = options?.taskId;
  229. isAdd.value = Boolean(+options?.add);
  230. if (!+isAdd.value) {
  231. const res = await useClientRequest.get(`/plt-api/app/plantationActivity/getInfo/${options.id}`);
  232. if (!res || res.code !== 200) return;
  233. form.value = res.data;
  234. MaterialData.value = res.data.inputMaterialList;
  235. res.data.inputMaterialList.forEach((i) => {
  236. if (!form.value.inputs) {
  237. form.value.inputs = [];
  238. }
  239. form.value.inputs.push({
  240. id: i.id,
  241. inputAmount: +i.quantity,
  242. });
  243. });
  244. }
  245. });
  246. </script>