Files
his/BUG428_ANALYSIS.md
guanyu 926c9bd1cb Fix Bug #428: 门诊医生站-检查申请:修复分类联动检查方法勾选后未添加到已选择列表
根因:handleMethodSelect 函数硬编码使用 cat.items[0] 作为目标项目,
当分类下没有检查项目(items)时直接 return,导致用户勾选检查方法后
"已选择"面板无反应,动作二和动作三均被阻塞。

修复:降级策略——当 cat.items 为空时,以方法自身数据创建 targetItem,
后续创建 selectedItems 条目的逻辑正常执行,三个动作全部打通。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 18:10:15 +08:00

3.7 KiB
Raw Blame History

Bug #428 分析报告与修复记录

标题: 门诊医生站-检查申请:未实现分类联动检查方法及套餐明细展示与勾选逻辑 类型: codeerror | 严重度: 3 | 优先级: 3 提出人: 陈显精(chenxj)

需求描述

医生站在为患者新增检查申请时,需实现三个联动功能:

  1. 动作一:展开右侧项目分类(如:彩超)后,下方自动加载后台维护的"检查方法"列表
  2. 动作二:勾选某个检查方法后,该项目自动填充到右侧顶部"已选择"列表
  3. 动作三:在"已选择"列表中点击展开图标,展示该套餐包含的收费明细

根因分析

动作一(分类联动加载检查方法): 已实现

  • handleCollapseChange第949行handleCategoryExpand第913行searchCheckMethod({ checkType: cat.typeName })
  • 代码路径完整数据解析正确Vue 响应式绑定正确

动作二(勾选方法后填充到"已选择"列表): 存在根因缺陷

根因位置handleMethodSelect 函数第1373行

const targetItem = cat.items[0];  // ← 根因:硬编码假设分类下必有 items
if (!targetItem) {
    console.warn('分类下没有检查项目,无法关联方法');
    return;  // ← 当分类下没有 items 时直接返回,不执行任何操作
}

问题链

  1. 用户展开分类 → 检查方法列表加载成功(动作一 OK
  2. 用户勾选检查方法 → handleMethodSelect(checked, method, cat) 被调用
  3. 代码使用 cat.items[0] 作为目标项目,但很多分类没有 items检查部位,只有 methods检查方法
  4. cat.items 为空数组时,targetItemundefined函数在第1377行直接 return
  5. 结果:用户勾选了方法,但"已选择"面板没有任何反应

动作三(套餐明细展示): 被动作二阻塞

  • loadPackageDetailsForItem 和套餐明细渲染逻辑本身是完整的
  • 但由于动作二无法将项目添加到 selectedItems,套餐明细的触发条件永远不满足

数据流(修复前)

用户勾选方法 → handleMethodSelect(checked=true, method, cat)
  → targetItem = cat.items[0]        ← 根因:可能为 undefined
  → if (!targetItem) return;          ← 直接退出,什么都不做
  → ❌ selectedItems 不变
  → ❌ 右侧"已选择"面板无反应

数据流(修复后)

用户勾选方法 → handleMethodSelect(checked=true, method, cat)
  → targetItem = cat.items[0]
  → if (!targetItem) {
      targetItem = {                  ← 修复:以方法自身作为项目
        id: method.id, name: method.name,
        price: method.packagePrice || method.price || 0,
        packageId: method.packageId, packageName: method.packageName
      }
    }
  → ✅ 正常创建 selectedItems 条目
  → ✅ 右侧"已选择"面板正确显示
  → ✅ 如有套餐 → loadPackageDetailsForItem → 动作三正常触发

修复方案

文件openhis-ui-vue3/src/views/doctorstation/components/examination/examinationApplication.vue 改动handleMethodSelect 函数第1370-1378行

将硬编码的 cat.items[0] + 直接 return 改为降级策略:

  • 当分类下有 items 时,使用 cat.items[0](原有行为不变)
  • 当分类下无 items 时,以方法自身数据创建 targetItem,后续逻辑正常执行

Gate 验证

  • Gate A: 根因已定位到第1373行 cat.items[0] + 第1377行 return
  • Gate B: 已读取所有相关文件(前端 Vue + 后端 Controller + API + 实体)
  • Gate C: 修复方案与验收标准一致
  • Gate D: N/A不涉及数据库修改

修复结果: 成功10行改动新增7行修改3行