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

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

View File

@@ -328,19 +328,36 @@ 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) {
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]) => ({ specValuesList.value = Object.entries(data.specValues).map(([key, value]) => ({
key, key,
value: String(value), value: String(value),
})); }));
// 回显到 specValuesMap
Object.entries(data.specValues).forEach(([key, value]) => { Object.entries(data.specValues).forEach(([key, value]) => {
specValuesMap[key] = String(value); specValuesMap[key] = String(value);
}); });
} else { } else {
specValuesList.value = [{ key: '', value: '' }]; specValuesList.value = [{ key: '', value: '' }];
} }
} else {
specValuesList.value = [{ key: '', value: '' }];
}
} catch (error) { } catch (error) {
skuFormVisible.value = false; skuFormVisible.value = false;
} finally { } finally {
@@ -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,
type: 'multi_select',
value: [selectedValue],
};
// 添加 dictType
if (attr.dictType) {
specItem.dictType = attr.dictType;
} }
}); // 添加 options只包含选中的值
// 兼容旧的 specValuesList if (attr.options && attr.options.length > 0) {
specValuesList.value.forEach((item) => { specItem.options = [{ label: selectedValue, value: selectedValue }];
if (item.key.trim() && !specValues[item.key.trim()]) { }
specValues[item.key.trim()] = item.value.trim(); 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,