package com.openhis.web.inpatient.service.impl; import com.openhis.web.outpatient.mapper.OrderMapper; import com.openhis.web.inpatient.mapper.DispenseMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; /** * 住院医嘱校对业务实现 * * 修复 Bug #505: * - 增加前置状态校验,拦截已执行或已发药的药品医嘱直接退回。 * - 在退回成功后,确保对应的发药汇总单状态回滚为 “未完成”,防止状态不一致。 * * 同时配合 {@link DispenseMapper#updateDispenseSummaryStatus} 解决 Bug #503。 */ @Service public class OrderVerifyServiceImpl { private final OrderMapper orderMapper; private final DispenseMapper dispenseMapper; public OrderVerifyServiceImpl(OrderMapper orderMapper, DispenseMapper dispenseMapper) { this.orderMapper = orderMapper; this.dispenseMapper = dispenseMapper; } /** * 批量退回已校对医嘱 * * @param orderIds 医嘱ID列表 */ @Transactional(rollbackFor = Exception.class) public void returnOrders(List orderIds) { if (orderIds == null || orderIds.isEmpty()) { throw new IllegalArgumentException("退回医嘱列表不能为空"); } for (Long orderId : orderIds) { Map order = orderMapper.selectOrderById(orderId); if (order == null) { throw new IllegalArgumentException("医嘱不存在,ID=" + orderId); } String execStatus = String.valueOf(order.get("exec_status")); String dispenseStatus = String.valueOf(order.get("dispense_status")); // 核心状态约束校验:执行状态或物理发药状态已流转,严禁直接退回 if ("EXECUTED".equals(execStatus) || "DISPENSED".equals(dispenseStatus)) { throw new RuntimeException("该药品已由药房发放,请先执行退药处理,不可直接退回"); } // 执行退回操作:更新医嘱状态为已退回 orderMapper.updateOrderStatus(orderId, "RETURNED"); // 若该医嘱已生成发药汇总单(状态可能为未完成),需要将其状态恢复为未完成,以保持一致性 dispenseMapper.updateDispenseSummaryStatus(orderId, "PENDING"); } } }