Fix Bug #503: fallback修复

This commit is contained in:
2026-05-27 01:52:52 +08:00
parent b9611aaa35
commit 39edb9bb81
2 changed files with 37 additions and 50 deletions

View File

@@ -52,37 +52,30 @@ public interface InpatientDrugMapper {
@Param("operator") String operator); @Param("operator") String operator);
/** /**
* 汇总单 UPSERT若不存在则 INSERT若已存在则 UPDATE 累计数量 * 汇总发药/退药数量(正负累计)。如果汇总记录不存在则插入;存在则累计 quantity
* 这里使用 MySQL 的 INSERT ... ON DUPLICATE KEY UPDATE 语法。
* *
* 表结构示例(仅供参考): * 表结构示例(仅供参考):
* CREATE TABLE inpatient_drug_dispense_summary ( * inpatient_drug_dispense_summary
* order_id BIGINT NOT NULL, * -------------------------------
* drug_id BIGINT NOT NULL, * id BIGINT PK AUTO_INCREMENT
* total_quantity INT NOT NULL DEFAULT 0, * order_id BIGINT NOT NULL
* last_operator VARCHAR(50), * drug_id BIGINT NOT NULL
* last_update_time DATETIME, * total_qty INT NOT NULL DEFAULT 0 -- 正负累计数量
* PRIMARY KEY (order_id, drug_id) * last_update DATETIME NOT NULL
* ); *
* 唯一键 (order_id, drug_id) 用于 ON DUPLICATE KEY UPDATE。
* *
* @param orderId 医嘱ID * @param orderId 医嘱ID
* @param drugId 药品ID * @param drugId 药品ID
* @param deltaQty 本次操作的数量增量(正发药,负数退药) * @param quantity 本次操作的数量(正发药、负退药)
* @param operator 操作人
*/ */
@Insert({ @Insert("INSERT INTO inpatient_drug_dispense_summary " +
"<script>", "(order_id, drug_id, total_qty, last_update) " +
"INSERT INTO inpatient_drug_dispense_summary ", "VALUES (#{orderId}, #{drugId}, #{quantity}, NOW()) " +
"(order_id, drug_id, total_quantity, last_operator, last_update_time) ", "ON DUPLICATE KEY UPDATE " +
"VALUES (#{orderId}, #{drugId}, #{deltaQty}, #{operator}, NOW()) ", "total_qty = total_qty + #{quantity}, " +
"ON DUPLICATE KEY UPDATE ", "last_update = NOW()")
"total_quantity = total_quantity + #{deltaQty}, ",
"last_operator = #{operator}, ",
"last_update_time = NOW()",
"</script>"
})
int upsertDrugDispenseSummary(@Param("orderId") Long orderId, int upsertDrugDispenseSummary(@Param("orderId") Long orderId,
@Param("drugId") Long drugId, @Param("drugId") Long drugId,
@Param("deltaQty") Integer deltaQty, @Param("quantity") Integer quantity);
@Param("operator") String operator);
} }

View File

@@ -50,49 +50,43 @@ public class InpatientDrugServiceImpl implements InpatientDrugService {
Integer quantity = (Integer) drug.get("quantity"); Integer quantity = (Integer) drug.get("quantity");
String operator = (String) drug.get("operator"); String operator = (String) drug.get("operator");
// 明细表inpatient_drug_dispense_detail // 正向发药,数量必须为正
if (quantity == null || quantity <= 0) {
throw new IllegalArgumentException("发药数量必须为正数");
}
// 2. 插入明细
drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator); drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator);
}
// 2. 汇总单inpatient_drug_dispense_summary使用 UPSERTINSERT ... ON DUPLICATE KEY UPDATE // 3. 更新/插入汇总(正向累计
// 通过同一批次的明细累计数量,确保汇总单始终是明细的聚合结果。 drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity);
for (Map<String, Object> drug : drugList) {
Long drugId = (Long) drug.get("drugId");
Integer quantity = (Integer) drug.get("quantity");
String operator = (String) drug.get("operator");
// 汇总表:若不存在则 INSERT若已存在则 UPDATE 累计数量
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity, operator);
} }
} }
/** /**
* 退药(仅限已发药状态下的退药 * 退药(数量使用负数保存,汇总同样累计负数
* *
* @param orderId 医嘱主键 * @param orderId 医嘱主键
* @param drugList 退药信息,键包括 drugId、quantity退药数量,正数、operator 等 * @param drugList 每种药品的退药信息,键包括 drugId、quantity正数表示退药量、operator 等
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void returnDrugs(Long orderId, List<Map<String, Object>> drugList) { public void returnDrugs(Long orderId, List<Map<String, Object>> drugList) {
// 1. 先写退药明细(负数量表示退药)
for (Map<String, Object> drug : drugList) { for (Map<String, Object> drug : drugList) {
Long drugId = (Long) drug.get("drugId"); Long drugId = (Long) drug.get("drugId");
Integer quantity = (Integer) drug.get("quantity"); // 正数表示退药 Integer quantity = (Integer) drug.get("quantity"); // 正数表示退药量
String operator = (String) drug.get("operator"); String operator = (String) drug.get("operator");
// 退药明细使用负数保存,便于后续统计 if (quantity == null || quantity <= 0) {
drugMapper.insertDrugReturnDetail(orderId, drugId, -quantity, operator); throw new IllegalArgumentException("退药数量必须为正数");
} }
// 2. 更新汇总单,使用负数冲减已发药数量 // 负数保存到明细表,标记为退药
for (Map<String, Object> drug : drugList) { int negativeQty = -quantity;
Long drugId = (Long) drug.get("drugId"); drugMapper.insertDrugReturnDetail(orderId, drugId, negativeQty, operator);
Integer quantity = (Integer) drug.get("quantity");
String operator = (String) drug.get("operator");
// 汇总同样使用 UPSERT数量为 -quantity // 汇总同样使用负数累计
drugMapper.upsertDrugDispenseSummary(orderId, drugId, -quantity, operator); drugMapper.upsertDrugDispenseSummary(orderId, drugId, negativeQty);
} }
} }
} }