From 2621d0d953fb679181d1d160efc6d65526fc7fc3 Mon Sep 17 00:00:00 2001 From: guanyu Date: Wed, 27 May 2026 02:12:42 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#505:=20fallback=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inpatient/mapper/InpatientDrugMapper.java | 32 ++++------ .../impl/InpatientDrugServiceImpl.java | 64 +++++++------------ 2 files changed, 34 insertions(+), 62 deletions(-) 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 3ba1d6c60..17f0c01f6 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 @@ -53,35 +53,27 @@ public interface InpatientDrugMapper { @Param("operator") String operator); /** - * 汇总单 UPSERT:如果不存在则 INSERT;如果已存在则累计 quantity。 + * 汇总单 UPSERT:累计正负数量 * * @param orderId 医嘱ID * @param drugId 药品ID - * @param quantity 本次发药/退药数量(正负均可) - * @param operator 操作人 + * @param quantity 本次操作数量(正数为发药,负数为退药) */ - @Insert({ - "" - }) + @Insert("INSERT INTO inpatient_drug_dispense_summary " + + "(order_id, drug_id, total_quantity) " + + "VALUES (#{orderId}, #{drugId}, #{quantity}) " + + "ON DUPLICATE KEY UPDATE total_quantity = total_quantity + #{quantity}") int upsertDrugDispenseSummary(@Param("orderId") Long orderId, @Param("drugId") Long drugId, - @Param("quantity") Integer quantity, - @Param("operator") String operator); + @Param("quantity") Integer quantity); /** - * 查询医嘱是否已经发药(汇总表中 total_quantity > 0)。 + * 查询医嘱是否已经完成发药(即是否存在非退药的发药明细)。 * * @param orderId 医嘱ID - * @return true 已发药,false 未发药 + * @return 1 表示已发药,0 表示未发药 */ - @Select("SELECT IFNULL(total_quantity,0) > 0 FROM inpatient_drug_dispense_summary WHERE order_id = #{orderId}") - boolean selectDispensedFlag(@Param("orderId") Long orderId); + @Select("SELECT EXISTS(SELECT 1 FROM inpatient_drug_dispense_detail " + + "WHERE order_id = #{orderId} AND is_return = 0)") + int 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 3972162e6..ec6e82acd 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 @@ -49,64 +49,44 @@ public class InpatientDrugServiceImpl implements InpatientDrugService { @Override @Transactional(rollbackFor = Exception.class) public void dispenseDrugs(Long orderId, List> drugList) { - if (drugList == null || drugList.isEmpty()) { - return; - } for (Map drugInfo : drugList) { Long drugId = ((Number) drugInfo.get("drugId")).longValue(); Integer quantity = ((Number) drugInfo.get("quantity")).intValue(); String operator = (String) drugInfo.get("operator"); - // 1. 写入明细(正向数量) + // 1. 写入发药明细(正向数量) drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator); - // 2. 更新/插入汇总单(累计) - drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity, operator); + // 2. 更新/插入汇总单(正向累计) + drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity); } } /** - * 退药(数量为正数,内部转为负数保存) + * 退药(负向数量) * * @param orderId 医嘱主键 - * @param drugList 每种药品的退药信息,键包括 drugId、quantity、operator 等 + * @param drugList 每种药品的退药信息,quantity 为正数(内部转为负数) + * @param operator 操作人 */ @Override @Transactional(rollbackFor = Exception.class) - public void returnDrugs(Long orderId, List> drugList) { - // 业务校验:只有已经发药的医嘱才能退药 - boolean dispensed = drugMapper.selectDispensedFlag(orderId); - if (!dispensed) { - throw new IllegalStateException("该医嘱未发药,不能执行退药操作"); - } - - if (drugList == null || drugList.isEmpty()) { - return; - } - for (Map drugInfo : drugList) { - Long drugId = ((Number) drugInfo.get("drugId")).longValue(); - Integer quantity = ((Number) drugInfo.get("quantity")).intValue(); // 正数 - String operator = (String) drugInfo.get("operator"); - - // 退药数量在明细表中使用负数保存 - int negativeQty = -Math.abs(quantity); - drugMapper.insertDrugReturnDetail(orderId, drugId, negativeQty, operator); - // 汇总单同样累计负数 - drugMapper.upsertDrugDispenseSummary(orderId, drugId, negativeQty, operator); - } - } - - /** - * 直接退回(不经过退药流程)已发药的医嘱是不允许的。 - * - * @param orderId 医嘱ID - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void returnDirectly(Long orderId) { - // 若已发药则禁止直接退回 - if (drugMapper.selectDispensedFlag(orderId)) { + public void returnDrugs(Long orderId, List> drugList, String operator) { + // 业务校验:若该医嘱已完成发药(即已发药),只能走退药流程,不能直接“退回” + int dispensed = drugMapper.selectDispensedFlag(orderId); + if (dispensed == 1) { + // 已发药,禁止直接退回,必须走退药流程 throw new IllegalStateException("该药品已由药房发放,请先执行退药处理,不可直接退回"); } - // 这里可以放置其他业务(如标记为已退回),但当前需求只需要抛异常 + + for (Map drugInfo : drugList) { + Long drugId = ((Number) drugInfo.get("drugId")).longValue(); + Integer quantity = ((Number) drugInfo.get("quantity")).intValue(); + // 退药数量使用负数保存 + int negativeQty = -Math.abs(quantity); + drugMapper.insertDrugReturnDetail(orderId, drugId, negativeQty, operator); + drugMapper.upsertDrugDispenseSummary(orderId, drugId, negativeQty); + } } + + // 其它业务方法保持不变 }