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

166 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 诊断:门诊划价检索不出诊疗项目问题
## 问题描述
在门诊划价页面,检索不出诊疗项目,显示"暂无数据"。
## 问题分析
### 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 文件
```