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