From 852a2a83b01e21f5aa91360ede1422aa40ac664e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=A4=87?= <刘备@gentronhealth.com> Date: Wed, 13 May 2026 00:13:09 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#489:=20=E3=80=90=E5=8C=BB=E5=98=B1?= =?UTF-8?q?=E9=97=AD=E7=8E=AF=E3=80=91=E5=8C=BB=E7=94=9F=E7=AB=99=E7=AD=BE?= =?UTF-8?q?=E5=8F=91=E5=8D=95=E6=9D=A1=E9=95=BF=E6=9C=9F=E8=8D=AF=E5=93=81?= =?UTF-8?q?=E5=8C=BB=E5=98=B1=EF=BC=8C=E6=8A=A4=E5=A3=AB=E6=A0=A1=E5=AF=B9?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E7=94=9F=E6=88=90=E9=87=8D=E5=A4=8D=EF=BC=88?= =?UTF-8?q?=E4=B8=A4=E6=9D=A1=EF=BC=89=E5=BE=85=E6=A0=A1=E5=AF=B9=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在住院医生站签发流程的 handMedication() 方法中增加去重逻辑, 与门诊医生站保持一致,使用 patientId+encounterId+adviceDefinitionId+dose+methodCode+rateCode 作为唯一键,防止前端重复提交导致数据库产生重复医嘱记录。 Co-Authored-By: Claude Opus 4.7 --- .../impl/AdviceManageAppServiceImpl.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java index 1428e2ee6..d18d54b66 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/AdviceManageAppServiceImpl.java @@ -341,6 +341,28 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService { && (DbOpType.INSERT.getCode().equals(e.getDbOpType()) || DbOpType.UPDATE.getCode().equals(e.getDbOpType()))) .collect(Collectors.toList()); + // 防重复保存:对新增医嘱进行去重,避免签发单条长期医嘱时产生重复记录 + Set longUniqueKeySet = new HashSet<>(); + List longUniqueList = new ArrayList<>(); + for (RegAdviceSaveDto adviceSaveDto : longInsertOrUpdateList) { + String uniqueKey = adviceSaveDto.getPatientId() + "_" + + adviceSaveDto.getEncounterId() + "_" + + adviceSaveDto.getAdviceDefinitionId() + "_" + + adviceSaveDto.getDose() + "_" + + adviceSaveDto.getMethodCode() + "_" + + adviceSaveDto.getRateCode(); + if (DbOpType.INSERT.getCode().equals(adviceSaveDto.getDbOpType()) && longUniqueKeySet.contains(uniqueKey)) { + log.warn("防重复保存:检测到重复长期医嘱,跳过保存 - patientId={}, encounterId={}, adviceDefinitionId={}, dose={}", + adviceSaveDto.getPatientId(), adviceSaveDto.getEncounterId(), + adviceSaveDto.getAdviceDefinitionId(), adviceSaveDto.getDose()); + continue; + } + longUniqueKeySet.add(uniqueKey); + longUniqueList.add(adviceSaveDto); + } + log.info("防重复保存(长期):去重前{}条,去重后{}条", longInsertOrUpdateList.size(), longUniqueList.size()); + longInsertOrUpdateList = longUniqueList; + for (RegAdviceSaveDto regAdviceSaveDto : longInsertOrUpdateList) { boolean firstTimeSave = false;// 第一次保存 longMedicationRequest = new MedicationRequest(); @@ -406,6 +428,29 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService { .getValue().equals(e.getTherapyEnum()) && (DbOpType.INSERT.getCode().equals(e.getDbOpType()) || DbOpType.UPDATE.getCode().equals(e.getDbOpType()))) .collect(Collectors.toList()); + + // 防重复保存:对新增医嘱进行去重 + Set tempUniqueKeySet = new HashSet<>(); + List tempUniqueList = new ArrayList<>(); + for (RegAdviceSaveDto adviceSaveDto : tempInsertOrUpdateList) { + String uniqueKey = adviceSaveDto.getPatientId() + "_" + + adviceSaveDto.getEncounterId() + "_" + + adviceSaveDto.getAdviceDefinitionId() + "_" + + adviceSaveDto.getDose() + "_" + + adviceSaveDto.getMethodCode() + "_" + + adviceSaveDto.getRateCode(); + if (DbOpType.INSERT.getCode().equals(adviceSaveDto.getDbOpType()) && tempUniqueKeySet.contains(uniqueKey)) { + log.warn("防重复保存:检测到重复临时医嘱,跳过保存 - patientId={}, encounterId={}, adviceDefinitionId={}, dose={}", + adviceSaveDto.getPatientId(), adviceSaveDto.getEncounterId(), + adviceSaveDto.getAdviceDefinitionId(), adviceSaveDto.getDose()); + continue; + } + tempUniqueKeySet.add(uniqueKey); + tempUniqueList.add(adviceSaveDto); + } + log.info("防重复保存(临时):去重前{}条,去重后{}条", tempInsertOrUpdateList.size(), tempUniqueList.size()); + tempInsertOrUpdateList = tempUniqueList; + for (RegAdviceSaveDto regAdviceSaveDto : tempInsertOrUpdateList) { boolean firstTimeSave = false;// 第一次保存 tempMedicationRequest = new MedicationRequest();