From 4112d3bef495a02c19ce46291785f1af272cd9f7 Mon Sep 17 00:00:00 2001 From: Yangk Date: Wed, 1 Apr 2026 09:18:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(erp/prtjectChange):=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=8F=98=E6=9B=B4=E8=A1=A8=E5=8D=95=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=8A=A0=E8=BD=BD=E7=AB=9E=E6=80=81=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E5=A4=8D=E9=A2=84=E7=AE=97=E6=95=B0=E5=80=BC?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 isDataLoading 锁防止 onMounted 和 route watch 竞态导致数据被清空 - 在 loadFormData 中实现并发加载保护机制 - 修复进度列表中 completionDegree 的数值转换 --- src/views/oa/erp/erpProjectChange/edit.vue | 81 +++++++++++++--------- src/views/oa/erp/erpProjectPlan/index.vue | 2 +- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/views/oa/erp/erpProjectChange/edit.vue b/src/views/oa/erp/erpProjectChange/edit.vue index 79dd883..a537948 100644 --- a/src/views/oa/erp/erpProjectChange/edit.vue +++ b/src/views/oa/erp/erpProjectChange/edit.vue @@ -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(); - // loadFormData内部已处理loading提示 }); diff --git a/src/views/oa/erp/erpProjectPlan/index.vue b/src/views/oa/erp/erpProjectPlan/index.vue index b24ade4..25722dd 100644 --- a/src/views/oa/erp/erpProjectPlan/index.vue +++ b/src/views/oa/erp/erpProjectPlan/index.vue @@ -258,7 +258,7 @@ const columns = ref([ { 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 },