诊疗下没有项目功能完善

This commit is contained in:
2026-01-26 11:59:13 +08:00
parent 2df1ed645f
commit 1616f66fc4
6 changed files with 22 additions and 576 deletions

View File

@@ -96,4 +96,7 @@ WHERE aci.context_enum = 'ACTIVITY'

View File

@@ -1,91 +0,0 @@
-- 快速诊断诊疗项目检索问题
-- 已知wor_activity_definition 表中有4条数据
-- 关键ChargeItemContext.ACTIVITY.getValue() = 3整数
-- 步骤1检查这4条诊疗项目定义的delete_flag状态
SELECT
id,
name,
delete_flag,
CASE WHEN delete_flag = '0' THEN '✅ 可用' ELSE '❌ 已删除' END as status
FROM wor_activity_definition
ORDER BY id;
-- 步骤2检查收费项目中是否有诊疗项目类型context_enum = 3的记录
SELECT
COUNT(*) as total_count,
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) as active_count
FROM adm_charge_item
WHERE (context_enum::text = '3' OR context_enum = 3);
-- 步骤3检查收费项目能否匹配到诊疗项目定义最关键
SELECT
aci.id as charge_item_id,
aci.encounter_id,
aci.product_id,
aci.status_enum,
wad.id as activity_def_id,
wad.name as activity_name,
CASE
WHEN wad.id IS NULL THEN '❌ 无法匹配product_id=' || aci.product_id || ' 在诊疗项目定义表中不存在'
WHEN wad.delete_flag != '0' THEN '❌ 无法匹配:诊疗项目定义已删除'
WHEN aci.delete_flag != '0' THEN '❌ 无法匹配:收费项目已删除'
WHEN aci.status_enum NOT IN (1,2,3,4,5,6) THEN '❌ 无法匹配:状态不在查询范围内 status=' || aci.status_enum
ELSE '✅ 可以匹配'
END as match_result
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::text = '3' OR aci.context_enum = 3)
AND aci.delete_flag = '0'
LIMIT 50;
-- 步骤4统计匹配情况
SELECT
COUNT(*) as total_charge_items,
COUNT(CASE WHEN wad.id IS NOT NULL AND wad.delete_flag = '0' THEN 1 END) as matched_count,
COUNT(CASE WHEN wad.id IS NULL THEN 1 END) as unmatched_def_count,
COUNT(CASE WHEN wad.delete_flag != '0' THEN 1 END) as deleted_def_count,
COUNT(CASE WHEN wad.id IS NOT NULL AND wad.delete_flag = '0' AND aci.status_enum IN (1,2,3,4,5,6) THEN 1 END) as final_matched_count
FROM adm_charge_item aci
LEFT JOIN wor_activity_definition wad
ON aci.product_id = wad.id
WHERE (aci.context_enum::text = '3' OR aci.context_enum = 3)
AND aci.delete_flag = '0';
-- 步骤5检查具体就诊的诊疗项目如果有encounterId取消注释并替换
-- SELECT
-- T1.encounter_id,
-- T1.id as charge_item_id,
-- T1.product_id,
-- T1.status_enum,
-- T2.id as activity_def_id,
-- T2.name as activity_name,
-- CASE
-- WHEN T2.id IS NULL THEN '❌ 无法匹配'
-- WHEN T2.delete_flag != '0' THEN '❌ 定义已删除'
-- WHEN T1.status_enum NOT IN (1,2,3,4,5,6) THEN '❌ 状态不符合'
-- ELSE '✅ 正常'
-- END as status
-- FROM adm_charge_item AS T1
-- LEFT JOIN wor_activity_definition AS T2
-- ON T1.product_id = T2.id AND T2.delete_flag = '0'
-- WHERE T1.encounter_id = :encounterId -- 替换为实际的encounterId
-- AND (T1.context_enum::text = '3' OR T1.context_enum = 3)
-- AND T1.delete_flag = '0';

View File

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