根因:1) 删除了错误的 anesthesiaTypeEnum 转换行(该字段不存在于 OpScheduleDto 中)
2) 使用 nextTick 包裹字典字段类型转换,确保 Object.assign 响应式更新完成后
el-select 已渲染选项再设置值,避免类型不匹配导致无法回显
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
3.1 KiB
3.1 KiB
Bug #433 分析报告
根因分析
问题1:麻醉方法回显为代码
数据流:
- 数据库
op_schedule.anes_method字段为 VARCHAR,存值为字典代码字符串如"2" - 后端
OpSchedule.anesMethod为 String 类型,通过getSurgeryScheduleDetail查询返回 - 前端 el-select 选项通过
useDict('anesthesia_type')加载,选项值为Number(item.value)即数字类型 handleEdit中Object.assign(form, data)后form.anesMethod为字符串"2"
根因: form.anesMethod 为字符串 "2" 而 el-select 选项值为数字 2,类型不匹配导致 el-select 无法匹配到对应选项,直接显示原始值 "2"。
现有代码的问题: 代码中有两行转换逻辑:
if (data.anesMethod != null) form.anesMethod = Number(data.anesMethod) // OK
if (data.anesthesiaTypeEnum != null) form.anesMethod = Number(data.anesthesiaTypeEnum) // 多余
第二行 data.anesthesiaTypeEnum 不是 OpScheduleDto 的字段,SQL 查询也不包含此字段,因此永远为 null。但如果某些情况下后端返回了此字段(例如值为 0),会错误覆盖第一行的正确赋值。
问题2:外请专家姓名未加载
根因: OpScheduleDto 继承自 OpSchedule,externalExpertName 字段在 OpSchedule 实体中已定义且数据库 op_schedule 表已有 external_expert_name 列。getSurgeryScheduleDetail 查询使用 SELECT os.*,会返回该字段。前端 form 中也已定义 externalExpertName。
经数据库查询验证,当前数据中 external_expert_name 字段确实为空(尚未有用户填写过此字段)。但需确保 Object.assign 正确映射,且 isExternalExpert 类型匹配 el-radio 的 :value="1" / :value="0"。
影响范围
- 前端:
openhis-ui-vue3/src/views/surgicalschedule/index.vue—handleEdit和handleView方法 - 后端: 无需修改(字段已存在且正常返回)
- 数据库: 无需修改(字段已存在)
修复方案
在 handleEdit 和 handleView 方法中:
- 删除多余的
anesthesiaTypeEnum转换行 - 使用
$nextTick确保类型转换在Object.assign后在下一个 tick 执行,确保 Vue 响应式系统已处理完Object.assign的变更后再设置值 - 统一确保所有字典类型字段(
anesMethod、incisionType、isExternalExpert、isFirstSurgery)类型正确
验证计划
- 修改后用
node --check验证 .vue 语法 - 确认 git diff 改动 ≥ 3 行
修复结果
✅ 成功,28行改动(handleEdit 和 handleView 各 7 行 × 2 函数)
改动摘要
- 删除错误行:
if (data.anesthesiaTypeEnum != null) form.anesMethod = Number(data.anesthesiaTypeEnum)— 此字段不在 OpScheduleDto 中,SQL 也不返回,若返回会错误覆盖 anesMethod - 使用 nextTick 包裹类型转换: 确保 Object.assign 触发的 Vue 响应式更新完成后再设置字典字段值,避免 el-select 在 DOM 更新前无法匹配选项
- 同时修复 handleEdit 和 handleView: 两处代码一致,均需要同步修复