Files
his/MD/bugs/BUG_749_ANALYSIS.md

138 lines
6.9 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 #749 诸葛亮分析报告
> **文档类型**: Bug分析
> **分析时间**: 2026-06-12 22:44:54
> **分析模型**: mimo-v2.5 (LLM深度分析)
---
## 基本信息
- **Bug #**: 749
- **标题**: 【门诊医生工作站】门诊医生工作站无法对患者进行保存医嘱的
- **模块**: 门诊医生工作站
- **提出人**: 王栩坤
---
Now I have enough understanding of the code flow. Let me compile my analysis.
---
## 一、Bug 理解
**原文引用 — 禅道 Bug #749**
> **标题**:【门诊医生工作站】门诊医生工作站无法对患者进行保存医嘱的
>
> **重现步骤**登录内科医生1的账号doctor1 密码123456 进入门诊医生工作站 → 保存一个诊断 → 进入医嘱 → 新增一条医嘱 → [结果] 点击了保存,无法保存成功,点击保存按钮无法响应
>
> **期望结果**:能够将医嘱保存成功,状态有待保存,变成待签发的状态
**附图关键信息:**
- 医嘱Tab页已打开列表中有 3 条已保存医嘱已签发×2、已收费×1
- 顶部有一条**"待保存"状态的新行**:医嘱类型显示"选择..."(未选择)、项目未输入、药房/科室"请选择药房"(未选择)
- **保存按钮**(蓝色)可见,但用户反映点击后无法响应
**综合总结**用户在门诊医生工作站的医嘱Tab页新增了一条医嘱行尝试点击"保存"按钮将医嘱从"待保存"变为"待签发",但按钮点击后没有任何响应,保存未生效。根据截图中"待保存"行关键字段(医嘱类型、项目、药房)均为空的状态,判断该行的**展开编辑区域expand row仍然处于打开状态**,导致 `handleSaveBatch()` 中的前置校验拦截了保存操作。
---
## 二、根因分析
**核心问题:** `handleSaveBatch()` 函数在 line 3738-3741 检查了展开行状态:
```javascript
// line 3738-3741 prescriptionlist.vue
const prescriptionExpandOrder = prescription.expandOrder || [];
if (prescriptionExpandOrder.length > 0) {
proxy.$modal.msgWarning('请先点击确定确认当前医嘱');
return; // ← 保存被拦截
}
```
**关键发现:** 这里的检查目标是 `prescription.expandOrder`(处方对象的属性),**不是**组件的 `expandOrder.value`(控制实际展开行的响应式变量)。`prescription.expandOrder``createNewPrescription()` 中被初始化为 `[]`,此后**从未被修改**,所以此检查永远为 false — 这是一段**无效的死代码**。
**真正的拦截点**在更上游的几个校验。结合截图分析,用户点击"保存"时:
1. **展开编辑行仍然打开**:用户新增医嘱行后(`handleAddPrescription`),如果选了项目但没点展开行中的"确定"按钮确认,行仍处于 `isEdit: true` 状态
2. **`handleSaveBatch``saveList` 构建问题**`saveList` 过滤条件中检查 `item.prescriptionId === targetPrescriptionId`,但从 `getListInfo` 加载的历史医嘱**没有 `prescriptionId` 字段**(因为 `prescriptionId` 是前端本地生成的处方ID导致只有通过 `handleAddPrescription` 新增的行才有正确的 `prescriptionId` 匹配
3. **`handleSaveSign` 对新医嘱不调 API**:当用户点击展开行中的"确定"按钮时,`handleSaveSign` 对没有 `requestId` 的新医嘱只做前端状态更新(`isEdit = false`**不调用后端保存接口**,真正的保存依赖后续点击"保存"按钮
**最可能的失败场景:**
- 用户新增行 → 未完全填写展开行 → 直接点击"保存" → 前置校验(如 `expandOrder.value.length > 0`、或 `accountId` 校验)拦截 → 弹出警告但用户可能忽略
- 或者用户填写了展开行但未点击"确定"就点击"保存" → 保存被 `expandOrder` 拦截
**涉及文件:**
- `healthlink-his-ui/src/views/doctorstation/components/prescription/prescriptionlist.vue``handleSaveBatch()` (line 3693)、`handleSaveSign()` (line 3500)、`handleAddPrescription()` (line 2370)
- `healthlink-his-ui/src/views/doctorstation/components/api.js``savePrescription()` (line 295)
- `healthlink-his-server/.../DoctorStationAdviceController.java``saveAdvice()` (line 560)
---
## 三、修复方案
### 方案 AUX 修复 — 让保存按钮对"未确认"的行也能正常保存
**核心思路**:用户点击"保存"时,自动完成未确认行的关闭操作,而不是拦截并弹出警告。
**修改文件:** `prescriptionlist.vue`
**修改 1**`handleSaveBatch()` 中,移除无效的 `prescription.expandOrder` 检查line 3738-3741改为检查组件级 `expandOrder.value`,并在有展开行时**自动关闭**而非拦截:
```javascript
// 替换 line 3738-3741
// 删除旧的无效检查:
// const prescriptionExpandOrder = prescription.expandOrder || [];
// if (prescriptionExpandOrder.length > 0) { ... }
// 改为:如果有展开行,自动关闭展开行
if (expandOrder.value.length > 0) {
updateExpandOrder([]);
}
```
**修改 2**`handleSaveBatch()``saveList` 过滤中,移除 `prescriptionId` 匹配条件(因为历史医嘱没有此字段),改为对所有 `statusEnum == 1 && !isSaved` 的行都能保存:
```javascript
// 修改 saveList 过滤条件(约 line 3823
.filter((item) => {
return item.statusEnum == 1 && !item.isSaved;
// 删除:&& (item.prescriptionId === targetPrescriptionId || !item.prescriptionId)
})
```
**修改 3** 给"保存"按钮增加明确的校验提示(当存在未填写完整的新行时):
```javascript
// 在 saveList 过滤后,检查是否有未填完关键字段的行
const incompleteItems = saveList.filter(item =>
!item.adviceType || !item.adviceName || !item.encounterId
);
if (incompleteItems.length > 0 && saveList.length === incompleteItems.length) {
proxy.$modal.msgWarning('请先选择医嘱类型和项目,填写完整后再保存');
return;
}
```
### 方案 B如果方案 A 改动太大):仅确保按钮可见反馈
`handleSaveBatch` 的每个 `return` 前,确保有明确的 `proxy.$modal.msgWarning()` 提示,让用户知道为什么保存失败。
---
## 四、路由决策
**FIXER: zhaoyun赵云**
**REASON:** 该 Bug 主要涉及前端 `prescriptionlist.vue` 的 UX 和数据流问题(保存按钮点击无响应、展开行状态管理、保存过滤条件),属于前端交互和界面逻辑修复范畴,由前端开发 Agent 赵云负责。无需数据库迁移或后端接口修改。
---
## 路由决策
- **FIXER_ID**: zhaoyun
- **修复 Agent**: zhaoyun前端
- **原因**: ** 该 Bug 主要涉及前端 `prescriptionlist.vue` 的 UX 和数据流问题(保存按钮点击无响应、展开行状态管理、保存过滤条件),属于前端交互和界面逻辑修复范畴,由前端开发 Agent 赵云负责。无需数据库迁移或后端接口修改。
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。