Files
his/MD/bugs/BUG_727_ANALYSIS.md

126 lines
5.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 #727 诸葛亮分析报告
> **文档类型**: Bug分析
> **分析时间**: 2026-06-13 01:08:49
> **分析模型**: mimo-v2.5 (LLM深度分析)
---
## 基本信息
- **Bug #**: 727
- **标题**: 【住院护士站-入出转管理】转出页面待转科患者医嘱列表缺失“医嘱状态”列且“执行科室”未获取值回显
- **模块**: 病区护士工作站
- **提出人**: 陈显精
---
I now have a complete understanding of the bug. Let me provide the analysis.
---
## 一、Bug 理解
**禅道 Bug 标题**:【住院护士站-入出转管理】转出页面待转科患者医嘱列表缺失"医嘱状态"列且"执行科室"未获取值回显
**重现步骤**
1. 登录"住院医生工作站",为患者开立医嘱(如:荆防颗粒),确保已校对(状态为:已校对,药房/科室为:中心药房)
2. 登录"住院护士站",进入【入出转管理】下的【转出】标签页,选择该患者
3. 观察右侧下方医嘱列表
**期望结果**
1. 医嘱列表应有"医嘱状态"列,正确回显"已校对"
2. "执行科室"列应显示"中心药房",不能显示"-"
**附图关键信息**
- 图2524护士站转出页医嘱列表缺少"医嘱状态"列,"执行科室"显示"-"
- 图2525医生站对比页同一医嘱"荆防颗粒",状态显示"已校对",药房/科室显示"中心药房"
**综合总结**:护士站在转出页面查看待转科患者的医嘱时,列表缺少"医嘱状态"列且"执行科室"未回显药房名称。而同一医嘱在医生站正常显示"已校对"和"中心药房"。这是一个前后端数据展示不一致的问题。
---
## 二、根因分析
### 问题1医嘱状态列缺失
**已修复**。Commit `babd8d0c0`2026-06-11已添加了"医嘱状态"列到 `transferOut.vue` 模板,且后端 `ATDManageAppServiceImpl.getInPatientPendingList()` 已正确设置 `requestStatus_enumText`
### 问题2执行科室显示"-"
**根因**:后端保存药品医嘱时,`perform_location` 字段未正确赋值。
**完整数据链路分析**
| 环 | 状态 | 说明 |
|---|---|---|
| ① 前端录入 | ✅ 正常 | 医生站选药房后,`orgId` 字段存有药房 ID |
| ② DTO 传输 | ❌ 断裂 | 前端发送 `orgId` → DTO 反序列化到 `orgId` 字段 |
| ③ Service 保存 | ❌ 断裂 | `DoctorStationAdviceAppServiceImpl:1172` 读取 `adviceSaveDto.getLocationId()` 而非 `getOrgId()`,导致 `performLocation` 为 null |
| ④ 数据库存储 | ❌ 数据缺失 | `med_medication_request.perform_location` 为 NULL |
| ⑤ 护士站查询 | ✅ SQL 正确 | `ATDManageAppMapper.xml` 正确 JOIN `adm_location`,但因 `perform_location` 为 NULL`position_name` 为 NULL |
| ⑥ 前端展示 | ✅ 逻辑正确 | `positionName \|\| orgName` 均为 null显示"-" |
**关键代码定位**
`DoctorStationAdviceAppServiceImpl.java:1172`
```java
// 发放药房
medicationRequest.setPerformLocation(adviceSaveDto.getLocationId());
```
`AdviceSaveDto.java` 中:
- `positionId`line 65前端字段名 `orgId`,对应数据库 `perform_location`
- `orgId`line 78前端传来字段名 `orgId`,对应数据库 `org_id`
- `locationId`line 166独立字段前端可能未发送此字段
**Bug #238 修复引入的问题**`AdviceSaveDto` 添加了 `orgId` 字段Bug #238 修复),但 `DoctorStationAdviceAppServiceImpl` 仍然从 `getLocationId()` 读取药房 ID而前端实际发送的是 `orgId``locationId` 未被前端赋值,导致 `performLocation` 始终为 null。
---
## 三、修复方案
### 方案:修复后端赋值逻辑
**修改文件**`DoctorStationAdviceAppServiceImpl.java`
**修改位置**:第 1172 行
**修改内容**
```java
// 修改前
medicationRequest.setPerformLocation(adviceSaveDto.getLocationId());
// 修改后 — 优先使用 getPerformLocation(),其次 getOrgId(),最后 getLocationId()
medicationRequest.setPerformLocation(
adviceSaveDto.getPerformLocation() != null ? adviceSaveDto.getPerformLocation()
: adviceSaveDto.getOrgId() != null ? adviceSaveDto.getOrgId()
: adviceSaveDto.getLocationId()
);
```
**同时检查**(同类问题):
1. `DoctorStationChineseMedicalAppServiceImpl.java:551` — 中药处方可能有相同问题
2. 现有数据修复 — 对 `perform_location` 为 NULL 的已保存医嘱,需要从 `content_json` 中提取 `orgId` 回填
**验证步骤**
1. `mvn clean compile -DskipTests` — 编译通过
2. 医生站开药 → 选"中心药房" → 签发
3. 护士站转出页 → 选该患者 → 医嘱列表"执行科室"应显示"中心药房"
---
## 四、路由决策
**FIXER**: guanyu后端开发
**REASON**: 核心 Bug 在后端 `DoctorStationAdviceAppServiceImpl` 的字段赋值逻辑,需要修改 Java 代码中 `setPerformLocation` 的取值来源。前端模板和 SQL 查询均已正确,无需前端修改。可能还需同步修复 `DoctorStationChineseMedicalAppServiceImpl` 中的同类问题。
---
## 路由决策
- **FIXER_ID**: guanyu
- **修复 Agent**: guanyu后端
- **原因**: LLM 分析决策
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。