Files
his/MD/bugs/BUG_714_ANALYSIS.md

128 lines
5.7 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 #714 诸葛亮分析报告
> **文档类型**: Bug分析
> **分析时间**: 2026-06-13 02:42:58
> **分析模型**: mimo-v2.5 (LLM深度分析)
---
## 基本信息
- **Bug #**: 714
- **标题**: 【住院护士站-医嘱校对】住院护士站-医嘱核对界面:缺少“截止时间”过滤条件且默认单选未选中“全部”
- **模块**: 病区护士工作站
- **提出人**: 陈显精
---
分析完毕。以下是完整输出。
---
## 一、Bug 理解
**Bug 标题**:【住院护士站-医嘱校对】住院护士站-医嘱核对界面:缺少"截止时间"过滤条件且默认单选未选中"全部"
**重现步骤**
1. 登录系统,进入"住院护士站"菜单
2. 点击进入"医嘱核对"页面,选中左侧"在科"列表中的某位患者
3. 观察右侧查询条件区域(包含"未校对/已校对/已停止/已退回"四个标签页)
**结果**
1. 过滤条件中缺少"截止时间"时间控件,无法限制截止时间进行医嘱筛选
2. 医嘱分类单选框默认未自动选中"全部"
3. 切换到"已校对/已停止/已退回"标签页时,同样缺失截止时间字段
**期望**
1. 四个标签页均应增加"截止时间"查询条件
2. "截止时间"默认显示为系统当前时间,且支持手动编辑/选择
3. 页面初始化默认选中"全部"单项
**附图关键信息**:截图清晰显示查询条件区域仅有"医嘱分类"(全部/长期/临时)单选框和"查询"按钮无截止时间DatePicker控件且"全部"选项未处于选中状态。
**综合总结**:用户在住院护士站医嘱核对界面无法按时间节点批量筛选医嘱,因为查询区域缺少截止时间过滤条件。同时初始化时医嘱分类默认未选中"全部",不利于日常操作。这是一个典型的设计缺陷——查询条件不完整影响护士工作效率。
---
## 二、根因分析
经代码全链路追踪Bug 涉及前端组件 + 后端 DTO + Service + Mapper 四层:
**前端层**`medicalOrderProofread/components/prescriptionList.vue`
1. `<el-radio-group>` 中"全部"选项的 `:value` 原为 `null`commit `376ddd46f` 中添加),导致 `type` 初始值为 `null`UI 上无选项被选中
2. 组件中完全没有 `<el-date-picker>` 日期选择控件,无法选择截止时间
3. `handleGetPrescription()` 构造请求参数时未传递 `deadline` 字段
**后端 DTO 层**`InpatientAdviceParam.java`
- `deadline` 字段已存在(在初始重构中引入),但此前未被 Service 层实际使用
**Service 层**`AdviceProcessAppServiceImpl.java``getInpatientAdvicePage()`
- 未提取 `deadline` 参数,未在 `QueryWrapper` 中拼接时间范围条件
**Mapper 层**`AdviceProcessAppMapper.xml`
- SQL 使用 `${ew.customSqlSegment}` 拼接条件Service 未设置条件则 SQL 无截止时间过滤
**根因总结**:前端查询组件设计时遗漏了截止时间控件,且默认值设置不当;后端虽然 DTO 有字段但 Service 层未处理该参数,导致整条链路断裂。
---
## 三、修复方案(⚠️ 已在 `ca812421d` 中修复)
> **注意**:经过 git 历史追踪,此 Bug 的修复已作为 Bug #665 的附带修复在 commit `ca812421d` 中完成。以下是修复内容详解:
### 3.1 前端修复(`prescriptionList.vue`
| 修改点 | 修改前 | 修改后 |
|--------|--------|--------|
| Radio 默认值 | `:value="null"` | `:value="0"` |
| type 初始值 | `ref(null)` | `ref(0)` |
| 截止时间控件 | 无 | 新增 `<el-date-picker>` (datetime类型) |
| deadline 初始值 | 无 | `ref(formatDateStr(new Date(), 'YYYY-MM-DD') + ' 23:59:59')` |
| 查询参数 | 无 deadline | `...(deadline.value ? { deadline: deadline.value } : {})` |
| therapyEnum 条件 | `type.value != null` | `type.value !== 0`(仅非"全部"时传递) |
### 3.2 后端修复(`AdviceProcessAppServiceImpl.java` → `getInpatientAdvicePage()`
新增代码逻辑:
```java
// 提取 deadline 手动处理
String deadline = inpatientAdviceParam.getDeadline();
inpatientAdviceParam.setDeadline(null);
// ...
// 手动拼接 deadline 条件,按医嘱截止时间筛选
if (deadline != null && !deadline.isEmpty()) {
LocalDateTime deadlineTime = LocalDateTime.parse(deadline,
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
queryWrapper.le("end_time", deadlineTime); // ≤ 截止时间
}
```
### 3.3 四标签页覆盖机制
`index.vue` 中四个 tab 各创建独立的 `PrescriptionList` 实例,每个实例维护独立的 `type``deadline` ref。切换 tab 时通过 `provide/inject` + `ref` 调用目标 tab 组件的 `handleGetPrescription()`,四标签页均能独立使用截止时间过滤。
### 3.4 验证检查项
- [ ] 前端编译通过(`npm run build:dev`
- [ ] 后端编译通过(`mvn clean compile -DskipTests`
- [ ] "未校对" tab截止时间默认为当日 23:59:59可编辑
- [ ] "全部" radio 默认选中,查询结果包含长期+临时
- [ ] "已校对/已停止/已退回" tab 同样有截止时间控件
- [ ] 修改截止时间后点"查询",结果正确过滤
---
## 四、路由决策
**FIXER**: zhaoyun前端为主+ guanyu后端 Service 层配合)
**REASON**: Bug 涉及前端 UI 组件DatePicker 控件新增 + Radio 默认值修正)占主要工作量,交赵云处理;后端 Service 层 deadline 条件拼接需关羽配合验证 SQL 正确性。**但此 Bug 已在 `ca812421d` commit 中修复完成**,若禅道状态仍为 active建议直接关闭并更新禅道状态为"已解决"。
---
## 路由决策
- **FIXER_ID**: guanyu
- **修复 Agent**: guanyu后端
- **原因**: LLM 分析决策
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。