# Bug #719 诸葛亮分析报告 > **文档类型**: Bug分析 > **分析时间**: 2026-06-13 02:11:11 > **分析模型**: mimo-v2.5 (LLM深度分析) --- ## 基本信息 - **Bug #**: 719 - **标题**: 【护士站-医嘱校对】已停止列表:频次/用法及停嘱医生字段未回写显示 - **模块**: 病区护士工作站 - **提出人**: 陈显精 --- Now I have a complete understanding of the bug. Let me provide the analysis. --- ## 一、Bug 理解 ### 禅道 Bug 原文 **标题**: 【护士站-医嘱校对】已停止列表:频次/用法及停嘱医生字段未回写显示 **重现步骤**: 1. 医生端已对某医嘱进行"停嘱"操作(如:注射用头孢哌酮舒巴坦钠) 2. 登录护士端进入"住院护士站" > "医嘱校对" 3. 在查询页签中点击"已停止"标签 4. 查看对应医嘱记录的"频次/用法"及"停嘱医生"两列 **结果**: 列表中"频次/用法"及"停嘱医生"列内容为空,未显示任何数据。 **期望**: 列表对应的"频次/用法"及"停嘱医生"列应正确显示数据,且与临床医生端显示内容一致(如:每日一次 静脉滴注、内科医生1)。 ### 附图关键信息 - **图2513**(护士站"已停止"标签页):两条已停医嘱记录中,"频次/用法"列和"停嘱医生"列均为空白。图中用红色标注"频次/用法 和停嘱医生未回写"。 - **图2512**(医生站视图):同一医嘱显示"频次/用法"为"每日一次 静脉滴注","停嘱医生"为"内科医生1"。 ### 综合总结 护士在医嘱校对的"已停止"列表中查看已停医嘱时,"频次/用法"和"停嘱医生"两个字段显示为空。这两个字段在医生端正常显示。问题出在护士站查询已停止医嘱时,数据源(SQL查询或Java处理)未能正确返回这两个字段的值。 --- ## 二、根因分析 ### 根因1:停嘱医生字段 —— `stopper_name` 映射到 `update_by` 被覆盖 **核心问题链路**: 1. **医生停嘱** (`AdviceManageAppServiceImpl.stopRegAdvice`): 设置 `update_by = SecurityUtils.getNickName()`(医生昵称) - 此时 `update_by = "内科医生1"` ✓ - **但未设置 `stopper_id`**(虽然 V41 迁移已添加此列) 2. **护士校对** (`AdviceProcessAppServiceImpl.adviceVerify`): 设置 `update_by = SecurityUtils.getNickName()`(护士昵称) - 此时 `update_by` 被覆盖为护士名 - 如果护士昵称为空/NULL → `update_by = NULL` 3. **SQL 查询** (`AdviceProcessAppMapper.xml`): ```sql NULL::bigint AS stopper_id, -- 硬编码 NULL! T1.update_by AS stopper_name -- 使用 update_by,已被覆盖 ``` 4. **Java 处理**: ```java e.setStopperName(e.getStopperName()); // 这是空操作! ``` **结论**: `stopper_name` 取自 `update_by`,而 `update_by` 被护士校对操作覆盖。若护士昵称为空,该字段为 NULL。V41 迁移添加了 `stopper_id` 列但 Java 实体和查询均未使用。 **涉及文件**: - `AdviceProcessAppMapper.xml` (L209-210, L355-356): `NULL::bigint AS stopper_id` + `T1.update_by AS stopper_name` - `AdviceProcessAppServiceImpl.java` (L318): `e.setStopperName(e.getStopperName())` — 空操作 - `AdviceManageAppServiceImpl.java` (L1127): `.set(MedicationRequest::getUpdateBy, stopUserName)` — 未设 `stopper_id` - `MedicationRequest.java`: 缺少 `stopperId` 字段 - `ServiceRequest.java`: 缺少 `stopperId` 字段 ### 根因2:频次/用法字段 —— 需要进一步排查 SQL 查询正确选取了 `T1.rate_code` 和 `T1.method_code`,Java 代码也正确计算了 `frequencyUsage`。但两个停嘱医嘱都为空,可能是: - 数据库中这两条医嘱的 `rate_code`/`method_code` 为 NULL(创建时未设置) - 或 `DictUtils.getDictLabel` 返回空字符串 **需验证**: 检查 `med_medication_request` 表中对应记录的 `rate_code` 和 `method_code` 值。 --- ## 三、修复方案 ### 修复1:停嘱医生字段(核心修复) **Step 1**: 给 `MedicationRequest` 和 `ServiceRequest` 实体添加 `stopperId` 字段 **Step 2**: 更新医生站停嘱逻辑,设置 `stopper_id` ```java // AdviceManageAppServiceImpl.stopRegAdvice // 获取停嘱医生的 practitionerId Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId(); // 药品 .set(MedicationRequest::getStopperId, practitionerId) .set(MedicationRequest::getUpdateBy, stopUserName) // 诊疗 .set(ServiceRequest::getStopperId, practitionerId) .set(ServiceRequest::getUpdateBy, stopUserName) ``` **Step 3**: 更新护士站 SQL 查询,用 `stopper_id` 关联 `adm_practitioner` 获取医生姓名 ```sql -- AdviceProcessAppMapper.xml 中 MedicationRequest UNION: -- 修改前: NULL::bigint AS stopper_id, T1.update_by AS stopper_name -- 修改后: T1.stopper_id AS stopper_id, COALESCE(practitioner_stop.name, T1.update_by) AS stopper_name -- 并增加 LEFT JOIN: LEFT JOIN adm_practitioner practitioner_stop ON T1.stopper_id = practitioner_stop.id AND practitioner_stop.delete_flag = '0' ``` 对 ServiceRequest UNION 同理修改。 **Step 4**: 更新护士站校对逻辑,停嘱单校对时不应覆盖 `update_by`(或同时保留 stopper 信息) ### 修复2:频次/用法字段 先验证数据:检查 `med_medication_request` 表中 `rate_code` 和 `method_code` 是否为 NULL。如果为 NULL,需检查订单创建流程是否正确设置了这两个字段。 --- ## 四、路由决策 **FIXER: guanyu(后端开发)+ zhaoyun(前端开发)** **REASON**: 根因在后端(SQL 查询 `stopper_name` 映射错误 + 实体缺少 `stopperId` + 停嘱逻辑未设 `stopper_id`),需 guanyu 修复实体类、Mapper XML、Service 层。频次/用法需排查数据库数据,也属后端。前端可能需确认"频次/用法"为空时的展示逻辑,属 zhaoyun 范围。 --- ## 路由决策 - **FIXER_ID**: guanyu - **修复 Agent**: guanyu(后端) - **原因**: LLM 分析决策 > ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。