feat: implement dynamic inspection requirement logic based on material master data

This commit is contained in:
DXC
2026-03-17 11:56:04 +08:00
parent 368298a29d
commit c1c494893f
8 changed files with 273 additions and 14 deletions

View File

@ -821,6 +821,10 @@ const printCopies = ref(1)
const entryMode = ref('batch')
const modeLocked = ref(false)
// 强制质检标记
const isCurrentMaterialInspectionRequired = ref(false)
const dialogImageUrl = ref('')
const dialogVisibleImage = ref(false)
const arrivalFileList = ref<any[]>([])
@ -1136,10 +1140,23 @@ const onMaterialSelected = (val: number) => {
form.category = item.category
form.unit = item.unit
form.material_type = item.type
// 保存强制质检标记
isCurrentMaterialInspectionRequired.value = item.isInspectionRequired || false
// 更新表单校验规则
updateInspectionRules()
checkHistoryAndSetMode(item.id)
}
}
// 动态更新质检相关校验规则
const updateInspectionRules = () => {
if (formRef.value) {
// 清除旧的校验结果
formRef.value.clearValidate('inspection_status')
formRef.value.clearValidate('inspection_report')
}
}
// ------------------------------------
// 校验规则
// ------------------------------------
@ -1159,12 +1176,39 @@ const validateIdentity = (rule: any, value: any, callback: any) => {
else if (entryMode.value === 'batch' && !form.batch_number && rule.field === 'batch_number') callback(new Error('批号必填'))
else callback()
}
const rules = {
base_id: [{required: true, message: '请选择物料', trigger: 'change'}],
in_quantity: [{required: true, message: '请输入数量', trigger: 'blur'}],
serial_number: [{validator: validateIdentity, trigger: 'blur'}, {validator: validateUnique, trigger: 'blur'}],
batch_number: [{validator: validateIdentity, trigger: 'blur'}, {validator: validateUnique, trigger: 'blur'}]
}
const rules = computed(() => {
const baseRules = {
base_id: [{required: true, message: '请选择物料', trigger: 'change'}],
in_quantity: [{required: true, message: '请输入数量', trigger: 'blur'}],
serial_number: [{validator: validateIdentity, trigger: 'blur'}, {validator: validateUnique, trigger: 'blur'}],
batch_number: [{validator: validateIdentity, trigger: 'blur'}, {validator: validateUnique, trigger: 'blur'}]
}
// 如果当前物料需要强制质检,添加质检相关校验
if (isCurrentMaterialInspectionRequired.value) {
// 到检状态必填
baseRules.inspection_status = [
{ required: true, message: '该物料为强管控物料,必须选择到检状态', trigger: 'change' }
]
// 检测报告必填(通过自定义校验规则:文件或外部链接至少有一个)
baseRules.inspection_report = [
{
validator: (rule: any, value: any, callback: any) => {
const hasFile = form.inspection_report && form.inspection_report.length > 0
const hasLink = inspection_report_url.value && inspection_report_url.value.trim() !== ''
if (!hasFile && !hasLink) {
callback(new Error('该物料为强管控物料,必须提供检测报告文件或链接'))
} else {
callback()
}
},
trigger: 'blur'
}
]
}
return baseRules
})
const checkHistoryAndSetMode = async (baseId: number) => {
try {
@ -1366,7 +1410,10 @@ const handleUpdate = (row: any) => {
inspection_report_url.value = reportLinks.length > 0 ? reportLinks[0] : ''
if (row.serial_number) { entryMode.value = 'serial'; form.serial_number = row.serial_number; form.batch_number = '' }
else { entryMode.value = 'batch'; form.batch_number = row.batch_number; form.serial_number = '' }
materialOptions.value = [{ id: row.base_id, name: row.material_name, spec: row.spec_model, category: row.category, company_name: row.company_name }]
materialOptions.value = [{ id: row.base_id, name: row.material_name, spec: row.spec_model, category: row.category, company_name: row.company_name, isInspectionRequired: row.isInspectionRequired }]
// 设置强制质检标记
isCurrentMaterialInspectionRequired.value = row.isInspectionRequired || false
updateInspectionRules()
visible.value = true
}
@ -1598,6 +1645,8 @@ const confirmPrint = async () => {
const resetForm = () => {
materialOptions.value = []; arrivalFileList.value = []; reportFileList.value = []; inspection_report_url.value = ''
searchPage.value = 1; hasNextPage.value = true; searchKeyword.value = '';
// 重置强制质检标记
isCurrentMaterialInspectionRequired.value = false
Object.assign(form, {
id: undefined, base_id: undefined,
company_name: '',