From 1a770ca0ee48804fff448ae8b889529fcbc36a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BA=91?= <赵云@gentronhealth.com> Date: Thu, 14 May 2026 09:10:21 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#402:=20=E4=BD=8F=E9=99=A2=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E7=AB=99=E8=AF=8A=E6=96=AD=E5=BD=95=E5=85=A5=EF=BC=9A?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E4=BF=9D=E5=AD=98=E8=AF=8A=E6=96=AD=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=88=97=E8=A1=A8=E5=87=BA=E7=8E=B0=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=94=E9=83=A8=E5=88=86=E6=9D=A1=E7=9B=AE?= =?UTF-8?q?=E5=85=83=E6=95=B0=E6=8D=AE=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因分析: 1. 前端保存按钮无防重复点击保护,连续点击会发送多个请求 2. 保存成功后前端使用本地排序数据更新,未从服务器重新加载,导致前后端数据不一致 3. 后端 saveDoctorDiagnosis 保存后未回写 encounterDiagnosisId,后续保存无法正确更新已有记录 修复方案: - 前端:在 handleSaveDiagnosis 入口增加 isSaving 守卫,防止重复提交 - 前端:保存成功后调用 getList() 从服务器重新加载数据,确保前后端一致 - 后端:saveOrUpdate 后回写 encounterDiagnosisId 到返回参数,前端可跟踪记录ID Co-Authored-By: Claude Opus 4.7 --- .../impl/DoctorStationDiagnosisAppServiceImpl.java | 4 +++- .../home/components/diagnosis/diagnosis.vue | 13 +++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java index d36440d28..11174386c 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationDiagnosisAppServiceImpl.java @@ -261,8 +261,10 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn // 设置创建时间,避免数据库约束错误 encounterDiagnosis.setCreateTime(new Date()); iEncounterDiagnosisService.saveOrUpdate(encounterDiagnosis); + // 回写就诊诊断ID,供前端后续更新使用 + saveDiagnosisChildParam.setEncounterDiagnosisId(encounterDiagnosis.getId()); } - return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"诊断"})); + return R.ok(saveDiagnosisParam, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"诊断"})); } diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue index ed8637cf3..e50513b32 100755 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/diagnosis.vue @@ -568,6 +568,11 @@ function handleMaindise(value, index) { * 保存诊断 */ function handleSaveDiagnosis() { + // 防止重复点击保存 + if (isSaving.value) { + return; + } + for (let index = 0; index < (form.value.diagnosisList || []).length; index++) { const item = form.value.diagnosisList[index]; if (!item.diagSrtNo) { @@ -600,7 +605,7 @@ function handleSaveDiagnosis() { // 步骤2:重新分配连续的序号(从1开始) sortedList.forEach((item, index) => { - item.diagSrtNo = index + 1; // 这里是关键!把“诊断排序”改成新顺序 + item.diagSrtNo = index + 1; // 这里是关键!把”诊断排序”改成新顺序 }); // 步骤3:提交排序后的数据 @@ -610,12 +615,12 @@ function handleSaveDiagnosis() { diagnosisChildList: sortedList, }).then((res) => { if (res.code === 200) { - // 步骤4:更新本地数据,使用全新对象防止响应式问题 - form.value.diagnosisList = sortedList.map(item => ({ ...item })); - emits('diagnosisSave', false); proxy.$modal.msgSuccess('诊断已保存'); + // 保存成功后从服务器重新加载数据,确保前后端数据一致 + getList(); + // 食源性疾病逻辑 isFoodDiseasesNew({ encounterId: props.patientInfo.encounterId }).then((res2) => { if (res2.code === 20 && res2.data) {