Files
his/.analysis/bug403_analysis.md
关羽 e2a213da8b Fix Bug #403: 住院医生工作站:应用医嘱组套后,药品明细字段内容丢失未正确引入表格
组套应用时数据预处理缺失部分关键字段(doseUnitCode_dictText/positionName/
injectFlag/skinTestFlag),导致父组件构建行数据时无法获取完整信息。
在orderGroupDrawer的processed item中显式补充这些字段。

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

4.4 KiB
Raw Blame History

Bug #403 分析报告

根因分析

Bug现象:住院医生工作站应用医嘱组套后,药品明细字段(单次剂量、总量、总金额、药房/科室)丢失。

数据流追踪

  1. 后端 getGroupPackageForOrder (OrdersGroupPackageAppServiceImpl.java:168)

    • 查询组套明细 SQLOrdersGroupPackageAppMapper.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 在构建 newRowline 1594-1617item 直接取值覆盖了 setValue 设置的值。问题在于:

  1. item.unitCodeName 可能为 undefined:组套明细 SQL 中 unitCodeName 来自字典关联 sys_dict_data,如果字典匹配不上则为 null。newRowunitCode_dictText 直接使用 item.unitCodeName || '',导致显示为空。

  2. positionName 未在 orderGroupDrawer 处理项中显式设置:虽然 setValue 会通过库存查询设置 positionName,但 orderGroupDrawer.vuehandleUseOrderGroup 没有将 positionName(或至少 orderDetail.positionName)包含在 processed item 中,导致 setValue 的库存查找依赖 inventoryList,而 inventoryList 来自后端 AdviceBaseDto

  3. doseUnitCode_dictText 依赖 setValueunitCodeListorderGroupDrawer 的处理项中没有显式包含 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.vuehandleUseOrderGroup 函数line 630-688

在 processed item 的 return 对象中显式添加缺失的字段:

  • doseUnitCode_dictText:从 orderDetail 获取剂量单位显示文本
  • positionName:从 orderDetail 获取执行科室/药房名称
  • injectFlag / injectFlag_enumText:注射标识
  • skinTestFlag / skinTestFlag_enumText:皮试标识
  • partPercentpartAttributeEnumunitConversionRatio:用于价格计算的关键字段

这些字段在 orderDetailAdviceBaseDto中都有只是没有在 processed item 的顶层显式设置。handleSaveGroupnewRow 通过 ...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 构建行数据时无法获取完整信息。补充字段后,setValuenewRow 构造均能正确传递这些数据到表格。