fix(erp/prtjectChange): 解决项目变更表单数据加载竞态问题并修复预算数值转换错误

- 添加 isDataLoading 锁防止 onMounted 和 route watch 竞态导致数据被清空
- 在 loadFormData 中实现并发加载保护机制
- 修复进度列表中 completionDegree 的数值转换
dev
Yangk 2 weeks ago
parent e325124627
commit 4112d3bef4

@ -524,42 +524,62 @@ const submitCallback = async () => {
router.go(-1);
};
// onMounted route watch
const isDataLoading = ref(false);
const loadFormData = async () => {
await resetFormState();
//
routeParams.value = route.query;
buttonLoading.value = false;
//
if (isDataLoading.value) return;
isDataLoading.value = true;
const id = routeParams.value.id as string;
const projectId = routeParams.value.projectId as string;
try {
await resetFormState();
//
routeParams.value = route.query;
buttonLoading.value = false;
// //
if (id && id !== '0' && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
try {
proxy?.$modal.loading('正在加载数据,请稍后...');
const res = await getErpProjectChange(id);
if (res.data) {
Object.assign(form.value, res.data);
const dateOnly = toDateOnly(form.value.applyChangeDate);
form.value.applyChangeDate = dateOnly ?? formatToday();
form.value.budgetList = res.data.budgetList ?? [];
form.value.progressList = res.data.progressList ?? [];
isCodeGenerated.value = !!form.value.projectChangeCode;
if (res.data.changeType) {
changeTypeList.value = res.data.changeType.split(',');
const id = routeParams.value.id as string;
const projectId = routeParams.value.projectId as string;
// //
if (id && id !== '0' && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
try {
proxy?.$modal.loading('正在加载数据,请稍后...');
const res = await getErpProjectChange(id);
if (res.data) {
Object.assign(form.value, res.data);
const dateOnly = toDateOnly(form.value.applyChangeDate);
form.value.applyChangeDate = dateOnly ?? formatToday();
// handleProjectChange/loadProjectDataByProjectId BigDecimal Number el-input-number
form.value.budgetList = (res.data.budgetList ?? []).map((item: any) => ({
...item,
budgetBefore: Number(item.budgetBefore || 0),
budgetAfter: Number(item.budgetAfter || 0),
amountUsed: Number(item.amountUsed || 0)
}));
form.value.progressList = (res.data.progressList ?? []).map((item: any) => ({
...item,
completionDegree: Number(item.completionDegree || 0)
}));
isCodeGenerated.value = !!form.value.projectChangeCode;
if (res.data.changeType) {
changeTypeList.value = res.data.changeType.split(',');
}
}
proxy?.$modal.closeLoading();
} catch (error) {
proxy?.$modal.closeLoading();
proxy?.$modal.msgError('加载变更申请数据失败');
console.error(error);
}
proxy?.$modal.closeLoading();
} catch (error) {
proxy?.$modal.closeLoading();
proxy?.$modal.msgError('加载变更申请数据失败');
console.error(error);
} else if (projectId) {
// ID
await loadProjectDataByProjectId(projectId);
} else if (!showProjectSelect.value) {
proxy?.$modal.msgError('缺少必要的参数项目ID或变更申请ID');
}
} else if (projectId) {
// ID
await loadProjectDataByProjectId(projectId);
} else if (!showProjectSelect.value) {
proxy?.$modal.msgError('缺少必要的参数项目ID或变更申请ID');
} finally {
isDataLoading.value = false;
}
};
@ -575,7 +595,6 @@ watch(
onMounted(async () => {
await loadFormData();
// loadFormDataloading
});
</script>

@ -258,7 +258,7 @@ const columns = ref<FieldOption[]>([
{ key: 4, label: `项目经理`, visible: true },
{ key: 5, label: `部门负责人`, visible: true },
{ key: 6, label: `付款方式`, visible: true },
{ key: 7, label: `项目计划状态`, visible: false },
{ key: 7, label: `项目计划状态`, visible: true },
{ key: 8, label: `流程状态`, visible: false },
{ key: 9, label: `合同名称`, visible: false },
{ key: 10, label: `排序号`, visible: false },

Loading…
Cancel
Save