fix: update_buy perm_code=None 导致 NoneType 崩溃 + validateUnique 编辑时排除自身改用 Number() 防类型不一致

This commit is contained in:
yueli
2026-07-17 16:57:46 +08:00
parent a8fb0cfc94
commit 9bcd02c742
4 changed files with 12 additions and 15 deletions

View File

@ -214,10 +214,12 @@ def update_buy(id):
# 复制一份,避免遍历时修改字典 # 复制一份,避免遍历时修改字典
for field in list(data.keys()): for field in list(data.keys()):
perm_code = field_to_perm.get(field) perm_code = field_to_perm.get(field)
if not perm_code:
continue # 不在映射中的字段跳过(不参与权限过滤)
# 提取不带前缀的基础权限码(如 'serial_number') # 提取不带前缀的基础权限码(如 'serial_number')
base_perm_code = perm_code.split(':')[-1] if ':' in perm_code else perm_code 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) data.pop(field, None)
BuyInboundService.update_inbound(id, data) BuyInboundService.update_inbound(id, data)

View File

@ -1293,8 +1293,9 @@ const updateInspectionRules = () => {
// ------------------------------------ // ------------------------------------
const validateUnique = (rule: any, value: string, callback: any) => { const validateUnique = (rule: any, value: string, callback: any) => {
if (!value) return callback() if (!value) return callback()
const currentId = form.id != null ? Number(form.id) : null
const isDuplicate = tableData.value.some((row: any) => { 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 === '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 if (rule.field === 'batch_number' && row.batch_number === value && row.base_id === form.base_id) return true
return false return false

View File

@ -1028,8 +1028,9 @@ const hasFormFieldPermission = (fieldName: string) => {
// ------------------------------------ // ------------------------------------
const validateUnique = (rule: any, value: string, callback: any) => { const validateUnique = (rule: any, value: string, callback: any) => {
if (!value) return callback() if (!value) return callback()
const currentId = form.id != null ? Number(form.id) : null
const isDuplicate = tableData.value.some((row: any) => { 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 === 'serial_number' && row.serial_number === value) return true
return false return false
}) })

View File

@ -1111,19 +1111,12 @@ const onMaterialSelected = async (item: any) => {
// ------------------------------------ // ------------------------------------
const validateUnique = (rule: any, value: string, callback: any) => { const validateUnique = (rule: any, value: string, callback: any) => {
if (!value) return callback() if (!value) return callback()
const currentId = form.id != null ? Number(form.id) : null
const isDuplicate = tableData.value.some((row: any) => { const isDuplicate = tableData.value.some((row: any) => {
if (dialogStatus.value === 'update' && row.id === form.id) { // 编辑模式:跳过自身记录(兼容 id 类型不一致)
console.log('[validateUnique] 跳过自身记录 id=', row.id, 'form.id=', form.id) if (dialogStatus.value === 'update' && currentId != null && Number(row.id) === currentId) return false
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
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
}
return false return false
}) })
if (isDuplicate) callback(new Error('当前列表页存在相同编号(后端将进行全局校验)')) if (isDuplicate) callback(new Error('当前列表页存在相同编号(后端将进行全局校验)'))