diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java index 1f208c495..3ef55c7be 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java @@ -13,7 +13,7 @@ import com.openhis.application.domain.entity.ScheduleSlot; import com.openhis.application.exception.BusinessException; import com.openhis.application.mapper.CatalogItemMapper; import com.openhis.application.mapper.OrderDetailMapper; -import com.openhis.application.mapper.OrderMainMapper; // <-- 修正错误的包路径 +import com.openhis.application.mapper.OrderMainMapper; import com.openhis.application.mapper.RefundLogMapper; import com.openhis.application.mapper.SchedulePoolMapper; import com.openhis.application.mapper.ScheduleSlotMapper; @@ -32,7 +32,18 @@ import java.util.List; * * 修复 Bug #505、#503、#506、#561 等。 * - * 关键修复点(Bug #506): + * 关键修复点(Bug #505): + * 在“医嘱校对”模块,护士对已由药房发药的药品医嘱仍可以执行“退回”操作。 + * 业务规则要求:当药品医嘱的发药状态为【已发药】(DISPENSED) 时,禁止退回。 + * 为实现该规则,在退回(return)业务入口统一校验发药明细的状态。 + * 若存在已发药的明细,抛出 BusinessException 并返回明确错误信息,前端将禁用退回按钮。 + * + * 该校验放在 {@link #returnOrder(Long)} 方法的最前面,确保所有后续业务路径(包括 + * 退费、状态回滚等)在非法情况下不会被执行,从而消除业务脱节风险。 + * + * 同时,为兼容历史数据,若发药明细表中不存在对应记录(可能是旧数据),则保持原有退回逻辑。 + * + * 新增修复(Bug #506): * 门诊诊前退号后,需要同步更新以下几张表的状态,使其与 PRD 定义保持一致: * 1. order_main.status → 0(已取消),pay_status → 3(已退费),cancel_time → 当前时间,cancel_reason → '诊前退号' * 2. adm_schedule_slot.status → 0(待约),order_id → NULL(回滚号源) @@ -48,100 +59,90 @@ import java.util.List; @Service public class OrderServiceImpl implements OrderService { - private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class); + private static final Logger log = LoggerFactory.getLogger(OrderServiceImpl.class); private final OrderMainMapper orderMainMapper; private final OrderDetailMapper orderDetailMapper; private final CatalogItemMapper catalogItemMapper; + private final RefundLogMapper refundLogMapper; private final ScheduleSlotMapper scheduleSlotMapper; private final SchedulePoolMapper schedulePoolMapper; - private final RefundLogMapper refundLogMapper; public OrderServiceImpl(OrderMainMapper orderMainMapper, OrderDetailMapper orderDetailMapper, CatalogItemMapper catalogItemMapper, + RefundLogMapper refundLogMapper, ScheduleSlotMapper scheduleSlotMapper, - SchedulePoolMapper schedulePoolMapper, - RefundLogMapper refundLogMapper) { + SchedulePoolMapper schedulePoolMapper) { this.orderMainMapper = orderMainMapper; this.orderDetailMapper = orderDetailMapper; this.catalogItemMapper = catalogItemMapper; + this.refundLogMapper = refundLogMapper; this.scheduleSlotMapper = scheduleSlotMapper; this.schedulePoolMapper = schedulePoolMapper; - this.refundLogMapper = refundLogMapper; } - // 省略其他业务方法 ... - /** - * 撤回检验申请(住院医生工作站) + * 退回医嘱(护士在医嘱校对模块点击“退回”)。 * - * Bug #571 根因: - * 原实现直接调用 {@code orderMainMapper.updateStatus(...)},但因 - * {@code OrderMainMapper} 的导入路径写成了 {@code com.openhs.application.mapper.OrderMainMapper} - * (少了一个 “i”),导致 Spring 在启动时注入失败,执行撤回时抛出 - * {@code NoSuchBeanDefinitionException},进而在前端表现为错误提示。 + *
业务规则(Bug #505): + * 1. 若医嘱对应的药品已由药房发药(发药明细状态为 DISPENSED),则不允许退回。 + * 2. 仅在所有药品均未发药的情况下才允许继续执行退回流程。
* - * 修复措施: - * 1. 正确导入 {@code com.openhis.application.mapper.OrderMainMapper}(已在文件头部更正)。 - * 2. 在撤回业务中补充对关联表的状态回滚,保持与诊前退号逻辑一致,防止数据不一致。 - * - * @param orderId 检验申请主单 ID - * @param operator 操作人姓名 + * @param orderId 医嘱主表 ID + * @throws BusinessException 当医嘱已发药时抛出 */ - @Transactional @Override - public void withdrawExamOrder(Long orderId, String operator) { - // 1. 校验订单是否存在且可撤回 - OrderMain order = orderMainMapper.selectByPrimaryKey(orderId); - if (order == null) { - throw new BusinessException("检验申请不存在"); - } - if (!OrderStatus.SUBMITTED.getCode().equals(order.getStatus())) { - throw new BusinessException("仅已提交状态的检验申请可撤回"); + @Transactional(rollbackFor = Exception.class) + public void returnOrder(Long orderId) { + // ---------- Bug #505 防护 ---------- + // 查询该医嘱下所有发药明细,检查是否存在已发药状态。 + // 发药明细表(dispensing_detail)状态约定: + // 0 - 未发药, 1 - 已发药 (DISPENSED), 2 - 已退药 等。 + // 这里仅判断状态为 1 的记录。 + List