This commit is contained in:
YeMingfei666 2024-09-27 13:49:15 +08:00
commit 8562f2243a
5 changed files with 317 additions and 127 deletions

View File

@ -233,6 +233,8 @@ import {
tbShopTable,
} from "@/api/table";
import dayjs from "dayjs";
export default {
components: {
addEara,
@ -253,18 +255,48 @@ export default {
selTable: "", //
areaMap: {},
shopInfo: {},
timer:null
};
},
beforeDestroy() {
this.clearTimer();
console.log('beforeDestroy')
},
mounted() {
this.clearTimer();
this.setTimter(60);
this.tbShopAreaGet();
this.getShopInfo();
},
filters: {
formatTime(time) {
return dayjs(time).format("HH小时mm分");
formatTime(milliseconds) {
console.log(milliseconds)
if (!milliseconds) {
return "";
}
const days = Math.floor(milliseconds / (1000 * 60 * 60 * 24));
const hours = Math.floor(
(milliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
);
const minutes = Math.floor(
(milliseconds % (1000 * 60 * 60)) / (1000 * 60)
);
return `${days ? days + "天" : ""} ${hours ? hours + "时" : ""} ${minutes + "分"
}`;
},
},
methods: {
clearTimer(){
console.log('clearTimer')
clearInterval(this.timer);
this.timer=null;
},
setTimter(time=60){
this.timer=setInterval(() => {
const showloading=false
this.tbShopTableGet(showloading)
}, time*1000);
},
//
async getShopInfo() {
try {
@ -322,7 +354,7 @@ export default {
this.selTable = item;
if (this.shopInfo.isTableFee) {
//
this.toInstead({num: 0,key});
this.toInstead({ num: 0, key });
// this.$refs.diancan.open(item, key, '');
return;
}
@ -330,20 +362,23 @@ export default {
if (item.useNum <= 0) {
return this.$refs.refChooseDinersNumber.open();
}
this.toInstead({num: num,key});
this.toInstead({ num: num, key });
// this.$refs.diancan.open(item, key, num);
},
toInstead(query) {
this.$router.push({ path: "/tool/Instead/index", query: {
table_name: this.selTable.name,
tableId: this.selTable.tableId,
maxCapacity:this.selTable.maxCapacity,
useType: this.selTable.useType,
...query
}});
this.$router.push({
path: "/tool/Instead/index",
query: {
table_name: this.selTable.name,
tableId: this.selTable.tableId,
useType: this.selTable.useType,
maxCapacity:this.selTable.maxCapacity,
...query,
},
});
},
chooseDinersNumberConfirm(num) {
this.toInstead({num: num});
this.toInstead({ num: num });
// this.$refs.diancan.open(this.selTable, undefined, num);
},
tabClick() {
@ -369,8 +404,8 @@ export default {
}
},
//
async tbShopTableGet() {
this.loading = true;
async tbShopTableGet(showloading=true) {
this.loading = showloading;
try {
const { content, total } = await tbShopTableGet({
shopId: localStorage.getItem("shopId"),

View File

@ -1,22 +1,22 @@
<template>
<div
class="flex order-item relative"
:class="[isActive]"
@click="itemClick"
>
<div class="flex order-item relative" :class="[isActive]" @click="itemClick">
<span class="absolute pack" v-if="item.isPack === 'true'"> </span>
<span class="absolute tui" v-if="item.status === 'return'"> 退 </span>
<div class="flex">
<div class="img">
<div class="isSeatFee img u-line-1 u-flex u-col-center u-row-center" v-if="isSeatFee">
<div
class="isSeatFee img u-line-1 u-flex u-col-center u-row-center"
v-if="isSeatFee"
>
<span>{{ item.name }}</span>
</div>
<img v-else :src="item.coverImg" class="" alt="" />
</div>
<div class="good-info">
<div class="flex lh-16">
<div class="name" :class="{ 'free-price': item.status === 'return' }">{{ item.name }}</div>
<div class="name" :class="{ 'free-price': item.status === 'return' }">
{{ item.name }}
</div>
<span class="good_info_discount" v-if="item.isGift === 'true'"
></span
>
@ -24,6 +24,9 @@
<div v-if="item.specSnap" class="specSnap">
{{ item.specSnap }}
</div>
<template v-if="item.note">
<div class="note">备注:{{ item.note || "" }}</div>
</template>
</div>
</div>
<div class="flex">
@ -50,10 +53,14 @@
</div>
</div>
</div>
<div class="color-333 total-price">
<div v-if="item.isGift === 'true'||item.status=='return' ">0</div>
<div :class="{ 'free-price': item.isGift === 'true'||item.status=='return' }">
<div v-if="item.isGift === 'true' || item.status == 'return'">0</div>
<div
:class="{
'free-price': item.isGift === 'true' || item.status == 'return',
}"
>
<span v-if="isSeatFee"> {{ item.totalAmount }}</span>
<span v-else> {{ item.salePrice }}</span>
</div>
@ -66,22 +73,22 @@
export default {
props: {
//
isSeatFee:{
isSeatFee: {
type: Boolean,
default: false,
},
//
isOld:{
isOld: {
type: Boolean,
default: false,
},
// 1 0
placeNum:{
type: [String,Number],
placeNum: {
type: [String, Number],
default: 0,
},
selPlaceNum:{
type: [String,Number],
selPlaceNum: {
type: [String, Number],
default: -1,
},
//
@ -112,11 +119,12 @@ export default {
};
},
computed: {
isActive(){
const isSel= (this.selIndex === this.index)&&(this.placeNum===this.selPlaceNum)
console.log(isSel)
return isSel?'active':'';
}
isActive() {
const isSel =
this.selIndex === this.index && this.placeNum === this.selPlaceNum;
console.log(isSel);
return isSel ? "active" : "";
},
},
watch: {
"item.number": function (val) {
@ -135,26 +143,25 @@ export default {
}
newval = `${newval}`.split(".")[0] * 1;
this.number = newval;
this.$emit("cartGoodsNumberChange",newval, this.index);
this.$emit("cartGoodsNumberChange", newval, this.index);
},
//
cartGoodsNumberInput(newval) {
if (newval <= 0) {
return this.number =1
return (this.number = 1);
}
newval = `${newval}`.split(".")[0] * 1;
this.number = newval;
this.$emit("cartGoodsNumberInput",newval, this.index);
this.$emit("cartGoodsNumberInput", newval, this.index);
},
changeOrderNumber(isReduce) {
this.$emit("changeOrderNumber", this.index, isReduce);
},
itemClick() {
if(this.isSeatFee){
return
}
this.$emit("itemClick", this.index,this.canChangeNumber,this.placeNum);
// if(this.isSeatFee){
// return
// }
this.$emit("itemClick", this.index, this.canChangeNumber, this.placeNum);
},
},
};
@ -171,8 +178,8 @@ export default {
padding: 0 4px;
text-align: center;
}
.isSeatFee{
background: #3F9EFF;
.isSeatFee {
background: #3f9eff;
color: #fff;
font-size: 12px;
}
@ -204,6 +211,7 @@ export default {
padding: 4px;
border-radius: 2px;
display: flex;
overflow: hidden;
cursor: pointer;
align-items: center;
justify-content: space-between;
@ -220,7 +228,7 @@ export default {
text-align: center;
line-height: 17px;
}
.tui{
.tui {
right: 100%;
width: 18px;
height: 18px;
@ -272,7 +280,15 @@ export default {
}
}
}
.note{
max-width: 70%;
font-size: 12px;
font-weight: 400;
text-align: left;
color: #999;
margin-top: 2px;
word-break: break-all;
}
.order-number-box {
position: relative;

View File

@ -59,7 +59,7 @@ export default {
this.tags.splice(index,1)
},
addNote(tag) {
if(this.note.length<=0){
if(!this.note){
return this.note = tag
}
this.note = tag + "," + this.note;
@ -76,13 +76,14 @@ export default {
},
confirm(){
const originTags = [...this.tags]
if(this.note.length>=1){
if(this.note){
if(originTags>=10){
originTags.shift()
}
const newTags=new Set([this.note,...originTags])
console.log(newTags)
localStorage.setItem("tags", JSON.stringify([...newTags]));
if(this.note.length<=16){
const newTags=new Set([this.note,...originTags])
localStorage.setItem("tags", JSON.stringify([...newTags]));
}
}
this.$emit('confirm',this.note)
this.close()

View File

@ -51,8 +51,7 @@ export default {
async init() {
const res = await $getPayType();
this.list = res.filter(v=>v.isDisplay);
console.log(res[0]);
this.sel = this.sel ? this.sel : res[0].payType;
this.sel = this.sel ? this.sel : 'scanCode';
},
},
mounted() {

View File

@ -237,11 +237,8 @@
</div>
</template>
</div>
<el-button
@click="clearCart"
type="text"
size="mini"
:disabled="order.list.length <= 0"
<el-button @click="clearCart" type="text" size="mini"
:disabled="order.list.length<=0"
>清空</el-button
>
</div>
@ -306,18 +303,21 @@
</template>
<!-- 餐位费 -->
<template v-if="order.seatFee && order.seatFee.totalAmount > 0">
<div class="carts_list_title">餐位费</div>
<div class="list">
<div class="carts_list_title">餐位费</div>
<cart-item
@itemClick="changeOrderOldSel"
@itemClick="changeOrderExtraSel"
:canChangeNumber="false"
key="seatFee"
:index="0"
:item="order.seatFee"
isSeatFee
:selIndex="order.old.selIndex"
:placeNum="-1"
:selIndex="order.extra.selIndex"
:placeNum="-10"
:selPlaceNum="order.selPlaceNum"
></cart-item>
</div>
</template>
<div class="order_remark" v-if="note.content">
订单备注 {{ note.content }}
@ -349,41 +349,77 @@
</div>
<div class="flex mt-14">
<template v-if="isCreateOrder">
<button
class="my-btn flex-1 default"
@click="createOrderClose"
>
<span>加菜/返回</span>
</button>
<div style="width: 15px"></div>
<button class="my-btn flex-1 primary" @click="payOrder">
<span>立即支付</span>
</button>
<template v-if="!postPay">
<template v-if="isCreateOrder">
<button
class="my-btn flex-1 default"
@click="createOrderClose"
>
<span>加菜/返回</span>
</button>
</template>
<template v-else>
<button
class="my-btn flex-1 primary"
@click="scanPayClick"
>
<span>微信/支付宝</span>
</button>
<div style="width: 15px"></div>
<button
class="my-btn flex-1 primary"
@click="cashPayClick"
>
<span>现金</span>
</button>
<div style="width: 15px"></div>
<button
class="my-btn flex-1 default"
@click="morePayClick"
>
<span>更多支付</span>
</button>
</template>
</template>
<template v-else>
<template v-if="postPay">
<template v-if="isCreateOrder">
<button
class="my-btn flex-1 default"
@click="createOrderClose"
>
<span>加菜/返回</span>
</button>
<div style="width: 15px"></div>
<button class="my-btn flex-1 primary" @click="payOrder">
<span>立即支付</span>
</button>
</template>
<template v-else>
<template v-if="postPay">
<div class="flex-1">
<el-button
type="primary"
size="medium"
:disabled="!order.list.length"
@click="toCreateOrderDebounce(false)"
>
仅下单
</el-button>
</div>
<div style="width: 15px"></div>
</template>
<div class="flex-1">
<el-button
type="primary"
size="medium"
:disabled="!order.list.length"
@click="toCreateOrderDebounce(false)"
:disabled="
!order.list.length && !order.old.list.length
"
@click="toCreateOrderDebounce(true)"
>
仅下单
去结账
</el-button>
</div>
<div style="width: 15px"></div>
</template>
<div class="flex-1">
<el-button
size="medium"
:disabled="!order.list.length && !order.old.list.length"
@click="toCreateOrderDebounce(true)"
>
去结账
</el-button>
</div>
</template>
</div>
</div>
@ -483,15 +519,15 @@
prveOrder.list.length
}}</span>
</div> -->
<div class="btn"
:class="{ disabled: order.selIndex < 0 }"
@click="refNoteShow(true)">单品备注</div>
<div class="btn" @click="refNoteShow">整单备注</div>
<div class="btn" @click="refNoteShow(false)">整单备注</div>
<div
class="btn"
:class="{
disabled:
order.placeNum <= 0 ||
order.old.selIndex < 0 ||
order.selGoods.status == 'return',
disabled: disableTuicai,
}"
@click="orderBtnsClick('returnCart')"
>
@ -885,7 +921,7 @@
v-if="!skuGoods.data.isGrounding"
disabled
>
已下架
已下架/库存不足
</button>
<template v-else>
<button
@ -1141,6 +1177,8 @@ export default {
},
data() {
return {
//
isDanNote: false,
//
shopInfo: {},
//
@ -1221,6 +1259,9 @@ export default {
total: 0,
},
order: {
extra: {
selIndex: -1,
},
seatFee: { totalAmount: 0 }, //
orderId: "",
payType: "",
@ -1315,6 +1356,12 @@ export default {
};
},
computed: {
disableTuicai() {
return (
this.order.placeNum==1 ||this.order.selIndex>=0||!this.order.selGoods||this.order.old.list.length<=0||
this.order.selGoods.status == "return"
);
},
title() {
return this.table ? "代客下单" + `(${this.table.name})` : "代客下单";
},
@ -1371,7 +1418,7 @@ export default {
.reduce((a, b) => {
return a + b.number * b.salePrice;
}, 0);
return (oldPrice + price + this.order.seatFee.totalAmount * 1).toFixed(2);
return (oldPrice + price + this.order.seatFee.totalAmount * (this.order.seatFee.status=='return'?0:1)).toFixed(2);
},
allNumber() {
const oldNumber = this.order.old.list.reduce((a, b) => {
@ -1571,14 +1618,60 @@ export default {
// this.refToggle('refScanCode',true)
// this.refToggle("refDiscount", true);
this.getShopInfo();
console.log(this.$route.query.tableId)
this.open(this.$route.query.tableId?this.$route.query:'');
console.log(this.$route.query.tableId);
this.open(this.$route.query.tableId ? this.$route.query : "");
},
methods: {
changeOrderExtraSel(index, canChangeNumber, placeNum) {
// console.log(index,canChangeNumber,placeNum)
this.order.selGoods = this.order.seatFee;
this.order.selPlaceNum = placeNum;
this.order.extra.selIndex = index;
},
async morePayClick() {
const res = await this.returnCreateOrderData();
this.createOrder.data = res;
this.order.payType = "";
this.isCreateOrder = true;
},
cashPayClick() {
this.$confirm("是否确认已现金收款:" + this.allPrice + "?", "快捷支付", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.order.payType = "cash";
this.cachePay();
});
},
returnCreateOrderData() {
return $createOrder({
masterId: this.order.masterId || this.masterId,
vipUserId: this.vipUser.id,
tableId: this.table.tableId,
note: this.note.content,
postPay: this.postPay,
orderld: this.order.orderId,
});
},
async cachePay() {
const res = await this.returnCreateOrderData();
this.createOrder.data = res;
this.pays();
},
async scanPayClick() {
const res = await this.returnCreateOrderData();
this.createOrder.data = res;
this.createOrder.discount = 1;
this.order.payType = "scanCode";
this.payTypeItemClick({ payType: "scanCode" });
},
changeOrderUseType(useType) {
if (useType && this.order.list.length) {
const tableId = useType=='takeout'?undefined: this.table.tableId;
$changeUseType({
useType,
tableId,
cartIds: this.order.list.map((v) => v.id),
});
}
@ -1645,18 +1738,27 @@ export default {
this.perpole = 1;
await this.changePerpole();
}
//
const item=this.table;
if (item && item.useType) {
localStorage.setItem("useType", item.useType);
this.useTypes.sel =
item.useType == "takeout"
? item.useType
: item.useType.replace(/-after|-before/g, "");
}
this.getCart();
this.getCacheOrder();
console.log(this.isCreateOrder)
if (!this.shopInfo.isTableFee && this.table.tableId&&this.perpole>0) {
console.log(this.isCreateOrder);
if (!this.shopInfo.isTableFee && this.table.tableId && this.perpole > 0 ) {
//
const seatFee= await $choseCount({
const seatFee = await $choseCount({
masterId: this.masterId,
tableId: this.table.tableId,
num: this.perpole,
});
this.order.seatFee = seatFee;
this.perpole=seatFee.totalNumber
this.perpole = seatFee.totalNumber;
}
if (this.isCreateOrder) {
this.toCreateOrder(true);
@ -1704,7 +1806,9 @@ export default {
const { content, total } = await tbShopTableGet({
shopId: localStorage.getItem("shopId"),
});
this.tableList = content.filter((v) => v.status != "closed"&&v.status != "cleaning");
this.tableList = content.filter(
(v) => v.status != "closed" && v.status != "cleaning"
);
} catch (error) {
console.log(error);
}
@ -1828,11 +1932,32 @@ export default {
console.log(e);
this.isPrint = e;
},
refOrderNoteConfirm(note) {
this.note.content = note;
async refOrderNoteConfirm(note) {
//
if(this.isDanNote){
const cart=this.order.list[this.order.selIndex]
const res= await $updateCart({
cartId: cart.id,
productId: cart.productId,
skuId: cart.skuId,
tableId: this.table.tableId,
note:note,
num: cart.number, // 0
});
this.$set(this.order.list, this.order.selIndex, res);
this.$notify({
title: "更新成功",
type: "success",
});
}else{
//
this.note.content = note;
}
},
refNoteShow() {
this.$refs.refOrderNote.open(this.note.content);
refNoteShow(isDan=false) {
this.isDanNote = isDan;
const note=isDan?this.order.list[this.order.selIndex].note:this.note.content;
this.$refs.refOrderNote.open(note);
},
//
async payOrder() {
@ -1876,7 +2001,7 @@ export default {
type: "success",
});
this.close();
// this.reset();
// this.reset();
},
chooseTableConfirm(item) {
console.log(item);
@ -1897,7 +2022,7 @@ export default {
this.$refs.refChooseUser.open();
},
createOrderClose() {
console.log('createOrderClose')
console.log("createOrderClose");
this.isCreateOrder = false;
},
//
@ -2281,9 +2406,9 @@ export default {
},
//
clearCart() {
if (this.order.list.length <= 0) {
return;
}
// if (this.order.list.length <= 0) {
// return;
// }
this.$confirm("确定要清空点餐列表吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
@ -2513,7 +2638,7 @@ export default {
.filter((v) => v.specSnap.match(i))
.every((v) => {
// return isCanBuy(v,this.selGoods.data.isStock)
return !isCanBuy(v);
return !isCanBuy(v, true);
});
}
}
@ -2583,7 +2708,7 @@ export default {
this.useTypes.sel = "dine-in";
},
//
setCart(res){
setCart(res) {
this.order.seatFee = res.seatFee ? res.seatFee : this.order.seatFee;
this.perpole = res.seatFee ? res.seatFee.totalNumber : 1;
const nowCart = res.records.find((v) => v.placeNum == 0);
@ -2632,7 +2757,7 @@ export default {
return prve;
}, {});
const canBudyGoods = this.selGoods.data.specList
.filter((v) => isCanBuy(v))
.filter((v) => isCanBuy(v, true))
.sort((a, b) => {
const aNumber = a.specSnap.split(",").reduce((prve, cur) => {
return prve + skuMapNumber[cur];
@ -2753,19 +2878,20 @@ export default {
this.getGoods();
this.getCategory();
this.getTable();
console.log(params)
console.log(params);
if (!params) {
//
return;
}
const item = { name: params.table_name, tableId: params.tableId , useType: params.useType,maxCapacity:params.maxCapacity*1},
const item = {
name: params.table_name,
tableId: params.tableId,
useType: params.useType,
maxCapacity: params.maxCapacity * 1,
},
key = params.key,
perpoleNumber = params.num;
//
this.key = key;
this.isCreateOrder =this.key == "isPayOrder"? true:false;
this.perpole = perpoleNumber;
this.table = item;
if (item && item.useType) {
localStorage.setItem("useType", item.useType);
this.useTypes.sel =
@ -2773,13 +2899,19 @@ export default {
? item.useType
: item.useType.replace(/-after|-before/g, "");
}
// this.getCart();
// this.getGoods();
// this.getCategory();
// this.getTable();
this.key = key;
this.isCreateOrder = this.key == "isPayOrder" ? true : false;
this.perpole = perpoleNumber;
this.table = item;
},
close() {
this.$router.push({ path: "/table/table_list"});
if (this.table.tableId) {
this.$router.replace({ path: "/table/table_list" });
} else {
this.$router.go(0);
// this.reset();
// this.$router.replace({ path: "/tool/Instead/index" });
}
this.informationdialogshow = false;
this.$emit("close");
},
@ -4225,5 +4357,12 @@ input[type="number"]::-webkit-outer-spin-button {
.pay_btns .el-button:disabled {
border: 1px solid #dcdfe6;
}
.order_remark{
font-size: 14px;
color: #666;
margin-top: 5px;
max-width: 340px;
word-break: break-all;
}
</style>