Files
his/.analysis/bug455_analysis.md
2026-05-16 18:17:00 +08:00

61 lines
3.1 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 #455 Analysis
## Title
门诊医生站-医嘱开立诊疗医嘱时执行科室默认获取逻辑有误且显示为原始ID
## Bug Description
- 执行科室文本框中默认显示为一串长数字ID1907266224262627329未进行名称转义
- 默认获取的值并非当前患者的就诊科室ID
## 影响文件
- `openhis-ui-vue3/src/views/doctorstation/components/prescription/prescriptionlist.vue`
## 根因分析
### 显示原始ID的原因
`执行科室`使用 `el-tree-select` 组件v-model 绑定 `scope.row.orgId`。组件会根据 `orgId``organization` 树数据中查找对应节点并显示名称。当树数据未加载完成或找不到匹配节点时显示原始ID。
### 核心问题:竞态条件
`setValue(row)` 函数中第3454-3463行诊疗医嘱adviceType=3的执行科室默认值设置
```javascript
prescriptionList.value[rowIndex.value].orgId = props.patientInfo?.orgId;
prescriptionList.value[rowIndex.value].positionId = props.patientInfo?.orgId;
prescriptionList.value[rowIndex.value].positionName = findOrgNameById(props.patientInfo?.orgId) || props.patientInfo?.orgName || '';
```
虽然 `getOrgList()``onMounted` 时调用第1130行但它是异步操作`.then()`),没有等待完成。当用户快速选择诊疗项目时:
1. `findOrgNameById(props.patientInfo?.orgId)` 调用时 `organization.value` 可能仍为空 → 返回 `''`
2. `props.patientInfo?.orgName` 可能为空 → 返回 `''`
3. 结果:`positionName = ''`,且 el-tree-select 因为 organization 树为空/未加载完成而无法解析 orgId → 显示原始ID
### 第3592-3610行的 else 分支问题
`setValue` 的后半段(非药品/耗材/会诊的处理分支),虽然调用了 `await getOrgList()`,但之后对 `positionName` 的设置仍然使用相同的 `findOrgNameById`,而此时的数据流可能不完整。
## 修复方案
### 方案1确保 organization 数据已加载
修改 `setValue` 函数,在处理诊疗医嘱前,等待 `getOrgList()` 完成(如果尚未完成),确保 `findOrgNameById` 能正确查找。
具体做法:
1.`getOrgList` 改为返回 Promise并缓存 Promise 以避免重复请求
2.`setValue` 中 await 该 Promise
3. 在 organization 加载完成后重新查找科室名称并更新
### 方案2使用 computed 响应式更新
`organization` 数据加载完成后,自动更新所有已设置 orgId 但 positionName 为空的行。
### 推荐方案1 + 方案2 结合
- 方案1 确保设置默认值时 organization 已加载
- 方案2 作为兜底,处理极端时序情况
---
## 修复结果:✅ 成功12行改动
### 改动内容
1. `getOrgList` 函数改为返回缓存的 Promise避免重复请求支持 await
2. `setValue` 函数中诊疗医嘱分支添加 `await getOrgList()`,确保 org 树加载完成后再调用 `findOrgNameById`
### 根因
`setValue` 在 organization 树数据未加载完成时调用 `findOrgNameById`导致返回空字符串。el-tree-select 无法找到匹配的 orgId 节点显示原始ID。