5.1 KiB
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 标题:【住院护士站-入出转管理】转出页面待转科患者医嘱列表缺失"医嘱状态"列且"执行科室"未获取值回显
重现步骤:
- 登录"住院医生工作站",为患者开立医嘱(如:荆防颗粒),确保已校对(状态为:已校对,药房/科室为:中心药房)
- 登录"住院护士站",进入【入出转管理】下的【转出】标签页,选择该患者
- 观察右侧下方医嘱列表
期望结果:
- 医嘱列表应有"医嘱状态"列,正确回显"已校对"
- "执行科室"列应显示"中心药房",不能显示"-"
附图关键信息:
- 图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:
// 发放药房
medicationRequest.setPerformLocation(adviceSaveDto.getLocationId());
AdviceSaveDto.java 中:
positionId(line 65):前端字段名orgId,对应数据库perform_locationorgId(line 78):前端传来字段名orgId,对应数据库org_idlocationId(line 166):独立字段,前端可能未发送此字段
Bug #238 修复引入的问题:AdviceSaveDto 添加了 orgId 字段(Bug #238 修复),但 DoctorStationAdviceAppServiceImpl 仍然从 getLocationId() 读取药房 ID,而前端实际发送的是 orgId。locationId 未被前端赋值,导致 performLocation 始终为 null。
三、修复方案
方案:修复后端赋值逻辑
修改文件:DoctorStationAdviceAppServiceImpl.java
修改位置:第 1172 行
修改内容:
// 修改前
medicationRequest.setPerformLocation(adviceSaveDto.getLocationId());
// 修改后 — 优先使用 getPerformLocation(),其次 getOrgId(),最后 getLocationId()
medicationRequest.setPerformLocation(
adviceSaveDto.getPerformLocation() != null ? adviceSaveDto.getPerformLocation()
: adviceSaveDto.getOrgId() != null ? adviceSaveDto.getOrgId()
: adviceSaveDto.getLocationId()
);
同时检查(同类问题):
DoctorStationChineseMedicalAppServiceImpl.java:551— 中药处方可能有相同问题- 现有数据修复 — 对
perform_location为 NULL 的已保存医嘱,需要从content_json中提取orgId回填
验证步骤:
mvn clean compile -DskipTests— 编译通过- 医生站开药 → 选"中心药房" → 签发
- 护士站转出页 → 选该患者 → 医嘱列表"执行科室"应显示"中心药房"
四、路由决策
FIXER: guanyu(后端开发)
REASON: 核心 Bug 在后端 DoctorStationAdviceAppServiceImpl 的字段赋值逻辑,需要修改 Java 代码中 setPerformLocation 的取值来源。前端模板和 SQL 查询均已正确,无需前端修改。可能还需同步修复 DoctorStationChineseMedicalAppServiceImpl 中的同类问题。
路由决策
- FIXER_ID: guanyu
- 修复 Agent: guanyu(后端)
- 原因: LLM 分析决策
⚠️ 修复人员请先验证以上分析是否正确,再执行修复。