feat: 代客下单更新,修复店铺列表编辑展示问题

This commit is contained in:
2025-03-04 10:34:19 +08:00
parent b71ca19c0d
commit bd59f05d26
19 changed files with 953 additions and 312 deletions

View File

@@ -17,7 +17,7 @@
</div>
<div class="userinfo" v-else @click="chooseUser">
<el-avatar class="avatar" :size="50" />
<div class="u-m-l-12">
<div class="u-m-l-12 no-wrap">
<p>
<span class="name u-font-16">服务员下单</span>
</p>
@@ -27,45 +27,47 @@
</p>
</div>
</div>
<div class="score">
<div class="u-flex u-col-center u-m-t-10">
<span class="u-font-14 font-bold u-m-r-20">积分抵扣</span>
<el-radio-group v-model="score.sel" size="small" class="">
<el-radio :value="0">
<span class="u-font-14">全部抵扣</span>
</el-radio>
<el-radio :value="1">
<span class="u-font-14">部分抵扣</span>
</el-radio>
</el-radio-group>
<template v-if="user.id">
<div class="score">
<div class="u-flex u-col-center u-m-t-10">
<span class="u-font-14 font-bold u-m-r-20">积分抵扣</span>
<el-radio-group v-model="score.sel" size="small" class="">
<el-radio :value="0">
<span class="u-font-14">全部抵扣</span>
</el-radio>
<el-radio :value="1">
<span class="u-font-14">部分抵扣</span>
</el-radio>
</el-radio-group>
</div>
<p class="u-font-14 color-666 u-m-t-10">
<span class="color-red">*</span>
<span>积分不足或小于最低使用门槛1</span>
</p>
</div>
<p class="u-font-14 color-666 u-m-t-10">
<span class="color-red">*</span>
<span>积分不足或小于最低使用门槛1</span>
</p>
</div>
<div class="u-flex u-col-center u-m-t-20 no-wrap">
<span class="u-font-14 font-bold u-m-r-20">团购代金券</span>
<div class="u-flex my-select">
<span class="u-m-r-10">代金券名称</span>
<el-icon><ArrowDown /></el-icon>
<div class="u-flex u-col-center u-m-t-20 no-wrap">
<span class="u-font-14 font-bold u-m-r-20">团购代金券</span>
<div class="u-flex my-select">
<span class="u-m-r-10">代金券名称</span>
<el-icon><ArrowDown /></el-icon>
</div>
<svg-icon iconClass="scan" size="30" class="u-m-l-10 cur-pointer"></svg-icon>
</div>
<svg-icon iconClass="scan" size="30" class="u-m-l-10 cur-pointer"></svg-icon>
</div>
<div class="u-flex u-col-center u-m-t-20 no-wrap">
<span class="u-font-14 font-bold u-m-r-20">优惠券</span>
<div class="u-flex my-select">
<span class="u-m-r-10">选择优惠券</span>
<el-icon><ArrowDown /></el-icon>
<div class="u-flex u-col-center u-m-t-20 no-wrap">
<span class="u-font-14 font-bold u-m-r-20">优惠券</span>
<div class="u-flex my-select" @click="openCoupon">
<span class="u-m-r-10">选择优惠券</span>
<el-icon><ArrowDown /></el-icon>
</div>
</div>
</div>
</template>
</div>
<div class="u-m-t-30">
<el-button size="large" @click="discountShow">整单打折/减免</el-button>
</div>
<div class="u-m-t-30">
<p class="u-font-16 font-bold u-m-r-20 font-bold">选择支付方式</p>
<p class="u-font-16 font-bold u-m-r-20 font-bold u-flex">选择支付方式</p>
<div class="u-m-t-20">
<el-button
v-for="(item, index) in payTypes.list"
@@ -91,65 +93,90 @@
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">餐位费</span>
<span class="u-m-l-10 value">{{ orderInfo.seatAmount }}</span>
<span class="u-m-l-10 value">{{ orderInfo.seatAmount }}</span>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">打包费</span>
<span class="u-m-l-10 value">{{ orderInfo.packFee }}</span>
<span class="u-m-l-10 value">{{ orderInfo.packFee }}</span>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">总价</span>
<span class="u-m-l-10 value">{{ orderInfo.orderAmount }}</span>
<span class="u-m-l-10 value">{{ carts.payMoney }}</span>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">优惠券</span>
<span class="u-m-l-10 value">{{ coupDiscount }}</span>
<span class="u-m-l-10 value">{{ coupDiscount }}</span>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">积分抵扣</span>
<span class="u-m-l-10 value">{{ orderInfo.pointsDiscountAmount || 0 }}</span>
<span class="u-m-l-10 value">-{{ orderInfo.pointsDiscountAmount || 0 }}</span>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">整单改价</span>
<span class="u-m-l-10 value"></span>
<span class="u-m-l-10 value">-{{ checkOrderPay.discountAmount || 0 }}</span>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">抹零</span>
<span class="u-m-l-10 value"></span>
<span class="u-m-l-10 value">-{{ orderInfo.pointsDiscountAmount || 0 }}</span>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">应付金额</span>
<span class="u-m-l-10 value">{{ payMoney }}</span>
<span class="u-m-l-10 value price">{{ currentpayMoney }}</span>
</div>
</div>
</div>
<!-- 扫码 -->
<scanPay ref="refScanPay" :order="orderInfo"></scanPay>
<scanPay
ref="refScanPay"
:order="orderInfo"
@paySuccess="paySuccess"
@confirm="refScanPayConfirm"
></scanPay>
<!-- 打折 -->
<discount ref="refDiscount" @confirm="discountConfirm"></discount>
<!-- 优惠券 -->
<popup-coupon ref="refCoupon" @confirm="refCouponConfirm"></popup-coupon>
</div>
</template>
<script setup>
import { useCartsStore } from "@/store/modules/carts";
const carts = useCartsStore();
import popupCoupon from "./popup-coupon.vue";
import PointsApi from "@/api/account/points";
import payTypeApi from "@/api/account/payType";
import payApi from "@/api/order/pay";
import scanPay from "./scan-pay.vue";
import discount from "./discount.vue";
import { ElLoading } from "element-plus";
import { ElMessage, ElMessageBox } from "element-plus";
//优惠券
const refCoupon = ref();
function openCoupon() {
refCoupon.value.open();
}
function couponChange(data) {}
//打折
const refDiscount = ref();
const checkOrderPay = reactive({
discountAmount: 0, //手动优惠金额
discount: 0,
});
function discountConfirm(e) {
console.log(e);
checkOrderPay.discountAmount = e.reduceMoney;
Object.assign(checkOrderPay, e);
if (e.discount) {
checkOrderPay.discountAmount =
carts.payMoney - (carts.payMoney * (e.discount / 100).toFixed(2)).toFixed(2);
}
}
function discountShow(e) {
refDiscount.value.open({
amount: props.orderInfo.originAmount,
amount: carts.payMoney,
});
}
@@ -160,13 +187,44 @@ const props = defineProps({
},
user: {
type: Object,
default: () => {},
default: () => {
return { id: "" };
},
},
orderInfo: {
type: Object,
default: () => {},
},
});
watch(
() => props.user.id,
(newval) => {
if (newval !== "") {
pointsInit();
}
}
);
watch(
() => props.orderInfo.id,
(newval) => {
if (newval !== "") {
pointsInit();
}
}
);
//002-获取订单可用积分及抵扣金额(支付页面使用)
function pointsInit() {
if (!props.user.id) {
return;
}
PointsApi.calcOrderUsablePoints({
userId: props.user.id,
orderAmount: (carts.payMoney - checkOrderPay.discountAmount).toFixed(2),
});
}
const emits = defineEmits(["chooseUser", "paysuccess"]);
function chooseUser() {
emits("chooseUser");
@@ -191,78 +249,118 @@ const payTypes = reactive({
const refScanPay = ref();
function changePayType(i) {
if (payTypes.list[i].payType === "scanCode") {
return refScanPay.value.open({
money: props.orderInfo.orderAmount,
shopId: localStorage.getItem("shopId"),
checkOrderPay: {
orderId: props.orderInfo.id,
discountRatio: 1,
orderAmount: props.orderInfo.orderAmount,
seatNum: props.orderInfo.seatNum,
originAmount: props.orderInfo.originAmount,
discountAmount: props.orderInfo.discountAmount,
productCouponDiscountAmount: props.orderInfo.productCouponDiscountAmount,
orderAmount: props.orderInfo.orderAmount,
roundAmount: props.orderInfo.roundAmount,
pointsDiscountAmount: props.orderInfo.pointsDiscountAmount,
pointsNum: props.orderInfo.pointsNum,
fullCouponDiscountAmount: props.orderInfo.fullCouponDiscountAmount,
},
});
}
const payType = payTypes.list[i].payType;
refScanPayOpen(payType);
payTypes.sel = i;
}
function returnPayParams() {
return {
shopId: localStorage.getItem("shopId"),
authCode: "",
checkOrderPay: {
orderId: props.orderInfo.id,
// discountRatio: (checkOrderPay.discount / 100).toFixed(2),
discountRatio: 0,
seatNum: props.orderInfo.seatNum,
originAmount: carts.payMoney * 1,
discountAmount: checkOrderPay.discountAmount * 1,
productCouponDiscountAmount: props.orderInfo.productCouponDiscountAmount || 0,
orderAmount: currentpayMoney.value * 1,
roundAmount: props.orderInfo.roundAmount,
pointsDiscountAmount: props.orderInfo.pointsDiscountAmount || 0,
pointsNum: props.orderInfo.pointsNum,
fullCouponDiscountAmount: props.orderInfo.fullCouponDiscountAmount || 0,
},
};
}
function refScanPayOpen(payType) {
if (payType == "deposit") {
return refScanPay.value.open(returnPayParams(), "deposit");
}
if (payType == "scanCode") {
return refScanPay.value.open(returnPayParams(), "scanCode");
}
}
async function getPaytype() {
const res = await payTypeApi.getList();
payTypes.list = res;
}
function nowPayClick() {
const payType = payTypes.list[payTypes.sel].payType;
console.log(payType);
if (payType === "cash") {
ElMessageBox.confirm("是否确认已现金收款:" + payMoney.value + "元", "快捷支付", {
ElMessageBox.confirm("是否确认已现金收款:" + currentpayMoney.value + "元", "快捷支付", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
payApi
.cashPay({
shopId: localStorage.getItem("shopId"),
checkOrderPay: {
orderId: props.orderInfo.id,
discountRatio: 1,
orderAmount: props.orderInfo.orderAmount,
seatNum: props.orderInfo.seatNum,
originAmount: props.orderInfo.originAmount,
discountAmount: props.orderInfo.discountAmount,
productCouponDiscountAmount: props.orderInfo.productCouponDiscountAmount,
orderAmount: props.orderInfo.orderAmount,
roundAmount: props.orderInfo.roundAmount,
pointsDiscountAmount: props.orderInfo.pointsDiscountAmount,
pointsNum: props.orderInfo.pointsNum,
fullCouponDiscountAmount: props.orderInfo.fullCouponDiscountAmount,
},
})
.then((res) => {
ElMessage.success("支付成功");
emits("paysuccess");
});
payOrder("cash");
})
.catch(() => {});
return;
}
refScanPayOpen(payType);
}
const payMoney = computed(() => {
if (!props.orderInfo.orderAmount) {
return "";
function refScanPayConfirm(authCode, isScan) {
const payType = payTypes.list[payTypes.sel].payType;
payParams.authCode = authCode;
payOrder(payType, isScan);
}
let payTimer = null;
//是否是正扫
async function payOrder(payType, isScan) {
clearTimeout(payTimer);
const loading = ElLoading.service({
lock: true,
text: "支付中,请稍等……",
background: "rgba(0, 0, 0, 0.7)",
});
payTimer = setTimeout(() => {
ElMessage.error("支付超时");
loading.close();
}, 1000 * 20);
let res = undefined;
try {
if (payType == "scanCode") {
res = isScan
? await payApi.scanPay(returnPayParams())
: await payApi.microPay(returnPayParams());
}
if (payType == "cash") {
res = await payApi.cashPay(returnPayParams());
}
if (payType == "deposit") {
res = await payApi.vipPay({ ...returnPayParams(), payType: "scanCode" });
}
} catch (error) {
clearTimeout(payTimer);
loading.close();
}
return (props.orderInfo.orderAmount - checkOrderPay.discountAmount).toFixed(2);
if (res) {
clearTimeout(payTimer);
ElMessage.success("支付成功");
emits("paysuccess");
loading.close();
}
}
//应付金额
const currentpayMoney = computed(() => {
if (checkOrderPay.discount) {
return (carts.payMoney * (checkOrderPay.discount / 100)).toFixed(2);
}
return (carts.payMoney - checkOrderPay.discountAmount).toFixed(2);
});
onMounted(() => {
getPaytype();
pointsInit();
});
</script>