Fix Bug #503: AI修复

This commit is contained in:
2026-05-27 00:07:41 +08:00
parent c9265b5aee
commit 6b4ab8d02b
3 changed files with 205 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
package com.openhis.web.inpatient.mapper;
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统一明细单与汇总单的状态过滤条件消除触发时机不一致导致的业务脱节风险
*/
@Mapper
public interface InpatientDispensingMapper {
/**
* 查询发药明细单
* @param wardId 病区ID
* @param statusList 统一的状态过滤列表 (需申请模式: ['SUBMITTED'], 自动模式: ['EXECUTED', 'SUBMITTED'])
*/
@Select("<script>" +
"SELECT d.id, d.patient_name, d.patient_no, d.drug_name, d.spec, d.dosage, d.quantity, d.apply_status " +
"FROM phm_dispensing_detail d " +
"WHERE d.ward_id = #{wardId} " +
"AND d.apply_status IN " +
"<foreach item='status' collection='statusList' open='(' separator=',' close=')'>" +
" #{status} " +
"</foreach>" +
"ORDER BY d.create_time DESC" +
"</script>")
List<Map<String, Object>> selectDispensingDetails(@Param("wardId") Long wardId,
@Param("statusList") List<String> statusList);
/**
* 查询发药汇总单
* @param wardId 病区ID
* @param statusList 统一的状态过滤列表
*/
@Select("<script>" +
"SELECT s.id, s.ward_name, s.total_items, s.total_quantity, s.apply_status " +
"FROM phm_dispensing_summary s " +
"WHERE s.ward_id = #{wardId} " +
"AND s.apply_status IN " +
"<foreach item='status' collection='statusList' open='(' separator=',' close=')'>" +
" #{status} " +
"</foreach>" +
"ORDER BY s.create_time DESC" +
"</script>")
List<Map<String, Object>> selectDispensingSummaries(@Param("wardId") Long wardId,
@Param("statusList") List<String> statusList);
}

View File

@@ -0,0 +1,53 @@
package com.openhis.web.inpatient.service.impl;
import com.openhis.web.inpatient.mapper.InpatientDispensingMapper;
import com.openhis.web.inpatient.service.InpatientDispensingService;
import com.openhis.web.system.service.SysDictDataService;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 住院发退药业务实现
* 修复 Bug #503根据字典配置统一明细与汇总单的查询触发时机确保数据状态同步
*/
@Service
public class InpatientDispensingServiceImpl implements InpatientDispensingService {
private final InpatientDispensingMapper dispensingMapper;
private final SysDictDataService dictDataService;
public InpatientDispensingServiceImpl(InpatientDispensingMapper dispensingMapper,
SysDictDataService dictDataService) {
this.dispensingMapper = dispensingMapper;
this.dictDataService = dictDataService;
}
@Override
public Map<String, Object> queryPharmacyDispensingData(Long wardId) {
// 1. 获取字典配置:病区护士执行提交药品模式 (默认: 1-需申请模式, 2-自动模式)
String submitMode = dictDataService.getDictValueByType("ward_nurse_drug_submit_mode");
if (submitMode == null || submitMode.isBlank()) {
submitMode = "1"; // 默认需申请模式
}
// 2. 统一数据触发状态条件,彻底解决“明细先显、汇总后显”的逻辑脱节
// 需申请模式(1):仅查询已汇总申请的数据 (apply_status = 'SUBMITTED')
// 自动模式(2):查询护士已执行的数据 (apply_status = 'EXECUTED' 或 'SUBMITTED')
List<String> statusFilter = "1".equals(submitMode)
? Arrays.asList("SUBMITTED")
: Arrays.asList("EXECUTED", "SUBMITTED");
// 3. 同步查询明细与汇总单,确保药房端接收到的数据触发时机完全一致
List<Map<String, Object>> detailList = dispensingMapper.selectDispensingDetails(wardId, statusFilter);
List<Map<String, Object>> summaryList = dispensingMapper.selectDispensingSummaries(wardId, statusFilter);
return Map.of(
"details", detailList,
"summaries", summaryList,
"mode", submitMode
);
}
}