Files
his/bug497_analysis.md

95 lines
4.1 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.

# 分析报告 — 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` — 校对方法修改