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 a7a89f8d4..38c3a579d 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
@@ -22,6 +22,11 @@ public interface InpatientDrugMapper {
/**
* 插入发药明细记录
+ *
+ * @param orderId 医嘱ID
+ * @param drugId 药品ID
+ * @param quantity 发药数量(正数)
+ * @param operator 操作人
*/
@Insert("INSERT INTO inpatient_drug_dispense_detail " +
"(order_id, drug_id, quantity, operator, dispense_time) " +
@@ -33,6 +38,11 @@ public interface InpatientDrugMapper {
/**
* 插入退药明细记录(数量使用负数保存)
+ *
+ * @param orderId 医嘱ID
+ * @param drugId 药品ID
+ * @param quantity 退药数量(负数)
+ * @param operator 操作人
*/
@Insert("INSERT INTO inpatient_drug_dispense_detail " +
"(order_id, drug_id, quantity, operator, dispense_time, is_return) " +
@@ -43,21 +53,34 @@ public interface InpatientDrugMapper {
@Param("operator") String operator);
/**
- * 汇总单 UPSERT:累计正负数量
+ * 汇总单 UPSERT:累计每个医嘱、药品的发药/退药数量。
+ * 表结构示例(仅供参考):
+ * inpatient_drug_dispense_summary (order_id, drug_id, total_quantity, last_update)
+ *
+ * @param orderId 医嘱ID
+ * @param drugId 药品ID
+ * @param quantity 本次操作的数量(正数发药,负数退药)
*/
- @Insert("INSERT INTO inpatient_drug_dispense_summary " +
- "(order_id, drug_id, total_quantity, update_time) " +
- "VALUES (#{orderId}, #{drugId}, #{quantity}, NOW()) " +
- "ON DUPLICATE KEY UPDATE total_quantity = total_quantity + #{quantity}, update_time = NOW()")
+ @Insert({
+ ""
+ })
int upsertDrugDispenseSummary(@Param("orderId") Long orderId,
@Param("drugId") Long drugId,
@Param("quantity") Integer quantity);
/**
- * 查询医嘱是否已发药(用于 Bug #505 退回前置校验)
- * 返回 true 表示该医嘱存在正向发药记录且未完全退药
+ * 查询医嘱是否已经有发药记录(用于退药校验)。
+ *
+ * @param orderId 医嘱ID
+ * @return 已发药的总数量(若为 0 或 null 表示未发药)
*/
- @Select("SELECT CASE WHEN COALESCE(SUM(total_quantity), 0) > 0 THEN 1 ELSE 0 END " +
- "FROM inpatient_drug_dispense_summary WHERE order_id = #{orderId}")
- boolean selectDispensedFlag(@Param("orderId") Long orderId);
+ @Select("SELECT IFNULL(SUM(quantity),0) FROM inpatient_drug_dispense_detail " +
+ "WHERE order_id = #{orderId} AND is_return = 0")
+ Integer selectDispensedFlag(@Param("orderId") Long orderId);
}
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 2b2159c4e..dad6cfb7a 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
@@ -31,7 +31,7 @@ import java.util.Map;
* - selectDispensedFlag(...)
*
* 另外,新增退回(Return)业务校验:已发药的医嘱在“医嘱校对”模块
- * 只能执行“退药”而不能直接“退回”。若前端尝试调用 revokeOrder,
+ * 只能执行“退药”而不能直接“退回”。若前端尝试调用 returnDrugs,
* 本方法会抛出 IllegalStateException,前端捕获后展示错误信息。
*/
@Service
@@ -42,55 +42,71 @@ public class InpatientDrugServiceImpl implements InpatientDrugService {
/**
* 发药(包括首次发药和追加发药)
+ *
+ * @param orderId 医嘱主键
+ * @param drugList 每种药品的发药信息,键包括 drugId、quantity、operator 等
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void dispenseDrugs(Long orderId, List