index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <template>
  2. <z-paging ref="paging" bgColor="#fff" safe-area-inset-bottom paging-class="paging-btm-shadow" scroll-with-animation>
  3. <template #top>
  4. <ut-navbar :title="did ? '编辑包装任务' : '创建包装任务'" :fixed="false" border></ut-navbar>
  5. </template>
  6. <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
  7. <view class="pd-24 bg-#fff mb-10">
  8. <view class="h-1" id="inputStorageIdpppp"></view>
  9. <up-form-item borderBottom label="选择包装对象" prop="inputStorageId" required>
  10. </up-form-item>
  11. <view class="h-1" id="storageUseAmountpppp"></view>
  12. <up-form-item borderBottom label="本次包装用量" prop="storageUseAmount" required>
  13. <up-input v-model="form.storageUseAmount" placeholder="请输入本次包装用量" border="none" clearable></up-input>
  14. <template #right>
  15. <span class="f-s-30 f-w-5 c-#333">{{ form?.stroeUnit || 'kg' }}</span>
  16. </template>
  17. </up-form-item>
  18. <view class="h-1" id="capacitypppp"></view>
  19. <view class="h-1" id="unitpppp"></view>
  20. <up-form-item label="包装规格" prop="spec" required class="form-item-bottom-padding-0">
  21. <div class="flex1 d-flex">
  22. <div class="flex1 ov-hd">
  23. <up-form-item prop="capacity" border-bottom class="form-item-top-padding-0">
  24. <up-input v-model="form.capacity" placeholder="请输入包装规格" border="none" clearable></up-input>
  25. </up-form-item>
  26. </div>
  27. <div class="pd-5"></div>
  28. <div class="w-200">
  29. <up-form-item prop="stroeUnit" border-bottom class="form-item-top-padding-0">
  30. <up-input v-model="form.stroeUnit" inputAlign="center" readonly placeholder="单位" border="none" clearable></up-input>
  31. </up-form-item>
  32. </div>
  33. <div class="pd2-0-10 c-#ccc d-flex a-c j-c">/</div>
  34. <div class="w-200">
  35. <ut-action-sheet v-model="form.unit" :tabs="pt_pack_spec_unit" mode="custom" title="选择单位">
  36. <up-form-item prop="unit" border-bottom class="form-item-top-padding-0">
  37. <up-input v-model="form.unit" inputAlign="center" readonly placeholder="单位" border="none" clearable></up-input>
  38. <template #right>
  39. <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
  40. </template>
  41. </up-form-item>
  42. </ut-action-sheet>
  43. </div>
  44. </div>
  45. </up-form-item>
  46. <view class="h-1" id="packagingDateStartpppp"></view>
  47. <view class="h-1" id="packagingDateEndpppp"></view>
  48. <up-form-item prop="packagingDateStart" required label="包装日期" class="form-item-bottom-padding-0">
  49. <view class="flex1 d-flex">
  50. <view class="flex1">
  51. <ut-datetime-picker v-model="form.packagingDateStart" :maxDate="form.packagingDateEnd || new Date()" mode="date">
  52. <up-form-item borderBottom prop="packagingDateStart" class="form-item-top-padding-0">
  53. <up-input v-model="form.packagingDateStart" readonly placeholder="包装开始日期" border="none" clearable></up-input>
  54. <template #right>
  55. <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
  56. </template>
  57. </up-form-item>
  58. </ut-datetime-picker>
  59. </view>
  60. <view class="pd2-0-20"></view>
  61. <view class="flex1">
  62. <ut-datetime-picker v-model="form.packagingDateEnd" :minDate="form.packagingDateStart" :maxDate="new Date()" mode="date">
  63. <up-form-item borderBottom prop="packagingDateEnd" class="form-item-top-padding-0">
  64. <up-input v-model="form.packagingDateEnd" readonly placeholder="包装结束日期" border="none" clearable></up-input>
  65. <template #right>
  66. <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
  67. </template>
  68. </up-form-item>
  69. </ut-datetime-picker>
  70. </view>
  71. </view>
  72. </up-form-item>
  73. <!-- 包装批号 -->
  74. <view class="h-1" id="packSnpppp"></view>
  75. <up-form-item borderBottom label="包装批号" prop="packSn" required>
  76. <up-input v-model="form.packSn" placeholder="请输入包装批号" border="none" clearable></up-input>
  77. <template #right>
  78. <up-button @click="generateBatchCode" type="primary" :customStyle="formItemBtnStyle">随机生成</up-button>
  79. </template>
  80. </up-form-item>
  81. <view class="h-1" id="batchSnpppp"></view>
  82. <up-form-item borderBottom label="成品批号" prop="batchSn" required>
  83. <up-input v-model="form.batchSn" placeholder="请输入成品批号" border="none" clearable></up-input>
  84. </up-form-item>
  85. <!-- 保质期 12月,数字加单位单位两个字段, expireDate,expireDateUnit -->
  86. <view class="h-1" id="expireDatepppp"></view>
  87. <view class="h-1" id="expireDateUnitpppp"></view>
  88. <up-form-item label="保质期" prop="expireDate" required class="form-item-bottom-padding-0">
  89. <div class="flex1 d-flex a-c">
  90. <div class="flex1 ov-hd">
  91. <up-form-item prop="expireDate" border-bottom class="form-item-top-padding-0">
  92. <up-input v-model="form.expireDate" placeholder="请输入保质期" border="none" clearable></up-input>
  93. </up-form-item>
  94. </div>
  95. <div class="pd-5"></div>
  96. <div class="w-200">
  97. <ut-action-sheet v-model="form.expireDateUnit" :tabs="pt_expire_date_unit" mode="custom" title="选择单位">
  98. <up-form-item prop="expireDateUnit" border-bottom class="form-item-top-padding-0">
  99. <up-input v-model="form.expireDateUnit" inputAlign="center" readonly placeholder="单位" border="none" clearable></up-input>
  100. <template #right>
  101. <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
  102. </template>
  103. </up-form-item>
  104. </ut-action-sheet>
  105. </div>
  106. </div>
  107. </up-form-item>
  108. <!-- 请选择赋码方式 -->
  109. <view class="h-1" id="packCodeTypepppp"></view>
  110. <ut-action-sheet v-model="form.packCodeType" :tabs="pt_pack_code_type" mode="custom" title="请选择赋码方式">
  111. <up-form-item borderBottom label="赋码方式" required prop="packCodeType">
  112. <view v-if="form.packCodeType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_pack_code_type, form.packCodeType) }}</view>
  113. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择赋码方式</view>
  114. <template #right>
  115. <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
  116. </template>
  117. </up-form-item>
  118. </ut-action-sheet>
  119. <view class="d-flex a-c pd2-10-0" @click="$u.route({ url: '/tools/view-html/index', params: { url: 'https://ta.zycpzs.cn/oss-file/smart-trace/szyy/template/pack_code_type.html', title: '赋码方式区别' } })">
  120. <up-icon size="28rpx" name="question-circle" color="#37A954"></up-icon>
  121. <span class="c-primary f-s-24">两种赋码方式的区别?怎么选择?</span>
  122. </view>
  123. </view>
  124. </up-form>
  125. <template #bottom>
  126. <view class="pd-20">
  127. <up-button type="primary" @click="submit">
  128. <text>{{ did ? '保存' : '提交' }}</text>
  129. </up-button>
  130. </view>
  131. </template>
  132. </z-paging>
  133. </template>
  134. <script setup lang="ts">
  135. import { useClientRequest } from '@/utils/request';
  136. import { formItemBtnStyle } from '@/assets/styles/uview-plus';
  137. import type { PackTaskForm } from './types';
  138. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  139. const { pt_pack_code_type, pt_pack_spec_unit, pt_expire_date_unit } = toRefs<any>(proxy?.useDict('pt_pack_code_type', 'pt_pack_spec_unit', 'pt_expire_date_unit'));
  140. const upFormRef = ref();
  141. const paging = ref();
  142. const did = ref<string>('');
  143. const form = ref<PackTaskForm>({
  144. storageUseAmount: '',
  145. stroeUnit: 'kg',
  146. capacity: '',
  147. unit: '',
  148. packagingDateStart: '',
  149. packagingDateEnd: '',
  150. packSn: '',
  151. batchSn: '',
  152. expireDate: '',
  153. expireDateUnit: '',
  154. packCodeType: '',
  155. });
  156. const rules = reactive<Record<string, any>>({
  157. storageUseAmount: [
  158. { required: true, message: '请输入本次包装用量' },
  159. {
  160. asyncValidator: (rule: any, value: any) => {
  161. if (value === undefined || value === null || value === '') return Promise.resolve();
  162. const num = Number(value);
  163. if (Number.isNaN(num)) return Promise.reject('本次包装用量请输入数字');
  164. if (num <= 0) return Promise.reject('本次包装用量需大于0');
  165. return Promise.resolve();
  166. },
  167. },
  168. ],
  169. capacity: [
  170. { required: true, message: '请输入包装规格' },
  171. {
  172. asyncValidator: (rule: any, value: any) => {
  173. if (value === undefined || value === null || value === '') return Promise.resolve();
  174. const num = Number(value);
  175. if (Number.isNaN(num)) return Promise.reject('包装规格请输入数字');
  176. if (num <= 0) return Promise.reject('包装规格需大于0');
  177. return Promise.resolve();
  178. },
  179. },
  180. ],
  181. stroeUnit: [{ required: true, message: '请选择包装单位' }],
  182. unit: [{ required: true, message: '请选择单位' }],
  183. packagingDateStart: [{ required: true, message: '请选择开始日期' }],
  184. packagingDateEnd: [{ required: true, message: '请选择结束日期' }],
  185. packSn: [{ required: true, message: '请输入包装批号' }],
  186. batchSn: [{ required: true, message: '请输入成品批号' }],
  187. expireDate: [{ required: true, message: '请输入保质期' }],
  188. expireDateUnit: [{ required: true, message: '请选择保质期单位' }],
  189. packCodeType: [{ required: true, message: '请选择赋码方式' }],
  190. });
  191. const loadDetail = async (id: string) => {
  192. if (!id) return;
  193. const res = await useClientRequest.get(`/plt-api/app/packTask/getInfo/${id}`);
  194. if (res && res.code === 200) {
  195. const data = res.data || {};
  196. console.log(data);
  197. }
  198. };
  199. const submit = async () => {
  200. try {
  201. await upFormRef.value?.validate();
  202. } catch (error: any) {
  203. const firstErrorField = error && error[0].prop + 'pppp';
  204. paging.value?.scrollIntoViewById(firstErrorField, 30, true);
  205. return;
  206. }
  207. try {
  208. await uni.showLoading({ title: did.value ? '保存中...' : '提交中...', mask: true });
  209. const url = did.value ? '/plt-api/app/packTask/edit' : '/plt-api/app/packTask/save';
  210. const payload: any = { ...(form.value as any) };
  211. if (did.value) payload.id = did.value;
  212. const res = await useClientRequest.post(url, payload);
  213. uni.hideLoading();
  214. if (res && res.code === 200) {
  215. uni.showToast({ title: did.value ? '保存成功' : '新增成功', icon: 'success' });
  216. uni.$emit('refreshContactUnitDetail');
  217. uni.$emit('refreshContactUnitList');
  218. setTimeout(() => uni.navigateBack(), 300);
  219. }
  220. } catch (e) {
  221. uni.hideLoading();
  222. console.error('保存往来单位失败:', e);
  223. }
  224. };
  225. // 点击随机生成服务端生成唯一的批号
  226. const generateBatchCode = async () => {
  227. uni.showLoading({
  228. title: '生成中...',
  229. });
  230. const res = await useClientRequest.post('/plt-api/app/plantationTask/getBatchCode', {
  231. plType: 'Z',
  232. linkType: 'I',
  233. });
  234. if (res && res.code === 200) {
  235. uni.hideLoading();
  236. form.value.packSn = res.data;
  237. uni.showToast({
  238. title: '批号生成成功',
  239. icon: 'success',
  240. });
  241. }
  242. };
  243. const confirmArea = (area: any) => {
  244. form.value.adcdCodeName = area.fullName;
  245. };
  246. onLoad((options: any) => {});
  247. </script>
  248. <style lang="scss" scoped></style>