From 66869adf8a6749109ad811e83c9151605168660a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BA=91?= <赵云@gentronhealth.com> Date: Thu, 14 May 2026 00:18:24 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#403:=20=E4=BD=8F=E9=99=A2=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E5=B7=A5=E4=BD=9C=E7=AB=99=EF=BC=9A=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=8C=BB=E5=98=B1=E7=BB=84=E5=A5=97=E5=90=8E=EF=BC=8C=E8=8D=AF?= =?UTF-8?q?=E5=93=81=E6=98=8E=E7=BB=86=E5=AD=97=E6=AE=B5=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=E6=9C=AA=E6=AD=A3=E7=A1=AE=E5=BC=95=E5=85=A5?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因分析: 1. orderGroupDrawer.vue 中 handleUseOrderGroup 的 mergedDetail 对象缺少 categoryCode、minUnitCode、doseUnitCode、partPercent、partAttributeEnum、 unitConversionRatio、defaultLotNumber 等关键字段,导致 setValue 和价格计算逻辑失效 2. 使用 || 替代 ?? 作为数字字段(如 doseQuantity=0)的回退操作符,导致值为 0 时被错误覆盖 3. handleSaveGroup 中价格计算使用 item.unitCode 查找 unitInfo,但 item.unitCode 可能为 undefined,而 setValue 已正确填充了 prescriptionList 中的 unitCode 修复内容: - mergedDetail 先展开 orderDetail(包含所有药品基础字段),再用组套用户覆盖值覆盖 - 所有数字字段回退从 || 改为 ??,确保 0 值不被覆盖 - 新增 doseQuantity 的 ?? 回退逻辑到 orderDetail.doseQuantity - 新增 groupId、groupOrder、orgId、orgName、therapyEnum 到 mergedDetail - handleSaveGroup 使用 baseRow 变量避免对象自引用问题 - 价格计算使用 newRow.unitCode(已由 setValue 填充)而非 item.unitCode Co-Authored-By: Claude Opus 4.7 --- .../prescription/orderGroupDrawer.vue | 40 ++++++++++++------- .../home/components/order/index.vue | 38 +++++++++++------- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/openhis-ui-vue3/src/views/doctorstation/components/prescription/orderGroupDrawer.vue b/openhis-ui-vue3/src/views/doctorstation/components/prescription/orderGroupDrawer.vue index b50c63a81..21d059bb4 100755 --- a/openhis-ui-vue3/src/views/doctorstation/components/prescription/orderGroupDrawer.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/prescription/orderGroupDrawer.vue @@ -589,36 +589,46 @@ function handleUseOrderGroup(row) { minUnitPrice: orderDetail.minUnitPrice, inventoryList: orderDetail.inventoryList || [], priceList: orderDetail.priceList || [], - partPercent: orderDetail.partPercent || 1, + partPercent: orderDetail.partPercent ?? 1, + partAttributeEnum: orderDetail.partAttributeEnum, + unitConversionRatio: orderDetail.unitConversionRatio, // 🔧 Bug #218 修复:positionId 可能存储在 item 本身,优先使用 item.positionId - positionId: item.positionId || orderDetail.positionId, + positionId: item.positionId ?? orderDetail.positionId, defaultLotNumber: orderDetail.defaultLotNumber, // 单位信息 - unitCode: item.unitCode || orderDetail.unitCode, + unitCode: item.unitCode ?? orderDetail.unitCode, + categoryCode: item.categoryCode ?? orderDetail.categoryCode, unitCodeName: item.unitCodeName || orderDetail.unitCode_dictText, minUnitCode: orderDetail.minUnitCode, doseUnitCode: orderDetail.doseUnitCode, // 合并后的完整对象(用于 setValue) + // 先展开 orderDetail 获取所有药品基础字段(categoryCode、minUnitCode、doseUnitCode、 + // partPercent、partAttributeEnum、unitConversionRatio、defaultLotNumber 等), + // 再用组套用户覆盖值覆盖,确保单次剂量/频次/用法/用药天数/总量等不被丢失 mergedDetail: { ...orderDetail, adviceName: orderDetail.adviceName || item.orderDefinitionName || '未知项目', adviceType: orderDetail.adviceType, quantity: item.quantity, - unitCode: item.unitCode || orderDetail.unitCode, + unitCode: item.unitCode ?? orderDetail.unitCode, + categoryCode: item.categoryCode ?? orderDetail.categoryCode, unitCodeName: item.unitCodeName, - dose: item.dose || orderDetail.dose, - rateCode: item.rateCode || orderDetail.rateCode, - methodCode: item.methodCode || orderDetail.methodCode, - dispensePerDuration: item.dispensePerDuration || orderDetail.dispensePerDuration, - doseQuantity: item.doseQuantity, - inventoryList: orderDetail.inventoryList || [], - priceList: orderDetail.priceList || [], - partPercent: orderDetail.partPercent || 1, - // 🔧 Bug #218 修复:positionId 可能存储在 item 本身,优先使用 item.positionId - positionId: item.positionId || orderDetail.positionId, - defaultLotNumber: orderDetail.defaultLotNumber, + dose: item.dose ?? orderDetail.dose, + rateCode: item.rateCode ?? orderDetail.rateCode, + methodCode: item.methodCode ?? orderDetail.methodCode, + dispensePerDuration: item.dispensePerDuration ?? orderDetail.dispensePerDuration, + doseQuantity: item.doseQuantity ?? orderDetail.doseQuantity, + // 🔧 Bug #218 / #403 修复:positionId 可能存储在 item 本身,优先使用 item.positionId + positionId: item.positionId ?? orderDetail.positionId, + // 执行科室:优先使用组套明细中保存的 orgId + orgId: item.orgId ?? orderDetail.orgId, + orgName: item.orgName ?? orderDetail.orgName, + // 组号(保留组套中的分组信息) + groupId: item.groupId, + groupOrder: item.groupOrder, + therapyEnum: item.therapyEnum ?? orderDetail.therapyEnum ?? '1', } }; }); diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue index 82aa40277..2db56ab37 100755 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue @@ -1639,20 +1639,14 @@ function handleSaveGroup(orderGroupList) { // 创建新的处方项目 // 🔧 Bug #403 修复:关键字段使用 null-safe 回退到 mergedDetail(已由 setValue 填充完整数据) + // 先取 setValue 填充的行数据作为基础 + const baseRow = prescriptionList.value[rowIndex.value]; const newRow = { - ...prescriptionList.value[rowIndex.value], + ...baseRow, patientId: patientInfo.value.patientId, encounterId: patientInfo.value.encounterId, accountId: accountId.value, - quantity: item.quantity ?? mergedDetail.quantity, - methodCode: item.methodCode ?? mergedDetail.methodCode, - rateCode: item.rateCode ?? mergedDetail.rateCode, - dispensePerDuration: item.dispensePerDuration ?? mergedDetail.dispensePerDuration, - dose: item.dose ?? mergedDetail.dose, - doseQuantity: item.doseQuantity ?? mergedDetail.doseQuantity, executeNum: 1, - unitCode: item.unitCode ?? mergedDetail.unitCode, - unitCode_dictText: item.unitCodeName || mergedDetail.unitCodeName || '', statusEnum: 1, orgId: resolveOrgId(item.orderDetailInfos?.orgId || mergedDetail.orgId || patientInfo.value?.inHospitalOrgId) || '', // 🔧 修复:同时保存 orgName,确保树匹配不到时仍有中文名称可显示 @@ -1661,19 +1655,33 @@ function handleSaveGroup(orderGroupList) { conditionId: conditionId.value, conditionDefinitionId: conditionDefinitionId.value, encounterDiagnosisId: encounterDiagnosisId.value, - therapyEnum: prescriptionList.value[rowIndex.value]?.therapyEnum || '1', + therapyEnum: baseRow?.therapyEnum || '1', }; + // 覆盖关键字段:优先使用 item 的值,其次 mergedDetail(已由 setValue 填充),最后 baseRow + newRow.quantity = item.quantity ?? mergedDetail.quantity ?? baseRow.quantity; + newRow.methodCode = item.methodCode ?? mergedDetail.methodCode ?? baseRow.methodCode; + newRow.rateCode = item.rateCode ?? mergedDetail.rateCode ?? baseRow.rateCode; + newRow.dispensePerDuration = item.dispensePerDuration ?? mergedDetail.dispensePerDuration ?? baseRow.dispensePerDuration; + newRow.dose = item.dose ?? mergedDetail.dose ?? baseRow.dose; + newRow.doseQuantity = item.doseQuantity ?? mergedDetail.doseQuantity ?? baseRow.doseQuantity; + newRow.unitCode = item.unitCode ?? mergedDetail.unitCode ?? baseRow.unitCode; + newRow.unitCode_dictText = item.unitCodeName || mergedDetail.unitCodeName || baseRow.unitCode_dictText || ''; // 计算价格和总量 - const unitInfo = unitCodeList.value.find((k) => k.value == item.unitCode); + // 🔧 Bug #403 修复:使用 newRow.unitCode(已由 setValue 填充)而非 item.unitCode + // 使用 ?? 替代 || 计算 partPercent,确保值为 0 时不会被错误替换 + const finalUnitCode = newRow.unitCode; + const unitInfo = unitCodeList.value.find((k) => k.value == finalUnitCode); + const finalQuantity = newRow.quantity; + const partPercent = item.orderDetailInfos?.partPercent ?? mergedDetail.partPercent ?? baseRow.partPercent ?? 1; if (unitInfo && unitInfo.type == 'minUnit') { newRow.price = newRow.minUnitPrice; - newRow.totalPrice = (item.quantity * newRow.minUnitPrice).toFixed(6); - newRow.minUnitQuantity = item.quantity; + newRow.totalPrice = ((finalQuantity || 0) * newRow.minUnitPrice).toFixed(6); + newRow.minUnitQuantity = finalQuantity || 0; } else { newRow.price = newRow.unitPrice; - newRow.totalPrice = (item.quantity * newRow.unitPrice).toFixed(6); - newRow.minUnitQuantity = item.quantity * (item.orderDetailInfos?.partPercent || mergedDetail.partPercent || 1); + newRow.totalPrice = ((finalQuantity || 0) * newRow.unitPrice).toFixed(6); + newRow.minUnitQuantity = (finalQuantity || 0) * partPercent; } newRow.contentJson = JSON.stringify(newRow);