glhcp/uniapp/pages/confirm_order/confirm_order.vue

414 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view>
<view class="confirm-order">
<view class="confirm-con">
<navigator hover-class="none" url="/bundle/pages/user_address/user_address?type=1">
<view class="address flex bg-white">
<image class="icon-md m-r-20" src="/static/images/icon_address.png"></image>
<view class="flex-1 m-r-20">
<view class="black md" v-if="!address.contact">设置收货地址</view>
<view v-else>
<text class="name md m-r-10">{{address.contact}}</text>
<text class="phone md">{{address.telephone}}</text>
<view class="area sm m-t-10 lighter">
{{address.province}} {{address.city}} {{address.district}} {{address.address}}
</view>
</view>
</view>
<u-icon name="arrow-right"></u-icon>
</view>
</navigator>
<!-- 拼团商品 -->
<block v-if="teamId==undefined">
<view class="goods contain" v-for="(item,index) in shopLists" :key="index">
<order-shop :order-type="orderInfo.order_type" :item="item" :invoice="invoiceArr" @changeremark="changeRemark"
@changecoupon="changeCoupon($event,index)" @changeIsFrontend="changeIsFrontend"></order-shop>
</view>
</block>
<!-- 其他商品 -->
<block v-else>
<view class="goods contain">
<order-shop :order-type="orderInfo.order_type" :item="shopLists" :invoice="invoiceArr" @changeremark="changeRemark" @changeIsFrontend="changeIsFrontend"
></order-shop>
</view>
</block>
</view>
<view class="footer bg-white flex row-between fixed">
<view class="all-price lg flex">
<text>合计:</text>
<view class="primary">
<price-format weight="500" :first-size="36" :second-size="36" :price="orderInfo.total_amount">
</price-format>
</view>
</view>
<button class="btn br60 white" size="md" hover-class="none" @tap="onSubmitOrder">
提交订单
</button>
</view>
</view>
<loading-view v-if="showLoading" background-color="transparent" :size="50"></loading-view>
<loading-view v-if="isFirstLoading"></loading-view>
</view>
</template>
<script>
import {
orderInfo,
orderBuy,
getOrderCoupon
} from '@/api/order';
import {
teamBuy,
teamKaiTuan
} from '@/api/activity'
import {
prepay,
getMnpNotice,
getPayway
} from '@/api/app';
import {
wxpay,
alipay
} from '@/utils/pay'
// total_amount
export default {
data() {
return {
isFirstLoading: true,
showLoading: false,
address: {},
orderInfo: {},
shopLists: [],
addressId: '',
useIntegral: 0,
userRemark: [],
couponId: [],
teamId: undefined,
carts: [],
type: '',
goods: '',
bargainLaunchId: -1,
invoiceArr: [] ,// 发票数组
is_frontend:'', //是否前置
};
},
onLoad(options) {
uni.$on("selectaddress", (e) => {
this.addressId = e.id;
this.orderBuyFun();
})
// 监听发票传回的值,
uni.$on('invoice', params => {
const index = this.invoiceArr.findIndex(el => el.shop_id == params.shop_id)
if ( params.del == true && this.invoiceArr.length) {
this.invoiceArr.splice(index, 1);
} else {
if ( index == -1 ) this.invoiceArr = [...this.invoiceArr, params]
else this.invoiceArr.splice(index, 1, params);
}
})
const {
data: {
goods,
carts,
teamId,
foundId,
type
}
} = this.$Route.query
this.goods = goods
this.bargainLaunchId = goods[0].bargain_launch_id
this.carts = carts || []
this.type = type
this.teamId = teamId
// 参团的id如果为空的话就是开团如果有数据就是参团
this.foundId = foundId || ''
this.orderBuyFun();
},
onUnload() {
uni.$off("selectaddress")
uni.$off("payment")
uni.$off("invoice")
},
methods: {
// 备注
changeRemark(e) {
let index = this.userRemark.findIndex((item) => item.shop_id == e.shop_id)
if (index == -1) {
this.userRemark.push(e)
} else {
this.userRemark[index].remark = e.remark
}
this.userRemark = this.userRemark.filter((item) => item.remark)
},
// 是否前置
changeIsFrontend(e) {
this.is_frontend = e.is_frontend;
},
// 选中优惠券
changeCoupon(e, index) {
this.couponId[index] = e
this.orderBuyFun()
},
getAuthMsg() {
return new Promise(resolve => {
getMnpNotice({
scene: 1
}).then(res => {
if (res.code == 1) {
uni.requestSubscribeMessage({
tmplIds: res.data,
fail(res) {
console.log(res.errMsg);
},
complete() {
resolve();
}
});
} else {
resolve();
}
});
});
},
onSubmitOrder() {
uni.showModal({
title: '温馨提示',
content: '是否确认下单?',
confirmColor: '#FF2C3C',
success: async res => {
let {
confirm
} = res;
if (confirm) {
// #ifdef MP-WEIXIN
await this.getAuthMsg();
//#endif
this.showLoading = true
this.orderBuyFun('submit');
}
}
});
},
async orderBuyFun(action = 'info') {
const {
userRemark,
useIntegral,
carts,
goods,
bargainLaunchId,
couponId
} = this;
const submitObj = {
goods: JSON.stringify(goods),
address_id: this.addressId,
cart_id: carts.join(),
coupon_id: couponId.filter(item => item),
// bargain_launch_id是砍价的判断
bargain_launch_id: this.bargainLaunchId == -1 ? '' : this.bargainLaunchId
};
// 判断是不是拼团的,并且是获取订单数据
if (this.teamId && action == 'info') {
delete submitObj.goods;
submitObj.action = 'info';
submitObj.item_id = this.goods[0].item_id;
submitObj.count = this.goods[0].num;
submitObj.goods_id = this.goods[0].goods_id
submitObj.team_id = this.teamId;
}
// 判断是不是拼团的,并且是提交订单
if (this.teamId && action == 'submit') {
submitObj.action = 'buy';
submitObj.item_id = this.goods[0].item_id;
submitObj.count = this.goods[0].num;
submitObj.goods_id = this.goods[0].goods_id
submitObj.team_id = this.foundId;
}
if (action == 'submit') {
// 拿第一个店铺的 delivery_type 类型,虚拟商品不能加入购物车所以不用考虑会虚拟商品和实物商品出错
submitObj.delivery_type = this.shopLists[0]?.delivery_type || 0
console.log(this.shopLists)
submitObj.remark = userRemark.length ? JSON.stringify(userRemark) : ''
submitObj.invoice = JSON.stringify(this.invoiceArr)
submitObj.is_frontend = this.is_frontend;
}
let {
data: orderData,
code: orderCode,
msg: orderMsg
} = action == 'info' ? this.teamId ? await teamKaiTuan(submitObj) : await orderInfo(submitObj) :
this.teamId ? await teamKaiTuan(submitObj) : await orderBuy(submitObj)
// 如果是info的话说明是获取订单数据用拼团的id判断当前是否是拼团是的话调用teamKaiTuan不是的话调用普通订单获取orderInfo
// 判断是不是拼团订单是的话调用teamKaiTuan提交拼团订单否则就是普通订单orderBuy
if(orderMsg == '抱歉,库存不足') {
setTimeout(() => {
uni.navigateBack(1)
},500)
}
if (orderCode !== 1) return this.showLoading = false
if (action == 'info') {
const {
shop,
address
} = orderData
this.address = address
this.shopLists = shop
this.orderInfo = orderData
this.$nextTick(() => {
this.isFirstLoading = false
});
} else if (action == 'submit') {
this.showLoading = false
let order_id = ''
const type = orderData.type
switch(type) {
case 'order': order_id = orderData.order_id; break;
case 'trade': order_id = orderData.trade_id; break;
}
uni.$on('payment', params => {
setTimeout(() => {
if (params.result) {
console.log('Jason', this)
this.$Router.replace({
path: '/pages/pay_result/pay_result',
query: {
id: params.order_id,
from: params.from
}
})
} else {
this.$Router.replace({
path: '/bundle/pages/user_order/user_order'
})
}
}, 1 * 1000)
})
if(this.is_frontend == 1) {
this.$Router.replace({
path: '/bundle/pages/user_order/user_order'
})
}else {
uni.navigateTo({
url: `/pages/payment/payment?from=${type}&order_id=${order_id}`
})
}
}
}
},
watch: {
address(val) {
this.addressId = val.id
}
}
}
</script>
<style lang="scss" scoped>
.confirm-order {
.confirm-con {
overflow: hidden;
padding-bottom: calc(120rpx + env(safe-area-inset-bottom));
.address {
min-height: 164rpx;
padding: 0 24rpx;
border-radius: 14rpx;
margin: 20rpx 20rpx 0;
}
.img-line {
height: 1.5px;
width: 100%;
display: block;
}
}
.price {
padding: 28rpx 20rpx;
.item:not(:last-of-type) {
margin-bottom: 20rpx;
}
}
.contain {
border-radius: 14rpx;
margin: 20rpx 20rpx 0;
background-color: #fff;
overflow: hidden;
}
.radio-group {
display: block;
}
.footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 100rpx;
padding: 0 30rpx;
box-sizing: content-box;
padding-bottom: env(safe-area-inset-bottom);
.btn {
background: linear-gradient(90deg, rgba(249, 95, 47, 1) 0%, rgba(255, 44, 60, 1) 100%);
padding: 0 50rpx;
}
}
}
// .confirm-order .van-cell:after {
// border: none;
// }
// .goods .shop-icon {
// width: 40rpx;
// height: 40rpx;
// }
// .pop-title {
// height: 100rpx;
// border-bottom: 1rpx solid #F2F2F2;
// }
// .pop-title .title {
// margin-left: 30rpx;
// font-size: 34rpx;
// font-weight: bold;
// line-height: 36rpx;
// }
</style>