# Bug #497 分析报告 ## 标题 【住院医生工作站-检查申请】检查申请列表缺失"申请单状态"列及全流程闭环状态流转逻辑 ## 根因分析 ### 问题描述 检查申请列表的"申请单状态"列始终显示"待签发",无法正确反映护士校对、医技接单、报告生成等临床节点状态。 ### 根因定位 `doc_request_form.status` 列在数据库中存在(INTEGER, 默认值 0),但全链路没有任何代码更新它: 1. **实体层**: `RequestForm` 领域实体(`RequestForm.java`)**没有 `status` 字段** → 保存时无法设置 2. **服务层**: `saveRequestForm()` / `withdrawRequestForm()` 方法从未修改 `doc_request_form.status` 3. **查询层**: SQL 查询直接 SELECT `drf.status` → 始终返回默认值 0 4. **前端层**: `parseStatus(0)` → 始终返回"待签发" 实际业务状态由 `wor_service_request.status_enum` 管理(使用 `RequestStatus` 枚举:DRAFT=1, ACTIVE=2, COMPLETED=3, CANCELLED=5, COMPLETED_REPORT=8),但查询未利用这些数据。 ### 修复方案 1. **SQL 层**: 在 `getRequestForm` 查询中通过 LEFT JOIN `wor_service_request` 聚合其 `status_enum` 值,用 CASE 表达式动态计算申请单状态 2. **实体层**: 给 `RequestForm.java` 添加 `status` 字段以完善领域模型 3. **前端层**: 已有状态列、筛选器、操作按钮,无需修改 ### 状态映射 | ServiceRequest.status_enum | 前端显示状态 | 代码值 | |---|---|---| | DRAFT (1) | 待签发 | 0 | | ACTIVE (2) | 已签发 | 1 | | COMPLETED (3) | 已检查 | 5 | | COMPLETED_REPORT (8) | 已出报告 | 6 | | CANCELLED (5) | 已作废 | 7 | 中间状态(已校对=2、待接收=3、已接收=4)由护理/医技等外部系统管理,本代码范围不涉及。 ### 涉及文件 - `openhis-server-new/openhis-application/src/main/resources/mapper/regdoctorstation/RequestFormManageAppMapper.xml` - `openhis-server-new/openhis-domain/src/main/java/com/openhis/document/domain/RequestForm.java` ## 修复结果 **结果**: ✅ 成功 **改动行数**: +86/-49 (2个文件) ### 具体修改 #### 1. RequestFormManageAppMapper.xml - 将原查询包裹在子查询中 - 用 `CASE WHEN EXISTS` 动态计算状态,替代静态 `drf.status` 列 - 状态筛选从外层作用于 `computed_status` - 移除了不必要的 GROUP BY(子查询中无聚合) #### 2. RequestForm.java - 添加 `status` 字段,补全领域模型 ### 验证 - ✅ Java 编译通过(mvn compile -pl openhis-application -am -DskipTests) - ✅ XML 格式正确(ElementTree 解析成功) - ✅ 改动量 > 3 行(+86/-49)