Files
his/MD/bugs/BUG_761_ANALYSIS.md

104 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
<result property="dispenseTime" column="planned_dispense_time"/>
```
`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 映射改为 `<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 分析决策