From 55f0c91a80acd3826388d7062a8e2fc1317a5c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Sat, 16 May 2026 18:17:00 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#461:=20=E6=A0=B9=E5=9B=A0+?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B9=E6=A1=88=E6=91=98=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .analysis/bug455_analysis.md | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .analysis/bug455_analysis.md diff --git a/.analysis/bug455_analysis.md b/.analysis/bug455_analysis.md new file mode 100644 index 000000000..31dc60e9d --- /dev/null +++ b/.analysis/bug455_analysis.md @@ -0,0 +1,60 @@ +# Bug #455 Analysis + +## Title +门诊医生站-医嘱:开立诊疗医嘱时执行科室默认获取逻辑有误且显示为原始ID + +## Bug Description +- 执行科室文本框中默认显示为一串长数字ID(1907266224262627329),未进行名称转义 +- 默认获取的值并非当前患者的就诊科室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。