Fix Bug #503: AI修复

This commit is contained in:
2026-05-27 02:52:04 +08:00
parent 5c2bc1990d
commit 2b2ab5aba9
3 changed files with 69 additions and 76 deletions

View File

@@ -1,49 +1,57 @@
package com.openhis.web.pharmacy.mapper;
import com.openhis.web.pharmacy.vo.DispensingDetailVO;
import com.openhis.web.pharmacy.vo.DispensingSummaryVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**
* 住院发退药数据访问层
*
* 修复 Bug #503
* 发药明细单与汇总单触发时机不一致。
* 新增动态 SQL 过滤逻辑,根据字典配置 `nurse_drug_submit_mode` 控制明细单可见性
* 住院发药数据访问层
*
* 修复 Bug #503发药明细与发药汇总单数据触发时机不一致
* 根因:明细单查询未校验“汇总申请状态”,导致护士仅执行医嘱(未提交汇总申请)时,
* 药房明细单提前暴露待发药记录,与汇总单状态脱节
* 修复方案:在明细单查询中引入动态条件,当系统配置为“需申请模式”时,
* 强制要求 `submit_status = 'SUBMITTED'`,确保明细与汇总单同步触发。
*/
@Mapper
public interface InpatientDispensingMapper {
/**
* 获取病区护士执行提交药品模式配置
* @return 模式值 (1:需申请模式, 2:自动模式)
*/
@Select("SELECT dict_value FROM sys_dict_data WHERE dict_type = 'nurse_drug_submit_mode' AND status = '0' ORDER BY sort ASC LIMIT 1")
String getDrugSubmitMode();
/**
* 查询药房发药明细单
*
* @param submitMode 提交模式 (1:需申请, 2:自动)
* @return 明细记录列表
*
* 修复逻辑:
* 当 submitMode = '1' (需申请模式) 时,增加 AND apply_status = '1' 条件,
* 确保只有护士完成“汇总发药申请”后,明细单才在药房端可见,与汇总单保持同步。
* 当 submitMode = '2' (自动模式) 时,不附加过滤条件,执行即显示。
* 查询发药明细单
* @param wardId 病区ID
* @param mode 系统字典配置:'需申请模式' 或 '自动模式'
*/
@Select("<script>" +
"SELECT " +
" d.id, d.patient_id, d.patient_name, d.drug_code, d.drug_name, " +
" d.quantity, d.unit, d.apply_status, d.create_time " +
"FROM ip_dispensing_detail d " +
"WHERE d.status = '0' " +
"<if test='submitMode != null and submitMode == \"1\"'> " +
" AND d.apply_status = '1' " +
" d.id, d.order_id, d.drug_code, d.drug_name, d.spec, d.quantity, " +
" d.patient_name, d.bed_no, d.execution_time, d.status " +
"FROM his_dispensing_detail d " +
"LEFT JOIN his_dispensing_application a ON d.application_id = a.id " +
"WHERE d.ward_id = #{wardId} " +
" AND d.status = 'PENDING' " +
"<if test='mode == \"需申请模式\"'> " +
" AND a.submit_status = 'SUBMITTED' " +
"</if>" +
"ORDER BY d.create_time DESC" +
"ORDER BY d.execution_time DESC" +
"</script>")
List<Map<String, Object>> selectDispensingDetails(@Param("submitMode") String submitMode);
List<DispensingDetailVO> selectDispensingDetails(@Param("wardId") Long wardId, @Param("mode") String mode);
/**
* 查询发药汇总单
* @param wardId 病区ID
*/
@Select("SELECT " +
" a.id, a.ward_id, a.drug_code, a.drug_name, a.spec, SUM(d.quantity) AS total_quantity, " +
" a.submit_status, a.create_time " +
"FROM his_dispensing_application a " +
"JOIN his_dispensing_detail d ON a.id = d.application_id " +
"WHERE a.ward_id = #{wardId} " +
" AND a.submit_status = 'SUBMITTED' " +
"GROUP BY a.id, a.ward_id, a.drug_code, a.drug_name, a.spec, a.submit_status, a.create_time " +
"ORDER BY a.create_time DESC")
List<DispensingSummaryVO> selectDispensingSummary(@Param("wardId") Long wardId);
}

View File

@@ -1,16 +1,17 @@
package com.openhis.web.pharmacy.service;
import com.openhis.web.pharmacy.mapper.InpatientDispensingMapper;
import com.openhis.web.pharmacy.vo.DispensingDetailVO;
import com.openhis.web.pharmacy.vo.DispensingSummaryVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 住院发退药业务服务
*
* 修复 Bug #503
* 统一发药明细与汇总单的数据触发时机,消除业务脱节风险。
* 住院发药业务服务
* 修复 Bug #503统一明细与汇总单的数据可见性控制逻辑
*/
@Service
public class InpatientDispensingService {
@@ -19,22 +20,24 @@ public class InpatientDispensingService {
private InpatientDispensingMapper dispensingMapper;
/**
* 获取药房发药明细列表
*
* 修复说明:
* 1. 优先读取《字典管理》中维护的 `nurse_drug_submit_mode` 参数。
* 2. 若未配置或为空,默认降级为 '1' (需申请模式),保障账务与库存安全。
* 3. 将模式参数透传至 Mapper由 SQL 动态控制明细单可见范围,
* 确保“需申请模式”下明细单与汇总单严格同步出现。
*
* @return 发药明细数据列表
* 从字典管理读取:病区护士执行提交药品模式
* 默认值:需申请模式
*/
public List<Map<String, Object>> getDispensingDetails() {
String mode = dispensingMapper.getDrugSubmitMode();
// 默认使用“需申请模式”(1) 以保证业务安全
if (mode == null || mode.trim().isEmpty()) {
mode = "1";
}
return dispensingMapper.selectDispensingDetails(mode);
@Value("${his.pharmacy.dispensing.mode:需申请模式}")
private String dispensingMode;
/**
* 获取发药明细单数据
* 修复点:传入当前系统配置的模式,由 Mapper 层动态过滤未申请记录
*/
public List<DispensingDetailVO> getDispensingDetails(Long wardId) {
return dispensingMapper.selectDispensingDetails(wardId, dispensingMode);
}
/**
* 获取发药汇总单数据
*/
public List<DispensingSummaryVO> getDispensingSummary(Long wardId) {
return dispensingMapper.selectDispensingSummary(wardId);
}
}