诊疗下面没有诊疗项目
This commit is contained in:
165
openhis-server-new/sql/诊断门诊划价检索不出诊疗项目问题.md
Normal file
165
openhis-server-new/sql/诊断门诊划价检索不出诊疗项目问题.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# 诊断:门诊划价检索不出诊疗项目问题
|
||||
|
||||
## 问题描述
|
||||
在门诊划价页面,检索不出诊疗项目,显示"暂无数据"。
|
||||
|
||||
## 问题分析
|
||||
|
||||
### 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 文件
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user