From 097fbb319f1b98a0dc7e32136429d87e14c558ea Mon Sep 17 00:00:00 2001 From: yueli Date: Fri, 17 Jul 2026 17:04:10 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20validateUnique=20=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=E5=80=BC=E6=9C=AA=E5=8F=98=E6=97=B6?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C=EF=BC=8C?= =?UTF-8?q?=E4=BB=85=E5=80=BC=E6=94=B9=E5=8F=98=E6=97=B6=E6=89=8D=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-web/src/views/stock/inbound/buy.vue | 22 +++++++++---------- .../src/views/stock/inbound/product.vue | 7 ++++++ .../src/views/stock/inbound/semi.vue | 8 ++++++- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/inventory-web/src/views/stock/inbound/buy.vue b/inventory-web/src/views/stock/inbound/buy.vue index a188c0c..7c3c293 100644 --- a/inventory-web/src/views/stock/inbound/buy.vue +++ b/inventory-web/src/views/stock/inbound/buy.vue @@ -1294,20 +1294,18 @@ const updateInspectionRules = () => { const validateUnique = (rule: any, value: string, callback: any) => { if (!value) return callback() const currentId = form.id != null ? Number(form.id) : null - console.log('[validateUnique] rule.field=', rule.field, 'value=', value, 'form.id=', form.id, 'currentId=', currentId, 'dialogStatus=', dialogStatus.value) + // 编辑模式:如果值未改变,跳过重复校验(用户可能在编辑其他字段) + if (dialogStatus.value === 'update' && currentId != null) { + const self = tableData.value.find((r: any) => Number(r.id) === currentId) + if (self && String(self[rule.field]) === value) { + return callback() // 值未变,无需校验重复 + } + } const isDuplicate = tableData.value.some((row: any) => { const rowId = Number(row.id) - const isSelf = dialogStatus.value === 'update' && currentId != null && rowId === currentId - if (rule.field === 'serial_number' && row.serial_number === value) { - if (isSelf) { console.log('[validateUnique] 跳过自身 SN, row.id=', row.id, 'rowId=', rowId); return false } - console.log('[validateUnique] SN匹配! row.id=', row.id, 'row.serial_number=', row.serial_number, 'value=', value) - return true - } - if (rule.field === 'batch_number' && row.batch_number === value && row.base_id === form.base_id) { - if (isSelf) { console.log('[validateUnique] 跳过自身 批号, row.id=', row.id); return false } - console.log('[validateUnique] 批号匹配! row.id=', row.id) - return true - } + if (dialogStatus.value === 'update' && currentId != null && rowId === currentId) return false + if (rule.field === 'serial_number' && row.serial_number === value) return true + if (rule.field === 'batch_number' && row.batch_number === value && row.base_id === form.base_id) return true return false }) if (isDuplicate) callback(new Error('当前列表页存在相同编号(后端将进行全局校验)')) diff --git a/inventory-web/src/views/stock/inbound/product.vue b/inventory-web/src/views/stock/inbound/product.vue index 260cf77..c14ea17 100644 --- a/inventory-web/src/views/stock/inbound/product.vue +++ b/inventory-web/src/views/stock/inbound/product.vue @@ -1029,6 +1029,13 @@ const hasFormFieldPermission = (fieldName: string) => { const validateUnique = (rule: any, value: string, callback: any) => { if (!value) return callback() const currentId = form.id != null ? Number(form.id) : null + // 编辑模式:如果值未改变,跳过重复校验(用户可能在编辑其他字段) + if (dialogStatus.value === 'update' && currentId != null) { + const self = tableData.value.find((r: any) => Number(r.id) === currentId) + if (self && String(self[rule.field]) === value) { + return callback() // 值未变,无需校验重复 + } + } const isDuplicate = tableData.value.some((row: any) => { if (dialogStatus.value === 'update' && currentId != null && Number(row.id) === currentId) return false if (rule.field === 'serial_number' && row.serial_number === value) return true diff --git a/inventory-web/src/views/stock/inbound/semi.vue b/inventory-web/src/views/stock/inbound/semi.vue index a3283fa..282b505 100644 --- a/inventory-web/src/views/stock/inbound/semi.vue +++ b/inventory-web/src/views/stock/inbound/semi.vue @@ -1112,8 +1112,14 @@ const onMaterialSelected = async (item: any) => { const validateUnique = (rule: any, value: string, callback: any) => { if (!value) return callback() const currentId = form.id != null ? Number(form.id) : null + // 编辑模式:如果值未改变,跳过重复校验(用户可能在编辑其他字段) + if (dialogStatus.value === 'update' && currentId != null) { + const self = tableData.value.find((r: any) => Number(r.id) === currentId) + if (self && String(self[rule.field]) === value) { + return callback() // 值未变,无需校验重复 + } + } const isDuplicate = tableData.value.some((row: any) => { - // 编辑模式:跳过自身记录(兼容 id 类型不一致) if (dialogStatus.value === 'update' && currentId != null && Number(row.id) === currentId) return false if (rule.field === 'serial_number' && row.serial_number === value) return true if (rule.field === 'batch_number' && row.batch_number === value && row.base_id === form.base_id) return true