Fix Bug #497: 根因+修复方案摘要

This commit is contained in:
2026-05-17 19:35:25 +08:00
parent f9f76b74da
commit 17d005051d

94
bug497_analysis.md Normal file
View File

@@ -0,0 +1,94 @@
# 分析报告 — Bug #497
## Bug 描述
【住院医生工作站-检查申请】检查申请列表缺失"申请单状态"列及全流程闭环状态流转逻辑
## 根因分析
### 前端层面
`examineApplication.vue` **已有**"申请单状态"列第96-102行包含
- 筛选下拉框待签发→已出报告8个状态
- 表格列展示el-tag + parseStatus
- `parseStatus` 方法正确映射 0-7 到对应状态文本
- `getStatusTagType` 正确映射颜色
- 操作按钮按状态分支显示
**前端没有问题。**
### 后端层面 — SQL CASE 语句不完整
`RequestFormManageAppMapper.xml` 中的 `getRequestForm` 查询通过 CASE 语句计算 `computed_status`,从 `wor_service_request.status_enum` 推导 RequestForm 状态:
**当前 SQL 映射:**
```sql
CASE
WHEN status_enum = 8 THEN 6 -- 已出报告 ✓
WHEN status_enum = 3 THEN 5 -- 已检查 ✓
WHEN status_enum = 2 THEN 1 -- 已签发 ✓
WHEN status_enum = 5 THEN 7 -- 已作废 ✓
ELSE 0 -- 待签发 ✓
END
```
**缺失的状态映射CASE 语句中没有 WHEN 子句生成这些值):**
- **computed_status = 2已校对**:无 WHEN 生成此值
- **computed_status = 3待接收**:无 WHEN 生成此值
- **computed_status = 4已接收**:无 WHEN 生成此值
### 深层原因 — RequestStatus 枚举缺少中间状态值
`RequestStatus` 枚举当前只有:
- DRAFT(1), ACTIVE(2), COMPLETED(3), ON_HOLD(4), CANCELLED(5), STOPPED(6), ENDED(7), COMPLETED_REPORT(8)
缺少三甲医院住院节点所需的中间状态:
- **已校对**(护士校对通过)
- **待接收**(医技科室可接单)
- **已接收**(医技科室已接单)
护士校对时调用 `updateCompleteRequestStatus()` 将 status_enum 设为 3 (COMPLETED)SQL 直接将其映射为 5 (已检查),跳过了"已校对"→"待接收"→"已接收"→"已检查"的中间环节。
### 数据流总结
| 节点 | ServiceRequest.status_enum | SQL 当前映射 | RequestForm.status | 正确? |
|------|---------------------------|-------------|-------------------|--------|
| 医生录入 | 1 (DRAFT) | ELSE 0 | 0 待签发 | ✓ |
| 医生签发 | 2 (ACTIVE) | WHEN 2 THEN 1 | 1 已签发 | ✓ |
| 护士校对 | 3 (COMPLETED) | WHEN 3 THEN 5 | 5 已检查 | ✗ 跳过中间状态 |
| 医技接收 | 无对应枚举值 | 无 | 无 | ✗ 缺失 |
| 医技检查 | 3 (COMPLETED) | WHEN 3 THEN 5 | 5 已检查 | ✓ 但语义不对 |
| 出报告 | 8 (COMPLETED_REPORT) | WHEN 8 THEN 6 | 6 已出报告 | ✓ |
| 作废 | 5 (CANCELLED) | WHEN 5 THEN 7 | 7 已作废 | ✓ |
## 修复方案
### 1. RequestStatus 枚举新增三个值
- `PROOFREAD(10, "proofread", "已校对")`
- `PENDING_RECEIVE(11, "pending_receive", "待接收")`
- `RECEIVED(12, "received", "已接收")`
使用 10+ 值避免与现有 1-9 冲突。
### 2. 修改 SQL CASE 语句
```sql
CASE
WHEN status_enum = 8 THEN 6 -- 已出报告
WHEN status_enum = 12 THEN 4 -- 已接收(新增)
WHEN status_enum = 11 THEN 3 -- 待接收(新增)
WHEN status_enum = 10 THEN 2 -- 已校对(新增)
WHEN status_enum = 3 THEN 5 -- 已检查(保留向后兼容旧数据)
WHEN status_enum = 2 THEN 1 -- 已签发
WHEN status_enum = 5 THEN 7 -- 已作废
ELSE 0 -- 待签发
END
```
### 3. 修改护士校对方法
`ServiceRequestServiceImpl.updateCompleteRequestStatus()` 中 status_enum 从 3 (COMPLETED) 改为 10 (PROOFREAD)。
### 4. 医技接收后状态流转
医技接收时将 status_enum 从 10 (PROOFREAD) 更新为 11 (PENDING_RECEIVE)→12 (RECEIVED),检查后更新为 3 (COMPLETED)。
## 涉及文件
1. `openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/RequestStatus.java` — 枚举新增
2. `openhis-server-new/openhis-application/src/main/resources/mapper/regdoctorstation/RequestFormManageAppMapper.xml` — SQL CASE 修复
3. `openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ServiceRequestServiceImpl.java` — 校对方法修改