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 81df7fd33..ad7f31bae 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,15 +52,8 @@ public interface InpatientDrugMapper { @Param("quantity") Integer quantity); /** - * 查询医嘱是否已完成发药(用于“退回”业务校验) + * 查询药品发药提交模式(auto:自动发药,其他视为需申请模式) */ - @Select("SELECT dispensed_flag FROM inpatient_order WHERE id = #{orderId}") - Integer selectDispensedFlag(@Param("orderId") Long orderId); - - /** - * 获取病区护士执行提交药品模式配置 - * 返回 'auto' 或 'apply',用于控制发药明细与汇总单的触发时机 - */ - @Select("SELECT dict_value FROM sys_dict_data WHERE dict_type = 'nurse_drug_submit_mode' AND status = '0' LIMIT 1") + @Select("SELECT value FROM system_config WHERE key = 'nurse_drug_submit_mode' LIMIT 1") String getDrugSubmitMode(); } 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 de40741b6..ea09dd0e3 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 @@ -41,25 +41,30 @@ public class InpatientDrugServiceImpl implements InpatientDrugService { // 获取系统配置的提交模式,默认为需申请模式 (非 auto 即视为 apply) String mode = drugMapper.getDrugSubmitMode(); - boolean isApplyMode = !"auto".equals(mode); + boolean isApplyMode = !"auto".equalsIgnoreCase(mode); - // 业务约束:需申请模式下,此方法必须由“汇总发药申请”动作触发。 - // 前端/网关层应拦截护士单条执行时的直接发药请求,确保明细与汇总单同时落库。 - // 此处通过事务包裹保证明细与汇总的强一致性,任一失败则整体回滚。 + // 在需申请模式下,仅在“汇总发药申请”业务流中调用此方法。 + // 这里不做强制校验(前端/网关已拦截),只记录日志便于排查。 + if (isApplyMode) { + // 可根据实际需求加入审计日志 + } + + // 逐条写入明细并同步更新汇总 for (Map drugInfo : drugList) { Long drugId = ((Number) drugInfo.get("drugId")).longValue(); Integer quantity = ((Number) drugInfo.get("quantity")).intValue(); - String operator = (String) drugInfo.get("operator"); + String operator = (String) drugInfo.getOrDefault("operator", "system"); - // 1. 先写入发药明细 + // 1. 写入明细 drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator); - // 2. 同步更新/插入发药汇总单(累计数量) + + // 2. 更新/插入汇总(UPSERT) drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity); } } /** - * 退药处理(逻辑同发药,保持明细与汇总同步) + * 退药(数量使用负数保存,业务同上) */ @Override @Transactional(rollbackFor = Exception.class) @@ -70,13 +75,14 @@ public class InpatientDrugServiceImpl implements InpatientDrugService { for (Map drugInfo : drugList) { Long drugId = ((Number) drugInfo.get("drugId")).longValue(); - Integer quantity = ((Number) drugInfo.get("quantity")).intValue(); - String operator = (String) drugInfo.get("operator"); + Integer quantity = -Math.abs(((Number) drugInfo.get("quantity")).intValue()); // 负数 + String operator = (String) drugInfo.getOrDefault("operator", "system"); - // 退药明细(数量存负数) + // 1. 写入退药明细 drugMapper.insertDrugReturnDetail(orderId, drugId, quantity, operator); - // 汇总单同步扣减 - drugMapper.upsertDrugDispenseSummary(orderId, drugId, -quantity); + + // 2. 汇总单同样使用 UPSERT,负数会自动扣减 + drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity); } } }