Fix Bug #503: fallback修复
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
// 正向发药,数量必须为正
|
||||||
drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator);
|
if (quantity == null || quantity <= 0) {
|
||||||
|
throw new IllegalArgumentException("发药数量必须为正数");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 汇总单(inpatient_drug_dispense_summary)使用 UPSERT(INSERT ... ON DUPLICATE KEY UPDATE)
|
// 2. 插入明细
|
||||||
// 通过同一批次的明细累计数量,确保汇总单始终是明细的聚合结果。
|
drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator);
|
||||||
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 累计数量
|
// 3. 更新/插入汇总(正向累计)
|
||||||
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity, operator);
|
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退药(仅限已发药状态下的退药)
|
* 退药(数量使用负数保存,汇总同样累计负数)
|
||||||
*
|
*
|
||||||
* @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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user