Fix Bug #444: 根因+修复方案摘要

## 根因分析
门诊手术安排的"生成临时医嘱"界面中,"已引用计费药品"列表未正常显示药品名称。
根本原因:`getRequestBaseInfo` SQL查询的药品部分(Part 1)通过 `generate_source_enum` 过滤,
导致部分手术场景下的药品计费记录(generate_source_enum != 1)被漏查。
之前的修复(commit 97d0011)仅在前端添加了名称回退字段,未解决后端数据查询遗漏问题。

## 修复方案
在 DoctorStationAdviceAppMapper.xml 中新增 Part 1b 查询段:
- 直接从 adm_charge_item 表补充查询药品计费记录
- 通过 INNER JOIN med_medication_request → med_medication_definition 获取药品名称
- 使用 NOT EXISTS 排除 Part 1 已返回的记录,避免 UNION ALL 重复
- 不依赖 generate_source_enum 过滤,确保所有药品计费记录都能被查询

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
关羽
2026-05-16 13:14:12 +08:00
parent 16ef28c96f
commit a3c4e9c8bd

View File

@@ -539,6 +539,65 @@
AND T1.refund_medicine_id IS NULL AND T1.refund_medicine_id IS NULL
ORDER BY T1.status_enum,T1.sort_number) ORDER BY T1.status_enum,T1.sort_number)
UNION ALL UNION ALL
-- 🔧 Bug #444: 直接从计费项目表补充查询药品记录用于覆盖med_medication_request有记录但generate_source_enum不匹配的场景
(SELECT 1 AS advice_type,
T1.service_id AS request_id,
T1.service_id || '-ci-med' AS unique_key,
'' AS prescription_no,
T1.enterer_id AS requester_id,
T1.entered_date AS request_time,
CASE WHEN T1.enterer_id = #{practitionerId} THEN '1' ELSE '0' END AS biz_request_flag,
T2.content_json AS content_json,
NULL AS skin_test_flag,
NULL AS inject_flag,
NULL AS group_id,
T3.NAME AS advice_name,
T4.total_volume AS volume,
T2.lot_number AS lot_number,
T1.quantity_value AS quantity,
T1.quantity_unit AS unit_code,
T1.status_enum AS status_enum,
'' AS method_code,
'' AS rate_code,
NULL AS dose,
'' AS dose_unit_code,
T1.id AS charge_item_id,
T1.unit_price AS unit_price,
T1.total_price AS total_price,
T1.status_enum AS charge_status,
NULL AS position_id,
'' AS position_name,
NULL AS dispense_per_duration,
T3.part_percent AS part_percent,
'' AS condition_definition_name,
T2.sort_number AS sort_number,
NULL AS based_on_id,
NULL AS category_enum,
T1.encounter_id AS encounter_id,
T1.patient_id AS patient_id,
'med_medication_definition' AS advice_table_name,
T3.ID AS advice_definition_id
FROM adm_charge_item AS T1
INNER JOIN med_medication_request AS T2 ON T2.ID = T1.service_id AND T2.delete_flag = '0'
LEFT JOIN med_medication_definition AS T3 ON T3.ID = T2.medication_id AND T3.delete_flag = '0'
LEFT JOIN med_medication AS T4 ON T4.medication_def_id = T3.ID AND T4.delete_flag = '0'
WHERE T1.delete_flag = '0'
AND T1.service_table = #{MED_MEDICATION_REQUEST}
<if test="historyFlag == '0'.toString()">
AND T1.encounter_id = #{encounterId}
</if>
<if test="historyFlag == '1'.toString()">
AND T1.patient_id = #{patientId} AND T1.encounter_id != #{encounterId}
</if>
AND NOT EXISTS (
SELECT 1 FROM med_medication_request T5
WHERE T5.ID = T1.service_id AND T5.delete_flag = '0'
<if test="generateSourceEnum != null">
AND T5.generate_source_enum = #{generateSourceEnum}
</if>
)
ORDER BY T1.entered_date)
UNION ALL
-- 🔧 查询仅存在于 adm_charge_item 的"孤儿"耗材数据DeviceRequest 缺失或 generate_source_enum 未设置) -- 🔧 查询仅存在于 adm_charge_item 的"孤儿"耗材数据DeviceRequest 缺失或 generate_source_enum 未设置)
-- 正常 DeviceRequestgenerate_source_enum 已赋值)由下方 Part 3 统一负责,此处不做重复覆盖避免 UNION ALL 重复行 -- 正常 DeviceRequestgenerate_source_enum 已赋值)由下方 Part 3 统一负责,此处不做重复覆盖避免 UNION ALL 重复行
(SELECT 2 AS advice_type, (SELECT 2 AS advice_type,