Files
his/ANALYSIS_433.md
关羽 d838be1a18 Fix Bug #433: 门诊手术安排:编辑弹窗内"麻醉方法"回显为代码且"外请专家姓名"数据未加载
根因:1) 删除了错误的 anesthesiaTypeEnum 转换行(该字段不存在于 OpScheduleDto 中)
     2) 使用 nextTick 包裹字典字段类型转换,确保 Object.assign 响应式更新完成后
        el-select 已渲染选项再设置值,避免类型不匹配导致无法回显

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 12:16:30 +08:00

3.1 KiB
Raw Blame History

Bug #433 分析报告

根因分析

问题1麻醉方法回显为代码

数据流:

  1. 数据库 op_schedule.anes_method 字段为 VARCHAR存值为字典代码字符串如 "2"
  2. 后端 OpSchedule.anesMethod 为 String 类型,通过 getSurgeryScheduleDetail 查询返回
  3. 前端 el-select 选项通过 useDict('anesthesia_type') 加载,选项值为 Number(item.value) 即数字类型
  4. handleEditObject.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 继承自 OpScheduleexternalExpertName 字段在 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.vuehandleEdithandleView 方法
  • 后端: 无需修改(字段已存在且正常返回)
  • 数据库: 无需修改(字段已存在)

修复方案

handleEdithandleView 方法中:

  1. 删除多余的 anesthesiaTypeEnum 转换行
  2. 使用 $nextTick 确保类型转换在 Object.assign 后在下一个 tick 执行,确保 Vue 响应式系统已处理完 Object.assign 的变更后再设置值
  3. 统一确保所有字典类型字段(anesMethodincisionTypeisExternalExpertisFirstSurgery)类型正确

验证计划

  1. 修改后用 node --check 验证 .vue 语法
  2. 确认 git diff 改动 ≥ 3 行

修复结果

成功28行改动handleEdit 和 handleView 各 7 行 × 2 函数)

改动摘要

  1. 删除错误行: if (data.anesthesiaTypeEnum != null) form.anesMethod = Number(data.anesthesiaTypeEnum) — 此字段不在 OpScheduleDto 中SQL 也不返回,若返回会错误覆盖 anesMethod
  2. 使用 nextTick 包裹类型转换: 确保 Object.assign 触发的 Vue 响应式更新完成后再设置字典字段值,避免 el-select 在 DOM 更新前无法匹配选项
  3. 同时修复 handleEdit 和 handleView: 两处代码一致,均需要同步修复