From 683ce749f3bd520fe96c6c72a26619d14ef9caef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Thu, 14 May 2026 22:07:57 +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"=E8=AF=B7=E5=85=88=E9=85=8D=E7=BD=AE=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E6=97=B6=E9=97=B4=E6=AE=B5=E7=9A=84=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E7=A7=91=E5=AE=A4"=E5=90=8E=EF=BC=8C=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E4=BB=8D=E7=94=9F=E6=88=90=E7=94=B3=E8=AF=B7=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 合并验证逻辑:移除独立的"配置列表是否为空"检查,改为在遍历 activityList 时统一验证每个项目的执行科室配置。所有验证在任何数据库操作之前完成, 确保验证失败时不会产生脏数据。同时增加 activityList 为空时的明确提示。 --- .../impl/RequestFormManageAppServiceImpl.java | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 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 2e09c86bc..7659ec718 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 @@ -81,36 +81,35 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer Long requestFormId = requestFormSaveDto.getRequestFormId(); boolean isEdit = requestFormId != null && requestFormId != 0L; - // 诊疗执行科室配置校验(必须在任何数据库操作之前) - List activityOrganizationConfig = - requestFormManageAppMapper.getActivityOrganizationConfig(typeCode); - if (activityOrganizationConfig.isEmpty()) { - throw new ServiceException("请先配置当前时间段的执行科室"); + // 校验所有activityList中的项目是否都配置了执行科室,并收集positionId供后续使用 + // 必须在任何数据库操作之前完成全部校验,避免部分保存后异常导致脏数据 + List activityList = requestFormSaveDto.getActivityList(); + if (activityList == null || activityList.isEmpty()) { + throw new ServiceException("请选择检查项目"); } - // 逐个校验activityList中的项目是否都配置了执行科室,并收集positionId供后续使用 - // 必须在任何数据库操作之前完成全部校验,避免部分保存后异常导致脏数据 - // 🔧 Bug #516: 优先使用前端传入的positionId(用户手动选择的发往科室),仅在未选择时使用配置的执行科室 - List activityList = requestFormSaveDto.getActivityList(); - // 缓存校验结果,避免主循环中重复查询和可能出现的数据不一致 + // 🔧 Bug #475: 查询诊疗执行科室配置 + List activityOrganizationConfig = + requestFormManageAppMapper.getActivityOrganizationConfig(typeCode); + + // 缓存校验结果,先全部验证通过后再进行数据库操作 + // 优先使用前端传入的positionId(用户手动选择的发往科室),仅在未选择时使用配置的执行科室 java.util.Map activityIdToPositionIdMap = new java.util.HashMap<>(); - if (activityList != null && !activityList.isEmpty()) { - for (ActivitySaveDto activitySaveDto : activityList) { - // 优先使用前端传入的positionId(用户手动选择的科室) - Long frontendPositionId = activitySaveDto.getPositionId(); - if (frontendPositionId != null) { - activityIdToPositionIdMap.put(activitySaveDto.getAdviceDefinitionId(), frontendPositionId); - continue; - } - // 前端未传入时,使用配置的执行科室 - Long configPositionId = activityOrganizationConfig.stream() - .filter(dto -> activitySaveDto.getAdviceDefinitionId().equals(dto.getActivityDefinitionId())) - .map(ActivityOrganizationConfigDto::getOrganizationId).findFirst().orElse(null); - if (configPositionId == null) { - throw new ServiceException(activitySaveDto.getAdviceDefinitionName() + "未配置当前时间段的执行科室"); - } - activityIdToPositionIdMap.put(activitySaveDto.getAdviceDefinitionId(), configPositionId); + for (ActivitySaveDto activitySaveDto : activityList) { + // 优先使用前端传入的positionId(用户手动选择的科室) + Long frontendPositionId = activitySaveDto.getPositionId(); + if (frontendPositionId != null) { + activityIdToPositionIdMap.put(activitySaveDto.getAdviceDefinitionId(), frontendPositionId); + continue; } + // 前端未传入时,使用配置的执行科室 + Long configPositionId = activityOrganizationConfig.stream() + .filter(dto -> activitySaveDto.getAdviceDefinitionId().equals(dto.getActivityDefinitionId())) + .map(ActivityOrganizationConfigDto::getOrganizationId).findFirst().orElse(null); + if (configPositionId == null) { + throw new ServiceException(activitySaveDto.getAdviceDefinitionName() + "未配置当前时间段的执行科室"); + } + activityIdToPositionIdMap.put(activitySaveDto.getAdviceDefinitionId(), configPositionId); } // 诊疗处方号