Files
his/openhis-server-new/sql/诊断门诊划价检索不出诊疗项目问题.md

4.8 KiB
Raw Blame History

诊断:门诊划价检索不出诊疗项目问题

问题描述

在门诊划价页面,检索不出诊疗项目,显示"暂无数据"。

问题分析

SQL查询逻辑

根据 OutpatientChargeAppMapper.xml 中的 selectEncounterPatientPrescription 查询:

  1. 查询主表adm_charge_item(收费项目表)
  2. 关联诊疗项目定义表wor_activity_definition
    • 关联条件:T1.context_enum = #{activity} AND T1.product_id = T2.id AND T2.delete_flag = '0'
  3. 返回字段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 应该 > 0unmatched_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' 或对应的枚举值)

解决方案

如果是数据问题:

  1. 缺少诊疗项目定义数据

    • 需要在 wor_activity_definition 表中添加诊疗项目数据
    • 或者在系统管理-目录管理-诊疗项目中添加
  2. product_id无法匹配

    • 检查 adm_charge_item 表中的 product_id 是否正确
    • 检查 wor_activity_definition 表中的 id 是否与 product_id 匹配
  3. delete_flag不正确

    • wor_activity_definition 表中需要使用的记录的 delete_flag 设置为 '0'

如果是代码问题:

  1. context_enum值不匹配

    • 检查后端代码中 ChargeItemContext.ACTIVITY.getValue() 返回的值
    • 确保与数据库中的 context_enum 值一致
  2. SQL查询条件错误

    • 检查 SQL 中的关联条件是否正确
    • 检查是否有其他过滤条件导致数据被过滤掉

快速诊断SQL

运行以下SQL可以快速诊断问题

-- 见 diagnose_treatment_items_issue.sql 文件