From ffaf455fe804df14f58e03ce7b8b01bce03cbf96 Mon Sep 17 00:00:00 2001 From: WUSIJIAN <13825895+wsj0228@user.noreply.gitee.com> Date: Mon, 12 Jan 2026 17:56:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96SKU=E8=A7=84=E6=A0=BC?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84,?= =?UTF-8?q?=E5=B0=86=E5=AF=B9=E8=B1=A1=E6=A0=BC=E5=BC=8F=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E6=A0=BC=E5=BC=8F=E4=BB=A5=E5=8C=B9=E9=85=8D?= =?UTF-8?q?metadata=E8=A7=84=E8=8C=83,=E5=90=8C=E6=97=B6=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=97=A7=E6=A0=BC=E5=BC=8F=E6=95=B0=E6=8D=AE=E7=9A=84=E5=9B=9E?= =?UTF-8?q?=E6=98=BE=E5=92=8C=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/asset/component/skuDialog.vue | 71 +++++++++++++------ 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/src/views/assets/asset/component/skuDialog.vue b/src/views/assets/asset/component/skuDialog.vue index 0182187..f4e3c47 100644 --- a/src/views/assets/asset/component/skuDialog.vue +++ b/src/views/assets/asset/component/skuDialog.vue @@ -328,16 +328,33 @@ const onEditSku = async (row: any) => { skuImagePreview.value = formatImageUrl(data.imageUrl); } - // 处理规格属性 - if (data.specValues && Object.keys(data.specValues).length > 0) { - specValuesList.value = Object.entries(data.specValues).map(([key, value]) => ({ - key, - value: String(value), - })); - // 回显到 specValuesMap - Object.entries(data.specValues).forEach(([key, value]) => { - specValuesMap[key] = String(value); - }); + // 处理规格属性(支持新格式数组和旧格式对象) + if (data.specValues) { + if (Array.isArray(data.specValues)) { + // 新格式:与 metadata 相同的数组格式 + data.specValues.forEach((item: any) => { + if (item.name) { + // value 可能是数组或字符串 + const val = Array.isArray(item.value) ? item.value[0] : item.value; + specValuesMap[item.name] = String(val || ''); + } + }); + specValuesList.value = data.specValues.map((item: any) => ({ + key: item.name, + value: String(Array.isArray(item.value) ? item.value[0] : item.value || ''), + })); + } else if (typeof data.specValues === 'object' && Object.keys(data.specValues).length > 0) { + // 旧格式:对象格式 { key: value } + specValuesList.value = Object.entries(data.specValues).map(([key, value]) => ({ + key, + value: String(value), + })); + Object.entries(data.specValues).forEach(([key, value]) => { + specValuesMap[key] = String(value); + }); + } else { + specValuesList.value = [{ key: '', value: '' }]; + } } else { specValuesList.value = [{ key: '', value: '' }]; } @@ -471,18 +488,26 @@ const onSubmitSku = async () => { submitLoading.value = true; - // 构建规格属性对象(优先使用 specValuesMap) - const specValues: Record = {}; - // 从 specValuesMap 获取(直接展示的属性) - Object.entries(specValuesMap).forEach(([key, value]) => { - if (key && value) { - specValues[key] = value; - } - }); - // 兼容旧的 specValuesList - specValuesList.value.forEach((item) => { - if (item.key.trim() && !specValues[item.key.trim()]) { - specValues[item.key.trim()] = item.value.trim(); + // 构建规格属性数组(与 metadata 格式相同) + const specValues: any[] = []; + assetSpecAttrs.value.forEach((attr) => { + const selectedValue = specValuesMap[attr.name]; + if (selectedValue) { + // 构建与 metadata 相同的数据结构 + const specItem: any = { + name: attr.name, + type: 'multi_select', + value: [selectedValue], + }; + // 添加 dictType + if (attr.dictType) { + specItem.dictType = attr.dictType; + } + // 添加 options(只包含选中的值) + if (attr.options && attr.options.length > 0) { + specItem.options = [{ label: selectedValue, value: selectedValue }]; + } + specValues.push(specItem); } }); @@ -491,7 +516,7 @@ const onSubmitSku = async () => { assetName: assetName.value, skuName: skuForm.skuName, imageUrl: skuForm.imageUrl || undefined, - specValues: Object.keys(specValues).length > 0 ? specValues : undefined, + specValues: specValues.length > 0 ? specValues : undefined, price: Math.round(skuForm.price * 100), unlimitedStock: skuForm.unlimitedStock, stock: skuForm.stock,