From 9bcd02c742bb1b07ec53b14b54a63c7de3bf8d13 Mon Sep 17 00:00:00 2001 From: yueli Date: Fri, 17 Jul 2026 16:57:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20update=5Fbuy=20perm=5Fcode=3DNone=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=20NoneType=20=E5=B4=A9=E6=BA=83=20+=20valida?= =?UTF-8?q?teUnique=20=E7=BC=96=E8=BE=91=E6=97=B6=E6=8E=92=E9=99=A4?= =?UTF-8?q?=E8=87=AA=E8=BA=AB=E6=94=B9=E7=94=A8=20Number()=20=E9=98=B2?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/app/api/v1/inbound/buy.py | 4 +++- inventory-web/src/views/stock/inbound/buy.vue | 3 ++- .../src/views/stock/inbound/product.vue | 3 ++- inventory-web/src/views/stock/inbound/semi.vue | 17 +++++------------ 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/inventory-backend/app/api/v1/inbound/buy.py b/inventory-backend/app/api/v1/inbound/buy.py index ed2aa0f..2d00d57 100644 --- a/inventory-backend/app/api/v1/inbound/buy.py +++ b/inventory-backend/app/api/v1/inbound/buy.py @@ -214,10 +214,12 @@ def update_buy(id): # 复制一份,避免遍历时修改字典 for field in list(data.keys()): perm_code = field_to_perm.get(field) + if not perm_code: + continue # 不在映射中的字段跳过(不参与权限过滤) # 提取不带前缀的基础权限码(如 'serial_number') base_perm_code = perm_code.split(':')[-1] if ':' in perm_code else perm_code # 如果用户的权限列表中,既没有长格式,也没有短格式,才移除该字段 - if perm_code and perm_code not in user_permissions and base_perm_code not in user_permissions: + if perm_code not in user_permissions and base_perm_code not in user_permissions: data.pop(field, None) BuyInboundService.update_inbound(id, data) diff --git a/inventory-web/src/views/stock/inbound/buy.vue b/inventory-web/src/views/stock/inbound/buy.vue index 67d5e64..d5d4fac 100644 --- a/inventory-web/src/views/stock/inbound/buy.vue +++ b/inventory-web/src/views/stock/inbound/buy.vue @@ -1293,8 +1293,9 @@ const updateInspectionRules = () => { // ------------------------------------ const validateUnique = (rule: any, value: string, callback: any) => { if (!value) return callback() + const currentId = form.id != null ? Number(form.id) : null const isDuplicate = tableData.value.some((row: any) => { - if (dialogStatus.value === 'update' && row.id === form.id) return false + 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 return false diff --git a/inventory-web/src/views/stock/inbound/product.vue b/inventory-web/src/views/stock/inbound/product.vue index 645a09d..260cf77 100644 --- a/inventory-web/src/views/stock/inbound/product.vue +++ b/inventory-web/src/views/stock/inbound/product.vue @@ -1028,8 +1028,9 @@ 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 const isDuplicate = tableData.value.some((row: any) => { - if (dialogStatus.value === 'update' && row.id === form.id) return false + if (dialogStatus.value === 'update' && currentId != null && Number(row.id) === currentId) return false if (rule.field === 'serial_number' && row.serial_number === value) return true return false }) diff --git a/inventory-web/src/views/stock/inbound/semi.vue b/inventory-web/src/views/stock/inbound/semi.vue index 90e64ab..a3283fa 100644 --- a/inventory-web/src/views/stock/inbound/semi.vue +++ b/inventory-web/src/views/stock/inbound/semi.vue @@ -1111,19 +1111,12 @@ 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 const isDuplicate = tableData.value.some((row: any) => { - if (dialogStatus.value === 'update' && row.id === form.id) { - console.log('[validateUnique] 跳过自身记录 id=', row.id, 'form.id=', form.id) - return false - } - if (rule.field === 'serial_number' && row.serial_number === value) { - console.log('[validateUnique] SN重复! row.id=', row.id, 'form.id=', form.id, 'dialogStatus=', dialogStatus.value) - return true - } - if (rule.field === 'batch_number' && row.batch_number === value && row.base_id === form.base_id) { - console.log('[validateUnique] 批号重复! row.id=', row.id, 'form.id=', form.id, 'dialogStatus=', dialogStatus.value) - return true - } + // 编辑模式:跳过自身记录(兼容 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 return false }) if (isDuplicate) callback(new Error('当前列表页存在相同编号(后端将进行全局校验)'))