Fix Bug #464: [目录管理-诊疗目录] 新增项目时"零售价"未与"诊疗子项"合计总价自动同步

- 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 <noreply@anthropic.com>
This commit is contained in:
关羽
2026-05-13 17:21:02 +08:00
parent fb987ba901
commit 7e902973b8

View File

@@ -467,9 +467,9 @@ function calculateTotalPrice() {
try { try {
let sum = 0; let sum = 0;
treatmentItems.value.forEach((item) => { treatmentItems.value.forEach((item) => {
if (item.adviceDefinitionId && item.retailPrice && item.childrenRequestNum) { if (item.adviceDefinitionId && item.adviceDefinitionId !== '') {
const price = parseFloat(item.retailPrice) || 0; const price = Number(item.retailPrice) || 0;
const count = parseInt(item.childrenRequestNum) || 0; const count = Number(item.childrenRequestNum) || 0;
sum += price * count; sum += price * count;
} }
}); });
@@ -479,7 +479,10 @@ function calculateTotalPrice() {
(item) => item.adviceDefinitionId && item.adviceDefinitionId !== '' (item) => item.adviceDefinitionId && item.adviceDefinitionId !== ''
); );
if (hasValidItem) { if (hasValidItem) {
form.value.retailPrice = parseFloat(totalPrice.value); // 使用 nextTick 确保总价更新后零售价才更新,避免 Vue 响应式时序问题
nextTick(() => {
form.value.retailPrice = parseFloat(totalPrice.value) || 0;
});
} else { } else {
form.value.retailPrice = undefined; form.value.retailPrice = undefined;
} }
@@ -565,15 +568,16 @@ function edit() {
form.value.pricingFlag = 1; form.value.pricingFlag = 1;
} }
// 处理子项数据确保包含retailPrice字段 // 处理子项数据确保包含retailPrice和name字段
if (props.item.childrenJson) { if (props.item.childrenJson) {
const parsedItems = JSON.parse(props.item.childrenJson); const parsedItems = JSON.parse(props.item.childrenJson);
treatmentItems.value = parsedItems.map((item) => ({ treatmentItems.value = parsedItems.map((item) => ({
...item, ...item,
name: item.name || '',
retailPrice: item.retailPrice || 0, retailPrice: item.retailPrice || 0,
})); }));
} else { } 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 = form.value.permittedUnitCode
? form.value.permittedUnitCode.toString() ? form.value.permittedUnitCode.toString()
@@ -618,7 +622,7 @@ function reset() {
chrgitmLv: undefined, //医保等级 chrgitmLv: undefined, //医保等级
pricingFlag: 1, // 划价标记,默认允许划价 pricingFlag: 1, // 划价标记,默认允许划价
}; };
treatmentItems.value = [{ adviceDefinitionId: '', childrenRequestNum: 1, retailPrice: 0 }]; treatmentItems.value = [{ adviceDefinitionId: '', childrenRequestNum: 1, name: '', retailPrice: 0 }];
totalPrice.value = '0.00'; totalPrice.value = '0.00';
proxy.resetForm('diagnosisTreatmentRef'); proxy.resetForm('diagnosisTreatmentRef');
} }
@@ -760,7 +764,10 @@ function selectRow(row, index) {
treatmentItems.value[index].adviceDefinitionId = row.id; treatmentItems.value[index].adviceDefinitionId = row.id;
treatmentItems.value[index].retailPrice = row.retailPrice || 0; treatmentItems.value[index].retailPrice = row.retailPrice || 0;
medicineSearchKey.value = ''; medicineSearchKey.value = '';
// 使用 nextTick 确保 DOM 更新后再计算总价
nextTick(() => {
calculateTotalPrice(); calculateTotalPrice();
});
} }
// 清空诊疗子项 // 清空诊疗子项