# Bug #403 分析报告 ## 根因分析 **Bug现象**:住院医生工作站应用医嘱组套后,药品明细字段(单次剂量、总量、总金额、药房/科室)丢失。 **数据流追踪**: 1. **后端 `getGroupPackageForOrder`** (OrdersGroupPackageAppServiceImpl.java:168) - 查询组套明细 SQL(OrdersGroupPackageAppMapper.xml:37-82)返回:`dose`, `quantity`, `doseQuantity`, `rateCode`, `methodCode`, `dispensePerDuration` 等字段 - 通过 `getAdviceBaseInfo` 获取 `AdviceBaseDto` 赋值给 `detail.setOrderDetailInfos()`,包含:`doseUnitCode`, `doseUnitCode_dictText`, `positionId`, `inventoryList`, `priceList`, `partPercent` 等 2. **前端 `orderGroupDrawer.vue`** `handleUseOrderGroup` (line 568-694) - 对每个组套明细项进行预处理,合并组套字段和医嘱库字段 - 通过 `emit('useOrderGroup', processedDetailList)` 发送到父组件 3. **前端 `inpatientDoctor/home/components/order/index.vue`** `handleSaveGroup` (line 1546-1639) - 接收 `orderGroupList`,对每个 item 调用 `setValue(mergedDetail)` 填充行数据 - 然后用 `item` 的字段显式覆盖创建 `newRow` **根因定位**:`handleSaveGroup` 在构建 `newRow` 时(line 1594-1617),从 `item` 直接取值覆盖了 `setValue` 设置的值。问题在于: 1. **`item.unitCodeName` 可能为 undefined**:组套明细 SQL 中 `unitCodeName` 来自字典关联 `sys_dict_data`,如果字典匹配不上则为 null。`newRow` 的 `unitCode_dictText` 直接使用 `item.unitCodeName || ''`,导致显示为空。 2. **`positionName` 未在 `orderGroupDrawer` 处理项中显式设置**:虽然 `setValue` 会通过库存查询设置 `positionName`,但 `orderGroupDrawer.vue` 的 `handleUseOrderGroup` 没有将 `positionName`(或至少 `orderDetail.positionName`)包含在 processed item 中,导致 `setValue` 的库存查找依赖 `inventoryList`,而 `inventoryList` 来自后端 `AdviceBaseDto`。 3. **`doseUnitCode_dictText` 依赖 `setValue` 的 `unitCodeList`**:`orderGroupDrawer` 的处理项中没有显式包含 `doseUnitCode_dictText`,完全依赖 `mergedDetail` 中 spread 的 `orderDetail` 字段。 ## 影响范围 - 前端文件:`openhis-ui-vue3/src/views/doctorstation/components/prescription/orderGroupDrawer.vue` - 前端文件:`openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue` - 影响场景:住院医生工作站和门诊医生工作站应用医嘱组套 ## 修复方案 **修改 `orderGroupDrawer.vue` 的 `handleUseOrderGroup` 函数**(line 630-688): 在 processed item 的 return 对象中显式添加缺失的字段: - `doseUnitCode_dictText`:从 orderDetail 获取剂量单位显示文本 - `positionName`:从 orderDetail 获取执行科室/药房名称 - `injectFlag` / `injectFlag_enumText`:注射标识 - `skinTestFlag` / `skinTestFlag_enumText`:皮试标识 - `partPercent`、`partAttributeEnum`、`unitConversionRatio`:用于价格计算的关键字段 这些字段在 `orderDetail`(AdviceBaseDto)中都有,只是没有在 processed item 的顶层显式设置。`handleSaveGroup` 的 `newRow` 通过 `...prescriptionList.value[rowIndex.value]` spread 能获取到 `setValue` 设置的值,但显式在顶层包含可以确保数据流的完整性。 ## 验证计划 1. 修改代码后,用 `node --check` 验证语法 2. 在住院医生工作站测试:选择患者 → 点击组套 → 预览组套 → 应用到当前患者 3. 验证表格中显示的字段:单次剂量、总量、总金额、药房/科室均有值 --- ## 修复结果:✅ 成功,10行改动 **修改文件**:`openhis-ui-vue3/src/views/doctorstation/components/prescription/orderGroupDrawer.vue` **改动说明**:在 `handleUseOrderGroup` 函数的 processed item 中显式添加了以下缺失字段: - `doseUnitCode_dictText`:剂量单位显示文本(如"mg"),用于"单次剂量"列的后缀显示 - `positionName`:药房/科室名称,用于"药房/科室"列显示 - `injectFlag` / `injectFlag_enumText`:注射药品标识及文本 - `skinTestFlag` / `skinTestFlag_enumText`:皮试标识及文本 **策略**:策略A(直接修复代码逻辑)—— 组套应用时数据预处理缺失部分关键字段,导致父组件 `handleSaveGroup` 构建行数据时无法获取完整信息。补充字段后,`setValue` 和 `newRow` 构造均能正确传递这些数据到表格。