104 lines
4.6 KiB
Markdown
104 lines
4.6 KiB
Markdown
# 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 分析决策
|