From fb6b9945c8250e17b0e9a404e53f78718abc5765 Mon Sep 17 00:00:00 2001 From: MSuMshk <2039814060@qq.com> Date: Tue, 24 Feb 2026 09:54:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=84=E6=A0=BC=E5=81=9A=E6=B3=95?= =?UTF-8?q?=E7=94=9F=E6=88=90SKU=E6=97=B6=E5=8F=A0=E5=8A=A0=E9=99=84?= =?UTF-8?q?=E5=8A=A0=E4=BB=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product-detail-page/sku-actions.ts | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/apps/web-antd/src/views/product/detail/composables/product-detail-page/sku-actions.ts b/apps/web-antd/src/views/product/detail/composables/product-detail-page/sku-actions.ts index a3aa4c4..59a0461 100644 --- a/apps/web-antd/src/views/product/detail/composables/product-detail-page/sku-actions.ts +++ b/apps/web-antd/src/views/product/detail/composables/product-detail-page/sku-actions.ts @@ -25,6 +25,31 @@ export function createProductDetailSkuActions( ) { const { form, skuBatch, specTemplateOptions } = options; + function normalizeMoney(value: number) { + return Number(Number(value).toFixed(2)); + } + + function resolveSpecOptionExtraPrice(templateId: string, optionId: string) { + const template = specTemplateOptions.value.find( + (item) => item.id === templateId, + ); + if (!template) return 0; + const option = template.values.find((item) => item.id === optionId); + if (!option) return 0; + const extraPrice = Number(option.extraPrice || 0); + return Number.isFinite(extraPrice) ? extraPrice : 0; + } + + function resolveSkuAttrsExtraPrice( + attrs: ProductDetailSkuRowState['attributes'], + ) { + return attrs.reduce( + (sum, item) => + sum + resolveSpecOptionExtraPrice(item.templateId, item.optionId), + 0, + ); + } + function getTemplateName(templateId: string) { return ( specTemplateOptions.value.find((item) => item.id === templateId)?.name || @@ -97,15 +122,23 @@ export function createProductDetailSkuActions( const key = buildSkuKey(attrs); const cached = previousMap.get(key); const skuIndex = index + 1; + const totalExtraPrice = resolveSkuAttrsExtraPrice(attrs); + const defaultPrice = normalizeMoney( + Math.max(0, Number(form.price || 0) + totalExtraPrice), + ); + const defaultOriginalPrice = + form.originalPrice !== null && + form.originalPrice !== undefined && + form.originalPrice > 0 + ? normalizeMoney( + Math.max(0, Number(form.originalPrice) + totalExtraPrice), + ) + : null; return { id: cached?.id || '', skuCode: cached?.skuCode || buildLocalSkuCode(skuIndex), - price: cached?.price ?? Number(form.price || 0), - originalPrice: - cached?.originalPrice ?? - (form.originalPrice && form.originalPrice > 0 - ? form.originalPrice - : null), + price: cached?.price ?? defaultPrice, + originalPrice: cached?.originalPrice ?? defaultOriginalPrice, stock: cached?.stock ?? Math.max(0, Math.floor(Number(form.stock || 0))), isEnabled: cached?.isEnabled ?? true,