diff --git a/src/main/java/com/openhis/application/service/impl/OrderVerificationServiceImpl.java b/src/main/java/com/openhis/application/service/impl/OrderVerificationServiceImpl.java index 31dc5c6be..de4c2b8ee 100644 --- a/src/main/java/com/openhis/application/service/impl/OrderVerificationServiceImpl.java +++ b/src/main/java/com/openhis/application/service/impl/OrderVerificationServiceImpl.java @@ -3,6 +3,7 @@ package com.openhis.application.service.impl; import com.openhis.application.mapper.OrderDetailMapper; import com.openhis.application.mapper.OrderMainMapper; import com.openhis.application.domain.entity.OrderMain; +import com.openhis.application.domain.entity.OrderDetail; import com.openhis.application.exception.BusinessException; import com.openhis.application.dto.OrderVerificationDTO; import com.openhis.application.mapper.OrderVerificationMapper; @@ -28,6 +29,18 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { private final OrderDetailMapper orderDetailMapper; private final OrderVerificationMapper orderVerificationMapper; + // ----------------------------------------------------------------- + // 状态常量(与生产环境(PRD)定义保持一致) + // ----------------------------------------------------------------- + /** 医嘱状态:已发药(不可退回) */ + private static final int STATUS_DISPENSED = 2; + /** 医嘱状态:待校对 */ + private static final int STATUS_PENDING = 0; + /** 医嘱状态:已校对 */ + private static final int STATUS_VERIFIED = 1; + /** 医嘱状态:已退回(门诊退号后对应的状态) */ + private static final int STATUS_RETURNED = 3; // 与 PRD 中的 “已退号” 对应 + public OrderVerificationServiceImpl(OrderMainMapper orderMainMapper, OrderDetailMapper orderDetailMapper, OrderVerificationMapper orderVerificationMapper) { @@ -38,6 +51,14 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { /** * 医嘱退回(撤销)操作 + * + * 业务规则(已在 Bug #505 中实现): + * 1. 当医嘱已发药(status = 2)时,禁止退回; + * 2. 仅在 “待校对”(0) 或 “已校对”(1) 状态下才允许退回。 + * + * 额外规则(Bug #506): + * 门诊诊前退号后,需要把主表、明细表以及校对关联表的状态统一更新为 + * PRD 环境中定义的 “已退号” 状态(值为 3),并记录退号原因。 */ @Override @Transactional(rollbackFor = Exception.class) @@ -48,32 +69,42 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { throw new BusinessException("医嘱不存在"); } - // 2. 业务规则校验:已发药的医嘱(status = 2)禁止退回 - // 只允许在“待校对”(0) 或 “已校对”(1) 状态下退回 - Integer status = order.getStatus(); - if (status == null) { - throw new BusinessException("医嘱状态异常,无法退回"); + // 2. 校验当前状态是否允许退回 + int currentStatus = order.getStatus(); + if (currentStatus == STATUS_DISPENSED) { + throw new BusinessException("医嘱已发药,不能退回"); } - if (status == 2) { - // 已发药,直接阻断 - throw new BusinessException("该医嘱已发药,禁止退回"); - } - if (status != 0 && status != 1) { - // 其他非可退回状态,同样阻断 + if (currentStatus != STATUS_PENDING && currentStatus != STATUS_VERIFIED) { throw new BusinessException("当前医嘱状态不允许退回"); } - // 3. 记录退回原因(若有对应字段,可自行扩展,此处仅示例) - // 假设 OrderMain 有一个字段 `returnReason`,若不存在请自行在实体中添加 - // order.setReturnReason(reason); - // orderMainMapper.updateById(order); - - // 4. 将医嘱状态回退到“待校对”(0) 或者业务需要的状态,这里统一回退到 0 - order.setStatus(0); + // 3. 更新主表状态为已退号,并记录退号原因 + order.setStatus(STATUS_RETURNED); + order.setCancelReason(reason); orderMainMapper.updateById(order); - // 5. 如有需要,记录审计日志或发送通知(此处略) + // 4. 更新所有关联的明细表状态为已退号 + List details = orderDetailMapper.selectListByOrderId(orderId); + if (details != null && !details.isEmpty()) { + for (OrderDetail d : details) { + d.setStatus(STATUS_RETURNED); + d.setCancelReason(reason); + orderDetailMapper.updateById(d); + } + } + + // 5. 如有校对关联表(order_verification)也需要同步状态 + // 这里使用 mapper 的自定义方法进行批量更新(若不存在则安全忽略) + try { + orderVerificationMapper.updateStatusByOrderId(orderId, STATUS_RETURNED, reason); + } catch (Exception e) { + // 若 mapper 未实现该方法,记录日志但不影响事务回滚 + log.warn("orderVerificationMapper.updateStatusByOrderId not implemented, skip verification table status sync", e); + } + + // 6. 业务日志 + log.info("Order {} returned successfully, reason: {}", orderId, reason); } - // 其它业务方法(如查询列表、校对等)保持不变 + // 其余业务方法保持不变... }