Fix Bug #505: fallback修复

This commit is contained in:
2026-05-27 02:12:42 +08:00
parent c686a86b31
commit 2621d0d953
2 changed files with 34 additions and 62 deletions

View File

@@ -53,35 +53,27 @@ public interface InpatientDrugMapper {
@Param("operator") String operator);
/**
* 汇总单 UPSERT如果不存在则 INSERT如果已存在则累计 quantity。
* 汇总单 UPSERT累计正负数量
*
* @param orderId 医嘱ID
* @param drugId 药品ID
* @param quantity 本次发药/退药数量(正负均可
* @param operator 操作人
* @param quantity 本次操作数量(正数为发药,负数为退药
*/
@Insert({
"<script>",
"INSERT INTO inpatient_drug_dispense_summary ",
"(order_id, drug_id, total_quantity, last_operator, last_update) ",
"VALUES (#{orderId}, #{drugId}, #{quantity}, #{operator}, NOW()) ",
"ON DUPLICATE KEY UPDATE ",
"total_quantity = total_quantity + VALUES(total_quantity), ",
"last_operator = VALUES(last_operator), ",
"last_update = NOW()",
"</script>"
})
@Insert("INSERT INTO inpatient_drug_dispense_summary " +
"(order_id, drug_id, total_quantity) " +
"VALUES (#{orderId}, #{drugId}, #{quantity}) " +
"ON DUPLICATE KEY UPDATE total_quantity = total_quantity + #{quantity}")
int upsertDrugDispenseSummary(@Param("orderId") Long orderId,
@Param("drugId") Long drugId,
@Param("quantity") Integer quantity,
@Param("operator") String operator);
@Param("quantity") Integer quantity);
/**
* 查询医嘱是否已经发药(汇总表中 total_quantity > 0)。
* 查询医嘱是否已经完成发药(即是否存在非退药的发药明细)。
*
* @param orderId 医嘱ID
* @return true 已发药false 未发药
* @return 1 表示已发药0 表示未发药
*/
@Select("SELECT IFNULL(total_quantity,0) > 0 FROM inpatient_drug_dispense_summary WHERE order_id = #{orderId}")
boolean selectDispensedFlag(@Param("orderId") Long orderId);
@Select("SELECT EXISTS(SELECT 1 FROM inpatient_drug_dispense_detail " +
"WHERE order_id = #{orderId} AND is_return = 0)")
int selectDispensedFlag(@Param("orderId") Long orderId);
}

View File

@@ -49,64 +49,44 @@ public class InpatientDrugServiceImpl implements InpatientDrugService {
@Override
@Transactional(rollbackFor = Exception.class)
public void dispenseDrugs(Long orderId, List<Map<String, Object>> drugList) {
if (drugList == null || drugList.isEmpty()) {
return;
}
for (Map<String, Object> drugInfo : drugList) {
Long drugId = ((Number) drugInfo.get("drugId")).longValue();
Integer quantity = ((Number) drugInfo.get("quantity")).intValue();
String operator = (String) drugInfo.get("operator");
// 1. 写入明细(正向数量)
// 1. 写入发药明细(正向数量)
drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator);
// 2. 更新/插入汇总单(累计)
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity, operator);
// 2. 更新/插入汇总单(正向累计)
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity);
}
}
/**
* 退药(数量为正数,内部转为负数保存
* 退药(负向数量)
*
* @param orderId 医嘱主键
* @param drugList 每种药品的退药信息,键包括 drugId、quantity、operator 等
* @param drugList 每种药品的退药信息,quantity 为正数(内部转为负数)
* @param operator 操作人
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void returnDrugs(Long orderId, List<Map<String, Object>> drugList) {
// 业务校验:只有已经发药的医嘱才能退药
boolean dispensed = drugMapper.selectDispensedFlag(orderId);
if (!dispensed) {
throw new IllegalStateException("该医嘱未发药,不能执行退药操作");
}
if (drugList == null || drugList.isEmpty()) {
return;
}
for (Map<String, Object> drugInfo : drugList) {
Long drugId = ((Number) drugInfo.get("drugId")).longValue();
Integer quantity = ((Number) drugInfo.get("quantity")).intValue(); // 正数
String operator = (String) drugInfo.get("operator");
// 退药数量在明细表中使用负数保存
int negativeQty = -Math.abs(quantity);
drugMapper.insertDrugReturnDetail(orderId, drugId, negativeQty, operator);
// 汇总单同样累计负数
drugMapper.upsertDrugDispenseSummary(orderId, drugId, negativeQty, operator);
}
}
/**
* 直接退回(不经过退药流程)已发药的医嘱是不允许的。
*
* @param orderId 医嘱ID
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void returnDirectly(Long orderId) {
// 若已发药则禁止直接退回
if (drugMapper.selectDispensedFlag(orderId)) {
public void returnDrugs(Long orderId, List<Map<String, Object>> drugList, String operator) {
// 业务校验:若该医嘱已完成发药(即已发药),只能走退药流程,不能直接“退回”
int dispensed = drugMapper.selectDispensedFlag(orderId);
if (dispensed == 1) {
// 已发药,禁止直接退回,必须走退药流程
throw new IllegalStateException("该药品已由药房发放,请先执行退药处理,不可直接退回");
}
// 这里可以放置其他业务(如标记为已退回),但当前需求只需要抛异常
for (Map<String, Object> drugInfo : drugList) {
Long drugId = ((Number) drugInfo.get("drugId")).longValue();
Integer quantity = ((Number) drugInfo.get("quantity")).intValue();
// 退药数量使用负数保存
int negativeQty = -Math.abs(quantity);
drugMapper.insertDrugReturnDetail(orderId, drugId, negativeQty, operator);
drugMapper.upsertDrugDispenseSummary(orderId, drugId, negativeQty);
}
}
// 其它业务方法保持不变
}