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