From 2bb9b0a07f00daac9325d9273ea758640806e608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Thu, 14 May 2026 11:14:11 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#475:=20=E3=80=90=E4=BD=8F=E9=99=A2?= =?UTF-8?q?=E5=8C=BB=E7=94=9F=E5=B7=A5=E4=BD=9C=E7=AB=99=E3=80=91=E5=BC=80?= =?UTF-8?q?=E7=AB=8B=E6=A3=80=E6=9F=A5=E7=94=B3=E8=AF=B7=E5=8D=95=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E5=90=8E=E4=BB=8D=E7=94=9F=E6=88=90=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:saveRequestForm方法的预校验循环和主循环分别独立查询activityOrganizationConfig获取positionId, 存在数据不一致风险——预校验通过但主循环中positionId查找失败时,RequestForm已被保存导致脏数据。 修复:将预校验循环中查到的positionId缓存到Map中,主循环直接使用缓存结果, 避免重复查询导致的数据不一致问题。确保所有校验通过后再执行任何数据库操作。 Co-Authored-By: Claude Opus 4.7 --- .../impl/RequestFormManageAppServiceImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java index ad87b75c4..3c8974e9b 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/regdoctorstation/appservice/impl/RequestFormManageAppServiceImpl.java @@ -87,8 +87,11 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer throw new ServiceException("请先配置当前时间段的执行科室"); } - // 逐个校验activityList中的项目是否都配置了执行科室,避免部分通过后在循环中抛异常导致事务复杂化 + // 逐个校验activityList中的项目是否都配置了执行科室,并收集positionId供后续使用 + // 必须在任何数据库操作之前完成全部校验,避免部分保存后异常导致脏数据 List activityList = requestFormSaveDto.getActivityList(); + // 缓存校验结果,避免主循环中重复查询和可能出现的数据不一致 + java.util.Map activityIdToPositionIdMap = new java.util.HashMap<>(); if (activityList != null && !activityList.isEmpty()) { for (ActivitySaveDto activitySaveDto : activityList) { Long positionId = activityOrganizationConfig.stream() @@ -97,6 +100,7 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer if (positionId == null) { throw new ServiceException(activitySaveDto.getAdviceDefinitionName() + "未配置当前时间段的执行科室"); } + activityIdToPositionIdMap.put(activitySaveDto.getAdviceDefinitionId(), positionId); } } @@ -179,9 +183,7 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer serviceRequest.setEncounterId(encounterId); // 就诊id serviceRequest.setAuthoredTime(curDate); // 请求签发时间 - Long positionId = activityOrganizationConfig.stream() - .filter(dto -> activitySaveDto.getAdviceDefinitionId().equals(dto.getActivityDefinitionId())) - .map(ActivityOrganizationConfigDto::getOrganizationId).findFirst().orElse(null); + Long positionId = activityIdToPositionIdMap.get(activitySaveDto.getAdviceDefinitionId()); if (positionId == null) { throw new ServiceException(activitySaveDto.getAdviceDefinitionName() + "未配置当前时间段的执行科室"); }