huangxw 1 week ago
parent
commit
f0c4ae7245

+ 18 - 0
package-lock.json

@@ -35,6 +35,7 @@
                 "uview-plus": "^3.6.4",
                 "vue": "3.5.26",
                 "vue-i18n": "9.14.5",
+                "vue-types": "^6.0.0",
                 "z-paging": "^2.8.7"
             },
             "devDependencies": {
@@ -10876,6 +10877,23 @@
                 "node": ">=10"
             }
         },
+        "node_modules/vue-types": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmmirror.com/vue-types/-/vue-types-6.0.0.tgz",
+            "integrity": "sha512-fBgCA4nrBrB8SCU/AN40tFq8HUxLGBvU2ds7a5+SEDse6dYc+TJyvy8mWiwwL8oWIC/aGS/8nTqmhwxApgU5eA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=14.0.0"
+            },
+            "peerDependencies": {
+                "vue": "^3.0.0"
+            },
+            "peerDependenciesMeta": {
+                "vue": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/vue/node_modules/@vue/compiler-core": {
             "version": "3.5.26",
             "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.26.tgz",

+ 1 - 0
package.json

@@ -64,6 +64,7 @@
         "uview-plus": "^3.6.4",
         "vue": "3.5.26",
         "vue-i18n": "9.14.5",
+        "vue-types": "^6.0.0",
         "z-paging": "^2.8.7"
     },
     "devDependencies": {

+ 1 - 1
src/plant/base/gap-base-info-edit/index.vue

@@ -180,7 +180,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 1 - 1
src/plant/base/mark-base/index.vue

@@ -169,7 +169,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 1 - 1
src/plant/contact-unit/unit-edit/index.vue

@@ -198,7 +198,7 @@ const submit = async () => {
     try {
         await upFormRef.value?.validate();
     } catch (error: any) {
-        const firstErrorField = error && error[0].prop + 'pppp';
+        const firstErrorField = error && error[0].field + 'pppp';
         paging.value?.scrollIntoViewById(firstErrorField, 30, true);
         return;
     }

+ 13 - 3
src/plant/export-print/export/index.vue

@@ -14,7 +14,15 @@
             </view>
             <view v-show="currentStep === 'export'">
                 <!-- 业务组件确认数量 -->
-                <export-print-confirm v-if="opts" :opts="opts" :infoData="info" :info="stepsObject[currentStep]"></export-print-confirm>
+                <export-print-confirm :paging="paging" v-if="opts" :opts="opts" prevStepValue="check" @prev="prevSteps" :infoData="info" :info="stepsObject[currentStep]">
+                    <template #fileType><view class="h-1" id="fileTypepppp"></view></template>
+                    <template #logos><view class="h-1" id="logospppp"></view></template>
+                    <template #fields><view class="h-1" id="fieldspppp"></view></template>
+                    <template #layoutType><view class="h-1" id="layoutTypepppp"></view></template>
+                    <template #printCount><view class="h-1" id="printCountpppp"></view></template>
+                    <template #email><view class="h-1" id="emailpppp"></view></template>
+                    <template #fileFormat><view class="h-1" id="fileFormatpppp"></view></template>
+                </export-print-confirm>
             </view>
             
         </view>
@@ -25,6 +33,7 @@
 import CheckInfoPack from '@/plant/print/models/check-info-pack.vue';
 import { useClientRequest } from '@/utils/request';
 import ExportPrintConfirm from '@/plant/export-print/models/export-print-confirm.vue';
+const paging = ref<any>(null);
 const currentStep = ref('export');
 const stepsObject = reactive<any>({
     check: {
@@ -50,8 +59,6 @@ const getDetailInfo = (data: any) => {
 };
 // 如果是 30x30
 const nextSteps = (data: any) => {
-    console.log(data);
-    
     if (!data.info || !data?.info?.value) return;
     stepsObject[data?.info?.value] = {
         ...data.info,
@@ -59,5 +66,8 @@ const nextSteps = (data: any) => {
     stepsObject[data?.nextStepValue].status = 'in-progress';
     currentStep.value = data?.nextStepValue;
 };
+const prevSteps = (data: any) => {
+    currentStep.value = data?.prevStepValue;
+};
 </script>
 <style lang="scss" scoped></style>

+ 65 - 0
src/plant/export-print/models/code-checked-logos.vue

@@ -0,0 +1,65 @@
+<template>
+    <view>
+        <up-checkbox-group v-model="checked" @change="changeLogos" placement="column">
+            <template v-for="(item, index) in logos" :key="index">
+                <up-checkbox :name="item.logo" :disabled="disabledFn(item)">
+                    <template #label>
+                        <view class="a-c logo-item" style="display: inline-flex;" :class="{ 'disabled': disabledFn(item) }">
+                            <view class="w-74 h-74 d-flex a-c j-c mr-16 radius-8 border-#C5C5C5">
+                                <image :src="item.logo" class="w-68 h-68" mode="aspectFit"></image>
+                            </view>
+                            <view class="flex1 ov-hd">
+                                <view class="f-s-30 f-w-5 c-#333">{{ item?.logoName }}</view>
+                                <view v-if="item?.remark" class="f-s-24 c-#999">{{ item?.remark }}</view>
+                            </view>
+                        </view>
+                    </template>
+                </up-checkbox>
+            </template>
+        </up-checkbox-group>
+    </view>
+</template>
+<script lang="ts" setup>
+import { propTypes } from '@/utils/propTypes';
+import { useClientRequest } from '@/utils/request';
+import type { PropType } from 'vue';
+
+const props = defineProps(
+    {
+        modelValue: propTypes.any.def([]),
+    }
+)
+const logos = ref<any[]>([])
+const checked = ref<any>(props.modelValue)
+const emit = defineEmits(['change', 'update:modelValue'])
+// 获取logos数据
+const getLogos = async () => {
+    const res = await useClientRequest.get('/plt-api/app/printLog/getLogoList');
+    if (!res || res.code !== 200) return
+    logos.value = res.data || [];
+}
+const changeLogos = (val: string[]) => {
+    emit('update:modelValue', val)
+    emit('change', val)
+}
+const disabledFn = (item: any) => {
+    if (!item.logo) return true;
+    if (!checked.value?.includes(item.logo) && checked.value?.length >= 2) {
+        return true;
+    }
+    return false;
+}
+onMounted(() => {
+    getLogos()
+})
+watch(() => props.modelValue, (val) => {
+    checked.value = val as string[]
+})
+</script>
+<style lang="scss" scoped>
+.logo-item {
+    &.disabled {
+        opacity: 0.7;
+    }
+}
+</style>

+ 113 - 35
src/plant/export-print/models/code-style-tem.vue

@@ -1,63 +1,70 @@
 <template>
-   <view v-if="layoutType == '2'" class="w-640 tem-wrapper-table">
+    <view v-if="layoutType == '2'" class="w-640 tem-wrapper-table">
         <view class="table-tr">
-            <view class="table-td flex1"></view>
+            <view class="table-td flex1 d-flex flex-cln j-c a-c">
+                <view class="f-s-36 f-w-6 c-#000 mb-30 pt-30">中药材标签</view>
+                <view class="d-flex j-c gap-60 mb-30">
+                     <template v-for="(item, index) in logos" :key="index">
+                          <image class="w-160 h-160" :src="item" mode="widthFix" />
+                     </template>
+                </view>
+            </view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('proName')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">品名</view>
             </view>
             <view class="table-td flex1">{{ info?.proName || '-' }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('genusName')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">基原</view>
             </view>
-            <view class="table-td flex1">三七</view>
+            <view class="table-td flex1">{{ info?.varietyInfo?.varietyName + info?.varietyInfo?.latinName || '-' }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('batchSn')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">批号</view>
             </view>
             <view class="table-td flex1">{{ info?.batchSn || '-' }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('proSpecn')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">规格等级</view>
             </view>
             <view class="table-td flex1">{{ info?.proLevel || '-' }}</view>
-        </view>
-        <view class="table-tr">
+        </view>  
+        <view v-if="(fields as string[])?.includes('proAdcodeDesc')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">产地</view>
             </view>
             <view class="table-td flex1">{{ info?.proAdcodeDesc || '-' }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('specn')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">数量/重量</view>
             </view>
             <view class="table-td flex1">{{ info?.specn }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('harvestDate')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">采收日期</view>
             </view>
             <view class="table-td flex1">{{ getDateRangeFrt(info?.harvestDate, info?.harvestDateEnd) }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('packagingDate')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">包装日期</view>
             </view>
             <view class="table-td flex1">{{ getDateRangeFrt(info?.packagingDateStart, info?.packagingDateStart) }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('expireDate')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">保质期</view>
             </view>
             <view class="table-td flex1">{{ info?.expireDate }}{{ info?.expireDateUnit }}</view>
         </view>
-        <view class="table-tr">
+        <view v-if="(fields as string[])?.includes('cpyName')" class="table-tr">
             <view class="table-td w-160">
                 <view class="table-label flex1">企业名称</view>
             </view>
@@ -67,31 +74,102 @@
             <view class="table-td w-160">
                 <view class="table-label flex1">追溯码</view>
             </view>
-            <view class="table-td flex1">三七</view>
+            <view class="table-td flex1 d-flex">
+                 <view class="d-flex j-c a-c flex-cln flex1">
+                    <image class="w-140 h-140" src="https://ta.zycpzs.cn/oss-file/smart-trace/szyy/images-plt/print-codes/code_logo_export.png" mode="widthFix" />
+                    <view class="f-s-26">xxxx</view>
+                    <view v-if="(fields as string[])?.includes('gapFlag')" class="f-s-26">药材符合GAP要求</view>
+                </view>
+            </view>
         </view>
-   </view>
+    </view>
+    <view v-if="layoutType == '1'" class="w-640 tem-wrapper-b;okk">
+        <view class="pd2-10-40">
+            <view class="d-flex flex-cln j-c a-c">
+                <view class="f-s-36 f-w-6 c-#000 mb-30 pt-30">中药材标签</view>
+                <view class="d-flex j-c gap-60 mb-30">
+                     <template v-for="(item, index) in logos" :key="index">
+                          <image class="w-160 h-160" :src="item" mode="widthFix" />
+                     </template>
+                </view>
+            </view>
+            <view v-if="(fields as string[])?.includes('proName')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>品名:</span>
+                <span>{{ info?.proName || '-' }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('genusName')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>基原:</span>
+                <span>{{ info?.varietyInfo?.varietyName + info?.varietyInfo?.latinName || '-' }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('batchSn')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>批号:</span>
+                <span>{{ info?.batchSn || '-' }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('proSpecn')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>规格等级:</span>
+                <span>{{ info?.proLevel || '-' }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('proAdcodeDesc')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>产地:</span>
+                <span>{{ info?.proAdcodeDesc || '-' }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('specn')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>数量/重量:</span>
+                <span>{{ info?.specn || '-' }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('harvestDate')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>采收日期:</span>
+                <span>{{ getDateRangeFrt(info?.harvestDate, info?.harvestDateEnd) }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('packagingDate')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>包装日期:</span>
+                <span>{{ getDateRangeFrt(info?.packagingDateStart, info?.packagingDateStart) }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('expireDate')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>保质期:</span>
+                <span>{{ (info?.expireDate || '') + (info?.expireDateUnit || '') || '-' }}</span>
+            </view>
+            <view v-if="(fields as string[])?.includes('cpyName')" class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <span>企业名称:</span>
+                <span>{{ info?.cpyName || '-' }}</span>
+            </view>
+            <view class="f-s-30 c-#000 f-w-5 pd2-8-0">
+                <view class="mb-20">溯源码:</view>
+                <view class="d-flex j-c a-c flex-cln">
+                    <image class="w-140 h-140" src="https://ta.zycpzs.cn/oss-file/smart-trace/szyy/images-plt/print-codes/code_logo_export.png" mode="widthFix" />
+                    <view class="f-s-26">xxxx</view>
+                </view>
+            </view>
+            <view class="h-2 bg-#000 mg2-10-0"></view>
+            <view v-if="(fields as string[])?.includes('gapFlag')" class="text-center f-s-40 c-#000 f-w-5">药材符合GAP要求</view>
+        </view>
+    </view>
 </template>
 
 <script lang="ts" setup>
 const props = defineProps({
-   fields: {
-       type: Array,
-       default: () => []
-   },
-   layoutType: {
-       type: String,
-       default: ''
-   },
-   hasBorder: { // 新增属性:控制是否显示边框
-       type: Boolean,
-       default: false
-   },
-   info: {
-       type: Object,
-       default: () => null
-   },
-})
-
+    fields: {
+        type: Array,
+        default: () => [],
+    },
+    layoutType: {
+        type: String,
+        default: '',
+    },
+    hasBorder: {
+        // 新增属性:控制是否显示边框
+        type: Boolean,
+        default: false,
+    },
+    info: {
+        type: Object,
+        default: () => null,
+    },
+    logos: {
+        type: Array,
+        default: () => [],
+    },
+});
 </script>
 
 <style lang="scss" scoped>
@@ -122,4 +200,4 @@ const props = defineProps({
     /*兼容ie*/
     text-justify: distribute-all-lines;
 }
-</style>
+</style>

+ 156 - 52
src/plant/export-print/models/export-print-confirm.vue

@@ -2,7 +2,7 @@
     <view class="pd-24 bg-fff">
         <up-form class="p-rtv bg-#fff" labelPosition="top" :model="form" errorType="toast" :rules="rules" labelWidth="auto" ref="upFormUpRef">
             <view class="f-s-24 c-#999">导出追溯码仅支持导出追溯码地址用于喷印或排版好追溯码PDF文件直接打印。如有疑问,请。如有疑问,请<span class="c-primary">点击此处联系客服</span>。</view>
-            <view class="h-1" id="fileTypepppp"></view>
+            <slot name="fileType"></slot>
             <ut-action-sheet v-model="form.extraInfo.fileType" :tabs="pt_code_export_type" @change="changeExtraFileType" mode="custom" title="请选择导出类型">
                 <up-form-item borderBottom label="导出类型" required prop="extraInfo.fileType">
                     <view v-if="form.extraInfo?.fileType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_code_export_type, form.extraInfo.fileType) }}</view>
@@ -12,47 +12,76 @@
                     </template>
                 </up-form-item>
             </ut-action-sheet>
-            <!-- 导出格式 -->
-            <view class="h-1" id="fileFormatpppp"></view>
+            <template v-if="form.extraInfo.fileType == '2'">
+                <slot name="logos"></slot>
+                <up-form-item borderBottom prop="extraInfo.logos">
+                    <view class="flex1">
+                        <view class="p-rtv mb-20">
+                            <span class="form-item-label_required">*</span>
+                            <span class="f-s-30 c-#333">打印logo</span>
+                            <span class="f-s-24 c-#999">(最多2种)</span>
+                        </view>
+                        <codeCheckedLogos v-model="form.extraInfo.logos"></codeCheckedLogos>
+                    </view>
+                </up-form-item>
+                <slot name="fields"></slot>
+                <up-form-item prop="extraInfo.fields" borderBottom>
+                    <view class="flex1">
+                        <view class="p-rtv mb-20">
+                            <span class="form-item-label_required">*</span>
+                            <span class="f-s-30 c-#333">导出信息</span>
+                            <span class="f-s-24 c-#999">(已默认勾选必打字段,如需其他字段可自行选择)</span>
+                        </view>
+                        <up-checkbox-group v-model="form.extraInfo.fields">
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="品名" name="proName"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="基原" name="genusName"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="批号" name="batchSn"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="规格等级" name="proSpecn"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="产地" name="proAdcodeDesc"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="数量(重量)" name="specn"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="采收日期" name="harvestDate"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="包装日期" name="packagingDate"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="保质期" name="expireDate"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="企业名称" name="cpyName"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="溯源码码值" name="code"></up-checkbox>
+                            <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="溯源码图" name="qrcode"></up-checkbox>
+                            <up-checkbox v-if="+info?.gapFlag" :customStyle="{ marginBottom: '8px' }" label="是否符合GAP要求" name="gapFlag"></up-checkbox>
+                        </up-checkbox-group>
+                    </view>
+                </up-form-item>
+
+                <slot name="layoutType"></slot>
+                <up-form-item props="extraInfo.layoutType" label="排版类型" required borderBottom>
+                    <view class="flex1">
+                        <ut-radio v-model="form.extraInfo.layoutType" :options="pt_code_export_layout_type"></ut-radio>
+                        <view class="d-flex j-c a-c pd-24">
+                            <codeStyleTem :fields="form.extraInfo.fields" :logos="form.extraInfo.logos" :info="infoData" :layoutType="form.extraInfo.layoutType"></codeStyleTem>
+                        </view>
+                    </view>
+                </up-form-item>
+                <!-- 导出数量 -->
+
+                <slot name="printCount"></slot>
+                <up-form-item :label="`导出数量`" prop="printCount" required borderBottom>
+                    <up-input v-model="form.printCount" placeholder="请输入导出数量" border="none" clearable></up-input>
+                    <template #right>
+                        <span class="f-s-30 f-w-5 c-#333">{{ opts?.unit || form?.unit || 'kg' }}</span>
+                    </template>
+                </up-form-item>
+                <!-- 邮箱 -->
+                <slot name="email"></slot>
+                <up-form-item borderBottom required label="邮箱" prop="extraInfo.email">
+                    <up-input v-model="form.extraInfo.email" placeholder="请输入邮箱" border="none" clearable></up-input>
+                </up-form-item>
+            </template>
+
+            <slot name="fileFormat"></slot>
             <up-form-item borderBottom label="导出格式" required prop="extraInfo.fileFormat">
                 <view v-if="form.extraInfo?.fileFormat" class="f-s-30 c-333 f-w-5 flex1">
                     {{ selectDictLabel(pt_code_export_format, form.extraInfo?.fileFormat) }}
                 </view>
                 <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择导出格式</view>
             </up-form-item>
-            <view class="h-1" id="fieldspppp"></view>
-            <up-form-item prop="extraInfo.fields" borderBottom>
-                <view class="flex1">
-                    <view class="p-rtv mb-20">
-                        <span class="form-item-label_required">*</span>
-                        <span class="f-s-30 c-#333">导出信息</span>
-                        <span class="f-s-24 c-#999">(已默认勾选必打字段,如需其他字段可自行选择)</span>
-                    </view>
-                    <up-checkbox-group v-model="form.extraInfo.fields">
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="品名" name="proName"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="基原" name="genusName"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="批号" name="batchSn"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="规格等级" name="proSpecn"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="产地" name="proAdcodeDesc"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="数量(重量)" name="specn"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="采收日期" name="harvestDate"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="包装日期" name="packagingDate"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="保质期" name="expireDate"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="企业名称" name="cpyName"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" label="溯源码码值" name="code"></up-checkbox>
-                        <up-checkbox :customStyle="{ width: '33%', marginBottom: '8px' }" disabled label="溯源码图" name="qrcode"></up-checkbox>
-                        <up-checkbox :customStyle="{ marginBottom: '8px' }" label="是否符合GAP要求" name="gapFlag"></up-checkbox>
-                    </up-checkbox-group>
-                </view>
-            </up-form-item>
-            <up-form-item props="extraInfo.layoutType" label="排版类型" required borderBottom>
-                <view class="flex1">
-                    <ut-radio v-model="form.extraInfo.layoutType" :options="pt_code_export_layout_type"></ut-radio>
-                    <view class="d-flex j-c a-c pd-24">
-                        <codeStyleTem :fields="form.extraInfo.fields" :info="infoData" :layoutType="form.extraInfo.layoutType"></codeStyleTem>
-                    </view>
-                </view>
-            </up-form-item>
             <up-form-item :label="`导出人`" required borderBottom>
                 <up-input v-model="form.printPerson" placeholder="请输入导出人" readonly border="none" clearable></up-input>
             </up-form-item>
@@ -60,12 +89,14 @@
     </view>
     <view class="pd3-40-24-30 d-flex">
         <up-button class="mr-30" type="primary" plain @click="prevSteps">上一步</up-button>
-        <up-button type="primary" @click="submitForm">下一步</up-button>
+        <up-button type="primary" @click="submitForm">确认导出</up-button>
     </view>
 </template>
 <script setup lang="ts">
 import { useInfoStore } from '@/store';
 import codeStyleTem from './code-style-tem.vue';
+import codeCheckedLogos from './code-checked-logos.vue';
+
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { pt_code_export_type, pt_code_export_format, pt_code_export_layout_type } = toRefs<any>(proxy?.useDict('pt_code_export_type', 'pt_code_export_format', 'pt_code_export_layout_type'));
 const infoStore = useInfoStore();
@@ -95,41 +126,114 @@ const props = defineProps({
         type: Object,
         default: () => null,
     },
+    paging: {
+        type: Object,
+        default: () => null,
+    },
 });
 const upFormUpRef = ref();
 const emit = defineEmits(['next', 'prev', 'formdata']);
-const form = ref({
+const form = ref<any>({
+    printCount: props.opts?.printedCount,
     extraInfo: {
-        fileType: '1',
+        fileType: '2',
         fileFormat: '1',
         logos: [], // 导出logo
         // 只有禁用的默认有值,
-        fields: ['proName', 'batchSn', 'proSpecn', 'proAdcodeDesc', 'specn', 'cpyName', 'qrcode'], // 导出字段
+        fields: ['proName', 'batchSn', 'proSpecn', 'proAdcodeDesc', 'specn', 'cpyName', 'code', 'qrcode'], // 导出字段
         layoutType: '2', // 排版类型
+        email: '',
     },
     printPerson: infoStore.userInfo?.name, // 导出人
 });
-const rules = reactive({});
+const rules = reactive({
+    'extraInfo.fileType': [
+        {
+            required: true,
+            message: '请选择导出类型',
+            trigger: 'change',
+        },
+    ],
+    'extraInfo.logos': [
+        {
+            type: 'array',
+            required: true,
+            message: '请选择导出logo',
+            trigger: 'change',
+        },
+        {
+            type: 'array',
+            max: 2,
+            message: '最多选择2个logo',
+            trigger: 'change',
+        },
+    ],
+    'extraInfo.layoutType': [
+        {
+            required: true,
+            message: '请选择排版类型',
+            trigger: 'change',
+        },
+    ],
+    printCount: [
+        { required: true, message: '请输入导出数量' },
+        // 只能输入大于0的正整数
+        { pattern: /^[1-9]\d*$/, message: '请输入大于0的正整数' },
+        // 打印数量不能大于剩余可打印数量
+        {
+            asyncValidator: (rule: any, value: any) => {
+                if (value === undefined || value === null || value === '') return Promise.resolve();
+                const num = Number(value);
+                if (Number.isNaN(num)) return Promise.reject('导出数量请输入数字');
+                if (num <= 0) return Promise.reject('导出数量需大于0');
+                // 打印数量不能大于剩余可打印数量
+                if (+props?.opts?.printedCount < +num) {
+                    return Promise.reject(`导出数量不能超过待打印数量`);
+                }
+                return Promise.resolve();
+            },
+        },
+    ],
+    'extraInfo.email': [
+        {
+            required: true,
+            message: '请输入邮箱',
+            trigger: 'blur',
+        },
+        {
+            asyncValidator: (rule: any, value: any) => {
+                // 邮箱校验
+                const reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
+                if (reg.test(value)) {
+                    return Promise.resolve();
+                } else {
+                    return Promise.reject('请输入正确的邮箱');
+                }
+            },
+        },
+    ],
+    'extraInfo.fileFormat': [
+        {
+            required: true,
+            message: '请选择导出格式',
+            trigger: 'change',
+        },
+    ],
+});
 const changeExtraFileType = (val: any) => {
-    console.log(val);
     form.value.extraInfo.fileFormat = val;
 };
 const submitForm = async () => {
     try {
         await upFormUpRef.value?.validate();
     } catch (error: any) {
+        // 滚动到第一个错误字段
+        console.log(error);
+
+        const firstErrorField = error && error[0].field + 'pppp';
+        props.paging?.scrollIntoViewById(firstErrorField, 30, true);
         return;
     }
-    emit('formdata', {
-        ...form.value,
-    });
-    emit('next', {
-        info: {
-            ...props.info,
-            status: 'completed',
-        },
-        nextStepValue: props.nextStepValue || 'print',
-    });
 };
 const prevSteps = () => {
     emit('prev', {

+ 1 - 1
src/plant/packaging/create/index.vue

@@ -218,7 +218,7 @@ const submit = async () => {
     try {
         await upFormRef.value?.validate();
     } catch (error: any) {
-        const firstErrorField = error && error[0].prop + 'pppp';
+        const firstErrorField = error && error[0].field + 'pppp';
         paging.value?.scrollIntoViewById(firstErrorField, 30, true);
         return;
     }

+ 5 - 5
src/plant/packaging/detail/models/print-info-page.vue

@@ -17,7 +17,7 @@
                         <image class="w-32 h-32 mr-8" src="https://ta.zycpzs.cn/oss-file/smart-trace/szyy/images-plt/print-codes/btn_zxdy_icon.png" mode="widthFix" />
                         <span>自行打印</span>
                     </view>
-                    <view class="btn-bottom-bt ss-style" @click="$u.route({ url: '/plant/export-print/export/index', params: { packId: form?.id, autoRelationId: form?.autoRelationId, printedCount: form?.actualCount - form?.printCount} })">
+                    <view class="btn-bottom-bt ss-style" @click="$u.route({ url: '/plant/export-print/export/index', params: { packId: form?.id, autoRelationId: form?.autoRelationId, unit: form?.unit, printedCount: form?.actualCount - form?.printCount} })">
                         <image class="w-32 h-32 mr-8" src="https://ta.zycpzs.cn/oss-file/smart-trace/szyy/images-plt/print-codes/dczsm_icon.png" mode="widthFix" />
                         <span>导出追溯码</span>
                     </view>
@@ -74,7 +74,7 @@ import { useClientRequest } from '@/utils/request';
 import PackCard from '@/plant/models/pack-card.vue';
 import { formItemBtnListStyle } from '@/assets/styles/uview-plus';
 
-const paging = ref(null);
+const paging = ref<any>(null);
 const props = defineProps({
     packId: {
         type: String,
@@ -111,7 +111,7 @@ const query = async (pageNum: number, pageSize: number) => {
     const res = await useClientRequest.get('/plt-api/app/printLog/list', params);
     if (res && res?.rows) {
         const { rows } = res;
-        paging.value.complete(rows);
+        paging.value?.complete(rows);
     }
 };
 const onRefresh = () => {
@@ -121,7 +121,7 @@ const onRefresh = () => {
         console.error('刷新列表失败:', error);
     }
 };
-const clickAllPrint = async (item) => {
+const clickAllPrint = async (item: any) => {
     try {
         const res = await uni.showModal({
             title: '全部打印提示',
@@ -129,7 +129,7 @@ const clickAllPrint = async (item) => {
             confirmColor: '#37A954',
         });
         if (res.confirm) {
-            uni.$u.route({ url: '/plant/print/print-all/index', params: item });
+            uni.$u.route({ type: 'navigateTo', url: '/plant/print/print-all/index', params: item });
         }
     } catch (error) {
         console.error('', error);

+ 1 - 1
src/plant/processing/processing-depstock/index.vue

@@ -161,7 +161,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 4 - 4
src/plant/storage/agro-product/add/index.vue

@@ -77,7 +77,7 @@
                 <!-- 入库日期 -->
                 <view class="h-1" id="instoreDatepppp"></view>
                 <ut-datetime-picker v-model="form.instoreBizInfo.instoreDate" :maxDate="new Date()" mode="date">
-                    <up-form-item borderBottom label="入库日期" required prop="instoreBizInfo.instoreDate">
+                    <up-form-item borderBottom label="入库日期" required prop="instoreDate">
                         <up-input v-model="form.instoreBizInfo.instoreDate" readonly placeholder="请选择入库日期" border="none"
                             clearable></up-input>
                         <template #right>
@@ -104,12 +104,12 @@
                     <select-warehouse-input v-model="form.warehouses" title="添加农资存放库房" :params="{ type: '1' }"></select-warehouse-input>
                 </up-form-item>
                 <!-- 入库人 -->
-                <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                <up-form-item borderBottom label="入库人" required prop="instoreMg">
                     <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none"
                         clearable></up-input>
                 </up-form-item>
                 <!-- 入库备注 -->
-                <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                <up-form-item borderBottom label="入库备注" prop="remark">
                     <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                 </up-form-item>
             </view>
@@ -168,7 +168,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 1 - 1
src/plant/storage/agro-product/info-edit/index.vue

@@ -229,7 +229,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 4 - 4
src/plant/storage/agro-product/info-update/index.vue

@@ -165,7 +165,7 @@
                 <!-- 入库日期 -->
                 <view class="h-1" id="instoreDatepppp"></view>
                 <ut-datetime-picker v-model="form.instoreBizInfo.instoreDate" :maxDate="new Date()" mode="date">
-                    <up-form-item borderBottom label="入库日期" required prop="instoreBizInfo.instoreDate">
+                    <up-form-item borderBottom label="入库日期" required prop="instoreDate">
                         <up-input v-model="form.instoreBizInfo.instoreDate" readonly placeholder="请选择入库日期" border="none" clearable></up-input>
                         <template #right>
                             <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
@@ -195,11 +195,11 @@
                     <select-warehouse-input v-model="form.warehouses" title="添加农资存放库房" :params="{ type: '1' }"></select-warehouse-input>
                 </up-form-item>
                 <!-- 入库人 -->
-                <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                <up-form-item borderBottom label="入库人" required prop="instoreMg">
                     <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none" clearable></up-input>
                 </up-form-item>
                 <!-- 入库备注 -->
-                <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                <up-form-item borderBottom label="入库备注" prop="remark">
                     <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                 </up-form-item>
             </view>
@@ -305,7 +305,7 @@ const submitForm = async () => {
             try {
                 await upFormRef.value?.validate();
             } catch (error: any) {
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 4 - 4
src/plant/storage/fresh-goods/add/index.vue

@@ -64,7 +64,7 @@
                 <!-- 入库日期 -->
                 <view class="h-1" id="instoreDatepppp"></view>
                 <ut-datetime-picker v-model="form.instoreBizInfo.instoreDate" :maxDate="new Date()" mode="date">
-                    <up-form-item borderBottom label="入库日期" required prop="instoreBizInfo.instoreDate">
+                    <up-form-item borderBottom label="入库日期" required prop="instoreDate">
                         <up-input v-model="form.instoreBizInfo.instoreDate" readonly placeholder="请选择入库日期" border="none" clearable></up-input>
                         <template #right>
                             <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
@@ -87,11 +87,11 @@
                     <select-warehouse-input v-model="form.warehouses" title="添加鲜货存放库房" :params="{ type: '4' }"></select-warehouse-input>
                 </up-form-item>
                 <!-- 入库人 -->
-                <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                <up-form-item borderBottom label="入库人" required prop="instoreMg">
                     <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none" clearable></up-input>
                 </up-form-item>
                 <!-- 入库备注 -->
-                <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                <up-form-item borderBottom label="入库备注" prop="remark">
                     <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                 </up-form-item>
             </view>
@@ -144,7 +144,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 1 - 1
src/plant/storage/fresh-goods/info-edit/index.vue

@@ -230,7 +230,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 6 - 6
src/plant/storage/fresh-goods/info-update/index.vue

@@ -148,7 +148,7 @@
                     <!-- 入库日期 -->
                     <view class="h-1" id="instoreDatepppp"></view>
                     <ut-datetime-picker v-model="form.instoreBizInfo.instoreDate" :maxDate="new Date()" mode="date">
-                        <up-form-item borderBottom label="入库日期" required prop="instoreBizInfo.instoreDate">
+                        <up-form-item borderBottom label="入库日期" required prop="instoreDate">
                             <up-input v-model="form.instoreBizInfo.instoreDate" placeholder="请选择入库日期" border="none" clearable></up-input>
                             <template #right>
                                 <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
@@ -169,11 +169,11 @@
                         <select-warehouse-input v-model="form.warehouses" title="添加鲜货存放库房" :params="{ type: '4' }"></select-warehouse-input>
                     </up-form-item>
                     <!-- 入库人 -->
-                    <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                    <up-form-item borderBottom label="入库人" required prop="instoreMg">
                         <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none" clearable></up-input>
                     </up-form-item>
                     <!-- 入库备注 -->
-                    <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                    <up-form-item borderBottom label="入库备注" prop="remark">
                         <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                     </up-form-item>
                 </view>
@@ -296,11 +296,11 @@
                         <select-warehouse-input v-model="form.warehouses" title="添加鲜货存放库房" :params="{ type: '4' }"></select-warehouse-input>
                     </up-form-item>
                     <!-- 入库人 -->
-                    <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                    <up-form-item borderBottom label="入库人" required prop="instoreMg">
                         <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none" clearable></up-input>
                     </up-form-item>
                     <!-- 入库备注 -->
-                    <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                    <up-form-item borderBottom label="入库备注" prop="remark">
                         <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                     </up-form-item>
                 </view>
@@ -375,7 +375,7 @@ const submitForm = async () => {
             try {
                 await upFormRef.value?.validate();
             } catch (error: any) {
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 1 - 1
src/plant/storage/loss-register/index.vue

@@ -204,7 +204,7 @@ const submit = async () => {
     try {
         await upFormRef.value?.validate();
     } catch (error: any) {
-        const firstErrorField = error && error[0].prop + 'pppp';
+        const firstErrorField = error && error[0].field + 'pppp';
         paging.value?.scrollIntoViewById(firstErrorField, 30, true);
         return;
     }

+ 4 - 4
src/plant/storage/seed-source/add/index.vue

@@ -78,7 +78,7 @@
                 <!-- 入库日期 -->
                 <view class="h-1" id="instoreDatepppp"></view>
                 <ut-datetime-picker v-model="form.instoreBizInfo.instoreDate" :maxDate="new Date()" mode="date">
-                    <up-form-item borderBottom label="入库日期" required prop="instoreBizInfo.instoreDate">
+                    <up-form-item borderBottom label="入库日期" required prop="instoreDate">
                         <up-input v-model="form.instoreBizInfo.instoreDate" readonly placeholder="请选择入库日期" border="none" clearable></up-input>
                         <template #right>
                             <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
@@ -101,11 +101,11 @@
                     <select-warehouse-input v-model="form.warehouses" title="添加种源存放库房" :params="{ type: '2' }"></select-warehouse-input>
                 </up-form-item>
                 <!-- 入库人 -->
-                <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                <up-form-item borderBottom label="入库人" required prop="instoreMg">
                     <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none" clearable></up-input>
                 </up-form-item>
                 <!-- 入库备注 -->
-                <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                <up-form-item borderBottom label="入库备注" prop="remark">
                     <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                 </up-form-item>
             </view>
@@ -160,7 +160,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 8 - 8
src/plant/storage/seed-source/info-edit/index.vue

@@ -61,7 +61,7 @@
                 <view class="h-1" id="motherFatherFlagpppp"></view>
                 <ut-action-sheet :tabs="pt_mother_father_flag" mode="custom" title="父母本情况" v-model="form.instoreBizInfo.motherFatherFlag">
                     <template v-if="['A3', 'A4'].includes(form.seedType as string) || ['3'].includes(form.seedSource as string)">
-                        <up-form-item borderBottom label="父母本情况" prop="instoreBizInfo.motherFatherFlag" required>
+                        <up-form-item borderBottom label="父母本情况" prop="motherFatherFlag" required>
                             <view v-if="form.instoreBizInfo.motherFatherFlag" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_mother_father_flag, form.instoreBizInfo.motherFatherFlag) }}</view>
                             <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择父母本情况</view>
                             <template #right>
@@ -110,7 +110,7 @@
                         </view>
                     </up-form-item>
                     <!-- 母本品种 -->
-                    <up-form-item borderBottom label="母本品种" prop="instoreBizInfo.motherVarietyId">
+                    <up-form-item borderBottom label="母本品种" prop="motherVarietyId">
                         <view class="flex1">
                             <up-button v-if="!form.instoreBizInfo.motherVarietyId" @click="selectMotherVarietyId" type="primary" plain>
                                 <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" />
@@ -145,14 +145,14 @@
                     <up-form-item :label="`${genCountMap[form.seedType as 'A3' | 'A4']}`" required class="form-item-bottom-padding-0">
                         <view class="d-flex flex1">
                             <view class="flex1 ov-hd">
-                                <up-form-item prop="instoreBizInfo.genCount" border-bottom class="form-item-top-padding-0">
+                                <up-form-item prop="genCount" border-bottom class="form-item-top-padding-0">
                                     <up-input v-model="form.instoreBizInfo.genCount" :placeholder="`请输入${genCountMap[form.seedType as 'A3' | 'A4']}`" border="none" clearable></up-input>
                                 </up-form-item>
                             </view>
                             <view class="pd-5"></view>
                             <view class="min-w-200">
                                 <ut-action-sheet v-model="form.instoreBizInfo.genUnit" :tabs="pt_gen_unit" mode="custom" title="选择单位">
-                                    <up-form-item prop="instoreBizInfo.genUnit" border-bottom class="form-item-top-padding-0">
+                                    <up-form-item prop="genUnit" border-bottom class="form-item-top-padding-0">
                                         <view class="flex1" style="line-height: 24px">
                                             <view v-if="form.instoreBizInfo.genUnit" class="f-s-30 c-333 f-w-5 text-center">{{ selectDictLabel(pt_gen_unit, form.instoreBizInfo.genUnit) }}</view>
                                             <view v-else class="f-s-30 c-ccc f-w-4 text-center">单位</view>
@@ -270,7 +270,7 @@
                 </up-form-item>
                 <!-- 个体标识:此处仅占位,后续可改为多选列表 -->
                 <view class="h-1" id="instoreBizInfo.idFlagpppp"></view>
-                <up-form-item borderBottom label="是否有个体标识" prop="instoreBizInfo.idFlag" required>
+                <up-form-item borderBottom label="是否有个体标识" prop="idFlag" required>
                     <up-radio-group v-model="form.instoreBizInfo.idFlag">
                         <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
                     </up-radio-group>
@@ -278,12 +278,12 @@
                 <!-- 个体标识:此处仅占位,后续可改为多选列表 -->
                 <template v-if="+form?.instoreBizInfo?.idFlag">
                     <view class="h-1" id="instoreBizInfo.animalspppp"></view>
-                    <up-form-item borderBottom label="个体标识号" prop="instoreBizInfo.animals" required>
+                    <up-form-item borderBottom label="个体标识号" prop="animals" required>
                         <AnimalsInput v-model="form.instoreBizInfo.animals"></AnimalsInput>
                     </up-form-item>
                 </template>
                 <!-- 保藏方法 -->
-                <up-form-item borderBottom label="保藏方法" prop="instoreBizInfo.storageMethod">
+                <up-form-item borderBottom label="保藏方法" prop="storageMethod">
                     <up-input v-model="form.instoreBizInfo.storageMethod" placeholder="请输入保藏方法" border="none" clearable></up-input>
                 </up-form-item>
                 <!-- 媒体与附件 -->
@@ -421,7 +421,7 @@ const submitForm = async () => {
                 await upFormRef.value?.validate();
             } catch (error: any) {
                 // 滚动到第一个错误字段
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 17 - 17
src/plant/storage/seed-source/info-update/index.vue

@@ -67,7 +67,7 @@
                     <view class="h-1" id="motherFatherFlagpppp"></view>
                     <ut-action-sheet :tabs="pt_mother_father_flag" mode="custom" title="父母本情况" v-model="form.instoreBizInfo.motherFatherFlag">
                         <template v-if="['A3', 'A4'].includes(form.seedType as string) || ['3'].includes(form.seedSource as string)">
-                            <up-form-item borderBottom label="父母本情况" prop="instoreBizInfo.motherFatherFlag" required>
+                            <up-form-item borderBottom label="父母本情况" prop="motherFatherFlag" required>
                                 <view v-if="form.instoreBizInfo.motherFatherFlag" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_mother_father_flag, form.instoreBizInfo.motherFatherFlag) }}</view>
                                 <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择父母本情况</view>
                                 <template #right>
@@ -116,7 +116,7 @@
                             </view>
                         </up-form-item>
                         <!-- 母本品种 -->
-                        <up-form-item borderBottom label="母本品种" prop="instoreBizInfo.motherVarietyId">
+                        <up-form-item borderBottom label="母本品种" prop="motherVarietyId">
                             <view class="flex1">
                                 <up-button v-if="!form.instoreBizInfo.motherVarietyId" @click="selectMotherVarietyId" type="primary" plain>
                                     <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" />
@@ -151,14 +151,14 @@
                         <up-form-item :label="`${genCountMap[form.seedType as 'A3' | 'A4']}`" required class="form-item-bottom-padding-0">
                             <view class="d-flex flex1">
                                 <view class="flex1 ov-hd">
-                                    <up-form-item prop="instoreBizInfo.genCount" border-bottom class="form-item-top-padding-0">
+                                    <up-form-item prop="genCount" border-bottom class="form-item-top-padding-0">
                                         <up-input v-model="form.instoreBizInfo.genCount" :placeholder="`请输入${genCountMap[form.seedType as 'A3' | 'A4']}`" border="none" clearable></up-input>
                                     </up-form-item>
                                 </view>
                                 <view class="pd-5"></view>
                                 <view class="min-w-200">
                                     <ut-action-sheet v-model="form.instoreBizInfo.genUnit" :tabs="pt_gen_unit" mode="custom" title="选择单位">
-                                        <up-form-item prop="instoreBizInfo.genUnit" border-bottom class="form-item-top-padding-0">
+                                        <up-form-item prop="genUnit" border-bottom class="form-item-top-padding-0">
                                             <view class="flex1" style="line-height: 24px">
                                                 <view v-if="form.instoreBizInfo.genUnit" class="f-s-30 c-333 f-w-5 text-center">{{ selectDictLabel(pt_gen_unit, form.instoreBizInfo.genUnit) }}</view>
                                                 <view v-else class="f-s-30 c-ccc f-w-4 text-center">单位</view>
@@ -254,7 +254,7 @@
                     </up-form-item>
                     <!-- 个体标识:此处仅占位,后续可改为多选列表 -->
                     <view class="h-1" id="idFlagpppp"></view>
-                    <up-form-item borderBottom label="是否有个体标识" prop="instoreBizInfo.idFlag" required>
+                    <up-form-item borderBottom label="是否有个体标识" prop="idFlag" required>
                         <up-radio-group v-model="form.instoreBizInfo.idFlag">
                             <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
                         </up-radio-group>
@@ -262,12 +262,12 @@
                     <!-- 个体标识:此处仅占位,后续可改为多选列表 -->
                     <view class="h-1" id="animalspppp"></view>
                     <template v-if="+form?.instoreBizInfo?.idFlag">
-                        <up-form-item borderBottom label="个体标识号" prop="instoreBizInfo.animals" required>
+                        <up-form-item borderBottom label="个体标识号" prop="animals" required>
                             <AnimalsInput v-model="form.instoreBizInfo.animals"></AnimalsInput>
                         </up-form-item>
                     </template>
                     <!-- 保藏方法 -->
-                    <up-form-item borderBottom label="保藏方法" prop="instoreBizInfo.storageMethod">
+                    <up-form-item borderBottom label="保藏方法" prop="storageMethod">
                         <up-input v-model="form.instoreBizInfo.storageMethod" placeholder="请输入保藏方法" border="none" clearable></up-input>
                     </up-form-item>
                     <!-- 媒体与附件 -->
@@ -336,7 +336,7 @@
                     <!-- 入库日期 -->
                     <view class="h-1" id="instoreDatepppp"></view>
                     <ut-datetime-picker v-model="form.instoreBizInfo.instoreDate" :maxDate="new Date()" mode="date">
-                        <up-form-item borderBottom label="入库日期" required prop="instoreBizInfo.instoreDate">
+                        <up-form-item borderBottom label="入库日期" required prop="instoreDate">
                             <up-input v-model="form.instoreBizInfo.instoreDate" readonly placeholder="请选择入库日期" border="none" clearable></up-input>
                             <template #right>
                                 <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
@@ -357,11 +357,11 @@
                         <select-warehouse-input v-model="form.warehouses" title="添加种源存放库房" :params="{ type: '2' }"></select-warehouse-input>
                     </up-form-item>
                     <!-- 入库人 -->
-                    <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                    <up-form-item borderBottom label="入库人" required prop="instoreMg">
                         <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none" clearable></up-input>
                     </up-form-item>
                     <!-- 入库备注 -->
-                    <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                    <up-form-item borderBottom label="入库备注" prop="remark">
                         <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                     </up-form-item>
                 </view>
@@ -422,7 +422,7 @@
                     </up-form-item>
                     <!-- 个体标识:此处仅占位,后续可改为多选列表 -->
                     <view class="h-1" id="instoreBizInfo.idFlagpppp"></view>
-                    <up-form-item borderBottom label="是否有个体标识" prop="instoreBizInfo.idFlag" required>
+                    <up-form-item borderBottom label="是否有个体标识" prop="idFlag" required>
                         <up-radio-group v-model="form.instoreBizInfo.idFlag">
                             <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
                         </up-radio-group>
@@ -430,12 +430,12 @@
                     <!-- 个体标识:此处仅占位,后续可改为多选列表 -->
                     <view class="h-1" id="instoreBizInfo.animalspppp"></view>
                     <template v-if="+form?.instoreBizInfo?.idFlag">
-                        <up-form-item borderBottom label="个体标识号" prop="instoreBizInfo.animals" required>
+                        <up-form-item borderBottom label="个体标识号" prop="animals" required>
                             <AnimalsInput v-model="form.instoreBizInfo.animals"></AnimalsInput>
                         </up-form-item>
                     </template>
                     <!-- 保藏方法 -->
-                    <up-form-item borderBottom label="保藏方法" prop="instoreBizInfo.storageMethod">
+                    <up-form-item borderBottom label="保藏方法" prop="storageMethod">
                         <up-input v-model="form.instoreBizInfo.storageMethod" placeholder="请输入保藏方法" border="none" clearable></up-input>
                     </up-form-item>
                     <!-- 媒体与附件 -->
@@ -499,7 +499,7 @@
                     <!-- 入库日期 -->
                     <view class="h-1" id="instoreDatepppp"></view>
                     <ut-datetime-picker v-model="form.instoreBizInfo.instoreDate" :maxDate="new Date()" mode="date">
-                        <up-form-item borderBottom label="入库日期" required prop="instoreBizInfo.instoreDate">
+                        <up-form-item borderBottom label="入库日期" required prop="instoreDate">
                             <up-input v-model="form.instoreBizInfo.instoreDate" readonly placeholder="请选择入库日期" border="none" clearable></up-input>
                             <template #right>
                                 <up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
@@ -520,11 +520,11 @@
                         <select-warehouse-input v-model="form.warehouses" title="添加种源存放库房" :params="{ type: '2' }"></select-warehouse-input>
                     </up-form-item>
                     <!-- 入库人 -->
-                    <up-form-item borderBottom label="入库人" required prop="instoreBizInfo.instoreMg">
+                    <up-form-item borderBottom label="入库人" required prop="instoreMg">
                         <up-input v-model="form.instoreBizInfo.instoreMg" placeholder="请输入入库人" border="none" clearable></up-input>
                     </up-form-item>
                     <!-- 入库备注 -->
-                    <up-form-item borderBottom label="入库备注" prop="instoreBizInfo.remark">
+                    <up-form-item borderBottom label="入库备注" prop="remark">
                         <up-textarea v-model="form.instoreBizInfo.remark" placeholder="请输入入库备注" autoHeight></up-textarea>
                     </up-form-item>
                 </view>
@@ -629,7 +629,7 @@ const submitForm = async () => {
             try {
                 await upFormRef.value?.validate();
             } catch (error: any) {
-                const firstErrorField = error && error[0].prop + 'pppp';
+                const firstErrorField = error && error[0].field + 'pppp';
                 paging.value?.scrollIntoViewById(firstErrorField, 30, true);
                 return;
             }

+ 1 - 1
src/plant/storage/storage-room/edit/index.vue

@@ -177,7 +177,7 @@ const submit = async () => {
         await upFormRef.value?.validate();
     } catch (error: any) {
         // 滚动到第一个错误字段
-        const firstErrorField = error && error[0].prop + 'pppp';
+        const firstErrorField = error && error[0].field + 'pppp';
         paging.value?.scrollIntoViewById(firstErrorField, 30, true);
         return;
     }

+ 26 - 0
src/utils/propTypes.ts

@@ -0,0 +1,26 @@
+import { CSSProperties } from 'vue';
+import VueTypes, { createTypes, toValidableType, VueTypeValidableDef, VueTypesInterface } from 'vue-types';
+
+type PropTypes = VueTypesInterface & {
+    readonly style: VueTypeValidableDef<CSSProperties>;
+    readonly fieldOption: VueTypeValidableDef<Array<FieldOption>>;
+};
+
+const propTypes = createTypes({
+    func: undefined,
+    bool: undefined,
+    string: undefined,
+    number: undefined,
+    object: undefined,
+    integer: undefined
+}) as PropTypes;
+
+export default class ProjectTypes extends VueTypes {
+    static get style() {
+        return toValidableType('style', {
+            type: [String, Object],
+            default: undefined
+        });
+    }
+}
+export { propTypes };