优化表单原始数据保存时机和结构,在资产编辑中将原始数据保存移至分类属性加载完成后,在分类编辑中统一使用buildSubmitData构建原始数据以确保与提交数据结构一致,避免因数据结构差异导致的最小化传参失效
This commit is contained in:
@@ -1050,11 +1050,19 @@ const openDialog = (row?: any, edit?: boolean) => {
|
||||
})
|
||||
.catch(() => {
|
||||
categoryAttrs.value = [];
|
||||
})
|
||||
.finally(() => {
|
||||
// 分类属性加载完成后,保存原始数据用于最小化传参
|
||||
buildRequestBody().then((originalBody) => {
|
||||
assetFormDiff.saveOriginal(JSON.parse(JSON.stringify(originalBody)));
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// 没有分类属性,直接保存原始数据
|
||||
buildRequestBody().then((originalBody) => {
|
||||
assetFormDiff.saveOriginal(JSON.parse(JSON.stringify(originalBody)));
|
||||
});
|
||||
}
|
||||
|
||||
// 保存原始数据用于最小化传参
|
||||
assetFormDiff.saveOriginal(JSON.parse(JSON.stringify(ruleForm)));
|
||||
})
|
||||
.finally(() => {
|
||||
formLoading.value = false;
|
||||
|
||||
@@ -365,12 +365,12 @@ const openDialog = (row?: CategoryRow | string, edit?: boolean) => {
|
||||
}
|
||||
}
|
||||
});
|
||||
// 保存原始数据用于最小化传参
|
||||
categoryFormDiff.saveOriginal(JSON.parse(JSON.stringify(ruleForm)));
|
||||
// 保存原始数据用于最小化传参(使用与提交相同的结构)
|
||||
categoryFormDiff.saveOriginal(JSON.parse(JSON.stringify(buildSubmitData())));
|
||||
});
|
||||
} else {
|
||||
// 保存原始数据用于最小化传参
|
||||
categoryFormDiff.saveOriginal(JSON.parse(JSON.stringify(ruleForm)));
|
||||
// 保存原始数据用于最小化传参(使用与提交相同的结构)
|
||||
categoryFormDiff.saveOriginal(JSON.parse(JSON.stringify(buildSubmitData())));
|
||||
}
|
||||
});
|
||||
} else if (row && typeof row === 'string') {
|
||||
@@ -411,46 +411,55 @@ const formatDictOptions = (attr: CustomAttr) => {
|
||||
});
|
||||
};
|
||||
|
||||
// 构建提交数据(用于保存原始数据和提交)
|
||||
const buildSubmitData = () => {
|
||||
// 处理 attrs:统一清理脏数据
|
||||
const processedAttrs = ruleForm.attrs.map((attr) => {
|
||||
const base = {
|
||||
type: attr.type,
|
||||
required: attr.required ?? false,
|
||||
multiple: attr.type === 'multi_select',
|
||||
sort: attr.sort ?? 0,
|
||||
};
|
||||
|
||||
if (isDictType(attr.type)) {
|
||||
return {
|
||||
...base,
|
||||
name: attr.name || '',
|
||||
dictType: attr.dictType || '',
|
||||
options: formatDictOptions(attr),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
...base,
|
||||
name: (attr.name || '').trim(),
|
||||
options: [],
|
||||
};
|
||||
});
|
||||
|
||||
return {
|
||||
...ruleForm,
|
||||
attrs: processedAttrs,
|
||||
};
|
||||
};
|
||||
|
||||
// 提交
|
||||
const onSubmit = () => {
|
||||
formRef.value.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true;
|
||||
// 处理 attrs:统一清理脏数据
|
||||
const processedAttrs = ruleForm.attrs.map((attr) => {
|
||||
const base = {
|
||||
type: attr.type,
|
||||
required: attr.required ?? false,
|
||||
multiple: attr.type === 'multi_select',
|
||||
sort: attr.sort ?? 0,
|
||||
};
|
||||
|
||||
if (isDictType(attr.type)) {
|
||||
return {
|
||||
...base,
|
||||
name: attr.name || '',
|
||||
dictType: attr.dictType || '',
|
||||
options: formatDictOptions(attr),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
...base,
|
||||
name: (attr.name || '').trim(),
|
||||
options: [],
|
||||
};
|
||||
});
|
||||
const submitData = buildSubmitData();
|
||||
|
||||
if (isEdit.value) {
|
||||
// 编辑模式:通过 _originalData 让拦截器自动处理最小化传参
|
||||
const originalData = categoryFormDiff.getOriginal();
|
||||
const submitData = {
|
||||
...ruleForm,
|
||||
attrs: processedAttrs,
|
||||
const requestData = {
|
||||
...submitData,
|
||||
_originalData: originalData,
|
||||
};
|
||||
|
||||
updateCategory(submitData)
|
||||
updateCategory(requestData)
|
||||
.then(() => {
|
||||
ElMessage.success('修改成功');
|
||||
closeDialog();
|
||||
@@ -461,7 +470,6 @@ const onSubmit = () => {
|
||||
});
|
||||
} else {
|
||||
// 新增模式:传递所有字段
|
||||
const submitData = { ...ruleForm, attrs: processedAttrs };
|
||||
addCategory(submitData)
|
||||
.then(() => {
|
||||
ElMessage.success('添加成功');
|
||||
|
||||
Reference in New Issue
Block a user