From 940fad5c7d1f396c1fa9ed61fa9cd0f9ce51c540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Wed, 13 May 2026 17:21:02 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#464:=20[=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=AE=A1=E7=90=86-=E8=AF=8A=E7=96=97=E7=9B=AE=E5=BD=95]=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=A1=B9=E7=9B=AE=E6=97=B6"=E9=9B=B6?= =?UTF-8?q?=E5=94=AE=E4=BB=B7"=E6=9C=AA=E4=B8=8E"=E8=AF=8A=E7=96=97?= =?UTF-8?q?=E5=AD=90=E9=A1=B9"=E5=90=88=E8=AE=A1=E6=80=BB=E4=BB=B7?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - calculateTotalPrice: 使用 nextTick 确保 Vue 响应式时序正确,零售价与总价同步 - calculateTotalPrice: 修复判断条件,使用 adviceDefinitionId 而非 retailPrice/childrenRequestNum(可能为0) - calculateTotalPrice: 使用 Number() 替代 parseFloat/parseInt 统一类型转换 - selectRow: 使用 nextTick 确保 DOM 更新后再计算总价,避免时序问题 - edit/reset: treatmentItems 初始化补充缺失的 name 字段 Co-Authored-By: Claude Opus 4.7 --- .../components/diagnosisTreatmentDialog.vue | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/openhis-ui-vue3/src/views/catalog/diagnosistreatment/components/diagnosisTreatmentDialog.vue b/openhis-ui-vue3/src/views/catalog/diagnosistreatment/components/diagnosisTreatmentDialog.vue index 2773e388c..f24b2d348 100755 --- a/openhis-ui-vue3/src/views/catalog/diagnosistreatment/components/diagnosisTreatmentDialog.vue +++ b/openhis-ui-vue3/src/views/catalog/diagnosistreatment/components/diagnosisTreatmentDialog.vue @@ -466,9 +466,9 @@ function calculateTotalPrice() { try { let sum = 0; treatmentItems.value.forEach((item) => { - if (item.adviceDefinitionId && item.retailPrice && item.childrenRequestNum) { - const price = parseFloat(item.retailPrice) || 0; - const count = parseInt(item.childrenRequestNum) || 0; + if (item.adviceDefinitionId && item.adviceDefinitionId !== '') { + const price = Number(item.retailPrice) || 0; + const count = Number(item.childrenRequestNum) || 0; sum += price * count; } }); @@ -478,7 +478,10 @@ function calculateTotalPrice() { (item) => item.adviceDefinitionId && item.adviceDefinitionId !== '' ); if (hasValidItem) { - form.value.retailPrice = parseFloat(totalPrice.value); + // 使用 nextTick 确保总价更新后零售价才更新,避免 Vue 响应式时序问题 + nextTick(() => { + form.value.retailPrice = parseFloat(totalPrice.value) || 0; + }); } else { form.value.retailPrice = undefined; } @@ -564,15 +567,16 @@ function edit() { form.value.pricingFlag = 1; } - // 处理子项数据,确保包含retailPrice字段 + // 处理子项数据,确保包含retailPrice和name字段 if (props.item.childrenJson) { const parsedItems = JSON.parse(props.item.childrenJson); treatmentItems.value = parsedItems.map((item) => ({ ...item, + name: item.name || '', retailPrice: item.retailPrice || 0, })); } else { - treatmentItems.value = [{ adviceDefinitionId: '', childrenRequestNum: 1, retailPrice: 0 }]; + treatmentItems.value = [{ adviceDefinitionId: '', childrenRequestNum: 1, name: '', retailPrice: 0 }]; } form.value.permittedUnitCode = form.value.permittedUnitCode ? form.value.permittedUnitCode.toString() @@ -617,7 +621,7 @@ function reset() { chrgitmLv: undefined, //医保等级 pricingFlag: 1, // 划价标记,默认允许划价 }; - treatmentItems.value = [{ adviceDefinitionId: '', childrenRequestNum: 1, retailPrice: 0 }]; + treatmentItems.value = [{ adviceDefinitionId: '', childrenRequestNum: 1, name: '', retailPrice: 0 }]; totalPrice.value = '0.00'; proxy.resetForm('diagnosisTreatmentRef'); } @@ -759,7 +763,10 @@ function selectRow(row, index) { treatmentItems.value[index].adviceDefinitionId = row.id; treatmentItems.value[index].retailPrice = row.retailPrice || 0; medicineSearchKey.value = ''; - calculateTotalPrice(); + // 使用 nextTick 确保 DOM 更新后再计算总价 + nextTick(() => { + calculateTotalPrice(); + }); } // 清空诊疗子项