组套应用时数据预处理缺失部分关键字段(doseUnitCode_dictText/positionName/ injectFlag/skinTestFlag),导致父组件构建行数据时无法获取完整信息。 在orderGroupDrawer的processed item中显式补充这些字段。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
4.4 KiB
Bug #403 分析报告
根因分析
Bug现象:住院医生工作站应用医嘱组套后,药品明细字段(单次剂量、总量、总金额、药房/科室)丢失。
数据流追踪:
-
后端
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等
- 查询组套明细 SQL(OrdersGroupPackageAppMapper.xml:37-82)返回:
-
前端
orderGroupDrawer.vuehandleUseOrderGroup(line 568-694)- 对每个组套明细项进行预处理,合并组套字段和医嘱库字段
- 通过
emit('useOrderGroup', processedDetailList)发送到父组件
-
前端
inpatientDoctor/home/components/order/index.vuehandleSaveGroup(line 1546-1639)- 接收
orderGroupList,对每个 item 调用setValue(mergedDetail)填充行数据 - 然后用
item的字段显式覆盖创建newRow
- 接收
根因定位:handleSaveGroup 在构建 newRow 时(line 1594-1617),从 item 直接取值覆盖了 setValue 设置的值。问题在于:
-
item.unitCodeName可能为 undefined:组套明细 SQL 中unitCodeName来自字典关联sys_dict_data,如果字典匹配不上则为 null。newRow的unitCode_dictText直接使用item.unitCodeName || '',导致显示为空。 -
positionName未在orderGroupDrawer处理项中显式设置:虽然setValue会通过库存查询设置positionName,但orderGroupDrawer.vue的handleUseOrderGroup没有将positionName(或至少orderDetail.positionName)包含在 processed item 中,导致setValue的库存查找依赖inventoryList,而inventoryList来自后端AdviceBaseDto。 -
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 设置的值,但显式在顶层包含可以确保数据流的完整性。
验证计划
- 修改代码后,用
node --check验证语法 - 在住院医生工作站测试:选择患者 → 点击组套 → 预览组套 → 应用到当前患者
- 验证表格中显示的字段:单次剂量、总量、总金额、药房/科室均有值
修复结果:✅ 成功,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 构造均能正确传递这些数据到表格。