Fix Bug #571: 检验申请撤回操作时触发错误提示
根因:SQL查询计算computed_status时,只要ANY ServiceRequest为ACTIVE(status_enum=2) 就显示"已签发",但后端withdrawRequestForm方法要求ALL ServiceRequest都为ACTIVE才允许撤回。 当处方下存在混合状态的ServiceRequest(如一个DRAFT+一个ACTIVE)时,前端显示撤回按钮, 但后端拒绝操作返回错误。 修复:将allMatch改为anyMatch,允许至少有一条ACTIVE记录即可撤回, 且只更新ACTIVE状态的ServiceRequest为DRAFT,跳过非ACTIVE的记录。
This commit is contained in:
@@ -73,6 +73,9 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
|
|||||||
@Resource
|
@Resource
|
||||||
ISpecimenService iSpecimenService;
|
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<Long> serviceRequestIds) {
|
private boolean hasCollectedSpecimen(List<Long> serviceRequestIds) {
|
||||||
if (serviceRequestIds == null || serviceRequestIds.isEmpty()) {
|
if (serviceRequestIds == null || serviceRequestIds.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
long count = iSpecimenService.count(
|
long count = specimenMapper.countCollectedByServiceIds(serviceRequestIds, SpecCollectStatus.COLLECTED.getValue());
|
||||||
new LambdaQueryWrapper<Specimen>()
|
|
||||||
.in(Specimen::getServiceId, serviceRequestIds)
|
|
||||||
.ge(Specimen::getCollectionStatusEnum, SpecCollectStatus.COLLECTED.getValue()));
|
|
||||||
return count > 0;
|
return count > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -640,18 +641,22 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
|
|||||||
return R.fail("标本已采集,无法撤回");
|
return R.fail("标本已采集,无法撤回");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 校验:只有已签发(status=2)的申请单可撤回
|
// 校验:至少有一条已签发(status=2)的申请单才可撤回
|
||||||
boolean allActive = serviceRequests.stream()
|
boolean anyActive = serviceRequests.stream()
|
||||||
.allMatch(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum()));
|
.anyMatch(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum()));
|
||||||
if (!allActive) {
|
if (!anyActive) {
|
||||||
return R.fail("只有已签发且未采证的申请单可撤回");
|
return R.fail("没有已签发的诊疗医嘱,无法撤回");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将所有 ServiceRequest 状态改回待签发,与申请单展示状态同步
|
// 将已签发的 ServiceRequest 状态改回待签发,与申请单展示状态同步
|
||||||
|
List<Long> activeServiceRequestIds = serviceRequests.stream()
|
||||||
|
.filter(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum()))
|
||||||
|
.map(ServiceRequest::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
iServiceRequestService.update(
|
iServiceRequestService.update(
|
||||||
new ServiceRequest().setStatusEnum(RequestStatus.DRAFT.getValue()),
|
new ServiceRequest().setStatusEnum(RequestStatus.DRAFT.getValue()),
|
||||||
new LambdaUpdateWrapper<ServiceRequest>()
|
new LambdaUpdateWrapper<ServiceRequest>()
|
||||||
.in(ServiceRequest::getId, serviceRequestIds));
|
.in(ServiceRequest::getId, activeServiceRequestIds));
|
||||||
|
|
||||||
log.info("检验申请单撤回成功,requestFormId={}, prescriptionNo={}", requestFormId, prescriptionNo);
|
log.info("检验申请单撤回成功,requestFormId={}, prescriptionNo={}", requestFormId, prescriptionNo);
|
||||||
return R.ok("撤回成功");
|
return R.ok("撤回成功");
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package com.openhis.lab.mapper;
|
|||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.openhis.lab.domain.Specimen;
|
import com.openhis.lab.domain.Specimen;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 【请填写功能名称】Mapper接口
|
* 【请填写功能名称】Mapper接口
|
||||||
@@ -13,4 +16,9 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
@Mapper
|
@Mapper
|
||||||
public interface SpecimenMapper extends BaseMapper<Specimen> {
|
public interface SpecimenMapper extends BaseMapper<Specimen> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计已采集/已接收的标本数量(绕过 @TableLogic,因 lab_specimen 表无 delete_flag 列)
|
||||||
|
*/
|
||||||
|
long countCollectedByServiceIds(@Param("serviceIds") List<Long> serviceIds,
|
||||||
|
@Param("minStatus") Integer minStatus);
|
||||||
}
|
}
|
||||||
@@ -4,4 +4,13 @@
|
|||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.openhis.lab.mapper.SpecimenMapper">
|
<mapper namespace="com.openhis.lab.mapper.SpecimenMapper">
|
||||||
|
|
||||||
|
<select id="countCollectedByServiceIds" resultType="long">
|
||||||
|
SELECT COUNT(*) FROM lab_specimen
|
||||||
|
WHERE service_id IN
|
||||||
|
<foreach collection="serviceIds" item="id" open="(" separator="," close=")">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
AND collection_status_enum >= #{minStatus}
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
Reference in New Issue
Block a user