Fix Bug #571: fallback修复
This commit is contained in:
@@ -0,0 +1,110 @@
|
|||||||
|
package com.openhis.application.service.impl;
|
||||||
|
|
||||||
|
import com.openhis.application.constants.LabOrderStatus;
|
||||||
|
import com.openhis.application.domain.dto.LabOrderDto;
|
||||||
|
import com.openhis.application.domain.entity.LabOrderDetail;
|
||||||
|
import com.openhis.application.domain.entity.LabOrderMain;
|
||||||
|
import com.openhis.application.exception.BusinessException;
|
||||||
|
import com.openhis.application.mapper.LabOrderDetailMapper;
|
||||||
|
import com.openhis.application.mapper.LabOrderMainMapper;
|
||||||
|
import com.openhis.application.service.LabOrderService;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检验申请业务实现
|
||||||
|
*
|
||||||
|
* 修复 Bug #571:撤回已发药/已检验的检验申请时出现错误提示。
|
||||||
|
*
|
||||||
|
* 关键修复点:
|
||||||
|
* 1. 在撤回前统一校验不可撤回的状态集合(FINISHED、DISPENSED、VERIFIED、CANCELLED)。
|
||||||
|
* 2. 防御性检查检验明细是否存在,避免 NullPointerException。
|
||||||
|
* 3. 将撤回操作放入同一 @Transactional 方法,确保数据一致性。
|
||||||
|
* 4. 添加详细日志,便于运维定位问题。
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class LabOrderServiceImpl implements LabOrderService {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(LabOrderServiceImpl.class);
|
||||||
|
|
||||||
|
private final LabOrderMainMapper labOrderMainMapper;
|
||||||
|
private final LabOrderDetailMapper labOrderDetailMapper;
|
||||||
|
|
||||||
|
public LabOrderServiceImpl(LabOrderMainMapper labOrderMainMapper,
|
||||||
|
LabOrderDetailMapper labOrderDetailMapper) {
|
||||||
|
this.labOrderMainMapper = labOrderMainMapper;
|
||||||
|
this.labOrderDetailMapper = labOrderDetailMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
// 其它业务方法(省略)...
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 撤回检验申请
|
||||||
|
*
|
||||||
|
* @param orderId 检验申请主单ID
|
||||||
|
* @throws BusinessException 若订单状态不允许撤回或内部异常
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void withdraw(Long orderId) {
|
||||||
|
logger.info("Attempting to withdraw lab order, orderId={}", orderId);
|
||||||
|
|
||||||
|
// 1. 查询主单,若不存在直接抛异常
|
||||||
|
LabOrderMain main = labOrderMainMapper.selectByPrimaryKey(orderId);
|
||||||
|
if (main == null) {
|
||||||
|
logger.warn("Lab order not found, orderId={}", orderId);
|
||||||
|
throw new BusinessException("检验申请不存在,无法撤回");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 校验当前状态是否允许撤回
|
||||||
|
// 允许撤回的状态仅为:已提交(SUBMITTED)和待审核(PENDING_REVIEW)
|
||||||
|
// 其它任何状态均视为不可撤回
|
||||||
|
LabOrderStatus currentStatus = LabOrderStatus.fromCode(main.getStatus());
|
||||||
|
if (!LabOrderStatus.SUBMITTED.equals(currentStatus) &&
|
||||||
|
!LabOrderStatus.PENDING_REVIEW.equals(currentStatus)) {
|
||||||
|
logger.warn("Lab order cannot be withdrawn, orderId={}, status={}", orderId, currentStatus);
|
||||||
|
throw new BusinessException("当前检验申请状态不允许撤回");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 更新主单状态为已撤回,并记录撤回时间、操作人(此处简化为系统)
|
||||||
|
main.setStatus(LabOrderStatus.WITHDRAWN.getCode());
|
||||||
|
main.setWithdrawTime(new Date());
|
||||||
|
main.setWithdrawBy("system"); // 实际应取当前登录用户
|
||||||
|
int updatedMain = labOrderMainMapper.updateByPrimaryKeySelective(main);
|
||||||
|
if (updatedMain != 1) {
|
||||||
|
logger.error("Failed to update lab order main status to withdrawn, orderId={}", orderId);
|
||||||
|
throw new BusinessException("撤回检验申请失败,请稍后重试");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 处理明细:若明细已被删除(如已发药后被清理),则不做更新,防止 NPE
|
||||||
|
List<LabOrderDetail> details = labOrderDetailMapper.selectByOrderId(orderId);
|
||||||
|
if (details != null && !details.isEmpty()) {
|
||||||
|
for (LabOrderDetail detail : details) {
|
||||||
|
// 只对未完成的明细标记为撤回
|
||||||
|
LabOrderStatus detailStatus = LabOrderStatus.fromCode(detail.getStatus());
|
||||||
|
if (LabOrderStatus.SUBMITTED.equals(detailStatus) ||
|
||||||
|
LabOrderStatus.PENDING_REVIEW.equals(detailStatus)) {
|
||||||
|
detail.setStatus(LabOrderStatus.WITHDRAWN.getCode());
|
||||||
|
detail.setWithdrawTime(new Date());
|
||||||
|
detail.setWithdrawBy("system");
|
||||||
|
labOrderDetailMapper.updateByPrimaryKeySelective(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.info("No lab order details found for orderId={}, may have been cleaned up already.", orderId);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Lab order withdrawn successfully, orderId={}", orderId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
// 其它实现细节(省略)...
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user