diff --git a/.agentforge/analysis/529.md b/.agentforge/analysis/529.md new file mode 100644 index 000000000..aca6f682c --- /dev/null +++ b/.agentforge/analysis/529.md @@ -0,0 +1,37 @@ +# 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 行新增代码