代客下单增加更新规格限制

This commit is contained in:
2024-08-20 16:45:13 +08:00
parent 28750b0a2d
commit 5575b4be9d

View File

@@ -142,14 +142,14 @@
<div style="width: 15px"></div>
<div class="flex-1">
<el-button
size="medium"
:disabled="!order.list.length"
@click="createOrderShow"
>
去结账
</el-button>
size="medium"
:disabled="!order.list.length"
@click="createOrderShow"
>
去结账
</el-button>
</div>
<!-- <button
class="my-btn flex-1 success"
:class="{ disabled: !order.list.length }"
@@ -583,14 +583,22 @@
v-for="(val, valIndex) in item.values"
:key="valIndex"
>
<el-tag
<el-button
plain
:disabled="val.disabled"
@click="changeTagSel(index, val)"
:type="val.name === item.sel ? 'success' : ''"
>
{{ val.name }}
</el-button>
<!-- <el-tag
v-if="val === item.sel"
size="medium "
size="medium"
:disabled="item.disabled"
@click="changeTagSel(index, val)"
effect="dark"
type="success"
>
<!-- :effect="val === item.sel ? 'dark' : 'light '" -->
{{ val }}
</el-tag>
@@ -598,11 +606,12 @@
v-else
size="medium"
type="success"
:disabled="item.disabled"
@click="changeTagSel(index, val)"
effect="light"
>
{{ val }}
</el-tag>
</el-tag> -->
</span>
</div>
</div>
@@ -807,9 +816,44 @@ import {
$cacheOrder,
$getCacheOrder,
$delOrder,
$setUser
$setUser,
} from "@/api/table";
import { tbShopCategoryGet } from "@/api/shop";
//判断商品是否可以下单
function isCanBuy(goods) {
return goods.isGrounding && goods.isPauseSale == 0 && goods.stockNumber > 0;
}
// 一个数组是否包含另外一个数组全部元素
function arrayContainsAll(arr1, arr2) {
for (let i = 0; i < arr2.length; i++) {
if (!arr1.includes(arr2[i])) {
return false;
}
}
return true;
}
//n项 n-1项组合生成全部结果
function generateCombinations(arr, k) {
let result = [];
function helper(index, current) {
if (current.length === k) {
result.push(current.slice()); // 使用slice()来避免直接修改原始数组
} else {
for (let i = index; i < arr.length; i++) {
current.push(arr[i]); // 将当前元素添加到组合中
helper(i + 1, current); // 递归调用,索引增加以避免重复选择相同的元素
current.pop(); // 回溯,移除当前元素以便尝试其他组合
}
}
}
helper(0, []); // 从索引0开始初始空数组作为起点
return result;
}
function returnReverseVal(val, isReturnString = true) {
const isBol = typeof val === "boolean";
const isString = typeof val === "string";
@@ -991,7 +1035,7 @@ export default {
},
skuText() {
const result = this.selGoods.skuList.reduce((a, b) => {
return a + b.sel + "+";
return a + (b.sel ? b.sel + "+" : "");
}, "");
return result.substring(0, result.length - 1);
},
@@ -1039,15 +1083,15 @@ export default {
},
},
watch: {
"vipUser.id":async function(val){
const {masterId}= await this.getMasterId()
this.masterId=masterId
$setUser({
tableId:this.table.tableId,
masterId:this.masterId,
vipUserId:val,
type:val===''?1:0
})
"vipUser.id": async function (val) {
const { masterId } = await this.getMasterId();
this.masterId = masterId;
$setUser({
tableId: this.table.tableId,
masterId: this.masterId,
vipUserId: val,
type: val === "" ? 1 : 0,
});
},
"prveOrder.list.length": function (val) {
if (val !== 0) {
@@ -1376,17 +1420,20 @@ export default {
// tableId:this.table.tableId,
// masterId:order.carList[0].masterId
// })
const {masterId,tableId,userId}= await $cacheOrder({orderId:this.prveOrder.list[this.prveOrder.sel].orderId,isPending:false})
this.masterId=masterId
const {records}=await getCart({
const { masterId, tableId, userId } = await $cacheOrder({
orderId: this.prveOrder.list[this.prveOrder.sel].orderId,
isPending: false,
});
this.masterId = masterId;
const { records } = await getCart({
masterId,
tableId,
vipUserId:userId!='null'?userId:''
})
console.log(records)
this.order.list = records
vipUserId: userId != "null" ? userId : "",
});
console.log(records);
this.order.list = records;
this.prveOrder.show = false;
return
return;
this.order.list = this.prveOrder.list[this.prveOrder.sel].carList;
this.delPrveOrder();
this.prveOrder.show = false;
@@ -1396,7 +1443,7 @@ export default {
const { sel } = this.prveOrder;
const order = this.prveOrder.list[sel];
const res = await $delOrder({
orderId: order.orderId
orderId: order.orderId,
});
this.$notify({
message: "删除成功",
@@ -1654,15 +1701,81 @@ export default {
this.order.list.push({ ...item, isPack, isGift });
this.order.selIndex = this.order.list.length - 1;
},
//设置规格按钮的禁止状态
setTagDisabled() {
const selArr = this.selGoods.skuList.reduce((prve, cur) => {
if (cur.sel) {
prve.push(cur.sel);
} else {
}
return prve;
}, []);
console.log(selArr);
let selArrAllGroup = generateCombinations(selArr, selArr.length - 1);
console.log(selArrAllGroup);
const matchArr = [];
for (let key in this.selGoods.skuMap) {
const goods = this.selGoods.skuMap[key];
const keyArr = key.split(",");
for (let spe of selArrAllGroup) {
if (arrayContainsAll(keyArr, spe)) {
matchArr.push(goods);
break;
}
}
}
console.log(matchArr);
const skuList = this.selGoods.skuList;
console.log(skuList);
//全部规格都已下架
if (!matchArr.length) {
for (let k in skuList) {
for (let i in skuList[k].values) {
this.$set(skuList[k].values[i], "disabled", true);
}
}
return;
}
const includeSkuMap = matchArr.reduce((prve, cur) => {
const speArr = cur.specSnap.split(",");
for (let i of speArr) {
if (!prve.hasOwnProperty("i")) {
prve[i] = matchArr
.filter((v) => v.specSnap.match(i))
.every((v) => {
return (
!v.isGrounding || v.isPauseSale == 1 || v.stockNumber <= 0
);
});
}
}
return prve;
}, {});
for (let i in includeSkuMap) {
for (let k in skuList) {
const index = skuList[k].valueArr.findIndex((val) => val === i);
if (index !== -1) {
this.$set(skuList[k].values[index], "disabled", includeSkuMap[i]);
}
}
}
},
changeTagSel(index, val) {
this.$set(this.selGoods.skuList[index], "sel", val);
this.$set(this.selGoods.skuList[index], "sel", val.name);
let specSnap = this.selGoods.skuList.reduce((a, b) => {
return a + b.sel + ",";
}, "");
specSnap = specSnap.substring(0, specSnap.length - 1);
const skuGoods = this.selGoods.skuMap[specSnap];
this.skuGoods.data = skuGoods;
this.skuGoods.number = skuGoods.suit || 1;
for (let sku of this.selGoods.skuList) {
console.log(sku);
}
this.setTagDisabled();
const canChooseGoods = this.selGoods.skuList.every((v) => v.sel);
if (canChooseGoods) {
const skuGoods = this.selGoods.skuMap[specSnap];
this.skuGoods.data = skuGoods;
this.skuGoods.number = skuGoods.suit || 1;
}
},
reset() {
// this.goods.list = [];
@@ -1719,8 +1832,8 @@ export default {
this.selGoods.title = item.name;
this.selGoods.show = true;
},
//根据右侧商品单规格多规格做不同处理
async goodsClick(item) {
// 备份版本会过滤下架和售尽以为库存小于等于0的商品
async goodsClickback(item) {
if (item.typeEnum === "sku") {
this.selGoods.data = item;
this.selGoods.skuMap = {};
@@ -1729,36 +1842,38 @@ export default {
this.selGoods.skuMap[specList[i].specSnap] = specList[i];
}
console.log(this.selGoods.skuMap);
let specSnap = "";
let tagSnap=JSON.parse(item.skuResult.tagSnap).map(v=>{
return {...v,newval:{}}
})
const canUseSpecSnap={}
const canBudyGoods=specList.filter(v=>v.isGrounding&&v.isPauseSale!=1&&v.stockNumber>0)
canBudyGoods.map(v=>{
v.specSnap.split(',').map(spe=>{
canUseSpecSnap[spe]=spe
})
})
console.log(canUseSpecSnap)
for(let i in canUseSpecSnap){
const item=tagSnap.find(v=>v.value.match(i))
item.newval[i]=i
let tagSnap = JSON.parse(item.skuResult.tagSnap).map((v) => {
return { ...v, newval: {} };
});
const canUseSpecSnap = {};
const canBudyGoods = specList.filter(
(v) => v.isGrounding && v.isPauseSale != 1 && v.stockNumber > 0
);
canBudyGoods.map((v) => {
v.specSnap.split(",").map((spe) => {
canUseSpecSnap[spe] = spe;
});
});
console.log(canUseSpecSnap);
for (let i in canUseSpecSnap) {
const item = tagSnap.find((v) => v.value.match(i));
item.newval[i] = i;
}
tagSnap=tagSnap.map(v=>{
const newvals=Object.keys(v.newval)
tagSnap = tagSnap.map((v) => {
const newvals = Object.keys(v.newval);
specSnap += newvals[0] + ",";
return {
...v,
values:newvals,
values: newvals,
sel: newvals[0],
}
})
console.log(tagSnap)
console.log(canUseSpecSnap)
console.log(canBudyGoods)
this.selGoods.skuList = tagSnap
};
});
console.log(tagSnap);
console.log(canUseSpecSnap);
console.log(canBudyGoods);
this.selGoods.skuList = tagSnap;
// this.selGoods.skuList = tagSnap.map((v) => {
// const values = v.value.split(",");
// specSnap += values[0] + ",";
@@ -1815,6 +1930,139 @@ export default {
this.orderListPush(res);
}
},
//多规格商品弹窗时,找到默认可以下单的规格商品
findGoods(skuList = [], goodsListMap = {}) {
const skuMapNumber = skuList.reduce((prve, cur) => {
for (let i in cur.valueArr) {
prve[cur.valueArr[i]] = i;
}
return prve;
}, {});
const canBudyGoods = this.selGoods.data.specList
.filter((v) => isCanBuy(v))
.sort((a, b) => {
const aNumber = a.specSnap.split(",").reduce((prve, cur) => {
return prve + skuMapNumber[cur];
}, 0);
const bNumber = b.specSnap.split(",").reduce((prve, cur) => {
return prve + skuMapNumber[cur];
}, 0);
return aNumber - bNumber;
});
return canBudyGoods[0];
},
//设置商品默认选中,规格禁止以及选中
setSkugoodsDefaultInit() {
const skuList = this.selGoods.skuList;
const goodsListMap = this.selGoods.skuMap;
const skuGoods = this.findGoods(skuList, goodsListMap);
console.log(skuGoods);
if (skuGoods) {
this.skuGoods.data = skuGoods;
this.skuGoods.number = skuGoods.suit || 1;
skuGoods.specSnap.split(",").map((v, index) => {
skuList[index].sel = v;
});
}
this.setTagDisabled();
// console.log(goods)
// const includeSkuMap = goodsList.reduce((prve, cur) => {
// const speArr = cur.specSnap.split(",");
// for (let i of speArr) {
// if (!prve.hasOwnProperty("i")) {
// prve[i] = goodsList
// .filter((v) => v.specSnap.match(i))
// .every((v) => {
// return (
// !v.isGrounding || v.isPauseSale == 1 || v.stockNumber <= 0
// );
// });
// }
// }
// return prve;
// }, {});
// console.log(includeSkuMap);
// for (let i in includeSkuMap) {
// for (let k in skuList) {
// const index = skuList[k].valueArr.findIndex((val) => val === i);
// if (index !== -1) {
// this.$set(skuList[k].values[index], "disabled", includeSkuMap[i]);
// }
// }
// }
},
//根据右侧商品单规格多规格做不同处理
async goodsClick(item) {
if (item.typeEnum === "sku") {
this.selGoods.data = item;
this.selGoods.skuMap = {};
const specList = item.specList;
for (let i in specList) {
this.selGoods.skuMap[specList[i].specSnap] = specList[i];
}
console.log(this.selGoods.skuMap);
let specSnap = "";
// const canBudyGoods=specList.filter(v=>v)
this.selGoods.skuList = JSON.parse(item.skuResult.tagSnap).map((v) => {
const values = v.value.split(",");
// specSnap += values[0] + ",";
return {
...v,
valueArr: values,
values: values.map((name) => {
return { name, disabled: false };
}),
// sel: values[0],
// sel: values[0],
};
});
// specSnap = specSnap.substring(0, specSnap.length - 1);
// const skuGoods = this.selGoods.skuMap[specSnap];
this.setSkugoodsDefaultInit();
// this.skuGoods.data = skuGoods;
// this.skuGoods.number = skuGoods.suit || 1;
this.selGoods.title = item.name;
this.selGoods.show = true;
return;
}
//单规格
const orderGoodsIndex = this.order.list.findIndex((V) => {
return V.skuId == item.specList[0].id && V.productId == item.id;
});
const orderGoods =
orderGoodsIndex != -1 ? this.order.list[orderGoodsIndex] : undefined;
// const orderGoods = this.order.list.find((V) => {
// return V.skuId == item.specList[0].id && V.productId == item.id;
// });
let res = "";
if (orderGoods) {
//更新
// res = await $updateCart({
// cartId: orderGoods.id,
// productId: item.id,
// skuId: item.specList[0].id,
// tableId: this.table.tableId,
// num: orderGoods.number * 1 + item.specList[0].suit, // 0会删除此商品
// });
orderGoods.number += item.specList[0].suit;
this.order.number = orderGoods.number;
this.order.selIndex = orderGoodsIndex;
} else {
//增加
console.log(item);
res = await addCart({
masterId: this.masterId,
vipUserId: this.vipUser.id,
productId: item.id,
skuId: item.specList[0].id,
tableId: this.table.tableId,
num: item.specList[0].suit, // 0会删除此商品
isPack: false, // 是否打包
});
this.orderListPush(res);
}
},
async getGoods() {
const res = await getGoodsLists(this.goods.query);
console.log(res);
@@ -1912,9 +2160,14 @@ input[type="number"]::-webkit-outer-spin-button {
background: #22bf64;
color: #fff;
}
::v-deep .flex-1 .el-button{
::v-deep .flex-1 .el-button {
width: 100%;
}
::v-deep .el-button--success.is-plain {
background: rgba(34, 191, 100, 0.1);
color: #22bf64;
border: 1px solid #22bf64;
}
::v-deep .el-button--medium {
padding-top: 12px;
padding-bottom: 12px;