From b5765a6e631ea6abd9265e00f34f7c498686de2c Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Fri, 22 May 2026 09:47:11 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#571:=20=E6=A3=80=E9=AA=8C=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=92=A4=E5=9B=9E=E6=93=8D=E4=BD=9C=E6=97=B6=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:SQL查询计算computed_status时,只要ANY ServiceRequest为ACTIVE(status_enum=2) 就显示"已签发",但后端withdrawRequestForm方法要求ALL ServiceRequest都为ACTIVE才允许撤回。 当处方下存在混合状态的ServiceRequest(如一个DRAFT+一个ACTIVE)时,前端显示撤回按钮, 但后端拒绝操作返回错误。 修复:将allMatch改为anyMatch,允许至少有一条ACTIVE记录即可撤回, 且只更新ACTIVE状态的ServiceRequest为DRAFT,跳过非ACTIVE的记录。 --- .../impl/RequestFormManageAppServiceImpl.java | 27 +++++++++++-------- .../openhis/lab/mapper/SpecimenMapper.java | 8 ++++++ .../resources/mapper/lab/SpecimenMapper.xml | 9 +++++++ 3 files changed, 33 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 a3c7198c..e3bbfa81 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 @@ -73,6 +73,9 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer @Resource ISpecimenService iSpecimenService; + @Resource + com.openhis.lab.mapper.SpecimenMapper specimenMapper; + /** * 校验当前用户是否有权操作该申请单(申请者本人或管理员) */ @@ -91,15 +94,13 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer /** * 校验关联医嘱是否已采证(存在已采集/已接收标本则不可撤回) + * 注意:lab_specimen 表无 delete_flag 列,不能使用 MyBatis-Plus LambdaQueryWrapper(会自动加 delete_flag 条件导致 SQL 报错) */ private boolean hasCollectedSpecimen(List serviceRequestIds) { if (serviceRequestIds == null || serviceRequestIds.isEmpty()) { return false; } - long count = iSpecimenService.count( - new LambdaQueryWrapper() - .in(Specimen::getServiceId, serviceRequestIds) - .ge(Specimen::getCollectionStatusEnum, SpecCollectStatus.COLLECTED.getValue())); + long count = specimenMapper.countCollectedByServiceIds(serviceRequestIds, SpecCollectStatus.COLLECTED.getValue()); return count > 0; } @@ -640,18 +641,22 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer return R.fail("标本已采集,无法撤回"); } - // 校验:只有已签发(status=2)的申请单可撤回 - boolean allActive = serviceRequests.stream() - .allMatch(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum())); - if (!allActive) { - return R.fail("只有已签发且未采证的申请单可撤回"); + // 校验:至少有一条已签发(status=2)的申请单才可撤回 + boolean anyActive = serviceRequests.stream() + .anyMatch(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum())); + if (!anyActive) { + return R.fail("没有已签发的诊疗医嘱,无法撤回"); } - // 将所有 ServiceRequest 状态改回待签发,与申请单展示状态同步 + // 将已签发的 ServiceRequest 状态改回待签发,与申请单展示状态同步 + List activeServiceRequestIds = serviceRequests.stream() + .filter(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum())) + .map(ServiceRequest::getId) + .collect(Collectors.toList()); iServiceRequestService.update( new ServiceRequest().setStatusEnum(RequestStatus.DRAFT.getValue()), new LambdaUpdateWrapper() - .in(ServiceRequest::getId, serviceRequestIds)); + .in(ServiceRequest::getId, activeServiceRequestIds)); log.info("检验申请单撤回成功,requestFormId={}, prescriptionNo={}", requestFormId, prescriptionNo); return R.ok("撤回成功"); diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java index bb198782..03631a29 100755 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java @@ -3,6 +3,9 @@ package com.openhis.lab.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.openhis.lab.domain.Specimen; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 【请填写功能名称】Mapper接口 @@ -13,4 +16,9 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SpecimenMapper extends BaseMapper { + /** + * 统计已采集/已接收的标本数量(绕过 @TableLogic,因 lab_specimen 表无 delete_flag 列) + */ + long countCollectedByServiceIds(@Param("serviceIds") List serviceIds, + @Param("minStatus") Integer minStatus); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml index d80d461a..2b39376b 100755 --- a/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml @@ -4,4 +4,13 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + \ No newline at end of file