4.6 KiB
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 理解
在"住院护士站 → 汇总领药"功能中,存在两个问题:
- "领药明细列表"中的"领药时间"列(
prescriptionList.vue)显示的时间(如"06-09")早于医嘱开立时间和实际执行时间,数据来源错误。 - "汇总单列表"中的"发药时间"列(
summaryMedicineList.vue)同样数据来源不正确,且列名不符合业务语义。
用户期望:列名改为"执行时间",显示的值应严格等于医嘱执行时记录的 cli_procedure.occurrence_time(执行时间),未发药的不展示。
二、根因分析
根因 1:领药明细列表时间数据来源错误(核心问题)
SQL selectMedicineDispenseFormPage 中,领药时间取的是 mmd.planned_dispense_time(预定发药时间),而非实际执行时间。
MedicineSummaryAppMapper.xml 第 53 行 collection 映射:
<result property="dispenseTime" column="planned_dispense_time"/>
planned_dispense_time 是药品发放记录中预设的发药时间,不是护士实际执行医嘱的时间。这个值在发放记录创建时就确定了,可能早于医嘱开立时间。
根因 2:汇总单列表时间数据来源错误 + JOIN Bug
SQL selectMedicineSummaryFormPage 中,"发药时间"取的是 wsd.receive_time(供应接收时间),而非执行时间。同时 SQL 有一个 JOIN Bug:
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 映射改为
<result property="dispenseTime" column="occurrence_time"/>(不再用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 分析决策