cashier-web/src/views/tool/Instead/components/order.vue

321 lines
9.7 KiB
Vue

<template>
<div class="order-box">
<div class="left">
<div class="user bg-fff u-p-20">
<div class="userinfo" v-if="user.id" @click="chooseUser">
<el-avatar class="avatar" :size="50" />
<div class="u-m-l-12">
<p>
<span class="name u-font-16">{{ user.nickName }}</span>
<span class="vip" v-if="user.isVip">>VIP{{ user.isVip }}</span>
</p>
<p class="u-font-14 color-666 u-m-t-10">
<span class="money">余额:{{ user.amount }}</span>
<span class="score u-m-l-10">积分:{{ user.accountPoints }}</span>
</p>
</div>
</div>
<div class="userinfo" v-else @click="chooseUser">
<el-avatar class="avatar" :size="50" />
<div class="u-m-l-12">
<p>
<span class="name u-font-16">服务员下单</span>
</p>
<p class="u-font-14 color-666 u-m-t-10">
<span class="money">余额:</span>
<span class="score u-m-l-10">积分:</span>
</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>
</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>
<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>
</div>
</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>
<div class="u-m-t-20">
<el-button
v-for="(item, index) in payTypes.list"
:key="index"
size="large"
:type="index == payTypes.sel ? 'primary' : ''"
@click="changePayType(index)"
>
{{ item.payName }}
</el-button>
</div>
<div class="u-m-t-20">
<el-button type="primary" size="large" @click="nowPayClick">立即支付</el-button>
</div>
</div>
</div>
<div class="right">
<h3>账单明细</h3>
<div class="order-info">
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">订单号:</span>
<span class="u-m-l-10 value">{{ orderInfo.orderNo }}</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.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>
</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>
</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>
</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>
</div>
<div class="u-flex u-m-b-10 u-row-between">
<span class="title">整单改价</span>
<span class="u-m-l-10 value"></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>
</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>
</div>
</div>
</div>
<!-- 扫码 -->
<scanPay ref="refScanPay" :order="orderInfo"></scanPay>
<!-- 打折 -->
<discount ref="refDiscount" @confirm="discountConfirm"></discount>
</div>
</template>
<script setup>
import payTypeApi from "@/api/account/payType";
import payApi from "@/api/order/pay";
import scanPay from "./scan-pay.vue";
import discount from "./discount.vue";
import { ElMessage, ElMessageBox } from "element-plus";
//打折
const refDiscount = ref();
const checkOrderPay = reactive({
discountAmount: 0, //手动优惠金额
});
function discountConfirm(e) {
console.log(e);
checkOrderPay.discountAmount = e.reduceMoney;
}
function discountShow(e) {
refDiscount.value.open({
amount: props.orderInfo.originAmount,
});
}
const props = defineProps({
table: {
type: Object,
default: () => {},
},
user: {
type: Object,
default: () => {},
},
orderInfo: {
type: Object,
default: () => {},
},
});
const emits = defineEmits(["chooseUser", "paysuccess"]);
function chooseUser() {
emits("chooseUser");
}
const coupDiscount = computed(() => {
const total =
props.orderInfo.fullCouponDiscountAmount * 1 + props.orderInfo.productCouponDiscountAmount * 1;
if (total <= 0) {
return 0;
}
return total.toFixed(2);
});
const score = ref({
list: [],
sel: 0,
});
const payTypes = reactive({
list: [],
sel: 0,
});
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,
},
});
}
payTypes.sel = i;
}
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 + "元", "快捷支付", {
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");
});
})
.catch(() => {});
return;
}
}
const payMoney = computed(() => {
if (!props.orderInfo.orderAmount) {
return "";
}
return (props.orderInfo.orderAmount - checkOrderPay.discountAmount).toFixed(2);
});
onMounted(() => {
getPaytype();
});
</script>
<style lang="scss" scoped>
.userinfo {
display: flex;
align-items: center;
line-height: 1;
cursor: pointer;
}
.vip {
padding: 2px 5px;
background: #f7793d;
color: #fff;
border-radius: 4px;
margin-left: 10px;
font-size: 10px;
}
.order-box {
display: flex;
padding: 20px 20px;
background-color: #f7f7fa;
min-height: 100%;
.left,
.right {
flex: 1;
}
.left {
padding-right: 20px;
}
.right {
border-left: 1px solid #ebebeb;
padding-left: 20px;
.order-info {
font-size: 14px;
.title {
}
.value {
}
.price {
color: #fa5555;
font-size: 20px;
}
}
}
}
.my-select {
border: 1px solid #d9d9d9;
border-radius: 4px;
margin-left: 12px;
cursor: pointer;
font-size: 14px;
color: #666;
padding: 8px 10px 8px 20px;
}
</style>