Files
his/MD/bugs/BUG_761_ANALYSIS.md

4.6 KiB
Raw Blame History

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 映射:

<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

ap2ap 都 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 NULLoccurrence_time 自然为 NULL前端不显示

1b. 修改 selectMedicineSummaryFormPage

  • wsd.receive_time AS dispense_time 改为从 cli_procedurecp.occurrence_time AS dispense_time(或从 med_medication_dispense 取)
  • 修复 JOIN Bugwsd.receiver_id = ap.idwsd.receiver_id = ap2.id

Step 2修改前端列名和显示逻辑

2a. prescriptionList.vue 第 164 行:title="领药时间"title="执行时间" 2b. summaryMedicineList.vue 第 46 行:title="发药时间"title="执行时间"

Step 3可选重命名 DTO 字段

  • MedicineDispenseFormDto.dispenseTimeexecuteTime(提高语义清晰度)
  • MedicineSummaryFormDto.dispenseTimeexecuteTime
  • 同步修改前端字段引用

四、路由决策

FIXER: guanyu后端+ zhaoyun前端

REASON: 修复涉及后端 Mapper XML SQL 重写(数据来源从 planned_dispense_time/receive_time 改为 cli_procedure.occurrence_time,修复 JOIN Bug→ guanyu 负责;前端两处列名修改和可能的字段重命名 → zhaoyun 负责。两个修复范围独立,可并行。


路由决策

  • 修复 Agent: guanyu
  • 原因: LLM 分析决策