From 5f18e8bd731e45225856575f487cc3142dd2890c Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Fri, 22 May 2026 12:07:04 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#571:=20=E4=BF=AE=E5=A4=8D=E6=A3=80?= =?UTF-8?q?=E9=AA=8C=E7=94=B3=E8=AF=B7=E6=92=A4=E5=9B=9E=E6=97=B6hasCollec?= =?UTF-8?q?tedSpecimen=E6=A3=80=E6=9F=A5=E8=8C=83=E5=9B=B4=E8=BF=87?= =?UTF-8?q?=E5=AE=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:SQL的computed_status使用EXISTS判断(status_enum=2即显示已签发), 但后端hasCollectedSpecimen检查该处方下所有ServiceRequest的标本状态, 包括非ACTIVE状态的。当处方下存在混合状态的ServiceRequest时 (如一个ACTIVE+一个COMPLETED且有已采标本),前端显示"已签发" (因为EXISTS status_enum=2为true),但后端因COMPLETED请求的标本 已采集而拒绝撤回,导致报错。 修复:先筛选出ACTIVE状态的ServiceRequest ID列表,再用该列表 校验标本采集状态和执行状态更新,与SQL的EXISTS逻辑完全一致。 Co-Authored-By: Claude Opus 4.7 --- .../impl/RequestFormManageAppServiceImpl.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 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 a3f65304..ad9379d6 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 @@ -632,26 +632,24 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer return R.fail("未找到关联的诊疗医嘱"); } - List serviceRequestIds = serviceRequests.stream() + // 筛选出ACTIVE状态的ServiceRequest,与SQL的EXISTS逻辑一致 + List activeServiceRequestIds = serviceRequests.stream() + .filter(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum())) .map(ServiceRequest::getId).collect(Collectors.toList()); - - // 校验:标本已采集则不可撤回 - if (hasCollectedSpecimen(serviceRequestIds)) { - return R.fail("标本已采集,无法撤回"); + if (activeServiceRequestIds.isEmpty()) { + return R.fail("只有已签发且未采证的申请单可撤回"); } - // 校验:任一ServiceRequest为ACTIVE(status=2)即可撤回,与SQL的EXISTS逻辑一致 - boolean hasActive = serviceRequests.stream() - .anyMatch(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum())); - if (!hasActive) { - return R.fail("只有已签发且未采证的申请单可撤回"); + // 校验:仅检查ACTIVE状态医嘱的标本采集情况,与SQL的computed_status逻辑一致 + if (hasCollectedSpecimen(activeServiceRequestIds)) { + return R.fail("标本已采集,无法撤回"); } // 将所有已签发的 ServiceRequest 状态改回待签发,与申请单展示状态同步 boolean updated = iServiceRequestService.update( new ServiceRequest().setStatusEnum(RequestStatus.DRAFT.getValue()), new LambdaUpdateWrapper() - .in(ServiceRequest::getId, serviceRequestIds) + .in(ServiceRequest::getId, activeServiceRequestIds) .eq(ServiceRequest::getStatusEnum, RequestStatus.ACTIVE.getValue())); if (!updated) { return R.fail("撤回失败,医嘱状态已变更,请刷新后重试");