From 22f7a1c1a6582a5e1c92c6d11a5253df7173aea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BA=91?= <赵云@gentronhealth.com> Date: Sat, 16 May 2026 16:41:37 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#428:=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 --- BUG_426_ANALYSIS.md | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 BUG_426_ANALYSIS.md diff --git a/BUG_426_ANALYSIS.md b/BUG_426_ANALYSIS.md new file mode 100644 index 000000000..f59de9837 --- /dev/null +++ b/BUG_426_ANALYSIS.md @@ -0,0 +1,65 @@ +# Bug #426 分析报告 + +**标题**: 门诊医生站-检查开立:已选择列表应支持树形展开,显示套餐明细(项目/数量/单价) + +## 根因分析 + +经过完整的代码追踪和数据库验证,定位到 **两个根因**: + +### 根因1:`loadPackageDetails` 响应判断条件错误(树形表格永远加载不到套餐明细) + +**涉及代码**: `examinationApplication.vue` 第576-605行 + +Axios 响应拦截器(`request.js` 第202行)对 `code === 200` 的响应返回 `Promise.resolve(res.data)`,即**解包后的 AjaxResult 对象**(如 `{data: [...]}`,不含 `code` 字段)。 + +但 `loadPackageDetails` 函数检查的是 `if (res.code === 200)` —— 这个条件 **永远为 false**(解包后的对象没有 `code` 字段),导致树形表格的懒加载 **永远返回空数组**。 + +``` +后端返回: {"code":200,"data":[{item_name:"xxx",quantity:1,...}]} +拦截器解包后: {data:[{item_name:"xxx",quantity:1,...}]} +loadPackageDetails 判断: res.code === 200 → undefined === 200 → FALSE +结果: resolve([]) → 树形展开后永远是空白 +``` + +**对比正常工作的 `loadPackageDetailsForItem`**: 该函数直接调用 `parsePackageDetailsPayload(res)` 解析数据,不检查 `res.code`,所以右侧卡片的套餐明细能正常加载。 + +### 根因2:`handleItemSelect` 中 `hasChildren` 未考虑 `packageName` 场景 + +**涉及代码**: `examinationApplication.vue` 第1492行 + +数据库 `check_part` 表只有 `package_name` 字段,没有 `package_id`。前端创建套餐项时: +- `isPackage` 正确判断了 `!!(item.packageId || item.packageName)` +- `hasChildren` 只判断了 `!!(item.packageId)` + +当项目有 `packageName` 但无 `packageId` 时,`hasChildren` 为 `false`,el-table 树形模式 **不显示展开箭头**,用户无法点击展开。 + +```javascript +// 当前代码 +hasChildren: !!(item.packageId) // item.packageId 为 null → false → 无展开箭头 + +// 修复后 +hasChildren: !!(item.packageId || item.packageName) // 有 packageName 也能展开 +``` + +## 修复方案 + +1. 修改 `loadPackageDetails` 函数:去掉 `res.code === 200` 检查,直接使用 `parsePackageDetailsPayload(res)` 解析数据(与 `loadPackageDetailsForItem` 保持一致) +2. 修改 `handleItemSelect` 中 `hasChildren` 赋值:增加 `|| item.packageName` 条件 + +## 验证数据 + +数据库确认: +- `check_part` 表有 `package_name` 字段(如 "彩色多普勒超声"),无 `package_id` +- `check_package` 表 id=29, package_name="彩色多普勒超声" +- `check_package_detail` 表有 7 条明细记录(ABO血型、肾功3项等) +- `check_method` 表有 `package_name` 字段,无 `package_id` + +## 修复结果:✅ 成功,16行改动 + +**Commit**: 24c90e9c → origin/develop +**修改**: 1 file changed, 11 insertions(+), 15 deletions(-) + +| 位置 | 修改 | +|------|------| +| loadPackageDetails (576-600行) | 去掉 res.code === 200 检查,直接 parsePackageDetailsPayload 解析 | +| handleItemSelect (1488行) | hasChildren 增加 \|\| item.packageName |