feat: 商品编辑功能

This commit is contained in:
duan 2025-02-24 18:03:17 +08:00
parent 907b763fca
commit 6da80d9b23
4 changed files with 103 additions and 70 deletions

View File

@ -49,7 +49,13 @@ const AuthAPI = {
data, data,
}); });
}, },
// 商品详情
getDetail(id: number) {
return request<any, Responseres>({
url: `${baseURL}/${id}`,
method: "get",
});
},
}; };

View File

@ -198,6 +198,9 @@ const handlePreviewImage = (imageUrl: string) => {
const handlePreviewClose = () => { const handlePreviewClose = () => {
previewVisible.value = false; previewVisible.value = false;
}; };
watch(modelValue, (newValue) => {
fileList.value = newValue.map((url) => ({ url }) as UploadUserFile);
});
onMounted(() => { onMounted(() => {
fileList.value = modelValue.value.map((url) => ({ url }) as UploadUserFile); fileList.value = modelValue.value.map((url) => ({ url }) as UploadUserFile);

View File

@ -105,16 +105,7 @@ async function handleAddClick() {
} }
// //
async function handleEditClick(row: IObject) { async function handleEditClick(row: IObject) {
console.log('handleEditClick') router.push({ name: 'addgoods', query: { goods_id: row.id } });
// editModalRef.value?.handleDisabled(false);
//
// editModalConfig.formItems[2]!.attrs!.data = await UserAPI.getPage({ name: "" });
// editModalConfig.formItems[2]!.attrs!.data = await DeptAPI.getOptions();
// id
// const data = await UserAPI.getunitinfo(row.id);
// editModalRef.value?.setFormData(data);
// editModalRef.value?.setModalVisible();
} }
const myDialogRef = ref(null) const myDialogRef = ref(null)
// //

View File

@ -56,24 +56,12 @@
<!-- <el-radio label="coupon">团购券</el-radio> --> <!-- <el-radio label="coupon">团购券</el-radio> -->
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- <el-form-item label="规格类型">
<el-radio-group v-model="ruleForm.specId">
<el-radio label="normal">单规格</el-radio>
<el-radio label="sku">多规格</el-radio>
</el-radio-group>
</el-form-item> -->
<!-- <el-form-item label="套餐类型">
<el-radio-group v-model="ruleForm.groupType">
<el-radio label="0">固定套餐</el-radio>
<el-radio label="1">可选套餐</el-radio>
</el-radio-group>
</el-form-item> -->
<el-form-item label="套餐商品" v-if="ruleForm.type == 'package'"> <el-form-item label="套餐商品" v-if="ruleForm.type == 'package'">
<div style="display: block;width: 100%;"> <div style="display: block;width: 100%;">
<div class="head-container"> <div class="head-container">
<el-radio-group v-model="ruleForm.groupType" @change="typeChange"> <el-radio-group v-model="ruleForm.groupType" @change="typeChange">
<el-radio-button label="0">固定套餐</el-radio-button> <el-radio-button :label="0">固定套餐</el-radio-button>
<el-radio-button label="1">可选套餐</el-radio-button> <el-radio-button :label="1">可选套餐</el-radio-button>
</el-radio-group> </el-radio-group>
</div> </div>
<div v-if="ruleForm.groupType == '0'"> <div v-if="ruleForm.groupType == '0'">
@ -146,12 +134,11 @@
:key="item.id"></el-option> :key="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="ele.name" v-if="datas.selectSpeclist.length" v-for="ele in datas.selectSpeclist"
<el-form-item :label="item.name" v-if="datas.selectSpeclist.length" v-for="item in datas.selectSpeclist" :key="ele.name">
:key="item.name"> <el-checkbox-group v-model="ele.selectSpecResult" @change="selectSpecResultChange">
<el-checkbox-group v-model="item.selectSpecResult" @change="selectSpecResultChange"> <el-checkbox :value="element.name" :label="element.name" v-for="(element, index) in ele.children"
<el-checkbox :value="item.name" v-for="(ele, index) in item.children" :key="index">{{ ele.name :key="index"></el-checkbox>
}}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
<!-- 规格属性 --> <!-- 规格属性 -->
@ -159,10 +146,8 @@
<SpecificationAttribute v-if="ruleForm.type != 'sku'" :info="ruleForm" :list="list" <SpecificationAttribute v-if="ruleForm.type != 'sku'" :info="ruleForm" :list="list"
ref="specificationAttributeRef"> ref="specificationAttributeRef">
</SpecificationAttribute> </SpecificationAttribute>
<SpecificationAttribute v-if="ruleForm.type == 'sku' && list.length" :specTableHeaders="datas.specTableHeaders" <SpecificationAttribute v-if="ruleForm.type == 'sku' && list.length" :specTableHeaders="datas.specTableHeaders"
:info="ruleForm" :list="list" ref="specificationAttributeRef"></SpecificationAttribute> :info="ruleForm" :list="list" ref="specificationAttributeRef"></SpecificationAttribute>
<el-form-item label="重量"> <el-form-item label="重量">
<el-col :span="12"> <el-col :span="12">
<div style="display: block;"> <div style="display: block;">
@ -203,16 +188,16 @@
</el-col> </el-col>
</el-form-item> </el-form-item>
<el-form-item label="上架"> <el-form-item label="上架">
<el-switch v-model="ruleForm.isSale" active-value="1" inactive-value="0" /> <el-switch v-model="ruleForm.isSale" :active-value="1" :inactive-value="0" />
</el-form-item> </el-form-item>
<el-form-item label="库存开关"> <el-form-item label="库存开关">
<div style="display: block;"> <div style="display: block;">
<el-switch v-model="ruleForm.isStock" active-value="1" inactive-value="0" /> <el-switch v-model="ruleForm.isStock" :active-value="1" :inactive-value="0" />
<div style="color: #999;">关闭则不计算出入库数据</div> <div style="color: #999;">关闭则不计算出入库数据</div>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="设为推荐" prop="delivery"> <el-form-item label="设为推荐" prop="delivery">
<el-switch v-model="ruleForm.isHot" active-value="1" inactive-value="0" /> <el-switch v-model="ruleForm.isHot" :active-value="1" :inactive-value="0" />
</el-form-item> </el-form-item>
<el-form-item label="库存数量"> <el-form-item label="库存数量">
<el-input-number v-model="ruleForm.stockNumber" :min="0" /> <el-input-number v-model="ruleForm.stockNumber" :min="0" />
@ -337,7 +322,7 @@ interface RuleForm {
images: string[], images: string[],
type: string, type: string,
specId: any, specId: any,
groupType: string, groupType: any,
skuList: string[], skuList: string[],
weight: any, weight: any,
isAllowTempModifyPrice: any, isAllowTempModifyPrice: any,
@ -437,7 +422,40 @@ const rules = reactive<FormRules<RuleForm>>({
}) })
onMounted(() => { onMounted(() => {
getList() getList()
if (router.currentRoute.value.query.goods_id) {
tbProductGetDetail(router.currentRoute.value.query.goods_id);
}
}) })
watch(() => router.currentRoute.value.query.goods_id, (val) => {
tbProductGetDetail(val);
})
async function tbProductGetDetail(id: any) {
//
const res = await UserAPI3.getDetail(id);
changeTypeEnum(res.type)
for (const key in res) {
if (key !== 'images' && key !== 'days') {
(ruleForm as any)[key] = res[key];
}
}
ruleForm.images = res.images.map((item: any, index: number) => item);
ruleForm.days = res.days.split(',');
ruleForm.useTime = [res.startTime, res.endTime];
ruleForm.proGroupVo = res.groupSnap
if (res.type === "sku") {
await tbProductSpecGet()
selectSpecHandle(ruleForm.specId)
datas.selectSpeclist.forEach((item: any) => {
item.children.forEach((ele: any) => {
item.selectSpecResult.push(ele.name)
})
})
selectSpecResultChange()
} else {
list.value = ruleForm.skuList
}
}
// sku // sku
function selectSkuHandle(item: any, index: number) { function selectSkuHandle(item: any, index: number) {
// false // false
@ -490,7 +508,6 @@ function addgoods(index: number = -1) {
} }
// //
function selectShopRes(res: Array<any>) { function selectShopRes(res: Array<any>) {
console.log(res, '选择商品')
let newres = res.map(item => { let newres = res.map(item => {
item.proId = item.id item.proId = item.id
item.proName = item.name item.proName = item.name
@ -510,7 +527,6 @@ function selectShopRes(res: Array<any>) {
ruleForm.proGroupVo = [{ ...obj }] ruleForm.proGroupVo = [{ ...obj }]
} else { } else {
if (datas.addGroupIndex != -1) { if (datas.addGroupIndex != -1) {
console.log(newres, 'newres')
ruleForm.proGroupVo[datas.addGroupIndex].count = newres.length ruleForm.proGroupVo[datas.addGroupIndex].count = newres.length
ruleForm.proGroupVo[datas.addGroupIndex].goods = newres ruleForm.proGroupVo[datas.addGroupIndex].goods = newres
} else { } else {
@ -535,10 +551,9 @@ function selectSpecResultChange() {
createSkuHeader(); createSkuHeader();
createSkuBody(); createSkuBody();
} }
//
function createSkuHeader() { function createSkuHeader() {
const headers = []; const headers = [];
for (let item of datas.selectSpeclist) { for (let item of datas.selectSpeclist) {
if (item.selectSpecResult.length) { if (item.selectSpecResult.length) {
headers.push({ headers.push({
@ -549,6 +564,7 @@ function createSkuHeader() {
} }
datas.specTableHeaders = headers; datas.specTableHeaders = headers;
} }
// //
function addtaocan() { function addtaocan() {
datas.addGroupIndex = -1; datas.addGroupIndex = -1;
@ -608,8 +624,20 @@ function createSkuBody() {
}); });
} }
} }
console.log(newarr, '提交') if (ruleForm.skuList.length) {
list.value = newarr; newarr.forEach((val: any, index: number) => {
val['originPrice'] = ruleForm.skuList[index]['originPrice']
val['costPrice'] = ruleForm.skuList[index]['costPrice']
val['salePrice'] = ruleForm.skuList[index]['salePrice']
val['memberPrice'] = ruleForm.skuList[index]['memberPrice']
val['suitNum'] = ruleForm.skuList[index]['suitNum']
});
list.value = newarr
} else {
list.value = newarr;
}
} }
// //
function changeTypeEnum(item: string) { function changeTypeEnum(item: string) {
@ -624,20 +652,19 @@ function changeTypeEnum(item: string) {
} }
} }
// //
function cartesian(arr: any[]) { function cartesian(arr) {
if (arr.length < 2) return arr[0] || []; if (arr.length < 2) return arr[0] || [];
return [].reduce.call(arr, (col: any, set: any, index) => { return [].reduce.call(arr, (col, set) => {
let res = <any>[]; let res = [];
col.forEach((c: any) => { col.forEach((c) => {
set.forEach((s: any) => { set.forEach((s) => {
let arr: any = Array.isArray(c) ? c : [c] let t = [].concat(Array.isArray(c) ? c : [c]);
let t: any[] = [].concat(arr);
t.push(s); t.push(s);
res.push(t); res.push(t);
}); });
}); });
return res; return res;
}, []); });
} }
// //
function typeChange() { function typeChange() {
@ -666,18 +693,17 @@ function selectSpecHandle(e: any) {
selectSpec[item].selectSpecResult = []; selectSpec[item].selectSpecResult = [];
} }
datas.selectSpeclist = selectSpec; datas.selectSpeclist = selectSpec;
// this.form.skuList = [ ];
} }
const specificationAttributeRef = ref(null) const specificationAttributeRef = ref(null)
const submitForm = async (formEl: FormInstance | undefined) => { const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
await formEl.validate(async (valid, fields) => { await formEl.validate(async (valid, fields) => {
if (valid) { if (valid) {
ruleForm.days = ruleForm.days.join(',')
// //
ruleForm.coverImg = ruleForm.images[0] ruleForm.coverImg = ruleForm.images[0]
// id // id
ruleForm.specId = specIdFunction(ruleForm.type) // ruleForm.specId = specIdFunction(ruleForm.type)
// //
ruleForm.startTime = ruleForm.useTime[0] ruleForm.startTime = ruleForm.useTime[0]
ruleForm.endTime = ruleForm.useTime[1] ruleForm.endTime = ruleForm.useTime[1]
@ -691,24 +717,31 @@ const submitForm = async (formEl: FormInstance | undefined) => {
}) })
ruleForm.selectSpecInfo = obj ruleForm.selectSpecInfo = obj
} else if (ruleForm.type == 'package') { } else if (ruleForm.type == 'package') {
console.log(ruleForm, '套餐') // console.log(ruleForm, '')
} }
let res = await UserAPI3.addunit(ruleForm) if (ruleForm.id) {
if (res.code == 200) { let res = await UserAPI3.update(ruleForm)
ElMessage.success("添加成功"); if (res.code == 200) {
ElMessage.success("修改成功");
}
} else {
let res = await UserAPI3.addunit(ruleForm)
if (res.code == 200) {
ElMessage.success("添加成功");
}
}
setTimeout(() => {
closeSelectedTag({
"name": "addgoods",
"title": "新增商品",
"path": "/product/addgoods",
"fullPath": "/product/addgoods",
"affix": false,
"keepAlive": true,
"query": {}
})
router.push({ name: 'productIndex' }); router.push({ name: 'productIndex' });
setTimeout(() => { }, 500);
closeSelectedTag({
"name": "addgoods",
"title": "新增商品",
"path": "/product/addgoods",
"fullPath": "/product/addgoods",
"affix": false,
"keepAlive": true,
"query": {}
})
}, 500);
}
} else { } else {
ElMessage.error("请填写完整信息"); ElMessage.error("请填写完整信息");
console.log('error submit!', fields) console.log('error submit!', fields)