# 诊断:门诊划价检索不出诊疗项目问题 ## 问题描述 在门诊划价页面,检索不出诊疗项目,显示"暂无数据"。 ## 问题分析 ### 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**: ```sql SELECT COUNT(*) FROM wor_activity_definition WHERE delete_flag = '0'; ``` #### 2. 收费项目中的product_id无法匹配到诊疗项目定义 - **检查**:`adm_charge_item` 表中的 `product_id` 是否存在于 `wor_activity_definition` 表中 - **SQL**: ```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**: ```sql SELECT id, name, delete_flag FROM wor_activity_definition WHERE delete_flag != '0'; ``` #### 4. context_enum 值不匹配 - **检查**:`adm_charge_item` 表中的 `context_enum` 值是否正确 - **SQL**: ```sql SELECT DISTINCT context_enum FROM adm_charge_item WHERE delete_flag = '0'; ``` - **注意**:后端代码中传入的 `#{activity}` 参数值应该是 `ChargeItemContext.ACTIVITY.getValue()` ## 诊断步骤 ### 步骤1:检查诊疗项目定义表是否有数据 ```sql 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:检查收费项目中的诊疗项目是否能匹配到定义 ```sql 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:检查具体就诊的诊疗项目 ```sql -- 替换 :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` 中: ```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可以快速诊断问题: ```sql -- 见 diagnose_treatment_items_issue.sql 文件 ```