|
|
|
@ -9,7 +9,7 @@
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item v-for="(sku, i) in form.skus" :key="i" :label="sku.name">
|
|
|
|
|
<el-form-item v-for="(sku, i) in form.attrsGroupList" :key="i" :label="sku.name">
|
|
|
|
|
<div class="flex">
|
|
|
|
|
<div class="left">
|
|
|
|
|
<el-tag
|
|
|
|
@ -28,7 +28,11 @@
|
|
|
|
|
</div>
|
|
|
|
|
<div class="right">
|
|
|
|
|
<el-button :disabled="i === 0" type="text" @click="handleMove(i, i - 1)">上移</el-button>
|
|
|
|
|
<el-button :disabled="i === form.skus.length - 1" type="text" @click="handleMove(i, i + 1)">
|
|
|
|
|
<el-button
|
|
|
|
|
:disabled="i === form.attrsGroupList.length - 1"
|
|
|
|
|
type="text"
|
|
|
|
|
@click="handleMove(i, i + 1)"
|
|
|
|
|
>
|
|
|
|
|
下移
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button type="text" @click="handleDelSku(i)">删除</el-button>
|
|
|
|
@ -38,7 +42,7 @@
|
|
|
|
|
</el-form>
|
|
|
|
|
<el-table border :data="form.skuInfos" style="width: 100%">
|
|
|
|
|
<el-table-column
|
|
|
|
|
v-for="(sku, index) in form.skus"
|
|
|
|
|
v-for="(sku, index) in form.attrsGroupList"
|
|
|
|
|
:key="index"
|
|
|
|
|
align="center"
|
|
|
|
|
header-align="center"
|
|
|
|
@ -65,7 +69,7 @@
|
|
|
|
|
<el-input-number v-model="row.warn" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column align="center" header-align="center" label="SKU编号" min-width="100px" prop="no" />
|
|
|
|
|
<el-table-column align="center" header-align="center" label="SKU编号" min-width="100px" prop="id" />
|
|
|
|
|
<el-table-column align="center" header-align="center" label="启用" prop="enabled" width="80px">
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
<el-switch v-model="row.enabled" />
|
|
|
|
@ -96,7 +100,7 @@
|
|
|
|
|
skuValue: [],
|
|
|
|
|
form: {
|
|
|
|
|
id: null,
|
|
|
|
|
skus: [],
|
|
|
|
|
attrsGroupList: [],
|
|
|
|
|
skuInfos: [],
|
|
|
|
|
},
|
|
|
|
|
rules: {},
|
|
|
|
@ -113,55 +117,104 @@
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
await Promise.all(arr);
|
|
|
|
|
state.form.skus = res;
|
|
|
|
|
state.form.attrsGroupList = res;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
onActivated(handleLoad);
|
|
|
|
|
watch(
|
|
|
|
|
() => state.form.skus,
|
|
|
|
|
(skus) => {
|
|
|
|
|
state.form.skuInfos = skus.reduce(
|
|
|
|
|
(info, sku) => {
|
|
|
|
|
let res = [];
|
|
|
|
|
info.forEach((row) => {
|
|
|
|
|
(sku.values || []).forEach((value) => {
|
|
|
|
|
res.push({ ...row, [sku.id + '']: value.name });
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
return res;
|
|
|
|
|
},
|
|
|
|
|
[{ sales: 0, inventory: 0, price: 0, warn: 100 }]
|
|
|
|
|
);
|
|
|
|
|
() => state.form.attrsGroupList,
|
|
|
|
|
(attrsGroupList) => {
|
|
|
|
|
const old = state.form.skuInfos;
|
|
|
|
|
state.form.skuInfos = attrsGroupList
|
|
|
|
|
.reduce(
|
|
|
|
|
(info, attrsGroup) => {
|
|
|
|
|
let res = [];
|
|
|
|
|
if (attrsGroup.values?.length) {
|
|
|
|
|
info.forEach((row) => {
|
|
|
|
|
attrsGroup.values?.forEach((value) => {
|
|
|
|
|
let temp = _.cloneDeep(row);
|
|
|
|
|
temp[attrsGroup.id + ''] = value.name;
|
|
|
|
|
temp.groups.push(value.id);
|
|
|
|
|
res.push(temp);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
res = info;
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
},
|
|
|
|
|
[{ sales: 0, inventory: 0, price: 0, warn: 100, groups: [] }]
|
|
|
|
|
)
|
|
|
|
|
.map((info) => {
|
|
|
|
|
let row = old.find((item) => item.groups.sort().join() === info.groups.sort().join());
|
|
|
|
|
if (row) {
|
|
|
|
|
Object.assign(info, row);
|
|
|
|
|
}
|
|
|
|
|
return info;
|
|
|
|
|
});
|
|
|
|
|
console.info(state.form.skuInfos, old);
|
|
|
|
|
},
|
|
|
|
|
{ immediate: true, deep: true }
|
|
|
|
|
{ deep: true }
|
|
|
|
|
);
|
|
|
|
|
const handleAddSku = () => {
|
|
|
|
|
const handleAddSku = async () => {
|
|
|
|
|
if (state.skuName) {
|
|
|
|
|
state.form.skus.push({ name: state.skuName, values: [] });
|
|
|
|
|
state.skuName = null;
|
|
|
|
|
let res = await store.dispatch('productAttrsGroup', {
|
|
|
|
|
name: state.skuName,
|
|
|
|
|
productId: route.params.id,
|
|
|
|
|
sort: state.form.attrsGroupList.length,
|
|
|
|
|
});
|
|
|
|
|
if (res) {
|
|
|
|
|
state.form.skuInfos = [];
|
|
|
|
|
state.form.attrsGroupList.push({ name: state.skuName, values: [] });
|
|
|
|
|
state.skuName = null;
|
|
|
|
|
} else {
|
|
|
|
|
proxy.$message.error('添加属性规格失败');
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
proxy.$message.error('请输入属性规格');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const handleDelSku = (index) => {
|
|
|
|
|
state.form.skus.splice(index, 1);
|
|
|
|
|
const handleDelSku = async (index) => {
|
|
|
|
|
let res = await store.dispatch('productAttrsGroup/remove', [state.form.attrsGroupList[index].id]);
|
|
|
|
|
if (res) {
|
|
|
|
|
state.form.attrsGroupList.splice(index, 1);
|
|
|
|
|
proxy.$message.success('删除成功');
|
|
|
|
|
} else {
|
|
|
|
|
proxy.$message.error('删除失败');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const handleMove = (oldIndex, newIndex) => {
|
|
|
|
|
let temp = state.form.skus[oldIndex];
|
|
|
|
|
state.form.skus[oldIndex] = state.form.skus[newIndex];
|
|
|
|
|
state.form.skus[newIndex] = temp;
|
|
|
|
|
let temp = state.form.attrsGroupList[oldIndex];
|
|
|
|
|
state.form.attrsGroupList[oldIndex] = state.form.attrsGroupList[newIndex];
|
|
|
|
|
state.form.attrsGroupList[newIndex] = temp;
|
|
|
|
|
};
|
|
|
|
|
const handleAddValue = (sku, index) => {
|
|
|
|
|
const handleAddValue = async (sku, index) => {
|
|
|
|
|
let value = state.skuValue[index];
|
|
|
|
|
if (value) {
|
|
|
|
|
sku.values.push(value);
|
|
|
|
|
state.skuValue[index] = null;
|
|
|
|
|
let res = await store.dispatch('productAttrsValue/save', {
|
|
|
|
|
name: value,
|
|
|
|
|
productAttributeGroupId: sku.id,
|
|
|
|
|
productId: route.params.id,
|
|
|
|
|
sort: sku.values.length,
|
|
|
|
|
symbol: Date.now(),
|
|
|
|
|
});
|
|
|
|
|
if (res) {
|
|
|
|
|
sku.values = await store.dispatch('productAttrsValue/search', sku.id);
|
|
|
|
|
} else {
|
|
|
|
|
proxy.$message.error('添加属性值失败');
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
proxy.$message.error('请输入属性值');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const handleDelValue = (sku, index) => {
|
|
|
|
|
sku.values.splice(index, 1);
|
|
|
|
|
const handleDelValue = async (sku, index) => {
|
|
|
|
|
let res = await store.dispatch('productAttrsValue/remove', [sku.values[index].id]);
|
|
|
|
|
if (res) {
|
|
|
|
|
sku.values.splice(index, 1);
|
|
|
|
|
proxy.$message.success('删除成功');
|
|
|
|
|
} else {
|
|
|
|
|
proxy.$message.error('删除失败');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const handleSave = async () => {
|
|
|
|
|
state.loading = true;
|
|
|
|
|