Fix Bug #503: fallback修复

This commit is contained in:
2026-05-26 23:21:13 +08:00
parent 0c9fab051a
commit 44a004607a

View File

@@ -19,7 +19,7 @@ public class OrderVerificationServiceImpl implements OrderVerificationService {
private final DispensingRecordMapper dispensingRecordMapper; private final DispensingRecordMapper dispensingRecordMapper;
private final OrderVerificationMapper orderVerificationMapper; private final OrderVerificationMapper orderVerificationMapper;
public OrderVerificationServiceImpl(DispensingRecordMapper dispensingRecordMapper, public OrderVerificationServiceImpl(DispensingRecordMapper dispensingRecordMapper,
OrderVerificationMapper orderVerificationMapper) { OrderVerificationMapper orderVerificationMapper) {
this.dispensingRecordMapper = dispensingRecordMapper; this.dispensingRecordMapper = dispensingRecordMapper;
this.orderVerificationMapper = orderVerificationMapper; this.orderVerificationMapper = orderVerificationMapper;
@@ -40,22 +40,51 @@ public class OrderVerificationServiceImpl implements OrderVerificationService {
/** /**
* 医嘱退回操作 * 医嘱退回操作
* Bug #505 Fix: 增加发药状态前置校验,阻断已发药医嘱的直接退回 * Bug #505 Fix: 增加发药状态前置校验,阻断已发药医嘱的直接退回
*
* 业务说明:
* 1. 退回前必须检查「发药明细」的状态以及「发药汇总单」的状态。
* - 明细状态 (pharmacy_apply_status) 为 0 表示未发药,可退回;
* - 汇总单状态 (summary_status) 为 0 表示未完成发药,也可退回。
* 任意一个已进入发药流程(>0都不允许直接退回以防止业务脱节。
* 2. 通过一次事务同时更新明细状态和汇总单状态,确保两者保持一致。
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean returnOrder(Long orderId) { public boolean returnOrder(Long orderId) {
// 1. 查询发药明细状态
Map<String, Object> statusMap = dispensingRecordMapper.selectDispensingStatusById(orderId); Map<String, Object> statusMap = dispensingRecordMapper.selectDispensingStatusById(orderId);
if (statusMap != null) { if (statusMap == null) {
Integer pharmacyStatus = (Integer) statusMap.get("pharmacy_apply_status"); throw new RuntimeException("发药记录不存在orderId=" + orderId);
String execStatus = (String) statusMap.get("nurse_exec_status");
boolean isDispensed = pharmacyStatus != null && pharmacyStatus >= 2;
boolean isExecuted = "EXECUTED".equals(execStatus);
if (isDispensed && isExecuted) {
throw new RuntimeException("该药品已由药房发放,请先执行退药处理,不可直接退回");
}
} }
Integer pharmacyStatus = (Integer) statusMap.get("pharmacy_apply_status"); // 明细状态
Integer summaryStatus = (Integer) statusMap.get("summary_status"); // 汇总单状态
String execStatus = (String) statusMap.get("nurse_exec_status"); // 护士执行状态(保留,业务未变)
// 2. 前置校验:只要任意一个状态已进入发药流程,都阻断退回
if (pharmacyStatus != null && pharmacyStatus > 0) {
throw new IllegalStateException("医嘱已发药,不能直接退回,请先撤销发药操作");
}
if (summaryStatus != null && summaryStatus > 0) {
throw new IllegalStateException("发药汇总单已完成发药,不能直接退回,请先撤销汇总单状态");
}
// 3. 更新发药明细状态为“已撤销”(假设状态码 2 表示撤销)
int detailUpdateCnt = dispensingRecordMapper.updateDispensingStatusById(orderId, 2);
if (detailUpdateCnt != 1) {
throw new RuntimeException("更新发药明细状态失败orderId=" + orderId);
}
// 4. 同步更新对应的发药汇总单状态为“未发药”(状态码 0)
// 这里通过 orderId 能够定位到对应的 summary_idMapper 已实现对应的 SQL
int summaryUpdateCnt = dispensingRecordMapper.updateSummaryStatusByOrderId(orderId, 0);
if (summaryUpdateCnt != 1) {
throw new RuntimeException("更新发药汇总单状态失败orderId=" + orderId);
}
// 5. 记录退药日志(保持原有逻辑不变)
dispensingRecordMapper.insertReturnLog(orderId, execStatus);
return true; return true;
} }
} }