diff --git a/BUG428_ANALYSIS.md b/BUG428_ANALYSIS.md new file mode 100644 index 000000000..ee961aba8 --- /dev/null +++ b/BUG428_ANALYSIS.md @@ -0,0 +1,52 @@ +# Bug #428 分析报告 + +## Bug 描述 +门诊医生站-检查申请:未实现分类联动检查方法及套餐明细展示与勾选逻辑 + +### 三个动作的验收标准 +1. **动作一**:分类展开后,下方自动加载后台维护的"检查方法"列表 +2. **动作二**:勾选某个检查方法后,自动填充到右侧"已选择"列表 +3. **动作三**:在"已选择"列表展开图标,展示该套餐包含的收费明细 + +## 根因分析 + +### 动作一(分类联动加载检查方法):已实现 ✅ +- `handleCollapseChange` → `handleCategoryExpand` → `searchCheckMethod({ checkType: cat.typeName })` +- 代码路径完整,数据解析正确,Vue 响应式绑定正确 + +### 动作二(勾选方法后填充到"已选择"列表):存在逻辑缺陷 ❌ +**核心问题在 `handleMethodSelect` 函数(第1370-1451行)**: +1. 当用户勾选一个检查方法时,代码使用 `cat.items[0]` 作为目标项目(第1373行),这是一个**硬编码假设**,不考虑用户是否勾选了任何项目 +2. 如果该用户已经选了一个项目(如"腹部彩超"),但后来勾选了另一个方法(如"心电1"),代码会找到已存在的 `selectedItems` 并只更新 `selectedMethod`(第1381-1394行),而不是创建新的条目 +3. 当方法被取消勾选时(`checked = false`),只清空 `selectedMethod` 但不从 `selectedItems` 移除(第1441-1448行),导致残留空项目 + +### 动作三(套餐明细展示):已实现但依赖动作二 ✅ +- `loadPackageDetailsForItem` → 后端 `/system/check-type/package/{id}/details` +- 右侧面板 `shouldShowPackageBody` + `getPackageDetailsList` 渲染逻辑完整 +- **但由于动作二的缺陷,套餐明细的前提条件(正确创建 item)无法满足** + +## 数据流 +``` +用户展开分类 → handleCategoryExpand() + → GET /check/method/search?checkType={typeName} + → cat.methods = [方法列表] + +用户勾选方法 → handleMethodSelect(checked, method, cat) + → 【问题】使用 cat.items[0] 作为目标项目 + → 创建/更新 selectedItems 条目 + → 如有 packageId → loadPackageDetailsForItem() + +用户展开已选项 → shouldShowPackageBody(item) + → 有 packageId/packageName → 显示套餐明细 +``` + +## 修复方案 +1. 修复 `handleMethodSelect`:当用户直接勾选方法时,以方法自身作为已选项的核心(而非 `cat.items[0]`) +2. 确保方法的 `price` 使用 `packagePrice`(方法没有独立 price 字段) +3. 取消勾选时清理逻辑完善 + +## Gate 验证 +- Gate A: ✅ 根因已定位到 `handleMethodSelect` 第1373行 `cat.items[0]` +- Gate B: ✅ 已读取所有相关文件(前后端+SQL Mapper) +- Gate C: ✅ 修复方案与验收标准一致 +- Gate D: N/A(不涉及数据库修改)