Fix Bug #571: 修复检验申请撤回时hasCollectedSpecimen检查范围过宽

根因: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 <noreply@anthropic.com>
This commit is contained in:
2026-05-22 12:07:04 +08:00
parent 3a17b518f8
commit 5f18e8bd73

View File

@@ -632,26 +632,24 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
return R.fail("未找到关联的诊疗医嘱");
}
List<Long> serviceRequestIds = serviceRequests.stream()
// 筛选出ACTIVE状态的ServiceRequest与SQL的EXISTS逻辑一致
List<Long> 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<ServiceRequest>()
.in(ServiceRequest::getId, serviceRequestIds)
.in(ServiceRequest::getId, activeServiceRequestIds)
.eq(ServiceRequest::getStatusEnum, RequestStatus.ACTIVE.getValue()));
if (!updated) {
return R.fail("撤回失败,医嘱状态已变更,请刷新后重试");