# 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` 还是空数组 `[]`(`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 行新增代码