fix: validateUnique 编辑模式下值未变时跳过重复校验,仅值改变时才检查冲突

This commit is contained in:
yueli
2026-07-17 17:04:10 +08:00
parent 1f43de4ccc
commit 097fbb319f
3 changed files with 24 additions and 13 deletions

View File

@ -1294,20 +1294,18 @@ 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 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 isDuplicate = tableData.value.some((row: any) => {
const rowId = Number(row.id) const rowId = Number(row.id)
const isSelf = dialogStatus.value === 'update' && currentId != null && rowId === currentId if (dialogStatus.value === 'update' && currentId != null && rowId === currentId) return false
if (rule.field === 'serial_number' && row.serial_number === value) { if (rule.field === 'serial_number' && row.serial_number === value) return true
if (isSelf) { console.log('[validateUnique] 跳过自身 SN, row.id=', row.id, 'rowId=', rowId); return false } if (rule.field === 'batch_number' && row.batch_number === value && row.base_id === form.base_id) return true
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
}
return false return false
}) })
if (isDuplicate) callback(new Error('当前列表页存在相同编号(后端将进行全局校验)')) if (isDuplicate) callback(new Error('当前列表页存在相同编号(后端将进行全局校验)'))

View File

@ -1029,6 +1029,13 @@ 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 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) => { const isDuplicate = tableData.value.some((row: any) => {
if (dialogStatus.value === 'update' && currentId != null && Number(row.id) === currentId) 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

View File

@ -1112,8 +1112,14 @@ 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 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) => { const isDuplicate = tableData.value.some((row: any) => {
// 编辑模式:跳过自身记录(兼容 id 类型不一致)
if (dialogStatus.value === 'update' && currentId != null && Number(row.id) === currentId) 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