Files
his/.agentforge/analysis/529.md

2.0 KiB
Raw Blame History

Bug #529 分析报告

Title

[住院医生工作站-检验申请] 点击"修改"打开编辑弹窗后,原已选中的项目未回显

根因分析

数据流

  1. testApplication.vue 列表中点击"修改" → handleEdit(row) 设置 editRowData = row → 打开编辑弹窗
  2. 弹窗使用 destroy-on-close,每次打开都重新创建 LaboratoryTests 组件
  3. LaboratoryTests 组件通过 :editData="editRowData" 接收编辑数据

根因时序竞态Race Condition

laboratoryTests.vue 中:

  1. onMounted() (line 262) 调用 loadAllData() 异步加载检验项目列表到 applicationListAll.value
  2. watch on props.editData (line 347-382) 设置了 { immediate: true },组件创建时立即触发
  3. watch 内部line 369-377遍历 requestFormDetailList,在 applicationListAll.value 中按 adviceName 匹配已选项目

时序问题

  • watch 因 immediate: true 立即触发时,applicationListAll.value 还是空数组 []onMountedloadAllData() 尚未完成)
  • 匹配逻辑找不到任何匹配项 → 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 行新增代码