Fix Bug #571: 修复检验申请撤回操作状态校验逻辑不一致

根因:SQL查询使用EXISTS判断(任一ServiceRequest为ACTIVE即显示已签发),
但后端撤回校验使用allMatch(要求所有ServiceRequest均为ACTIVE)。
当多项申请单中部分为待签发时,前端显示已签发但后端拒绝撤回,导致报错。

修复:
1. 将allMatch改为anyMatch,与SQL的EXISTS逻辑保持一致
2. 仅更新ACTIVE状态的ServiceRequest为DRAFT,避免影响其他状态
3. 增加update返回值校验,处理并发场景下的状态变更

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-22 11:40:46 +08:00
parent 385c3e0990
commit 1f653ed729

View File

@@ -647,11 +647,15 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
return R.fail("只有已签发且未采证的申请单可撤回");
}
// 将所有 ServiceRequest 状态改回待签发,与申请单展示状态同步
iServiceRequestService.update(
// 将所有已签发的 ServiceRequest 状态改回待签发,与申请单展示状态同步
boolean updated = iServiceRequestService.update(
new ServiceRequest().setStatusEnum(RequestStatus.DRAFT.getValue()),
new LambdaUpdateWrapper<ServiceRequest>()
.in(ServiceRequest::getId, serviceRequestIds));
.in(ServiceRequest::getId, serviceRequestIds)
.eq(ServiceRequest::getStatusEnum, RequestStatus.ACTIVE.getValue()));
if (!updated) {
return R.fail("撤回失败,医嘱状态已变更,请刷新后重试");
}
log.info("检验申请单撤回成功requestFormId={}, prescriptionNo={}", requestFormId, prescriptionNo);
return R.ok("撤回成功");