4.8 KiB
4.8 KiB
诊断:门诊划价检索不出诊疗项目问题
问题描述
在门诊划价页面,检索不出诊疗项目,显示"暂无数据"。
问题分析
SQL查询逻辑
根据 OutpatientChargeAppMapper.xml 中的 selectEncounterPatientPrescription 查询:
- 查询主表:
adm_charge_item(收费项目表) - 关联诊疗项目定义表:
wor_activity_definition- 关联条件:
T1.context_enum = #{activity}ANDT1.product_id = T2.idANDT2.delete_flag = '0'
- 关联条件:
- 返回字段:
item_name来自wor_activity_definition.name
可能的原因
1. 数据库中没有诊疗项目定义数据
- 检查:
wor_activity_definition表中是否有数据 - SQL:
SELECT COUNT(*) FROM wor_activity_definition WHERE delete_flag = '0';
2. 收费项目中的product_id无法匹配到诊疗项目定义
- 检查:
adm_charge_item表中的product_id是否存在于wor_activity_definition表中 - SQL:
SELECT
aci.id,
aci.encounter_id,
aci.product_id,
aci.context_enum,
wad.id as activity_def_id,
wad.name as activity_name
FROM adm_charge_item aci
LEFT JOIN wor_activity_definition wad ON aci.product_id = wad.id AND wad.delete_flag = '0'
WHERE aci.context_enum = 'ACTIVITY'
AND aci.delete_flag = '0'
AND wad.id IS NULL; -- 无法匹配的记录
3. 诊疗项目定义被标记为删除
- 检查:
wor_activity_definition表中的delete_flag是否为 '0' - SQL:
SELECT
id,
name,
delete_flag
FROM wor_activity_definition
WHERE delete_flag != '0';
4. context_enum 值不匹配
- 检查:
adm_charge_item表中的context_enum值是否正确 - SQL:
SELECT DISTINCT context_enum FROM adm_charge_item WHERE delete_flag = '0';
- 注意:后端代码中传入的
#{activity}参数值应该是ChargeItemContext.ACTIVITY.getValue()
诊断步骤
步骤1:检查诊疗项目定义表是否有数据
SELECT
COUNT(*) as total_count,
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) as active_count,
COUNT(CASE WHEN delete_flag != '0' THEN 1 END) as deleted_count
FROM wor_activity_definition;
预期结果:active_count 应该 > 0
步骤2:检查收费项目中的诊疗项目是否能匹配到定义
SELECT
COUNT(*) as total_charge_items,
COUNT(CASE WHEN wad.id IS NOT NULL THEN 1 END) as matched_count,
COUNT(CASE WHEN wad.id IS NULL THEN 1 END) as unmatched_count
FROM adm_charge_item aci
LEFT JOIN wor_activity_definition wad
ON aci.context_enum = 'ACTIVITY'
AND aci.product_id = wad.id
AND wad.delete_flag = '0'
WHERE aci.context_enum = 'ACTIVITY'
AND aci.delete_flag = '0';
预期结果:matched_count 应该 > 0,unmatched_count 应该 = 0
步骤3:检查具体就诊的诊疗项目
-- 替换 :encounterId 为实际的就诊ID
SELECT
T1.encounter_id,
T1.id as charge_item_id,
T1.context_enum,
T1.product_id,
T1.status_enum,
T2.id as activity_def_id,
T2.name as activity_name,
T2.delete_flag as activity_delete_flag,
CASE
WHEN T2.id IS NULL THEN '诊疗项目定义不存在或已删除'
WHEN T2.delete_flag != '0' THEN '诊疗项目定义已删除'
ELSE '正常'
END as status
FROM adm_charge_item AS T1
LEFT JOIN wor_activity_definition AS T2
ON T1.context_enum = 'ACTIVITY'
AND T1.product_id = T2.id
WHERE T1.encounter_id = :encounterId -- 替换为实际的encounterId
AND T1.context_enum = 'ACTIVITY'
AND T1.delete_flag = '0'
AND T1.status_enum IN (1, 2, 3, 4, 5, 6);
步骤4:检查后端传入的参数值
检查 OutpatientChargeAppServiceImpl.java 中:
ChargeItemContext.ACTIVITY.getValue()
确认这个值是什么(应该是 'ACTIVITY' 或对应的枚举值)
解决方案
如果是数据问题:
-
缺少诊疗项目定义数据:
- 需要在
wor_activity_definition表中添加诊疗项目数据 - 或者在系统管理-目录管理-诊疗项目中添加
- 需要在
-
product_id无法匹配:
- 检查
adm_charge_item表中的product_id是否正确 - 检查
wor_activity_definition表中的id是否与product_id匹配
- 检查
-
delete_flag不正确:
- 将
wor_activity_definition表中需要使用的记录的delete_flag设置为 '0'
- 将
如果是代码问题:
-
context_enum值不匹配:
- 检查后端代码中
ChargeItemContext.ACTIVITY.getValue()返回的值 - 确保与数据库中的
context_enum值一致
- 检查后端代码中
-
SQL查询条件错误:
- 检查 SQL 中的关联条件是否正确
- 检查是否有其他过滤条件导致数据被过滤掉
快速诊断SQL
运行以下SQL可以快速诊断问题:
-- 见 diagnose_treatment_items_issue.sql 文件