# 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 分析决策