Files
cashier-ipad-new/pagesOrder/pay-order/pay-order.vue
2025-09-29 10:42:48 +08:00

1197 lines
30 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="bg-gray min-page u-p-30 u-font-28">
<view class="u-p-t-60 u-p-b-60 u-text-center">
<template v-if="originPrice!=payPrice">
<view class="u-font-32 ">
<text class="price-fuhao"></text>
<text class="font-bold price">{{payPrice}}</text>
</view>
<view class="u-m-t-10 color-999 old-price">
<text class=""></text>
<text class=" ">{{originPrice}}</text>
</view>
<view class="u-m-t-10 u-flex u-row-center color-main">
<view @click="discountShow">修改</view>
</view>
</template>
<template v-else>
<view class="u-font-32 ">
<text class="price-fuhao"></text>
<text class="font-bold price">{{originPrice}}</text>
</view>
<view class="u-m-t-10 u-flex u-row-center color-main">
<view @click="discountShow">修改</view>
</view>
</template>
</view>
<view class="content bg-fff border-r-12">
<view class="u-p-l-26 u-p-r-26 card top u-m-t-30">
<view class="border-bottom-dashed u-p-b-30 u-p-t-30" v-if="vipDiscount*1>0">
<view class="u-flex u-p-l-24 u-p-r-24 u-row-between ">
<view>会员优惠</view>
<view class="color-red">
-{{vipDiscount}}
</view>
</view>
</view>
<view class="border-bottom-dashed u-p-b-30 u-p-t-30" v-if="discountSaleAmount*1>0">
<view class="u-flex u-p-l-24 u-p-r-24 u-row-between ">
<view>单品打折优惠</view>
<view class="color-red">
-{{discountSaleAmount}}
</view>
</view>
</view>
<view class="border-bottom-dashed u-p-b-30 u-p-t-30">
<view class="u-flex u-p-l-24 u-p-r-24 u-row-between " @click="toQuan">
<view>优惠券</view>
<view class="color-999 u-flex u-col-center">
<text>选择优惠券</text>
<view class="u-flex u-col-center">
<uni-icons type="right" color="#999"></uni-icons>
</view>
</view>
</view>
<view class="u-m-t-24" v-if="pays.quan.length>0">
<view class="u-flex u-p-l-24 u-p-r-24 u-m-t-24 u-row-between "
v-for="(item,index) in pays.quan" :key="index">
<view class="u-flex">
<view class="hui"></view>
<view class="u-m-l-18">{{item.name}}</view>
<view class="u-m-l-18 color-999">x1</view>
</view>
<view class="u-flex">
<view class="color-red">
-{{item.discountAmount}}
</view>
<view class="u-m-l-12" @click="delQuan(index)">
<up-icon :size="16" name="minus-circle-fill" color="rgb(255, 0, 0)"></up-icon>
</view>
</view>
</view>
</view>
</view>
<view class="border-bottom u-p-b-30" v-if="discount.value||accountPoints.sel">
<view class="u-flex u-p-l-24 u-p-r-24 u-row-between u-p-t-30 " v-if="discount.value">
<view>服务员改价</view>
<view class=" u-flex u-col-center">
<text style="color: rgb(255, 95, 46);">-{{to2(discount.value)}}</text>
</view>
</view>
<view class="u-flex u-p-l-24 u-p-r-24 u-row-between u-p-t-30 "
v-if="accountPoints.price&&accountPoints.sel">
<view>积分抵扣</view>
<view class=" u-flex u-col-center">
<text style="color: rgb(255, 95, 46);">-{{to2(accountPoints.price)}}</text>
</view>
</view>
</view>
</view>
<view class="bg-fff border-r-12 ">
<view class="u-p-t-30 u-p-l-50 u-p-r-50 card bottom">
<my-tabs :list="pays.list" v-model="pays.selIndex"></my-tabs>
<template v-if="pays.selIndex==0">
<view class="list">
<view class="item" @click="changePayType(index,item)" :class="{disabled:item.disabled}"
v-for="(item,index) in pays.payTypes.list" :key="index">
<view class="u-flex u-row-between u-p-t-30 u-p-b-30 border-bottom">
<view class="u-flex">
<image class="icon" :src="item.icon" mode=""></image>
<text class="u-m-l-10 no-wrap">{{item.payName}}</text>
</view>
<view class="u-flex color-999 u-font-24">
<view class="u-m-r-20" v-if="item.payType=='arrears'&&pageData.buyer.id"
@click.stop="chooseBuyer">
<view>
<text>挂账人</text>
<text class="u-m-r-4">{{pageData.buyer.debtor}}</text>
</view>
<view>
<text>挂账额度</text>
<text>{{pageData.buyer.remainingAmount||'0'}}</text>
</view>
</view>
<view class="u-m-r-20" v-if="item.payType=='member-account'&&pageData.user.id"
@click.stop="chooseUser">
<view>
<text>会员</text>
<text class="u-m-r-4">{{pageData.user.phone||pageData.user.nickName}}</text>
</view>
<view>
<text>余额</text>
<text>{{pageData.user.amount||'0'}}</text>
</view>
<!-- <view>
<text>积分</text>
<text>{{user.accountPoints||'0'}}</text>
</view> -->
</view>
<view :class="{op3:item.disabled}">
<my-radio @click="changePayType(index,item)"
:modelValue="index==pays.payTypes.selIndex">
</my-radio>
</view>
</view>
</view>
</view>
</view>
<view class="border-bottom-dashed "></view>
<view class="u-flex u-row-between u-p-t-24" v-if="pageData.user.id" @click="changeAccountPoints">
<view class="u-flex ">
<view class="">积分抵扣</view>
<view class="color-999 u-m-l-10">
<text>(</text>
<text>{{pageData.user.accountPoints||'0'}}</text>
<text>)</text>
</view>
<!-- <view><text class="color-red font-bold">{{accountPoints.price}}</text></view> -->
</view>
<view class="u-flex">
<view class="u-flex">
<view><text>{{accountPoints.num}}</text></view>
<view v-if="accountPoints.calcRes.usable" @click.stop="refPointsOpen">
<up-icon name="edit-pen" size="16" color="#999"></up-icon>
</view>
</view>
<view class="u-m-l-32 u-relative" v-if="accountPoints.calcRes.usable">
<view class="u-absolute position-all"></view>
<my-radio :modelValue="accountPoints.sel">
</my-radio>
</view>
</view>
</view>
<view class="color-999 u-font-24 u-m-t-16">
<view class="" v-if="accountPoints.calcRes.unusableReason">
<text class="color-red">*</text>
<text>{{accountPoints.calcRes.unusableReason}}</text>
</view>
<view class="" v-if="accountPoints.calcRes.usable">
<text class="color-red">*</text>
<text class=""
v-if="accountPoints.calcRes.equivalentPoints">100积分等于{{to2(accountPoints.calcRes.equivalentPoints*100)}},</text>
<text>
最大抵扣积分{{accountPoints.calcRes.maxUsablePoints}}
</text>
<text>,
最小抵扣积分0
</text>
</view>
</view>
<view class="u-m-t-60 u-p-b-30">
<my-button @click="payOrderClick">确认付款</my-button>
</view>
</template>
<template v-if="pays.selIndex==1">
<view class="u-font-32 u-m-t-40 u-text-center">请让顾客使用微信/支付宝扫码</view>
<view class="u-flex u-row-center u-m-t-40">
<up-qrcode cid="code" :size="140" :val="payCodeUrl"></up-qrcode>
</view>
</template>
</view>
<!-- 二维码支付扫码 -->
<template v-if="pays.selIndex==1">
<view class="card border-bottom top u-m-t-32">
</view>
<view class="bg-fff card bottom border-r-12 u-p-32">
<view class="font-bold u-font-32 u-text-center">
{{payPrice}}</view>
<view class="u-flex u-row-center u-m-t-24">
<template v-if="order.status=='unpaid'">
<up-loading-icon size="14" text="等待支付"></up-loading-icon>
</template>
<template v-if="order.status=='done'">
<view class="u-flex pay-success">
<up-icon color="#5CBB6F" name="checkmark-circle-fill"></up-icon>
<view class="u-m-l-6">支付成功</view>
</view>
</template>
</view>
</view>
</template>
</view>
</view>
<edit-discount :nowPrice="order.orderAmount-productCouponDiscountAmount-fullCouponDiscountAmount"
@confirm="editDiscountConfirm" title="优惠金额" :ref="setModel" name="editMoney"
:price="payPrice" :discount="discount.discount"></edit-discount>
<up-modal :title="modal.title" :content="modal.content" :show="modal.show" :confirmText="modal.confirmText"
:cancelText="modal.cancelText" showCancelButton closeOnClickOverlay @confirm="confirmModelConfirm"
@cancel="confirmModelCancel" @close="confirmModelCancel" width="300px" />
<edit-accountPoints @confirm="pointsConfirm" :price="accountPoints.num" :accountPoints="accountPoints"
ref="refPoints"></edit-accountPoints>
</view>
</template>
<script setup>
import { reactive, onMounted, watch, ref, onBeforeUnmount, computed, inject } from 'vue';
import { onLoad, onBackPress, onShow } from '@dcloudio/uni-app'
import go from '@/commons/utils/go.js'
import infoBox from '@/commons/utils/infoBox.js';
import { hasPermission } from '@/commons/utils/hasPermission.js'
import editDiscount from '@/components/my-components/edit-discount.vue'
import editAccountPoints from './components/edit-accountPoints.vue'
import {
returnGoodsPayPriceMap,
returnProCoupStartIndex,
returnProductCoupAllPrice,
returnProductCanUseNum
} from '../quan_util.js'
import { mathFloorPrice } from '@/commons/utils/goodsUtil.js'
// import { getCouponList } from '@/http/api/coupon.js'
import { getHistoryOrder } from '@/http/api/order.js'
import { getPayTypeList } from '@/http/api/payType.js'
import { shopUserDetail } from '@/http/api/shopUser.js'
import { scanPay,microPay,cashPay,vipPay,creditPay,getOrderPayUrl,queryOrderStatus } from '@/http/api/pay.js'
import { calcUsablePoints,calcDeductionAmount,payedDeductPoints,consumeAwardPoints } from '@/http/api/points.js'
const websocketUtil = inject('websocketUtil'); // 注入 WebSocket 工具类实例
const modal = reactive({
title: '提示',
cancelText: '取消',
confirmText: '确认',
content: '',
key: 'cash',
show: false,
data: ''
})
const pageData = reactive({
goodsList: [], //菜品列表
user: { //会员信息
userId: null,
amount: 0
},
shopInfo: uni.getStorageSync('shopInfo'),
buyer: {},
payUrlShow: false,
})
const order = reactive({
orderAmount: 0
})
//商品数量从0到n每一个对应的价格
let $goodsPayPriceMap = {}
const pays = reactive({
list: ['扫码收款', '二维码收款'],
selIndex: 0,
payTypes: {
list: [],
selIndex: 0
},
quan: [],
seatNum: 0
})
//打折相关数据
const discount = reactive({
discount: 100,
currentPrice: 0,
value: 0
})
const accountPoints = reactive({
sel: false,
num: 0,
calcRes: {
usable: false,
unusableReason: '',
minDeductionPoints: 0,
maxUsablePoints: 0
},
price: 0
})
let timer = null
const refPoints = ref(null)
let payCodeUrl = ref('') //收款二维码地址
onShow(() => {
watchChooseuser()
watchChoosebuyer()
watchChooseQuan()
})
onLoad(async (opt) => {
Object.assign(order, opt)
getPayType()
init()
})
onBeforeUnmount(() => {
clearInterval(timer)
timer = null
})
onBackPress(() => {
uni.$emit('orderDetail:update')
console.log('onBackPress');
})
/**
* 初始化
*/
async function init() {
// 获取订单详情
const {data:orderRes} = await getHistoryOrder({orderId:order.orderId})
console.log(orderRes,'dataaaaaaaaaaaaaa');
Object.assign(order, orderRes)
pageData.goodsList = objToArrary(orderRes.detailMap)
$goodsPayPriceMap = returnGoodsPayPriceMap(pageData.goodsList)
// console.log("order===",order)
// console.log("pageData.user===",pageData.user)
// 获取用户信息
if (order.userId||pageData.user.userId) {
shopUserDetail({
userId: order.userId || pageData.user.userId
}).then(res => {
pageData.user = res
getCalcUsablePoints()
if (orderRes.pointsNum) {
accountPoints.sel = true
}
})
}
pageData.seatNum = order.seatNum;
}
/**
* 判断是否是会员
*/
const isVip = computed(() => {
return uni.getStorageSync('shopInfo').isMemberPrice && pageData.user && pageData.user.id && pageData.user.isVip
})
const coupAllPrice = computed(() => {
const n = pays.quan.reduce((prve, cur) => {
return prve + cur.discountAmount * 1
}, 0)
return n
})
/**
* 菜品打包费
*/
const packAmount = computed(() => {
if(pageData.goodsList){
let price = pageData.goodsList.filter(v => v.packNumber > 0 && v.status !== "return").reduce((a, b) => {
console.log(b)
return a + ((b.packAmount||0)*b.packNumber).toFixed(2)*1
}, 0)
// console.log("菜品打包费===",price)
return price
}
})
/**
* 桌位费
*/
const tableFee = computed(() => {
// console.log("桌位费===", order.seatNum > 0 ? order.seatNum*pageData.shopInfo.tableFee : 0)
return order.seatNum > 0 ? order.seatNum*pageData.shopInfo.tableFee : 0
})
/**
* 菜品金额
*/
const originPrice = computed(() => {
if(pageData.goodsList){
let goodsPrice = pageData.goodsList.filter(v => v.price != 0 && v.status !== "return").reduce((a, b) => {
return a + parseFloat(mathFloorPrice(b.num * b.price,b))
}, 0)
// console.log("菜品原金额===",goodsPrice)
return (parseFloat(goodsPrice) + parseFloat(tableFee.value) + parseFloat(packAmount.value)).toFixed(2)
}
})
const newOriginPrice = computed(() => {
if(pageData.goodsList){
let goodsPrice = pageData.goodsList.filter(v => v.price != 0 && v.status !== "return").reduce((a, b) => {
let memberPrice = b.memberPrice ? b.memberPrice : b.price
let tPrice = (isVip.value ? memberPrice : b.price)
tPrice = (b.discountSaleAmount ? b.discountSaleAmount : tPrice )
return a + parseFloat(mathFloorPrice(b.num * tPrice,b)*1 - mathFloorPrice(b.returnNum*tPrice,b)*1 - mathFloorPrice(b.refundNum*tPrice,b)*1)
}, 0)
// console.log("减去退款退费的菜品金额===",goodsPrice)
return (goodsPrice + tableFee.value + packAmount.value).toFixed(2)
}
})
/**
* 会员优惠金额
*/
const vipDiscount = computed(() => {
if (!isVip.value) {
return 0
}
if(pageData.goodsList){
let price = pageData.goodsList.filter(v => v.price != 0 && v.discountSaleAmount <= 0 && v.status !== "return" && v.memberPrice && (v.memberPrice != v.price)).reduce((a, b) => {
return a + (b.num * (b.price - b.memberPrice))
}, 0)
return price.toFixed(2)
}
})
/**
* 菜品折扣金额
*/
const discountSaleAmount = computed(() => {
if(pageData.goodsList){
let price = pageData.goodsList.filter(v => v.discountSaleAmount > 0 && v.status !== "return").reduce((a, b) => {
return a + ((b.num * b.price) - (b.num * b.discountSaleAmount))
}, 0)
// console.log("单品折扣金额====",price)
return price.toFixed(2)
}
})
/**
* 优惠券金额
*/
const fullCouponDiscountAmount = computed(() => {
return pays.quan.filter(v => v.type == 1).reduce((prve, cur) => {
// console.log("优惠券金额",prve + cur.discountAmount * 1)
return prve + cur.discountAmount * 1
}, 0)
})
/**
* 商品券金额
*/
const productCouponDiscountAmount = computed(() => {
return pays.quan.filter(v => v.type == 2).reduce((prve, cur) => {
return prve + cur.discountAmount * 1
}, 0)
})
/**
* 积分计算
*/
const pointCanDicountPrice = computed(() => {
let total = (originPrice.value || 0) - productCouponDiscountAmount.value - discount.value -
fullCouponDiscountAmount.value
return (total < 0 ? 0 : total).toFixed(2)
})
/**
* 支付金额
*/
const payPrice = computed(() => {
// console.log("newOriginPrice===",newOriginPrice.value)
// console.log("vipDiscount===",vipDiscount.value)
// console.log("productCouponDiscountAmount===",productCouponDiscountAmount.value)
// console.log("discount===",discount.value)
// console.log("fullCouponDiscountAmount===",fullCouponDiscountAmount.value)
// console.log("accountPoints===",accountPoints)
let total = (newOriginPrice.value*1) - productCouponDiscountAmount.value - discount
.value - fullCouponDiscountAmount.value - accountPoints.price * (accountPoints.sel ? 1 : 0)
// console.log("支付金额===",total)
return (total < 0 ? 0 : total).toFixed(2)
})
/**
* 积分使用前金额
*/
const orderAmount = computed(() => {
let total = (newOriginPrice.value*1) - productCouponDiscountAmount.value - discount.value - fullCouponDiscountAmount.value
console.log(total)
return (total < 0 ? 0 : total).toFixed(2)
})
watch(() => accountPoints.sel, (newval) => {
if (newval) {
calcDeDuctionPoints()
}
})
watch(() => pointCanDicountPrice.value, (newval) => {
if( pageData.user.id ){
getCalcUsablePoints()
}
})
watch(() => payPrice.value, (newval) => {
if( pageData.payUrlShow){
setTimeout(()=>{
getPayUrl()
})
}
if (newval <= 0) {
const arr = ['cash', 'member-account']
pays.payTypes.list.map(v => {
if (arr.includes(v.payType)) {
v.disabled = false
} else {
v.disabled = true
}
})
const index = pays.payTypes.list.findIndex(v => !v.disabled)
pays.payTypes.selIndex = index
} else {
pays.payTypes.list.map(v => {
v.disabled = false
})
}
})
watch(() => accountPoints.num, (newval) => {
if (!newval) {
accountPoints.price = 0
return
}
calcDeDuctionPoints()
})
watch(() => pays.selIndex, (newval) => {
clearInterval(timer)
if (newval) {
timer = setInterval(() => {
getHistoryOrder({orderId:order.orderId}).then(res => {
order.status = res.status
if (res.status == 'done') {
paySuccess()
}
})
}, 2000)
if( newval == 1 ){
getPayUrl()
}
}
})
function getPayParam () {
let params = {
shopId: uni.getStorageSync("shopId"),
orderId: order.id,
originAmount: originPrice.value, //订单原金额(包含打包费+餐位费) 不含折扣价格
orderAmount: payPrice.value, // 订单金额
seatNum: pageData.seatNum, // 用餐人数
discountAmount: discount.value.toFixed(2), // 手动优惠金额
fullCouponDiscountAmount: fullCouponDiscountAmount.value, // 满减金额
productCouponDiscountAmount: productCouponDiscountAmount.value,
vipPrice: vipDiscount.value != 0 ? 1: 0, // 是否使用会员价
pointsDiscountAmount: accountPoints.sel ? accountPoints.price : 0,
pointsNum: accountPoints.sel ? accountPoints.num : 0,
couponList: [],
}
if( pays.quan.length > 0 ){
pays.quan.forEach(v => {
params.couponList.push(v.id)
})
}
params.couponList = params.couponList.join(",")
// params.couponList = JSON.stringify(params.couponList)
return params
}
/**
* 获取店铺订单支付URL
*/
function getPayUrl() {
console.log("支付参数 ===",getPayParam())
let par = getPayParam()
let params = {
shopId: uni.getStorageSync("shopId"),
...par
}
if( order.userId||pageData.user.userId ){
params.userId = order.userId||pageData.user.userId
}
getOrderPayUrl(params).then(res => {
console.log(res,'tishi')
payCodeUrl.value = res.data
pageData.payUrlShow = true
})
}
/**
* 获取支付方式
*/
async function getPayType() {
const payTypeList = await getPayTypeList()
pays.payTypes.list = [];
payTypeList.data.map(v => {
if( v.payType != 'bank'){
pays.payTypes.list.push({
...v,
disabled: false
})
}
})
}
/**
* 设置优惠券/商品券
* @param {Object} arr
*/
function setQuan(arr) {
console.log("choose-quan===",arr)
let manjianCoup = arr.filter(v => v.type == 1)
let productCoup = arr.filter(v => v.type == 2)
let setmanjianCoup = pays.quan.filter(v => v.type == 1)
let setproductCoup = pays.quan.filter(v => v.type == 2)
if ( manjianCoup.length > 0) {
setmanjianCoup = manjianCoup
}
//商品券分组
let goods;
let tPrice;
productCoup.map(item=>{
goods = pageData.goodsList.find(v => v.productId == item.proId)
if(!goods)return;
let memberPrice = goods.memberPrice ? goods.memberPrice : goods.price
tPrice = (isVip.value ? memberPrice : goods.price)
tPrice = goods.discountSaleAmount ? goods.discountSaleAmount : tPrice
item.discountAmount = tPrice
})
if( !goods || tPrice > payPrice.value){
productCoup = [];
}
// productCoup = productCoup.filter(v => v.number >= 1)
pays.quan = [...manjianCoup, ...productCoup]
console.log("优惠券2===",pays.quan)
}
/**
* 积分选择
*/
function refPointsOpen() {
if (!accountPoints.calcRes.usable && accountPoints.sel) {
return
}
refPoints.value.open()
}
/**
* 积分确认
* @param {Object} e
*/
function pointsConfirm(e) {
accountPoints.num = e
}
/**
* 获取积分信息
* @param {Object} orderAmount
*/
async function getCalcUsablePoints(orderAmount) {
if (!order.userId&&!pageData.user.userId) {
return
}
const res = await calcUsablePoints({
shopUserId: pageData.user.id,
orderAmount: payPrice.value
})
accountPoints.calcRes = res
accountPoints.num = res.maxUsablePoints
return res;
}
async function calcDeDuctionPoints() {
if (accountPoints.num <= 0) {
accountPoints.price = 0
return ''
}
console.log(payPrice.value)
const res = await calcDeductionAmount({
shopUserId: pageData.user.id,
orderAmount: orderAmount.value,
points: accountPoints.num
})
if (res) {
accountPoints.price = res
}
return res
}
function changeAccountPoints() {
if (!accountPoints.calcRes.usable) {
return
}
accountPoints.sel = !accountPoints.sel
if (!accountPoints.sel) {
accountPoints.num = 0
}
}
/**
* 选择优惠券
*/
function toQuan() {
console.log(pageData.user);
if (!order.userId&&!pageData.user.id) {
return infoBox.showToast('请先选择会员', 0.5).then(() => {
chooseUser()
})
}
go.to('PAGES_ORDER_QUAN', {
orderId: order.id,
shopUserId: pageData.user.id,
orderPrice: (payPrice.value * 1 + coupAllPrice.value * 1).toFixed(2)
})
}
/**
* 判断是否可以修改金额
*/
async function discountShow() {
const bol = await hasPermission('yun_xu_da_zhe')
if (bol) {
showModel('editMoney', true)
}
}
/**
* 积分金额处理
* @param {Object} n
*/
function to2(n) {
if (!n) {
return ''
}
return Number(n).toFixed(2)
}
/**
* 优惠券选择
*/
function watchChooseQuan() {
uni.$off('choose-quan')
uni.$on('choose-quan', (arr) => {
setQuan(arr)
})
}
/**
* 删除优惠券
* @param {Object} i
*/
function delQuan(i) {
pays.quan.splice(i, 1)
discount.discount = 100
discount.value = 0
}
/**
* 选择用户
*/
function chooseUser() {
go.to('PAGES_CHOOSE_USER')
}
/**
* 更新选择用户
*/
function watchChooseuser() {
uni.$off('choose-user')
uni.$on('choose-user', (data) => {
console.log(data);
pageData.user = data
pays.quan = []
discount.discount = 100
discount.value = 0
init()
})
}
/**
* 选择挂账人
*/
function chooseBuyer() {
go.to('PAGES_CHOOSE_BUYER')
}
/**
* 更新选择挂账人
*/
function watchChoosebuyer() {
uni.$off('choose-buyer')
uni.$on('choose-buyer', (data) => {
pageData.buyer = data
})
}
/**
* 修改价格确认
* @param {Object} form
*/
function editDiscountConfirm(form) {
accountPoints.sel = false
Object.assign(discount, {
...form,
value: form.price - form.currentPrice
})
const fullCoupon = pays.quan.find(v => v.type == 1)
if (fullCoupon && form.currentPrice < fullCoupon.fullAmount) {
modal.content = '改价后价格不满足满减券最低满减需求' + fullCoupon.fullAmount + '元'
modal.key = 'fullCoupon'
modal.show = true
modal.cancelText = '取消改价'
modal.confirmText = '删除满减券'
}
}
/**
* 支付方式选择
* @param {Object} i
* @param {Object} item
*/
function changePayType(i, item) {
if (item.disabled) {
return infoBox.showToast(item.payName + '不可用')
}
pays.payTypes.selIndex = i
if (item.payType == 'member-account' && !pageData.user.id) {
chooseUser()
}
if (item.payType == 'arrears' && !pageData.buyer.id) {
chooseBuyer()
}
}
const models = new Map();
function setModel(el) {
if (el && el.$attrs['name']) {
models.set(el.$attrs['name'], el);
}
}
function showModel(key) {
const model = models.get(key)
model && model.open()
}
let payStatus = '';
/**
* 确认付款
*/
const tipsMap = {
paying: '支付中',
success: '已支付成功'
}
function payOrderClick() {
const payType = pays.payTypes.list[pays.payTypes.selIndex].payType
if (payType == 'scanCode' || payType == 'deposit') {
return saomaPay(payType)
}
if (payType == 'cash' && payPrice.value * 1 > 0) {
return cashConfirmShow()
}
if (payType == 'arrears' && pageData.buyer.remainingAmount < payPrice.value * 1 ) {
return infoBox.showToast('挂账额度不足')
}
if (payType == 'member-account' && pageData.user.amount * 1 < payPrice.value * 1) {
return infoBox.showToast('余额不足')
}
if (payStatus) {
return infoBox.showToast(tipsMap[payStatus])
}
try {
pay()
} catch (e) {
//TODO handle the exception
payStatus = ''
}
}
/**
* 支付调佣
* @param {Object} par
*/
async function pay(par) {
const payType = pays.payTypes.list[pays.payTypes.selIndex].payType
let pars = getPayParam()
payStatus = 'paying'
let params = {
shopId: uni.getStorageSync("shopId"),
checkOrderPay: {
...pars
},
...par
}
if( order.userId||pageData.user.userId ){
params.checkOrderPay.userId = order.userId||pageData.user.userId
}
if( payType == 'arrears' ){
params.creditBuyerId = pageData.buyer.id
}
try {
if (payType == 'scanCode') {
await microPay(params)
}
if (payType == 'cash') {
await cashPay(params)
}
if (payType == 'arrears') {
await creditPay(params)
}
if( payType == 'member-account' || payType == 'deposit' ) {
if (pageData.user.amount * 1 >= payPrice.value * 1) {
params.payType = 'userPay'
params.shopUserId = pageData.user.id
await vipPay(params)
} else {
infoBox.showToast('余额不足')
return
}
}
} catch (error) {
console.log(error)
let res;
let timer;
if( error.code == 211 && error.msg == '等待用户付款'){
uni.showLoading({
title: '支付中...'
})
timer = setInterval(async ()=>{
res = await queryOrderStatus({orderId: pars.orderId})
if ( res == 'done') {
clearInterval(timer)
uni.hideLoading()
paySuccess()
}
console.log(res)
},1000)
}
if( error.code == 701 ){
uni.removeStorageSync("table_code")
uni.navigateBack()
}
payStatus = '';
return false;
}
paySuccess()
}
/**
* 支付成功回调
*/
function paySuccess() {
infoBox.showToast('支付成功')
payStatus = 'success'
setTimeout(() => {
// uni.$emit('orderDetail:update')
uni.$emit('get:table')
uni.$emit('update:orderDetail')
uni.navigateBack({
delta: 1
})
websocketUtil.send(JSON.stringify({
type:'onboc',
account: uni.getStorageSync("iToken").loginId,
shop_id: uni.getStorageSync("shopId"),
operate_type:'cleanup',
table_code: order.tableCode,
}))
}, 1500)
}
/**
* 弹窗关闭
*/
function confirmModelCancel() {
if (modal.key == 'fullCoupon') {
// 取消改价
discount.discount = 100
discount.value = 0
}
modal.show = false
modal.key = ''
modal.data = ''
}
/**
* 弹窗确认
*/
async function confirmModelConfirm() {
if (modal.key == 'cash') {
await pay()
confirmModelCancel()
return
}
if (modal.key == 'fullCoupon') {
//删除满减券
const index = pays.quan.findIndex(v => v.type == 1)
pays.quan.splice(index, 1)
return
}
}
function objToArrary (obj) {
if (Object.values(obj) && Array.isArray(Object.values(obj)[0])){
// 是数组
let arr = []
Object.values(obj).forEach(item=>{
arr = [...arr,...item]
})
return arr
} else {
// 不是数组
return Object.keys(obj).map(key => obj[key])
}
}
/**
* 扫码/储值卡支付
*/
function saomaPay() {
const item = pays.payTypes.list[pays.payTypes.selIndex]
uni.scanCode({
onlyFromCamera: true,
success: function(res) {
console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result);
pay({
authCode: res.result
})
}
});
}
/**
* 现金支付唤起
*/
function cashConfirmShow() {
modal.content = '是否确认已现金收款' + payPrice.value
modal.key = 'cash'
modal.show = true
}
</script>
<style lang="scss" scoped>
$quan-color: #318AFE;
.op3 {
opacity: .3;
}
.hui {
// background-color: $quan-color;
background-image: linear-gradient(to right bottom, rgb(254, 103, 4), rgb(241, 50, 42));
padding: 4rpx 10rpx;
border-radius: 10rpx;
font-size: 24rpx;
color: #fff;
}
.box-shadow {
box-shadow: 0 0 5px #E5E5E5;
}
.pay-success {
color: #5CBB6F;
}
.icon {
width: 40rpx;
height: 40rpx;
}
.border-bottom-dashed {
border-bottom: 1px dashed #bbb;
}
.border-bottom {
border-color: rgb(240, 240, 240);
}
.list {
.item {
&.disabled {
color: #999;
}
}
.item:last-child {
.border-bottom {
border-bottom: none;
}
}
}
.old-price {
text-decoration: line-through;
}
.price-fuhao {
font-size: 24px;
}
.price {
font-size: 32px;
}
$dotSize: 20rpx;
$position: calc($dotSize / (-2));
.card {
position: relative;
&::after,
&:before {
content: '';
display: block;
position: absolute;
background-color: #F9F9F9;
width: $dotSize;
height: $dotSize;
border-radius: 50%;
}
&.top {
&::after {
right: $position;
bottom: $position;
}
&:before {
left: $position;
bottom: $position;
}
}
&.bottom {
&::after {
right: $position;
top: $position;
}
&:before {
left: $position;
top: $position;
}
}
}
</style>