Files
his/bug497_analysis.md

4.1 KiB
Raw Blame History

分析报告 — 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 映射:

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 语句

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 — 校对方法修改