# Bug #761 诸葛亮分析报告 > **文档类型**: Bug分析 > **分析时间**: 2026-06-12 14:24:27 > **分析模型**: mimo-v2.5 (LLM深度分析) --- ## 基本信息 - **Bug #**: 761 - **标题**: [住院护士站-汇总领药]领药明细列表,“领药时间”显示逻辑异常且早于医嘱开立时间 - **模块**: 病区护士工作站 - **提出人**: 陈显精 --- Now I have a complete picture. Let me finalize my analysis. --- ### 一、Bug 理解 在"住院护士站 → 汇总领药"功能中,存在两个问题: 1. **"领药明细列表"中的"领药时间"列**(`prescriptionList.vue`)显示的时间(如"06-09")早于医嘱开立时间和实际执行时间,数据来源错误。 2. **"汇总单列表"中的"发药时间"列**(`summaryMedicineList.vue`)同样数据来源不正确,且列名不符合业务语义。 用户期望:列名改为"执行时间",显示的值应严格等于医嘱执行时记录的 `cli_procedure.occurrence_time`(执行时间),未发药的不展示。 ### 二、根因分析 **根因 1:领药明细列表时间数据来源错误(核心问题)** SQL `selectMedicineDispenseFormPage` 中,领药时间取的是 `mmd.planned_dispense_time`(预定发药时间),而非实际执行时间。 `MedicineSummaryAppMapper.xml` 第 53 行 collection 映射: ```xml ``` `planned_dispense_time` 是药品发放记录中预设的发药时间,不是护士实际执行医嘱的时间。这个值在发放记录创建时就确定了,可能早于医嘱开立时间。 **根因 2:汇总单列表时间数据来源错误 + JOIN Bug** SQL `selectMedicineSummaryFormPage` 中,"发药时间"取的是 `wsd.receive_time`(供应接收时间),而非执行时间。同时 SQL 有一个 JOIN Bug: ```sql LEFT JOIN adm_practitioner ap2 ON wsd.receiver_id = ap.id -- ← 应为 ap2.id ``` `ap2` 和 `ap` 都 JOIN 到了 `adm_practitioner` 表的同一行(`wsr.applicant_id`),导致"领药人"显示的是"申请人"的名字。 **根因 3:前端列名不符合业务语义** - `prescriptionList.vue` 第 164 行:`title="领药时间"` 应改为"执行时间" - `summaryMedicineList.vue` 第 46 行:`title="发药时间"` 应改为"执行时间" **涉及文件**: | 层级 | 文件 | 问题 | |------|------|------| | Mapper XML | `MedicineSummaryAppMapper.xml` | SQL 取 `planned_dispense_time` / `receive_time`,应取 `occurrence_time` | | Mapper XML | `MedicineSummaryAppMapper.xml` | `ap2` JOIN 条件错误 | | DTO | `MedicineDispenseFormDto.java` | collection 中 `dispenseTime` 映射到 `planned_dispense_time` | | DTO | `MedicineSummaryFormDto.java` | `dispenseTime` 映射到 `receive_time` | | 前端 | `prescriptionList.vue` | 列名"领药时间"应为"执行时间";JS 中 substring 逻辑基于 `dispenseTime` | | 前端 | `summaryMedicineList.vue` | 列名"发药时间"应为"执行时间" | ### 三、修复方案 **Step 1:修复 `MedicineSummaryAppMapper.xml`** 1a. 修改 `selectMedicineDispenseFormPage`: - SELECT 中增加 `cp.occurrence_time`(从 `cli_procedure` 获取执行时间) - JOIN 增加 `LEFT JOIN cli_procedure cp ON mmd.procedure_id = cp.id AND cp.delete_flag = '0'` - collection 映射改为 ``(不再用 `planned_dispense_time`) - 对于未执行的(`procedure_id IS NULL`),`occurrence_time` 自然为 NULL,前端不显示 1b. 修改 `selectMedicineSummaryFormPage`: - 将 `wsd.receive_time AS dispense_time` 改为从 `cli_procedure` 取 `cp.occurrence_time AS dispense_time`(或从 `med_medication_dispense` 取) - 修复 JOIN Bug:`wsd.receiver_id = ap.id` → `wsd.receiver_id = ap2.id` **Step 2:修改前端列名和显示逻辑** 2a. `prescriptionList.vue` 第 164 行:`title="领药时间"` → `title="执行时间"` 2b. `summaryMedicineList.vue` 第 46 行:`title="发药时间"` → `title="执行时间"` **Step 3:(可选)重命名 DTO 字段** - `MedicineDispenseFormDto.dispenseTime` → `executeTime`(提高语义清晰度) - `MedicineSummaryFormDto.dispenseTime` → `executeTime` - 同步修改前端字段引用 ### 四、路由决策 **FIXER: guanyu(后端)+ zhaoyun(前端)** **REASON**: 修复涉及后端 Mapper XML SQL 重写(数据来源从 `planned_dispense_time`/`receive_time` 改为 `cli_procedure.occurrence_time`,修复 JOIN Bug)→ guanyu 负责;前端两处列名修改和可能的字段重命名 → zhaoyun 负责。两个修复范围独立,可并行。 --- ## 路由决策 - **修复 Agent**: guanyu - **原因**: LLM 分析决策