index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <template>
  2. <z-paging class="" ref="paging" bgColor="#fff" paging-class="paging-btm-shadow" safe-area-inset-bottom scroll-with-animation>
  3. <template #top>
  4. <ut-navbar :title="optionsParam?.mode == 'edit' ? '编辑鲜货入库信息' : '添加鲜货入库信息'" :fixed="false" border></ut-navbar>
  5. </template>
  6. <view class="pd-24">
  7. <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
  8. <view class="h-1" id="varietyIdpppp"></view>
  9. <up-form-item borderBottom label="动植物名称" required prop="varietyId">
  10. <view class="flex1">
  11. <up-button v-if="!form.varietyId" @click="selectVarietyId" type="primary" plain>
  12. <image class="w-36 h-36 mr-10" src="https://ta.zycpzs.cn/oss-file/smart-trace/szyy/images-plt/common/select_push_icon.png" mode="widthFix" />
  13. <span>请选择动植物名称</span>
  14. </up-button>
  15. <view v-else class="bg-#FBFDFB card-info-block pd-24 p-rtv">
  16. <view class="mb-16">
  17. <span class="f-s-34 c-#333 f-w-5 mr-16">{{ form?.varietyInfo?.varietyName }}</span>
  18. <span class="f-s-24 c-#666">{{ form?.varietyInfo?.latinName }}</span>
  19. </view>
  20. <view class="mb-16">
  21. <span class="f-s-28 c-#333 f-w-5 mr-16">{{ form?.varietyInfo?.genusName }}</span>
  22. <span class="f-s-24 c-#666">{{ form?.varietyInfo?.genusLatinName }}</span>
  23. </view>
  24. <view class="f-s-24 c-#666">产出:{{ form?.varietyInfo?.medicineName }}</view>
  25. <view
  26. class="close-icon pd-16"
  27. @click="
  28. form.varietyId = '';
  29. form.varietyInfo = null;
  30. "
  31. >
  32. <up-icon color="#F81242" name="close" size="32rpx"></up-icon>
  33. </view>
  34. </view>
  35. </view>
  36. </up-form-item>
  37. <view class="h-1" id="partpppp"></view>
  38. <SelectMedicinalPart v-model="form.part" v-model:value-name="form.partName">
  39. <up-form-item borderBottom label="药用部位/对象" prop="part" required>
  40. <up-input v-model="form.partName" placeholder="请选择药用部位/对象" border="none" readonly clearable></up-input>
  41. <template #right>
  42. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  43. </template>
  44. </up-form-item>
  45. </SelectMedicinalPart>
  46. <view class="h-1" id="sourceTypepppp"></view>
  47. <ut-action-sheet :tabs="pt_medicine_source" mode="custom" title="鲜货来源" v-model="form.sourceType">
  48. <up-form-item borderBottom label="鲜货来源" required prop="sourceType">
  49. <view v-if="form.sourceType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_medicine_source, form.sourceType) }}</view>
  50. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择鲜货来源</view>
  51. <template #right>
  52. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  53. </template>
  54. </up-form-item>
  55. </ut-action-sheet>
  56. <!-- 入库数量与单位 -->
  57. <view class="h-1" id="capacitypppp"></view>
  58. <view class="h-1" id="unitpppp"></view>
  59. <up-form-item label="入库量" required class="form-item-bottom-padding-0">
  60. <div class="flex1 d-flex">
  61. <div class="flex1 ov-hd">
  62. <up-form-item prop="capacity" border-bottom class="form-item-top-padding-0">
  63. <up-input v-model="form.capacity" placeholder="请输入入库量" border="none" clearable></up-input>
  64. </up-form-item>
  65. </div>
  66. <div class="pd-5"></div>
  67. <div class="min-w-200">
  68. <ut-action-sheet v-model="form.unit" :tabs="pt_medicine_unit" mode="custom" title="选择单位">
  69. <up-form-item prop="unit" border-bottom class="form-item-top-padding-0">
  70. <view class="flex1" style="line-height: 24px">
  71. <view v-if="form.unit" class="f-s-30 c-333 f-w-5 text-center">{{ selectDictLabel(pt_medicine_unit, form.unit) }}</view>
  72. <view v-else class="f-s-30 c-ccc f-w-4 text-center">单位</view>
  73. </view>
  74. <template #right>
  75. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  76. </template>
  77. </up-form-item>
  78. </ut-action-sheet>
  79. </div>
  80. </div>
  81. </up-form-item>
  82. <template v-if="['2'].includes(form.sourceType as string)">
  83. <up-form-item borderBottom label="供应商" prop="supplierId" required>
  84. <view class="flex1">
  85. <ContactUnitInput v-model="form.supplierId" v-model:info="form.supplierInfo" :params="{ cpyType: '4' }" title="选择供应商" placeholder="请选择供应商信息"></ContactUnitInput>
  86. </view>
  87. </up-form-item>
  88. <up-form-item borderBottom label="供应商是否是生产商" prop="supplierProducerFlag">
  89. <up-radio-group v-model="form.supplierProducerFlag" @change="changeSupplierProducerFlag">
  90. <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
  91. </up-radio-group>
  92. </up-form-item>
  93. <up-form-item borderBottom label="生产商" prop="producer">
  94. <up-input v-model="form.producer" placeholder="请输入生产商名称" border="none" clearable></up-input>
  95. </up-form-item>
  96. </template>
  97. <!-- 检验报告与供应商信息 -->
  98. <up-form-item borderBottom label="检验报告" prop="examinReport">
  99. <ut-upload v-model="form.examinReport" :max-count="50" valueType="array" accept="image,file"></ut-upload>
  100. </up-form-item>
  101. <!-- 鲜货产地 -->
  102. <PickerAreaInput v-model="form.producePlace" v-model:full-name="form.producePlaceName" title="选择鲜货产地">
  103. <view class="h-1" id="producePlacepppp"></view>
  104. <up-form-item borderBottom label="鲜货产地" prop="producePlace" required>
  105. <view v-if="form.producePlace" class="f-s-30 c-333 f-w-5 flex1">{{ form.producePlaceName }}</view>
  106. <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择鲜货产地</view>
  107. <template #right>
  108. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  109. </template>
  110. </up-form-item>
  111. </PickerAreaInput>
  112. <view class="h-1" id="productDatepppp"></view>
  113. <ut-datetime-picker v-model="form.productDate" :maxDate="new Date()" mode="date">
  114. <up-form-item borderBottom label="采收日期" prop="productDate" required>
  115. <up-input v-model="form.productDate" readonly placeholder="请选择采收日期" border="none" clearable></up-input>
  116. <template #right>
  117. <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
  118. </template>
  119. </up-form-item>
  120. </ut-datetime-picker>
  121. <!-- 媒体与附件 -->
  122. <up-form-item borderBottom label="鲜货图片" prop="imgs">
  123. <ut-upload v-model="form.imgs" :max-count="9" valueType="string"></ut-upload>
  124. </up-form-item>
  125. <up-form-item borderBottom label="鲜货视频" prop="vedios">
  126. <ut-upload v-model="form.vedios" :max-count="3" accept="video" valueType="string"></ut-upload>
  127. </up-form-item>
  128. </up-form>
  129. </view>
  130. <template #bottom>
  131. <view class="pd-20 d-flex">
  132. <up-button @click="submitForm" type="primary">保存</up-button>
  133. </view>
  134. </template>
  135. </z-paging>
  136. </template>
  137. <script setup lang="ts">
  138. import { FreshGoodsInstoreItemForm } from '../models/type';
  139. import ContactUnitInput from '@/models/contact-unit-input/contact-unit-input.vue';
  140. import PickerAreaInput from '@/models/picker-area-input/picker-area-input.vue';
  141. import SelectMedicinalPart from '@/models/select-medicinal-part/select-medicinal-part.vue';
  142. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  143. const { pt_medicine_source, pt_medicine_unit, yes_no } = toRefs<any>(proxy?.useDict('pt_medicine_source', 'pt_medicine_unit', 'yes_no'));
  144. const paging = ref<any>(null);
  145. const upFormRef = ref<any>(null);
  146. const createDefaultForm = (): FreshGoodsInstoreItemForm => ({
  147. uid: '',
  148. varietyId: '',
  149. varietyInfo: null,
  150. part: '',
  151. partName: '',
  152. sourceType: '',
  153. capacity: '',
  154. unit: '',
  155. supplierId: undefined,
  156. supplierProducerFlag: '',
  157. producer: '',
  158. examinReport: [],
  159. producePlace: '',
  160. producePlaceName: '',
  161. productDate: '',
  162. imgs: '',
  163. vedios: '',
  164. });
  165. const form = ref<FreshGoodsInstoreItemForm>(createDefaultForm());
  166. const rules = reactive({
  167. varietyId: [{ required: true, message: '请选择动植物名称' }],
  168. part: [{ required: true, message: '请选择药用部位/对象' }],
  169. sourceType: [{ required: true, message: '请选择鲜货来源' }],
  170. capacity: [
  171. { required: true, message: '请输入入库量' },
  172. {
  173. asyncValidator: (rule: any, value: any) => {
  174. if (value === 0 || value === '0') return Promise.reject('入库量需大于0');
  175. if (value === undefined || value === null || value === '') return Promise.resolve();
  176. const num = Number(value);
  177. if (Number.isNaN(num)) return Promise.reject('入库量请输入数字');
  178. if (num <= 0) return Promise.reject('入库量需大于0');
  179. return Promise.resolve();
  180. },
  181. },
  182. ],
  183. unit: [{ required: true, message: '请选择单位' }],
  184. supplierId: [
  185. {
  186. asyncValidator: (rule: any, value: any) => {
  187. if (['2'].includes(form.value.sourceType as string)) {
  188. if (!value) return Promise.reject('请选择供应商');
  189. }
  190. return Promise.resolve();
  191. },
  192. },
  193. ],
  194. producePlace: [{ required: true, message: '请选择鲜货产地' }],
  195. productDate: [{ required: true, message: '请选择采收日期' }],
  196. });
  197. const submitForm = async () => {
  198. console.log(form.value);
  199. uni.$u.debounce(
  200. async () => {
  201. try {
  202. await upFormRef.value?.validate();
  203. } catch (error: any) {
  204. // 滚动到第一个错误字段
  205. const firstErrorField = error && error[0].prop + 'pppp';
  206. paging.value?.scrollIntoViewById(firstErrorField, 30, true);
  207. return;
  208. }
  209. // 提交表单
  210. uni.$emit('submitForm', {
  211. ...optionsParam.value,
  212. form: { ...form.value, uid: optionsParam.value?.uid || '' },
  213. });
  214. uni.navigateBack({
  215. delta: 1,
  216. });
  217. try {
  218. } catch (error) {
  219. uni.hideLoading();
  220. }
  221. },
  222. 500,
  223. true,
  224. );
  225. };
  226. // 去选择动植物名称
  227. const selectVarietyId = () => {
  228. uni.$once('updateBiologicalname', function (data) {
  229. form.value.varietyId = data.msg.id;
  230. form.value.varietyInfo = data.msg;
  231. });
  232. uni.$u.route({
  233. type: 'navigateTo',
  234. url: '/tools/por-torganism/index',
  235. params: {
  236. title: '选择动植物名称',
  237. },
  238. });
  239. };
  240. const changeSupplierProducerFlag = (value: string) => {
  241. if (value === '1') {
  242. form.value.producer = form.value.supplierInfo?.name || '';
  243. } else {
  244. form.value.producer = '';
  245. }
  246. };
  247. const optionsParam = ref({} as any);
  248. onLoad((options: any) => {
  249. const instance: any = getCurrentInstance()?.proxy;
  250. const eventChannel = instance?.getOpenerEventChannel();
  251. eventChannel.on('optionsParam', (data: any) => {
  252. console.log(data);
  253. optionsParam.value = {
  254. uid: data?.uid || '',
  255. mode: data?.mode || 'add',
  256. };
  257. form.value = {
  258. ...createDefaultForm(),
  259. ...data?.form,
  260. uid: data?.uid || data?.form?.uid || '',
  261. };
  262. });
  263. });
  264. </script>
  265. <style lang="scss" scoped>
  266. .card-info-block {
  267. border: 1rpx solid #afddbb;
  268. border-radius: 10rpx;
  269. }
  270. .close-icon {
  271. position: absolute;
  272. top: 0rpx;
  273. right: 0rpx;
  274. }
  275. :deep(.form-item-top-padding-0) {
  276. > .u-form-item__body {
  277. padding-top: 0rpx;
  278. }
  279. }
  280. :deep(.form-item-bottom-padding-0) {
  281. > .u-form-item__body {
  282. padding-bottom: 0rpx;
  283. }
  284. }
  285. </style>