优化SKU规格属性数据结构,将对象格式改为数组格式以匹配metadata规范,同时兼容旧格式数据的回显和编辑

This commit is contained in:
WUSIJIAN
2026-01-12 17:56:47 +08:00
parent 586e0d51dd
commit ffaf455fe8

View File

@@ -328,16 +328,33 @@ const onEditSku = async (row: any) => {
skuImagePreview.value = formatImageUrl(data.imageUrl); skuImagePreview.value = formatImageUrl(data.imageUrl);
} }
// 处理规格属性 // 处理规格属性(支持新格式数组和旧格式对象)
if (data.specValues && Object.keys(data.specValues).length > 0) { if (data.specValues) {
specValuesList.value = Object.entries(data.specValues).map(([key, value]) => ({ if (Array.isArray(data.specValues)) {
key, // 新格式:与 metadata 相同的数组格式
value: String(value), data.specValues.forEach((item: any) => {
})); if (item.name) {
// 回显到 specValuesMap // value 可能是数组或字符串
Object.entries(data.specValues).forEach(([key, value]) => { const val = Array.isArray(item.value) ? item.value[0] : item.value;
specValuesMap[key] = String(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 { } else {
specValuesList.value = [{ key: '', value: '' }]; specValuesList.value = [{ key: '', value: '' }];
} }
@@ -471,18 +488,26 @@ const onSubmitSku = async () => {
submitLoading.value = true; submitLoading.value = true;
// 构建规格属性对象(优先使用 specValuesMap // 构建规格属性数组(与 metadata 格式相同
const specValues: Record<string, string> = {}; const specValues: any[] = [];
// 从 specValuesMap 获取(直接展示的属性) assetSpecAttrs.value.forEach((attr) => {
Object.entries(specValuesMap).forEach(([key, value]) => { const selectedValue = specValuesMap[attr.name];
if (key && value) { if (selectedValue) {
specValues[key] = value; // 构建与 metadata 相同的数据结构
} const specItem: any = {
}); name: attr.name,
// 兼容旧的 specValuesList type: 'multi_select',
specValuesList.value.forEach((item) => { value: [selectedValue],
if (item.key.trim() && !specValues[item.key.trim()]) { };
specValues[item.key.trim()] = item.value.trim(); // 添加 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, assetName: assetName.value,
skuName: skuForm.skuName, skuName: skuForm.skuName,
imageUrl: skuForm.imageUrl || undefined, imageUrl: skuForm.imageUrl || undefined,
specValues: Object.keys(specValues).length > 0 ? specValues : undefined, specValues: specValues.length > 0 ? specValues : undefined,
price: Math.round(skuForm.price * 100), price: Math.round(skuForm.price * 100),
unlimitedStock: skuForm.unlimitedStock, unlimitedStock: skuForm.unlimitedStock,
stock: skuForm.stock, stock: skuForm.stock,