<template> <view class="container p-bottom"> <view class="flow-mode"> <selectSwitch :switchList="orderModeList" checked_bj_color="#00acac" @change="switchMode"/> </view> <!-- 快递配送:配送地址 --> <view @click="onSelectAddress" v-if="orderMode == false" class="flow-delivery"> <view class="flow-delivery__detail dis-flex flex-y-center"> <view class="detail-location dis-flex"> <text class="iconfont icon-dingwei"></text> </view> <view class="detail-content flex-box"> <block v-if="address"> <view class="detail-content__title dis-flex"> <text class="f-30">{{ address.name }}</text> <text class="detail-content__title-phone f-28">{{ address.mobile }}</text> </view> <view class="address-info detail-content__describe"> <text class="region">{{ address.provinceName }}{{ address.cityName }}{{ address.regionName }}</text> <text class="detail">{{ address.detail }}</text> <text class="icon"> » </text> </view> </block> <block v-else> <view class="detail-content__describe dis-flex select-address"> <text class="col-6">请选择配送地址 <text class="icon"> > </text></text> </view> </block> </view> <view class="detail-arrow dis-flex"> <text class="iconfont icon-arrow-right"></text> </view> </view> </view> <!-- 门店自提:自提地址 --> <view v-if="orderMode == true" class="flow-delivery"> <view class="flow-delivery__detail dis-flex flex-y-center"> <view class="detail-location dis-flex"> <text class="iconfont icon-dingwei"></text> </view> <view class="detail-content flex-box"> <block> <view class="store"> <view class="f-30 store-name">{{ storeInfo ? storeInfo.name : '' }}</view> <view class="f-30 store-phone">{{ storeInfo ? storeInfo.phone : '' }}</view> <text class="f-30 store-address">{{ storeInfo ? storeInfo.address : '' }}</text> </view> </block> </view> <view class="detail-arrow dis-flex"> <text class="iconfont icon-arrow-right"></text> </view> </view> </view> <!-- 商品列表 --> <view class="m-top20"> <view v-for="(item, index) in goodsCart" :key="index" class="checkout_list"> <view class="flow-shopList dis-flex"> <!-- 商品图片 --> <view class="flow-list-left"> <image mode="scaleToFill" :src="item.goodsInfo.logo"></image> </view> <view class="flow-list-right flex-box"> <!-- 商品名称 --> <text class="goods-name twolist-hidden">{{ item.goodsInfo.name }}</text> <!-- 商品规格 --> <view class="goods-props clearfix"> <view class="goods-props-item" v-for="(props, idx) in item.specList" :key="idx"> <text class="group-name">{{ props.specName }}: </text> <text>{{ props.specValue }};</text> </view> </view> <!-- 商品数量和单价 --> <view class="flow-list-cont dis-flex flex-x-between flex-y-center"> <text class="small"> x {{ item.num }} </text> <text class="flow-cont">¥{{ item.goodsInfo.price }} </text> </view> </view> </view> </view> <view class="flow-num-box b-f"> <text>共{{ totalNum }}件,合计:</text> <text class="flow-money col-m">¥{{ totalPrice }}</text> </view> </view> <!-- 订单折扣 --> <view class="flow-all-money b-f m-top20"> <!-- 卡券 --> <view class="flow-all-list dis-flex"> <text class="flex-five">使用卡券抵扣:</text> <view class="flex-five t-r"> <view v-if="couponList.length > 0" @click="handleShowPopup()"> <text class="col-m" v-if="useCouponInfo">-¥{{ useCouponInfo.amount }}</text> <text class="col-m" v-else>共有卡券{{ couponList.length }}张</text> <text class="right-arrow iconfont icon-arrow-right"></text> </view> <text v-else class="">无卡券可用</text> </view> </view> <!-- 积分抵扣 --> <view class="points flow-all-list dis-flex flex-y-center" v-if="usePoint > 0"> <view class="block-left flex-five" @click="handleShowPoints()"> <text class="title">使用{{ usePoint }}积分抵扣:</text> <text class="iconfont icon-help"></text> </view> <view class="flex-five dis-flex flex-x-end flex-y-center"> <text class="points-money col-m">-¥{{ usePointAmount }}</text> <u-switch v-model="isUsePoints" size="48" active-color="#00acac" @change="getCartList()"></u-switch> </view> </view> </view> <!-- 支付方式 --> <view class="pay-method flow-all-money b-f m-top20"> <view class="flow-all-list dis-flex"> <text class="flex-five">支付方式</text> </view> <!-- 微信支付 --> <view class="pay-item dis-flex flex-x-between" @click="handleSelectPayType(PayTypeEnum.WECHAT.value)"> <view class="item-left dis-flex flex-y-center"> <view class="item-left_icon wechat"> <text class="iconfont icon-weixinzhifu"></text> </view> <view class="item-left_text"> <text>{{ PayTypeEnum.WECHAT.name }}</text> </view> </view> <view class="item-right col-m" v-if="curPayType == PayTypeEnum.WECHAT.value"> <text class="iconfont icon-duihao"></text> </view> </view> </view> <!-- 买家留言 --> <view class="flow-all-money b-f m-top20"> <view class="ipt-wrapper"> <textarea v-model="remark" rows="3" maxlength=100 placeholder="买家留言 (选填,100字以内)" type="text"></textarea> </view> </view> <!-- 提交订单 --> <view class="flow-fixed-footer b-f m-top10"> <view class="dis-flex chackout-box"> <view class="chackout-left pl-12"> <view class="col-amount-do">支付金额: <text class="pay-amount">¥{{ payPrice ? payPrice.toFixed(2) : '0.00' }}</text> <view v-if="deliveryFee > 0 && orderMode == false" class="delivery-fee">( 配送费:¥{{ deliveryFee.toFixed(2) }} )</view> </view> </view> <view class="chackout-right" @click="onSubmitOrder()"> <view class="flow-btn f-32" :class="{ disabled }">提交订单</view> </view> </view> </view> <!-- 积分说明弹窗 --> <u-modal v-model="showPoints" :title="`积分说明`"> <scroll-view class="points-content" :scroll-y="true"> <text>积分兑换金额</text> </scroll-view> </u-modal> <!-- 卡券弹出框 --> <u-popup v-model="showPopup" mode="bottom"> <view class="popup__coupon"> <view class="coupon__title f-30">选择卡券</view> <!-- 卡券列表 --> <view class="coupon-list"> <scroll-view :scroll-y="true" style="height: 565rpx;"> <view class="coupon-item" v-for="(item, index) in couponList" :key="index"> <view class="item-wrapper" :class="[item.status == 'A' ? 'color-default': 'color-gray']" @click="handleSelectCoupon(index)"> <view class="coupon-type">{{ item.type }}</view> <view class="tip dis-flex flex-dir-column flex-x-center"> <text class="money">¥{{ item.amount }}</text> <text class="pay-line">{{ item.description }}</text> </view> <view class="split-line"></view> <view class="content dis-flex flex-dir-column flex-x-between"> <view class="title">{{ item.name }}</view> <view class="bottom dis-flex flex-y-center"> <view class="time flex-box"> <block>{{ item.effectiveDate }}</block> </view> </view> </view> </view> </view> </scroll-view> </view> <!-- 不使用卡券 --> <view class="coupon__do_not dis-flex flex-y-center flex-x-center"> <view class="control dis-flex flex-y-center flex-x-center" @click="handleNotUseCoupon()"> <text class="f-26">不使用卡券</text> </view> </view> </view> </u-popup> <!-- 支付方式弹窗 --> <u-popup v-model="showPayPopup" mode="bottom" :closeable="true"> <view class="pay-type-popup"> <view class="title">请选择支付方式</view> <view class="pop-content"> <!-- 微信支付 --> <view class="pay-item dis-flex flex-x-between" @click="doSubmitOrder(PayTypeEnum.WECHAT.value)"> <view class="item-left dis-flex flex-y-center"> <view class="item-left_icon wechat"> <text class="iconfont icon-weixinzhifu"></text> </view> <view class="item-left_text"> <text>{{ PayTypeEnum.WECHAT.name }}</text> </view> </view> </view> <!-- 余额支付 --> <view class="pay-item dis-flex flex-x-between" @click="doSubmitOrder(PayTypeEnum.BALANCE.value)"> <view class="item-left dis-flex flex-y-center"> <view class="item-left_icon balance"> <text class="iconfont icon-qiandai"></text> </view> <view class="item-left_text"> <text>{{ PayTypeEnum.BALANCE.name }}</text> </view> </view> </view> </view> </view> </u-popup> </view> </template> <script> import * as Verify from '@/utils/verify' import * as CartApi from '@/api/cart' import * as SettlementApi from '@/api/settlement' import DeliveryTypeEnum from '@/common/enum/order/DeliveryType' import PayTypeEnum from '@/common/enum/order/PayType' import { wxPayment } from '@/utils/app' import selectSwitch from "@/components/xuan-switch/xuan-switch.vue"; import * as AddressApi from '@/api/address' import * as settingApi from '@/api/setting' export default { components: { selectSwitch }, data() { return { // 枚举类 PayTypeEnum, // 当前页面参数 options: {}, // 当前选中的支付方式 curPayType: PayTypeEnum.WECHAT.value, // 买家留言 remark: '', // 禁用submit按钮 disabled: false, // 按钮禁用 disabled: false, goodsCart: [], // 优惠券列表 couponList: [], totalPrice: 0, payPrice: 0, totalNum: 0, deliveryFee: 0, orderModeList: ['门店自提', '物流配送'], orderMode: true, address: null, useCouponInfo: null, selectCouponId: 0, myPoint: 0, usePoint: 0, usePointAmount: 0.00, // 是否使用积分抵扣 isUsePoints: true, // 是否显示积分说明 showPoints: false, // 是否显示卡券弹窗 showPopup: false, storeInfo: null, // 支付方式弹窗 showPayPopup: false, // 订单ID orderId: "" } }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { this.options = options; }, /** * 生命周期函数--监听页面显示 */ onShow() { const app = this; if (app.orderId) { app.navToOrderResult(app.orderId); } // 获取购物车信息 app.getCartList(); // 获取默认收货地址 app.getDefaultAddress(); // 获取店铺信息 app.getStoreInfo(); }, methods: { // 获取购物车信息 getCartList() { const app = this if (!app.isUsePoints) { app.usePoint = 0; app.usePointAmount = 0; } return new Promise((resolve, reject) => { // 配送或自取 let orderMode = "oneself"; if (!app.orderMode) { orderMode = "express"; } CartApi.list(app.options.cartIds, app.options.goodsId, app.options.skuId, app.options.buyNum, app.selectCouponId, app.isUsePoints, orderMode) .then(result => { app.goodsCart = result.data.list; app.totalNum = result.data.totalNum; app.totalPrice = result.data.totalPrice; app.payPrice = result.data.payPrice; app.couponList = result.data.couponList; app.useCouponInfo = result.data.useCouponInfo; app.usePoint = result.data.usePoint; app.myPoint = result.data.myPoint; app.deliveryFee = result.data.deliveryFee; if (app.usePoint < 1) { app.isUsePoints = false; } app.usePointAmount = result.data.usePointAmount; resolve(result); }) .catch(err => reject(err)) }) }, // 获取默认收货地址 getDefaultAddress() { const app = this AddressApi.detail(0) .then(result => { app.address = result.data.address ? result.data.address : null; }) }, // 显示积分说明 handleShowPoints() { this.showPoints = true; }, // 显示卡券弹窗 handleShowPopup() { this.showPopup = true; }, // 选择卡券 handleSelectCoupon(index) { const app = this; // 当前选择的卡券 const couponItem = app.couponList[index]; // 记录选中的卡券id if (couponItem.status != 'A') { app.$error('该卡券不可用'); return false; } app.selectCouponId = couponItem.userCouponId; // 重新获取购物车信息 app.getCartList(); // 隐藏卡券弹层 app.showPopup = false; }, // 不使用卡券 handleNotUseCoupon() { const app = this; app.selectCouponId = 0; // 重新获取购物车信息 app.getCartList(); // 隐藏卡券弹层 app.showPopup = false; }, // 选择支付方式 handleSelectPayType(value) { this.curPayType = value }, // 快递配送:选择收货地址 onSelectAddress() { this.$navTo('pages/address/index', { from: 'checkout' }) }, // 切换配送模式 switchMode(mode) { const app = this; app.orderMode = mode; if (mode && !app.storeInfo) { app.getStoreInfo(); } app.getCartList(); }, // 获取店铺详情 getStoreInfo() { const app = this; if (!app.storeInfo) { settingApi.storeDetail() .then(result => { app.storeInfo = result.data.storeInfo; }) } }, // 弹出支付方式 onSubmitOrder() { const app = this if (app.disabled) { return false } if (app.totalPrice < 0 || app.goodsCart.length < 1) { app.disabled = true return false } // 表单验证 if (!app.orderMode && app.address == undefined) { app.$toast('请先选择配送地址哦') return false } // 配送或自取 let orderMode = "oneself"; if (!app.orderMode) { orderMode = "express"; } app.showPayPopup = true; }, // 订单提交 doSubmitOrder(payType) { const app = this; if (app.disabled) { app.$toast('请勿重复提交订单'); return false; } if (app.totalPrice < 0 || app.goodsCart.length < 1) { app.$toast('提交订单商品有误'); app.disabled = true; return false; } // 表单验证 if (!app.orderMode && app.address == undefined) { app.$toast('请先选择配送地址哦'); return false; } // 配送或自取 let orderMode = "oneself"; if (!app.orderMode) { orderMode = "express"; } // 按钮禁用 app.disabled = true; // 请求api SettlementApi.submit(0, "", "goods", app.remark, 0, app.usePoint, app.selectCouponId, app.options.cartIds, app.options.goodsId, app.options.skuId, app.options.buyNum, orderMode, payType) .then(result => { app.onSubmitCallback(result); }) .catch(err => { if (err.result) { const errData = err.result.data; if (errData.isCreated) { app.navToOrderResult(errData.orderInfo.id); return false; } } app.disabled = false; }) }, // 订单提交成功后回调 onSubmitCallback(result) { const app = this; if (result.code != '200' && !result.data) { if (result.message) { app.$error(result.message); } else { app.$error('订单提交失败'); } app.disabled = false; return false; } // 发起微信支付 if (result.data.payType == PayTypeEnum.WECHAT.value) { // #ifdef H5 app.orderId = result.data.orderInfo.id; // #endif wxPayment(result.data.payment).then(() => { app.$success('支付成功'); }).catch(err => { app.$error('支付失败'); }).finally(() => { app.disabled = false; app.navToOrderResult(result.data.orderInfo.id, ''); }) } // 余额支付 if (result.data.payType == PayTypeEnum.BALANCE.value) { app.disabled = false; app.navToOrderResult(result.data.orderInfo.id, result.message); } }, // 跳转到订单结果页 navToOrderResult(orderId, message) { this.$navTo('pages/order/result?orderId='+orderId+'&message=' + message); } } } </script> <style lang="scss" scoped> @import "./style.scss"; </style>