414 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			414 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Vue
		
	
	
| <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>
 |