优化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);
}
// 处理规格属性
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<string, string> = {};
// 从 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,