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

3.1 KiB
Raw Blame History

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。组件会根据 orgIdorganization 树数据中查找对应节点并显示名称。当树数据未加载完成或找不到匹配节点时显示原始ID。

核心问题:竞态条件

setValue(row) 函数中第3454-3463行诊疗医嘱adviceType=3的执行科室默认值设置

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。