diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/InpatientDrugMapper.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/InpatientDrugMapper.java index 6c9301102..397ce97bc 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/InpatientDrugMapper.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/InpatientDrugMapper.java @@ -52,37 +52,30 @@ public interface InpatientDrugMapper { @Param("operator") String operator); /** - * 汇总单 UPSERT:若不存在则 INSERT;若已存在则 UPDATE 累计数量。 - * 这里使用 MySQL 的 INSERT ... ON DUPLICATE KEY UPDATE 语法。 + * 汇总发药/退药数量(正负累计)。如果汇总记录不存在则插入;存在则累计 quantity。 * * 表结构示例(仅供参考): - * CREATE TABLE inpatient_drug_dispense_summary ( - * order_id BIGINT NOT NULL, - * drug_id BIGINT NOT NULL, - * total_quantity INT NOT NULL DEFAULT 0, - * last_operator VARCHAR(50), - * last_update_time DATETIME, - * PRIMARY KEY (order_id, drug_id) - * ); + * inpatient_drug_dispense_summary + * ------------------------------- + * id BIGINT PK AUTO_INCREMENT + * order_id BIGINT NOT NULL + * drug_id BIGINT NOT NULL + * total_qty INT NOT NULL DEFAULT 0 -- 正负累计数量 + * last_update DATETIME NOT NULL + * + * 唯一键 (order_id, drug_id) 用于 ON DUPLICATE KEY UPDATE。 * * @param orderId 医嘱ID * @param drugId 药品ID - * @param deltaQty 本次操作的数量增量(正数发药,负数退药) - * @param operator 操作人 + * @param quantity 本次操作的数量(正发药、负退药) */ - @Insert({ - "" - }) + @Insert("INSERT INTO inpatient_drug_dispense_summary " + + "(order_id, drug_id, total_qty, last_update) " + + "VALUES (#{orderId}, #{drugId}, #{quantity}, NOW()) " + + "ON DUPLICATE KEY UPDATE " + + "total_qty = total_qty + #{quantity}, " + + "last_update = NOW()") int upsertDrugDispenseSummary(@Param("orderId") Long orderId, @Param("drugId") Long drugId, - @Param("deltaQty") Integer deltaQty, - @Param("operator") String operator); + @Param("quantity") Integer quantity); } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/impl/InpatientDrugServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/impl/InpatientDrugServiceImpl.java index f0eb8a92d..4bdb77028 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/impl/InpatientDrugServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/impl/InpatientDrugServiceImpl.java @@ -50,49 +50,43 @@ public class InpatientDrugServiceImpl implements InpatientDrugService { Integer quantity = (Integer) drug.get("quantity"); 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); - } - // 2. 汇总单(inpatient_drug_dispense_summary)使用 UPSERT(INSERT ... ON DUPLICATE KEY UPDATE) - // 通过同一批次的明细累计数量,确保汇总单始终是明细的聚合结果。 - for (Map 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); + // 3. 更新/插入汇总(正向累计) + drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity); } } /** - * 退药(仅限已发药状态下的退药) + * 退药(数量使用负数保存,汇总同样累计负数) * * @param orderId 医嘱主键 - * @param drugList 退药信息,键包括 drugId、quantity(退药数量,正数)、operator 等 + * @param drugList 每种药品的退药信息,键包括 drugId、quantity(正数表示退药量)、operator 等 */ @Override @Transactional(rollbackFor = Exception.class) public void returnDrugs(Long orderId, List> drugList) { - // 1. 先写退药明细(负数量表示退药) for (Map drug : drugList) { Long drugId = (Long) drug.get("drugId"); - Integer quantity = (Integer) drug.get("quantity"); // 正数,表示退药数量 + Integer quantity = (Integer) drug.get("quantity"); // 正数表示退药量 String operator = (String) drug.get("operator"); - // 退药明细使用负数保存,便于后续统计 - drugMapper.insertDrugReturnDetail(orderId, drugId, -quantity, operator); - } + if (quantity == null || quantity <= 0) { + throw new IllegalArgumentException("退药数量必须为正数"); + } - // 2. 更新汇总单,使用负数冲减已发药数量 - for (Map drug : drugList) { - Long drugId = (Long) drug.get("drugId"); - Integer quantity = (Integer) drug.get("quantity"); - String operator = (String) drug.get("operator"); + // 负数保存到明细表,标记为退药 + int negativeQty = -quantity; + drugMapper.insertDrugReturnDetail(orderId, drugId, negativeQty, operator); - // 汇总表同样使用 UPSERT,数量为 -quantity - drugMapper.upsertDrugDispenseSummary(orderId, drugId, -quantity, operator); + // 汇总同样使用负数累计 + drugMapper.upsertDrugDispenseSummary(orderId, drugId, negativeQty); } } }