From 17d005051d2c31fc7e8734036d24dd99b7754a58 Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Sun, 17 May 2026 19:35:25 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#497:=20=E6=A0=B9=E5=9B=A0+?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B9=E6=A1=88=E6=91=98=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bug497_analysis.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 bug497_analysis.md diff --git a/bug497_analysis.md b/bug497_analysis.md new file mode 100644 index 000000000..bb2746311 --- /dev/null +++ b/bug497_analysis.md @@ -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` — 校对方法修改