2.0 KiB
2.0 KiB
Bug #529 分析报告
Title
[住院医生工作站-检验申请] 点击"修改"打开编辑弹窗后,原已选中的项目未回显
根因分析
数据流
testApplication.vue列表中点击"修改" →handleEdit(row)设置editRowData = row→ 打开编辑弹窗- 弹窗使用
destroy-on-close,每次打开都重新创建LaboratoryTests组件 LaboratoryTests组件通过:editData="editRowData"接收编辑数据
根因:时序竞态(Race Condition)
在 laboratoryTests.vue 中:
onMounted()(line 262) 调用loadAllData()异步加载检验项目列表到applicationListAll.value- watch on
props.editData(line 347-382) 设置了{ immediate: true },组件创建时立即触发 - watch 内部(line 369-377)遍历
requestFormDetailList,在applicationListAll.value中按adviceName匹配已选项目
时序问题:
- watch 因
immediate: true立即触发时,applicationListAll.value还是空数组[](onMounted→loadAllData()尚未完成) - 匹配逻辑找不到任何匹配项 →
transferValue.value = [] - 随后
loadAllData()完成,applicationListAll.value被填充,但 watch 不会重新触发(因为props.editData没变化) - 结果:transfer 组件的 "已选择" 区域显示"无数据"
涉及文件
- 前端:
openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/applicationForm/laboratoryTests.vue(line 347-382) - 前端:
openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/testApplication.vue(line 193-210, 弹窗渲染处)
修复方案
在 laboratoryTests.vue 中新增一个 watch 监听 applicationListAll.value 的变化,当数据加载完成且当前处于编辑模式时,重新执行回显匹配逻辑。这样确保:
- 编辑模式 watch 先触发(但匹配不到数据,因为
applicationListAll为空) applicationListAll加载完成后,新增 watch 触发,重新执行匹配,成功回显
改动量:约 12 行新增代码