Files
cashier_weapp/pagesOrder/confirm_order/index.vue
2024-11-18 14:18:10 +08:00

1622 lines
43 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="container">
<!-- 头部内容 -->
<view class="head">
<view class="head_bg"></view>
<view class="tips" v-if="storeInfo.registerType == 'munchies'">
<image class="informIcon" src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/informIcon.png" mode="aspectFill"/>
<text class="informText">温馨提示请适量点餐避免浪费</text>
</view>
<view class="tabBox" v-if="storeInfo.registerType == 'munchies'">
<view class="tab">
<view v-if="item.show" :class="is_type==index?'tab_item'+(is_type+1)+' tab_item active ':'tab_item'" v-for="(item,index) in is_typeList" :key="index" @click="tabClick(index,item)">
<view></view>
<image class="icon" :src="is_type==index?item.url_active:item.url" mode="aspectFill"/>
<text class="title" :class="{active:is_type==index}">{{item.title}}</text>
</view>
</view>
<!-- 送餐到桌 -->
<view class="table" v-if="is_type==0">
<view class="table_left">
<image class="icon" src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/table.png" mode="aspectFill"/>
<text class="title">桌台</text>
</view>
<view class="value" v-if="tableCode"> {{ shopTableInfo.name || '' }} </view>
<u-icon v-else @click="scan" name="scan" size="60"></u-icon>
</view>
<!-- 打包外带 -->
<view class="pack" v-else>
<view class="top">
<text class="title">{{ storeInfo.shopName }}</text>
<text class="address">{{ storeInfo.address }}</text>
</view>
<!-- <view class="list">
<view class="item">
<view class="lable">取餐时间</view><view class="text">立即取餐</view>
</view>
<view class="item">
<view class="lable">预留电话</view><view class="getPhone text"><u-input class="inputVal" v-model="order.phone" input-align="right" placeholder="请输入预留电话以便联系您" ></u-input><text class="getBtn">获取手机号</text></view>
</view>
</view> -->
</view>
</view>
<view class="addDish" @click="addDish" v-if="storeInfo.registerType == 'restaurant'">加菜下单</view>
<view class="tabBox_t " v-if="storeInfo.registerType == 'restaurant'">
<view class="shopName">{{ listinfo.name }}</view>
<view class="tableName" style="display: flex;align-items: center;justify-content: space-between;">
<view style="display: flex;">
<view>桌号</view>
<view class="name" v-if="shopTableInfo.name">{{ shopTableInfo.name || '' }} </view>
<view class="num" v-if="shopTableInfo&&shopTableInfo.seatNum">{{ shopTableInfo.seatNum }}</view>
</view>
<u-icon v-if="!shopTableInfo.name" @click="scan" name="scan" size="60"></u-icon>
</view>
</view>
</view>
<!-- 订单内容区域 -->
<view class="content_box">
<view class="content">
<view class="title"> {{ listinfo.name }} </view>
<view class="list_item" v-for="(item,index) in listinfo.details" :key="item.id">
<view class="left" >
<image class="img" v-if="item.productId!=-999" :src="item.coverImg || item.productImg || ''" mode="aspectFill"/>
<image class="img" v-else :src="'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/table.png'" mode="heightFix"/>
<view class="center" >
<text class="center_title"> {{item.name || item.productName || "" }} </text>
<text class="type"> {{ item.skuName || item.productSkuName || ""}} </text>
<text class="num" > X{{ item.totalNumber || ""}} </text>
</view>
</view>
<view class="price"> {{ item.memberPrice*item.totalNumber || item.salePrice*item.totalNumber || 0}} </view>
</view>
<view class="cell-item" v-if="packFee && packFee > 0">
<view class="label">打包费</view>
<view class="val">
<view></view>
<view style="font-size: 28rpx;"></view>
<view>{{packFee.toFixed(2)}}</view>
</view>
</view>
<view class="cell-item" v-if="shopTableInfo&&shopTableInfo.seatNum&&sendType=='table'&&storeInfo.registerType == 'munchies'">
<view class="label">餐位费</view>
<view class="val">
<view>X{{shopTableInfo.seatNum}}</view>
<view style="font-size: 28rpx;"></view>
<view>{{(shopTableInfo.seatNum*storeInfo.tableFee).toFixed(2)}}</view>
</view>
</view>
<view v-for="(item,index) in favorable" :key="index" v-if="storeInfo.registerType == 'munchies'">
<view class="favorable" :class="{column:item.value.length>0&&item.type=='product'}" @click="goUrl(item)">
<view class="favorable_left">
<!-- <image class="icon" :src="item.url" mode="aspectFill"/> -->
<text class="name"> {{ item.name }} </text>
</view>
<view class="favorable_right" v-if="item.type=='coupon'">
<text class="favorable_right_text">{{item.value}}</text>
<u-icon name="arrow-right" color="#575B66" size="28"></u-icon>
</view>
<view class="favorable_right" :class="{column:item.value.length>0}" v-if="item.type=='product'">
<view class="favorable_right_text" v-for="(items,indexs) in item.value" :key="indexs">
<text>{{items.name}}</text>
<text>X{{items.num}}</text>
<text>-{{items.discountAmount || 0}}</text>
</view>
<u-icon v-if="item.value.length <= 0" name="arrow-right" color="#575B66" size="28"></u-icon>
</view>
<view class="favorable_right" v-if="item.type=='points'" @click.stop="pointsChange">
<text class="favorable_right_text" style="color: #666;margin-right: 16rpx;" v-if="calcUsablePointsData.usable">
使用 {{ calcUsablePointsData.pointsNum}} 积分抵扣{{calcUsablePointsData.pointsNum/calcUsablePointsData.equivalentPoints}}
</text>
<text class="favorable_right_text" style="color: #666;margin-right: 16rpx;color: #DE4D3A;" v-else>
{{calcUsablePointsData.unusableReason}}
</text>
<u-checkbox-group iconPlacement="right" @change="pointsChange">
<u-checkbox v-model="isPointsChecked" :disabled="freeCheck||!calcUsablePointsData.usable" :checked="isPointsChecked" activeColor="#E8AD7B" shape="circle" icon-size="36" size="36">
</u-checkbox>
</u-checkbox-group>
</view>
</view>
</view>
<view class="totalPrice">
<text style="margin-bottom: 5rpx;">小计</text>
<text class="totalPriceNum"> {{listinfo.payAmount}} </text>
</view>
<!-- <u-divider color="#fa3534" half-width="200" border-color="#6d6d6d">姑苏城外寒山寺</u-divider> -->
</view>
</view>
<!-- 订单备注 -->
<view class="remark">
<view class="remark_bg">
<view class="remark_title">订单备注</view>
<u-textarea class="remark_value" placeholder="请填写口味、偏好等要求" :type="'textarea'" v-model="remark" :border="textareaBorder" :clearable="true"/>
</view>
</view>
<!-- 充值免单 -->
<rechargeFree v-if="freeDingConfig.enable == 1&&storeInfo.registerType == 'munchies'" ref="rechargeFree" :freeDisabled="freeDisabled" :payAmount="listinfo.payAmount" :freeDingConfig="freeDingConfig" :shopUserInfo="amountVIP" @changeFree="changeFree"></rechargeFree>
<!-- 充值活动 -->
<topUpActivity v-if="storeInfo.registerType == 'munchies'" ref="topUpActivity" :shopUserInfo="amountVIP" ></topUpActivity>
<!-- 支付方式 -->
<view style="padding: 0 20rpx;">
<paymentMethod ref="paymentMethod" :freeCheck="freeCheck" :amountVIP="amountVIP" v-if="storeInfo.registerType == 'munchies'" @groupChange="groupChange"></paymentMethod>
</view>
<view style="width: 100%;height: 200rpx;"> </view>
<view class="bottom">
<view class="bottom_left">
<text style="margin-bottom: 5rpx;">实付金额</text>
<text class="totalAmount">{{ listinfo.payAmount }} </text>
</view>
<block v-if="storeInfo.registerType == 'munchies'">
<view class="paymentBtnText" @tap="$u.debounce(showpopupclickdd, 500)" v-if="listinfoid && listinfo"> {{ paymentBtnText }} </view>
<view class="paymentBtnText" @tap="$u.debounce(orderdetail, 500)" v-else> {{ paymentBtnText }} </view>
</block>
<block v-if="storeInfo.registerType == 'restaurant'">
<view class="paymentBtnText" @tap="$u.debounce(orderdetail, 500)" > 提交订单 </view>
</block>
</view>
<u-popup :show="ispws" :round="20" mode="bottom" @close="close" height="500" :safeAreaInsetBottom="false">
<view class="pay-info-wrap">
<view class="info-wrap flex-between">
<view class="close" @click="close">
<u-icon name="close" color="#999999" size="40"></u-icon>
</view>
<text class="title">请输入支付密码</text>
<view></view>
</view>
<view class="info-content">
<payPasswordtwo ref="payPwd" :payAmount="listinfo.payAmount" @accountPayevent="accountPayevent" v-if="ispws"></payPasswordtwo>
</view>
</view>
</u-popup>
<!-- 支付密码 -->
<!-- <payPasswordtwo ref="payPwd" :listinfo="listinfo" @accountPayevent="accountPayevent" v-if="ispws"></payPasswordtwo> -->
</view>
</template>
<script>
import webSocketUtils from '@/common/js/websocket.js'
import payPasswordtwo from '@/components/payPasswordtwo.vue'
import paymentMethod from '../components/paymentMethod.vue'
import rechargeFree from '../components/rechargeFree.vue'
import topUpActivity from '../components/topUpActivity.vue'
// import cwxKeyboard from '@/components/cwx-keyboard/cwx-keyboard.vue'
export default {
components: {
payPasswordtwo,
paymentMethod,
rechargeFree,
topUpActivity,
},
data() {
return {
opacitys: false,
toplist: {
name: '确认订单'
},
is_type: 0,
is_typeList: [
{ title: "送餐到桌", show: false, type: "table", val: "dine-in", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/tab1.png" , url_active: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/tab1_active.png"},
{ title: "打包外带", show: false, type: "takeself", val: "take-out", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/tab2.png" , url_active: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/tab2_active.png"},
],
sendType: "table",
eatModel: [],
favorable: [
{ name: "优惠券", type: "coupon",value: "", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/coupon.png"},
{ name: "商品券", type: "product",value: [], url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/coupon.png"},
// { name: "团购优惠", type: "group",value: "", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/groupOffer.png"},
{ name: "积分抵扣", type: "points",value: "", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/points.png" }
],
isPointsChecked: false,
rechargeFreeChecked: false,
calcUsablePointsData: null,
order: {
phone: "",
},
userCouponInfos: [],
shopTableInfo: null,
freeDingConfig: null,
cartLists: [],
listinfo: {
details: [],
payAmount: 0,
name: "",
},
freeCheck: false,
freeDisabled: false,
totalPrice: 0, // 小计金额
totalAmount: 20, // 支付金额
remark: "", // 备注
radiovalue: 1, // 支付方式
ispws: false, // 输入支付密码
payPasswordShow: false,
amountVIP: uni.cache.get('shopUserInfo'), // 会员信息
listinfoid: null,
paymentBtnText: "余额支付",
isSocket: false,
socketTicket: null,
orderAMeal: true,
shopId: null,
storeInfo: {},
tableCode: null,
packFee: null,
}
},
computed: {
HeighT() { //手机类型的尺寸
return this.$store.getters.is_BarHeight
},
},
onUnload() {
if (this.socketTicket) {
this.socketTicket.Close()
uni.$off('message')
}
this.ispws = false
},
onHide() {
if (this.socketTicket) {
this.socketTicket.Close()
uni.$off('message')
}
},
onLoad(options) {
if ( options.storeInfo ) {
this.storeInfo = JSON.parse(decodeURIComponent(options.storeInfo));
}
this.shopId = this.storeInfo.id;
this.listinfo.name = this.storeInfo.shopName;
this.listinfo.details = JSON.parse(options.cartLists).data;
this.cartLists = JSON.parse(options.cartLists);
if ( options.tableCode ) { this.tableCode = options.tableCode;}
if ( this.storeInfo.eatModel.indexOf("dine-in") != -1 ) {
this.eatModel = "dine-in";
this.is_type = 0;
} else {
this.eatModel = "take-out";
this.is_type = 1;
}
this.getProductqueryShop();
this.getchoseEatModel('index',0);
},
onShow() {
let _this = this;
if (this.listinfoid) {
uni.$on('message', this.getMessage)
this.orderorderInfo()
} else {
this.handlemessage()
}
this.is_typeList.map((item)=>{
if ( this.storeInfo.eatModel.indexOf(item.val) != -1) {
item.show = true;
}
})
uni.$on('couponItem',this.changeCoupon)
},
methods: {
/**
* 监听优惠券/商品券选择
* @param {Object} data
*/
changeCoupon ( data ) {
let _this = this;
// uni.$off('couponItem')
let couponData = JSON.parse(data)
console.log('监听到事件来自返回的参数:' , couponData);
if ( couponData.type == 1 ) { //满减优惠券
let couponList = _this.userCouponInfos.filter(v => v.type == 1);
//不包含优惠券的金额
let currentPayAmount = (couponList.length > 0 ? _this.listinfo.payAmount + couponList[0].discountAmount : _this.listinfo.payAmount)
// 判断优惠金额不能大于支付金额
if ( couponData.discountAmount < currentPayAmount) {
_this.listinfo.payAmount = ( currentPayAmount - couponData.discountAmount).toFixed(2)
_this.favorable[0].value = ('-¥'+couponData.discountAmount)
if ( couponList.length > 0) {
_this.userCouponInfos.map(item => {
if ( item.type == 1 ) {
item.userCouponId = couponData.id
item.type = couponData.type
item.discountAmount = couponData.discountAmount
item.num = couponData.type == 1 ? 1 : couponData.num
}
})
} else {
_this.favorable[0].value = ('-¥'+couponData.discountAmount)
_this.userCouponInfos.push({
userCouponId: couponData.id,
type: couponData.type,
discountAmount: couponData.discountAmount,
num: couponData.type == 1 ? 1 : couponData.num,
})
}
if ( _this.isPointsChecked) {
_this.pointsChange()
_this.getCalcUsablePoints()
}
} else {
uni.showToast({
title: "优惠券满减金额大于订单金额不可使用",
icon: "none",
})
}
} else { //商品券
// this.listinfo.details
// 筛选选中商品券商品列表
let couponList = _this.listinfo.details.filter(v => v.productId == couponData.proId);
//金额从小到大排序
let minCouponList = couponList.sort((a, b) => (a.memberPrice > 0 ? a.memberPrice : a.salePrice) - (b.memberPrice > 0 ? b.memberPrice : b.salePrice))
let productTicketList = _this.userCouponInfos.filter(v => v.productId == couponData.proId);
//商品券抵扣的数量
let productNum = couponData.num;
let productPayAmount = 0;
let productTicketNum = 0;
let productNumber = 0;
productTicketList.map((item,index) => {
productTicketNum += item.num
})
console.log(productTicketNum)
minCouponList.map((item,index) => {
productNumber += item.number
if ( productNum > 0 && productNumber > productTicketNum) {
let num = productNum >= item.number ? item.number : productNum
productNum = (productNum - item.number) >= 0 ? (productNum - item.number) : 0;
console.log(num)
console.log(item.salePrice)
productPayAmount = productPayAmount + (num*(item.memberPrice > 0 ? item.memberPrice : item.salePrice))
}
})
console.log(minCouponList)
_this.userCouponInfos.push({
userCouponId: couponData.id,
type: couponData.type,
productId: couponData.proId,
discountAmount: productPayAmount,
num: productNum == 0 ? couponData.num : (couponData.num - productNum),
})
_this.favorable[1].value.push({
userCouponId: couponData.id,
name: couponData.name,
type: couponData.type,
productId: couponData.proId,
discountAmount: productPayAmount,
num: productNum == 0 ? couponData.num : (couponData.num - productNum),
})
if ( _this.isPointsChecked) {
_this.pointsChange()
_this.getCalcUsablePoints()
}
}
uni.$off('couponItem')
},
setPayAmount ( cartLists ) {
let tableFee;
if ( this.is_type == 0 ) {
tableFee = this.shopTableInfo?(this.shopTableInfo.seatNum*this.storeInfo.tableFee):0
} else{
tableFee = 0
}
if ( this.amountVIP.isVip == 1 && cartLists.memberAmount > 0 ) {
this.listinfo.payAmount = (cartLists.memberAmount+tableFee).toFixed(2)
} else {
this.listinfo.payAmount = (cartLists.amount+tableFee).toFixed(2)
}
if ( this.userCouponInfos.length > 0 ) {
console.log(this.userCouponInfos)
this.userCouponInfos.forEach(item => {
if ( item.type == 1 ) {
if ( item.discountAmount && item.discountAmount > 0 ) {
this.listinfo.payAmount = (this.listinfo.payAmount - item.discountAmount).toFixed(2)
}
} else {
if ( item.discountAmount && item.discountAmount > 0 ) {
this.listinfo.payAmount = (this.listinfo.payAmount - item.discountAmount).toFixed(2)
}
}
})
}
this.isPointsChecked = false;
this.getCalcUsablePoints()
},
/**
* 免单状态监听
* @param {Object} val
*/
changeFree ( val ) {
this.freeCheck = val;
if ( val ) {
this.listinfo.payAmount = (this.listinfo.payAmount*this.freeDingConfig.rechargeTimes).toFixed(2)
} else {
this.listinfo.payAmount = (this.listinfo.payAmount/this.freeDingConfig.rechargeTimes).toFixed(2)
}
},
/**
* 积分状态监听
*/
pointsChange (){
if ( this.freeCheck || !this.calcUsablePointsData.usable) {
return;
}
this.isPointsChecked = !this.isPointsChecked
if ( this.isPointsChecked ) {
this.freeDisabled = true
this.listinfo.payAmount = (this.listinfo.payAmount-(this.calcUsablePointsData.pointsNum/this.calcUsablePointsData.equivalentPoints)).toFixed(2);
} else {
this.freeDisabled = false
this.listinfo.payAmount = (Number(this.listinfo.payAmount)+(this.calcUsablePointsData.pointsNum/this.calcUsablePointsData.equivalentPoints)).toFixed(2);
}
},
goUrl(item){
switch (item.type){
case 'coupon':
let payAmount = this.listinfo.payAmount;
let couponList = this.userCouponInfos.filter(v => v.type == 1);
if ( couponList.length > 0 ) {
payAmount = payAmount + couponList.discountAmount;
}
uni.pro.navigateTo('/pages/user/coupon', {
type: "confirm_order_coupon",
payAmount: payAmount,
shoppingCart: JSON.stringify(this.listinfo.details)
})
break;
case 'product':
let productList = this.userCouponInfos.filter(v => v.type == 2);
uni.pro.navigateTo('/pages/user/coupon', {
type: "confirm_order_product",
payAmount: this.listinfo.payAmount,
shoppingCart: JSON.stringify(this.listinfo.details),
productList: JSON.stringify(productList)
})
break;
}
},
/**
* 获取积分相关信息
*/
async getCalcUsablePoints() {
let params = {
memberId: this.amountVIP.id,
orderAmount: this.listinfo.payAmount,
}
let res = await this.api.calcUsablePoints(params)
this.calcUsablePointsData = res.data;
if ( this.calcUsablePointsData.usable && this.listinfo.payAmount >= this.calcUsablePointsData.minPaymentAmount) {
this.calcUsablePointsData.pointsNum = this.calcUsablePointsData.accountPoints >= this.calcUsablePointsData.maxUsablePoints ? this.calcUsablePointsData.maxUsablePoints : this.calcUsablePointsData.accountPoints
}
},
/**
* 获取桌台码
*/
scan () {
uni.scanCode({
success: (res) => {
this.tableCode = this.getQueryString(decodeURIComponent(res.result), 'code')
if (this.tableCode) {
this.getProductqueryShop();
}
},
fail: () => {
}
})
},
/**
* 获取店铺信息。桌台信息
* @param {Object} tableCode
*/
async getProductqueryShop (tableCode) {
let params = {
lng: uni.cache.get('getLocationstorage').lng ? uni.cache.get('getLocationstorage').lng :
'',
lat: uni.cache.get('getLocationstorage').lat ? uni.cache.get('getLocationstorage').lat :
'',
}
if (this.tableCode) {params.code = this.tableCode}
if (this.shopId) {params.shopId = this.shopId}
let res = await this.api.productqueryShop(params)
if ( res.data.shopTableInfo && !res.data.shopTableInfo.choseCount&&this.orderAMeal) {
this.orderAMeal = false;
uni.pro.navigateTo('/pagesOrder/orderAMeal/index', {
tableCode: this.tableCode,
shopId: res.data.storeInfo.id,
type: 'confirm'
})
return;
}
this.freeDingConfig = res.data.freeDingConfig;
this.shopTableInfo = res.data.shopTableInfo;
this.storeInfo = res.data.storeInfo;
},
/**
* 解码
* @param {Object} url
* @param {Object} name
*/
getQueryString(url, name) {
var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
var r = url.substr(1).match(reg)
if (r != null) {
return r[2]
}
return null;
},
/**
* 加菜下单
*/
addDish () {
uni.pro.navigateBack()
},
/**
* 消息监听
* @param {Object} msg
*/
getMessage(msg) {
if (msg == 1) { // 网络在连接
return false
}
if (msg.type == 'heartbeat') { //后台心跳 处理返回 不然控制台一直报错
return false
}
if (msg.status != 'success') {
uni.showToast({
title: msg.msg,
icon: "none",
})
return false;
} else {
switch (msg.type) {
case 'createOrder':
if ( this.eatModel == "dine-in" && this.tableCode ) {
if ( this.storeInfo.registerType == 'restaurant') {
uni.switchTab({
url: '/pages/order/order'
});
return;
}
this.isSocket = true;
this.listinfoid = msg.data.id
this.listinfo.details = msg.data.detailList;
this.setPayAmount(msg.data)
uni.$off('getMessage')
this.orderorderInfo(1)
}
break;
case 'addCart':
this.isSocket = true;
if ( this.eatModel == "dine-in" && this.tableCode ) {
if (this.listinfoid) {
this.orderorderInfo()
} else {
this.listinfo.details = msg.data;
this.setPayAmount(msg)
}
}
break;
case 'order':
uni.navigateBack()
setTimeout(() => {
uni.showToast({
title: '您的小伙伴已下单了哦~~'
})
}, 1000)
break;
case 'addcart':
if (this.listinfoid) {
this.orderorderInfo()
} else {
this.listinfo.details = msg.data;
this.setPayAmount(msg)
}
this.isSocket = true;
break;
}
this.$set(this, 'cartLists', msg)
}
},
/**
* 监听送餐/打包切换
* @param {Object} val
*/
tabClick ( index, item ) {
this.getchoseEatModel('tabClick', index, item);
},
/**
* 获取堂食/外带菜品数据
*/
async getchoseEatModel ( type , index, item) {
let params = {
shopId: uni.cache.get('shopId'),
type: index,
}
if ( index == 0 && this.tableCode ) { params.tableId = this.tableCode; }
if ( this.shopTableInfo && this.shopTableInfo.seatNum ) { params.num = this.shopTableInfo.seatNum; }
let res = await this.api.choseEatModel(params)
if ( type == 'tabClick') {
if ( index == 1 ) {
if ( res.data.info.length > 0) {
this.is_type = index;
this.sendType = item.type
this.eatModel = [];
this.eatModel.push(item.val);
} else {
uni.showToast({
title: "没有可打包商品",
icon: "none",
})
return;
}
} else {
this.is_type = index;
this.sendType = item.type
this.eatModel = [];
this.eatModel.push(item.val);
}
}
this.listinfo.details = res.data.info;
this.packFee = res.data.packFee;
this.setPayAmount(res.data)
},
/**
* 监听支付方式切换
* @param {Object} n
*/
groupChange(e) {
this.radiovalue = e.type;
this.paymentBtnText = e.name;
},
/**
* 输入密码关闭
*/
close () {
this.ispws = false;
uni.pro.navigateTo('/pagesOrder/order_detail/index', {
orderId: this.listinfoid
})
},
/**
* 初始化socket
*/
handlemessage() {
//调用前先判断是否有socket正在进行 先关闭后链接
this.socketTicket ? this.socketTicket.Close() : null
this.socketTicket = new webSocketUtils(`${uni.conf.baseUrlwws}`, 5000, {
tableId: uni.cache.get('tableCode'),
shopId: uni.cache.get('shopId'),
userId: uni.cache.get('userInfo').id,
"type": "connect",
})
uni.$on('message', this.getMessage)
},
/**
* 数据处理
* @param {Object} data
*/
socketSendMsg(data) {
if (this.socketTicket) {
this.socketTicket.send(data);
}
},
/**
* 获取会员信息
*/
async getAount() {
let res = await this.api.shopUserInfo({
"shopId": uni.cache.get('shopId'),
"userId": uni.cache.get('userInfo').id,
})
if (res.code == 0) {
this.amountVIP = res.data;
}
},
/**
* 查询订单信息
* @param {Object} i
*/
async orderorderInfo(i) {
let res = await this.api.orderorderInfo({
orderId: this.listinfoid
})
if (res.code == 0) {
this.listinfo = res.data
if (i == 1) { //请求完了详情在去调支付
this.showpopupclickdd()
}
}
},
/**
* 去充值
*/
goRecharge() {
// 判断是否绑定手机,只有下单时候有,会员列表肯定有
// console.log(this.amountVIP.isVip, '调试1')
uni.pro.navigateTo('/pages/member/index', {
shopId: uni.cache.get('shopId')
})
},
/**
* 生成订单
*/
async orderdetail() {
if ( this.eatModel == "dine-in" && !this.tableCode) {
uni.showToast({
title: "请选择桌台",
icon: "none",
})
return;
}
if ( this.listinfo.details.length == 0) {
uni.showToast({
title: "购物车为空,请添加商品",
icon: "none",
})
return;
}
let params = {
"tableId": this.tableCode , //桌台码
"shopId": uni.cache.get('shopId'),
"userId": uni.cache.get('userInfo').id,
"sendType": this.sendType,
"remark": this.remark,
}
if ( this.isPointsChecked && this.calcUsablePointsData.pointsNum && this.calcUsablePointsData.pointsNum > 0) {
params.pointsNum = this.calcUsablePointsData.pointsNum;
}
if ( this.userCouponInfos ) {
params.userCouponInfos = this.userCouponInfos
}
let res = await this.api.creatOrder(params)
this.listinfoid = res.data.id;
if ( this.storeInfo.registerType == 'restaurant') {
uni.redirectTo({
url: '/pagesOrder/order_detail/index?orderId=' + this.listinfoid
});
} else {
this.showpopupclickdd();
}
},
/**
* 去支付
*/
showpopupclickdd() {
if ( (this.radiovalue == 2 || this.radiovalue == 3) && this.listinfo.payAmount <= 0 ) {
uni.showToast({
title: "支付金额必须大于0",
icon: 'none'
})
return;
}
uni.showLoading({
title: '加载中',
mask: true
})
// radiovalue为2是微信支付
if (this.radiovalue == 2 || this.radiovalue == 3) {
this.showpopupclickdds() //微信支付
} else {
// 先判断是否设置支付密码。0是没设置。没设置的情况下跳转到设置页面。有的话输入支付密码
// console.log(isPwd,'是否设置了支付密码')
if ( this.amountVIP.isVip == 0 ) {//非会员情况
this.goRecharge();
} else {
if (uni.cache.get('userInfo').isPwd == 0) {
uni.navigateTo({
url: '/pages/member/setPassword?shopUserInfo=' + JSON.stringify(this.amountVIP)
})
} else {
uni.hideLoading()
// this.payPasswordShow = false;
this.ispws = true
this.$nextTick(() => {
// this.$refs.payPwd.onPayUp();
})
}
}
}
},
/**
* 微信/支付宝支付
*/
async showpopupclickdds() {
let res;
if ( !this.freeCheck ) {
res = await this.api.orderPay({
orderId: this.listinfoid,
// #ifdef MP-WEIXIN
payType: 'wechatPay',
// #endif
// #ifdef MP-ALIPAY
payType: 'aliPay',
// #endif
// payType: this.radiovalue == 2 ? 'wechatPay' : 'aliPay'
}) //判断是否支付成功
} else {
res = await this.api.paymemeberIn({
shopId: uni.cache.get('shopId'),
amount: this.listinfo.payAmount,
orderld: this.listinfoid,
// #ifdef MP-WEIXIN
payType: 'wechatPay',
// #endif
// #ifdef MP-ALIPAY
payType: 'aliPay',
// #endif
// payType: this.radiovalue == 2 ? 'wechatPay' : 'aliPay'
}) //判断是否支付成功
}
if (res.code == 0) {
// 微信支付还是余额支付
uni.requestPayment({
// #ifdef MP-WEIXIN
provider: 'wxpay', //支付类型-固定值
partnerid: res.data.appId, // 微信支付商户号
timeStamp: res.data.timeStamp, // 时间戳(单位:秒)
nonceStr: res.data.nonceStr, // 随机字符串
package: res.data.package, // 固定值
signType: res.data.signType, //固定值
paySign: res.data.paySign, //签名
// #endif
// #ifdef MP-ALIPAY
provider: 'alipay', //支付类型-固定值
orderInfo: res.data.tradeNo, // 微信支付商户号
// #endif
success: (res) => {
let _this = this
uni.showToast({
title: "支付成功"
})
// #ifdef MP-WEIXIN
uni.requestSubscribeMessage({
tmplIds: ['z0fUG7-jhSfYCrw6poOvSRzh4_hgnPkm_5C7E5s5bCQ'],
complete() {
// uni.cache.set('shopUser', '') //删除shopUser
_this.paymodfiyOrderInfo()
uni.redirectTo({
url: '/pagesOrder/order_detail/index?orderId=' + _this.listinfoid
});
},
})
// #endif
// #ifdef MP-ALIPAY
_this.paymodfiyOrderInfo()
uni.redirectTo({
url: '/pagesOrder/order_detail/index?orderId=' + _this.listinfoid
});
// #endif
},
fail: async () => {
let res = await this.api.cancelOrderPay({
orderId: this.listinfoid,
}) //判断是否支付成功
uni.pro.navigateTo('/pagesOrder/order_detail/index', {
orderId: this.listinfoid
})
uni.hideLoading()
}
});
}
},
/**
* 支付完成后请求
*/
async paymodfiyOrderInfo() {
let res = await this.api.paymodfiyOrderInfo({
orderId: this.listinfoid,
})
},
/**
* 余额支付
* @param {Object} pwd
*/
async accountPayevent(pwd) {
this.ispws = false;
let res = await this.api.accountPay({
orderId: this.listinfoid,
memberId: this.amountVIP.id,
pwd: pwd
})
if (res.code == 0) {
// data ->1 支付成功
// ->2 余额不足
// ->3 未设置支付密码,
// ->4 不是会员,
if (res.data == 1) {
this.showToastUppop('支付成功')
let _this = this
uni.requestSubscribeMessage({
tmplIds:["z0fUG7-jhSfYCrw6poOvSRzh4_hgnPkm_5C7E5s5bCQ","AV-KybUHaK3KtFVLqpy6PHccHBS7XeX__mOM4RbufnQ"],
complete() {
uni.redirectTo({
url: '/pagesOrder/order_detail/index?orderId=' + _this
.listinfoid
});
},
})
} else if (res.data == 2) {
this.showToastUppop('余额不足')
setTimeout(() => {
// 去充值
this.goRecharge()
}, 1500)
} else if (res.data == 3) {
this.showToastUppop('未设置支付密码')
setTimeout(() => {
uni.navigateTo({
url: '/pages/member/setPassword?shopUserInfo=' + JSON.stringify(this.amountVIP)
})
}, 1500)
} else if (res.data == 4) {
this.showToastUppop('非会员请充值')
setTimeout(() => {
// 去充值
this.goRecharge()
}, 1500)
}
}
},
showToastUppop(title) {
uni.showToast({
icon: 'none',
title,
success: () => {
}
})
},
}
}
</script>
<style lang="scss">
.container{
// padding-bottom: 246rpx;
}
.head{
width: 100%;
padding: $uni-spacing-row-base;
box-sizing: border-box;
position: relative;
.head_bg{
height: 456rpx;
background: linear-gradient( 180deg, #E8AD7B 0%, #F5F5F5 100%);
position: absolute;
left: 0;
right: 0;
top: 0;
margin: auto;
}
.tips{
width: 100%;
height: 64rpx;
line-height: 64rpx;
background: #FFF8E8;
border-radius: 8rpx 8rpx 8rpx 8rpx;
padding: 0 16rpx;
box-sizing: border-box;
position: relative;
z-index: 1;
display: flex;
align-items: center;
.informIcon{
width: 26.79rpx;
height: 24.06rpx;
margin-right: 8rpx;
}
.informText{
font-size: $uni-font-size-base;
color: #FF803D;
font-weight: 400;
}
}
.tabBox{
width: 100%;
margin-top: 52rpx;
position: relative;
z-index: 1;
.tab{
display: flex;
justify-content: space-between;
align-items: center;
border-radius: 22rpx 22rpx 0 0;
background-color: $uni-bg-color;
.tab_item{
width: 50%;
height: 90rpx;
line-height: 90rpx;
display: flex;
align-items: center;
padding-left: 30rpx;
box-sizing: border-box;
background-color: #FEFBF8;
border-radius: 22rpx 22rpx 0 0;
position: relative;
.title{
font-weight: 500;
font-size: 28rpx;
color: #999999;
position:relative;
z-index: 1;
}
.title.active{
color: #E8AD7B;
}
.icon{
width: 48rpx;
height: 48rpx;
margin-right: 16rpx;
position:relative;
z-index: 1;
}
}
.tab_item.active{
background-color: #fff;
}
// .tab_item.active:after {
// content: "";
// position: absolute;
// top: 0;
// left: -4px;
// width: 40px;
// height: 26px;
// background: orange;
// }
.tab_item.active:before {
content: "";
position: absolute;
top: -20rpx;
left: 0;
right: 0;
bottom: 0;
border-radius: 2px;
background: #fff;
transform: skewX(0deg);
}
.tab_item1.active:before{
border-radius: 22rpx 40rpx 0 0;
}
.tab_item2.active:before{
border-radius: 40rpx 22rpx 0 0;
}
}
.table{
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 30rpx;
box-sizing: border-box;
height: 90rpx;
background-color: $uni-bg-color;
border-radius: 0 0 22rpx 22rpx;
.table_left{
display: flex;
align-items: center;
.icon{
width: 32.86rpx;
height: 39.07rpx;
margin-right: 24rpx;
}
.title{
display: flex;
align-items: center;
color: #E8AD7B;
}
}
.value{
font-weight: 500;
font-size: 32rpx;
color: #333333;
}
}
.pack{
display: flex;
flex-direction: column;
padding: 30rpx;
box-sizing: border-box;
background-color: $uni-bg-color;
border-radius: 0 0 22rpx 22rpx;
.top{
display: flex;
flex-direction: column;
margin-top: 8rpx;
.title{
font-size: 28rpx;
color: #333;
font-weight: bold;
margin-bottom: 16rpx;
}
.address{
font-size: 24rpx;
font-weight: 400;
color: #999;
}
}
.list{
display: flex;
flex-direction: column;
.item{
height: 70rpx;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 28rpx;
.lable{
color: #666;
font-weight: 500;
}
.getPhone{
display: flex;
align-items: center;
.u-input{
width: 340rpx;
border: none;
input{
font-size: 24rpx;
color: #333;
}
.input-placeholder{
font-size: 24rpx;
}
}
}
.text,.getBtn{
color: #E8AD7B;
}
.getBtn{
border-radius: 12rpx;
border: 2rpx solid #E8AD7B;
padding: 8rpx 20rpx;
box-sizing: border-box;
}
}
}
}
}
.addDish{
width: 176rpx;
height: 56rpx;
line-height: 56rpx;
text-align: center;
background: #FFF8E8;
border-radius: 28rpx 28rpx 28rpx 28rpx;
font-weight: 500;
font-size: 28rpx;
color: #333333;
position: relative;
z-index: 1;
}
.tabBox_t{
font-weight: 500;
font-size: 28rpx;
color: #333333;
padding: 32rpx 24rpx;
background-color: #fff;
border-radius: 18rpx;
display: flex;
flex-direction: column;
position: relative;
z-index: 1;
margin-top: 32rpx;
}
.shopName{
margin-bottom: 16rpx;
}
.tableName{
display: flex;
.name{
margin-right: 16rpx;
}
.num{
border-left: 2rpx solid #d6d6d6;
padding-left: 16rpx;
}
}
}
.content_box{
padding: 0 20rpx;
box-sizing: border-box;
margin-top: 10rpx;
position: relative;
z-index: 1;
.content{
background-color: $uni-bg-color;
border-radius: 22rpx;
display: flex;
flex-direction: column;
padding: 30rpx 0;
box-sizing: border-box;
.title{
font-size: 28rpx;
color: #666;
margin-bottom: 32rpx;
padding: 0 30rpx;
box-sizing: border-box;
}
.list_item{
display: flex;
align-items: center;
margin-bottom: 32rpx;
padding: 0 30rpx;
box-sizing: border-box;
.left{
width: 100%;
display: flex;
align-items: flex-start;
.img{
width: 142rpx;
height: 142rpx;
margin-right: 34rpx;
flex-shrink: 0;
border-radius: 20rpx;
}
.center{
width: 100%;
display: flex;
flex-direction: column;
align-items: flex-start;
.center_title{
font-size: 32rpx;
font-weight: 500;
color: #333;
}
.type{
margin: 12rpx 0 10rpx 0;
}
.type,.num{
font-size: 24rpx;
color: #999;
}
}
}
.num{
font-size: 24rpx;
color: #999;
}
.price{
font-size: 32rpx;
color: #333;
font-weight: 500;
}
}
.cell_item{
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 32rpx;
padding: 0 30rpx;
.lable{
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
.value{
display: flex;
align-items: flex-end;
view:nth-child(1){
font-weight: 400;
font-size: 24rpx;
color: #999999;
margin-right: 16rpx;
}
view:nth-child(2){
font-weight: bold;
font-size: 28rpx;
color: #333333;
}
}
}
.favorable{
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 30rpx;
box-sizing: border-box;
padding-bottom: 26rpx;
padding-top: 26rpx;
border-bottom: 2rpx solid #E5E5E5;
.favorable_left{
display: flex;
align-items: center;
.icon{
width: 40rpx;
height: 40rpx;
margin-right: 16rpx;
}
.name{
font-size: 28rpx;
font-weight: 400rpx;
color: #333;
}
}
.favorable_right{
display: flex;
align-items: center;
.favorable_right_text{
font-size: 24rpx;
color: #999;
font-weight: 400rpx;
}
}
.favorable_right.column{
display: flex;
flex-direction: column;
.favorable_right_text{
margin-bottom: 10rpx;
text:nth-child(1){
font-size: 26rpx;
color: #999;
}
text:nth-child(2){
font-size: 26rpx;
color: #999;
margin: 0 30rpx;
}
text:nth-child(3){
font-size: 26rpx;
color: #333;
}
}
}
}
.favorable.column{
align-items: flex-start;
}
.cell-item{
display: flex;
align-items: center;
justify-content: space-between;
padding: 32rpx 34rpx 32rpx 34rpx;
.label{
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.val{
display: flex;
align-items: flex-end;
view:nth-child(1){
font-weight: 400;
font-size: 24rpx;
color: #999999;
margin-right: 42rpx;
}
view:nth-child(2){
display: flex;
align-items: flex-end;
font-weight: bold;
font-size: 36rpx;
color: #333333;
}
}
}
.totalPrice{
padding: 32rpx 30rpx;
box-sizing: border-box;
// border-top: 2rpx solid #E5E5E5;
display: flex;
justify-content: flex-end;
align-items: flex-end;
font-size: 32rpx;
color: #333;
font-weight: bold;
.totalPriceNum{
font-size: 40rpx;
}
}
}
}
// 备注
.remark{
padding: 0 20rpx;
margin-top: 32rpx;
.remark_bg{
background-color: $uni-bg-color;
border-radius: 22rpx;
padding: 32rpx 30rpx;
box-sizing: border-box;
.remark_title{
font-size: 32rpx;
color: #333;
font-weight: 500;
margin-bottom: 16rpx;
}
.u-textarea{
height: 148rpx;
background-color: #f5f5f5;
border-radius: 10rpx;
padding: 32rpx 22rpx!important;
box-sizing: border-box;
textarea{
font-size: 24rpx;
}
}
}
}
.bottom{
width: 100%;
background: #FFFFFF;
box-shadow: 0rpx -6rpx 14rpx 2rpx rgba(0,0,0,0.1);
position: fixed;
bottom: 0;
display: flex;
align-items: center;
justify-content: space-between;
padding: 32rpx 50rpx 82rpx 50rpx;
box-sizing: border-box;
z-index: 9;
.bottom_left{
display: flex;
font-size: 28rpx;
font-weight: 500;
color: #333;
align-items: flex-end;
.totalAmount{
font-size: 40rpx;
font-weight: bold;
margin-top: 5rpx;
}
}
.paymentBtnText{
background: #E8AD7B;
border-radius: 36rpx;
font-weight: 400;
font-size: 32rpx;
color: #FFFFFF;
padding: 14rpx 44rpx;
}
}
.page-total{
position: inherit;
}
.pay-info-wrap{
padding: 0;
box-sizing: border-box;
.info-wrap{
padding: 64rpx 30rpx 30rpx 30rpx;
box-sizing: border-box;
.title{
align-self: center;
font-size: 32rpx;
color: #333;
font-weight: bold;
}
}
.info-content{
.pay-title {
display: flex;
align-items: flex-end;
justify-content: center;
font-weight: bold;
width: 100%;
font-size: 48rpx;
color: #333;
margin-top: 48rpx;
text {
font-size: 60rpx;
color: #333;
}
}
.pay-password {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 64rpx;
.list {
width: 88rpx;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
border: 2rpx solid #999;
border-radius: 8rpx;
text {
font-size: 32rpx;
}
}
}
.hint {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100rpx;
text {
font-size: 28rpx;
color: #ccc;
}
}
}
}
</style>