From 9f615df3f96a93447c4eb2551bd6ff81ba0b5271 Mon Sep 17 00:00:00 2001 From: guanyu Date: Mon, 18 May 2026 10:07:03 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#537:=20=E6=A0=B9=E5=9B=A0+?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B9=E6=A1=88=E6=91=98=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .agentforge/analysis/529.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .agentforge/analysis/529.md 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 行新增代码