123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- <template>
- <view class="container p-bottom" v-if="order.goodsList.length">
- <!-- 快递配送:配送地址 -->
- <view v-if="curDelivery == DeliveryTypeEnum.EXPRESS.value" @click="onSelectAddress" 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="order.address">
- <view class="detail-content__title dis-flex">
- <text class="f-30">{{ order.address.name }}</text>
- <text class="detail-content__title-phone f-28">{{ order.address.phone }}</text>
- </view>
- <view class="address detail-content__describe">
- <text class="region" v-for="(region, idx) in order.address.region" :key="idx">{{ region }}</text>
- <text class="detail">{{ order.address.detail }}</text>
- </view>
- </block>
- <block v-else>
- <view class="detail-content__describe dis-flex">
- <text class="col-6">请选择配送地址</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 class="checkout_list" v-for="(item, index) in order.goodsList" :key="index">
- <view class="flow-shopList dis-flex" data-index="index" @click="onTargetGoods(item.goods_id)">
- <!-- 商品图片 -->
- <view class="flow-list-left">
- <image mode="scaleToFill" :src="item.goods_image"></image>
- </view>
- <view class="flow-list-right flex-box">
- <!-- 商品名称 -->
- <text class="goods-name twoline-hide">{{ item.goods_name }}</text>
- <!-- 商品规格 -->
- <view class="goods-props clearfix">
- <view class="goods-props-item" v-for="(props, idx) in item.skuInfo.goods_props" :key="idx">
- <text class="group-name">{{ props.group.name }}: </text>
- <text>{{ props.value.name }};</text>
- </view>
- </view>
- <!-- 商品数量和单价 -->
- <view class="flow-list-cont dis-flex flex-x-between flex-y-center">
- <text class="small">×{{ item.total_num }}</text>
- <text class="flow-cont" :class="[item.is_user_grade ? 'price-delete' : '']">¥{{ item.goods_price }}</text>
- </view>
- <!-- 会员折扣价 -->
- <view v-if="item.is_user_grade" class="grade-price">
- <text>会员折扣价:¥{{ item.grade_goods_price }}</text>
- </view>
- </view>
- </view>
- </view>
- <view class="flow-num-box b-f">
- <text>共{{ order.orderTotalNum }}件商品,合计:</text>
- <text class="flow-money col-m">¥{{ order.orderTotalPrice }}</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">
- <text class="col-m">¥{{ order.orderTotalPrice }}</text>
- </view>
- </view>
- <!-- 优惠券 -->
- <view class="flow-all-list dis-flex">
- <text class="flex-five">优惠券:</text>
- <view class="flex-five t-r">
- <view v-if="order.couponList.length > 0" @click="handleShowPopup()">
- <text class="col-m" v-if="order.couponId > 0">-¥{{ order.couponMoney }}</text>
- <text class="col-m" v-else>有{{ order.couponList.length }}张优惠券</text>
- <text class="right-arrow iconfont icon-arrow-right"></text>
- </view>
- <text v-else class="">无优惠券可用</text>
- </view>
- </view>
- <!-- 积分抵扣 -->
- <view v-if="order.isAllowPoints" class="points flow-all-list dis-flex flex-y-center">
- <view class="block-left flex-five" @click="handleShowPoints()">
- <text class="title">可用{{ setting.points_name }}抵扣:</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">-¥{{ order.pointsMoney }}</text>
- <u-switch v-model="isUsePoints" size="48" active-color="#07c160" @change="getOrderData()"></u-switch>
- </view>
- </view>
- <!-- 配送费用 -->
- <view v-if="curDelivery == DeliveryTypeEnum.EXPRESS.value" class="dis-flex flow-all-list">
- <text class="flex-five">配送费用:</text>
- <view class="flex-five t-r">
- <view v-if="order.address">
- <text class="col-m" v-if="order.isIntraRegion">+¥{{ order.expressPrice }}</text>
- <text v-else>不在配送范围</text>
- </view>
- <view v-else>
- <text class="col-7">请先选择配送地址</text>
- </view>
- </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>
- <!-- 微信支付 -->
- <!-- #ifdef MP-WEIXIN -->
- <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-wechat-pay"></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-check"></text>
- </view>
- </view>
- <!-- #endif -->
- <!-- 余额支付 -->
- <view class="pay-item dis-flex flex-x-between" @click="handleSelectPayType(PayTypeEnum.BALANCE.value)">
- <view class="item-left dis-flex flex-y-center">
- <view class="item-left_icon balance">
- <text class="iconfont icon-balance-pay"></text>
- </view>
- <view class="item-left_text">
- <text>{{ PayTypeEnum.BALANCE.name }}</text>
- </view>
- <view class="user-balance">
- <text>(可用¥{{ personal.balance }}元)</text>
- </view>
- </view>
- <view class="item-right col-m" v-if="curPayType == PayTypeEnum.BALANCE.value">
- <text class="iconfont icon-check"></text>
- </view>
- </view>
- </view>
- <!-- 买家留言 -->
- <view class="flow-all-money b-f m-top20">
- <view class="ipt-wrapper dis-flex flow-all-list">
- <input v-model="remark" placeholder="选填:买家留言(50字以内)"></input>
- </view>
- </view>
- <!-- 提交订单 -->
- <view class="flow-fixed-footer b-f m-top10">
- <view class="dis-flex chackout-box">
- <view class="chackout-left pl-12">实付款:
- <text class="col-m">¥{{ order.orderPayPrice }}</text>
- </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="`${setting.points_name}说明`">
- <scroll-view class="points-content" :scroll-y="true">
- <text>{{ setting.points_describe }}</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 order.couponList" :key="index">
- <view class="item-wrapper"
- :class="[item.is_apply ? 'color-' + CouponColors[index % CouponColors.length] : 'color-gray']"
- @click="handleSelectCoupon(index)">
- <view class="coupon-type">{{ CouponTypeEnum[item.coupon_type].name }}</view>
- <view class="tip dis-flex flex-dir-column flex-x-center">
- <view v-if="item.coupon_type == CouponTypeEnum.FULL_DISCOUNT.value">
- <text class="f-30">¥</text>
- <text class="money">{{ item.reduce_price }}</text>
- </view>
- <text class="money"
- v-if="item.coupon_type == CouponTypeEnum.DISCOUNT.value">{{ item.discount }}折</text>
- <text class="pay-line">满{{ item.min_price }}元可用</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 v-if="item.start_time === item.end_time">{{ item.start_time }}</block>
- <block v-else>{{ item.start_time }}~{{ item.end_time }}</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>
- </view>
- </template>
- <script>
- import * as Verify from '@/utils/verify'
- import * as CheckoutApi from '@/api/checkout'
- import { CouponTypeEnum } from '@/common/enum/coupon'
- import DeliveryTypeEnum from '@/common/enum/order/DeliveryType'
- import PayTypeEnum from '@/common/enum/order/PayType'
- import { wxPayment } from '@/core/app'
- const CouponColors = ['red', 'blue', 'violet', 'yellow']
- export default {
- data() {
- return {
- // 枚举类
- DeliveryTypeEnum,
- PayTypeEnum,
- CouponTypeEnum,
- // 当前页面参数
- options: {},
- // 优惠券颜色组
- CouponColors,
- // 当前选中的配送方式
- curDelivery: null,
- // 当前选中的支付方式
- curPayType: PayTypeEnum.BALANCE.value,
- // 选择的优惠券
- selectCouponId: 0,
- // 是否使用积分抵扣
- isUsePoints: false,
- // 买家留言
- remark: '',
- // 禁用submit按钮
- disabled: false,
- // 是否显示积分说明
- showPoints: false,
- // 是否显示优惠券弹窗
- showPopup: false,
- // 按钮禁用
- disabled: false,
- // 订单信息 (从后端api中获取)
- order: {
- // 商品列表
- goodsList: [],
- // 优惠券列表
- couponList: [],
- // 是否存在收货地址
- existAddress: false,
- // 默认收货地址
- address: null,
- // 是否存在收货地址
- existAddress: false,
- // 当前用户收货城市是否存在配送规则中
- isIntraRegion: true,
- // 是否存在错误
- hasError: false,
- // 错误信息
- errorMsg: ''
- },
- // 个人信息
- personal: {},
- // 商城设置
- setting: {}
- }
- },
- /**
- * 生命周期函数--监听页面加载
- */
- onLoad(options) {
- this.options = options
- },
- /**
- * 生命周期函数--监听页面显示
- */
- onShow() {
- // 获取当前订单信息
- this.getOrderData()
- },
- methods: {
- // 获取订单数据
- getOrderData() {
- const app = this
- // 请求的参数
- const params = {
- delivery: app.curDelivery || 0,
- couponId: app.selectCouponId || 0,
- isUsePoints: app.isUsePoints ? 1 : 0,
- }
- // 请求api
- CheckoutApi.order(app.options.mode, app.getRequestParam())
- .then(result => {
- app.initData(result.data)
- })
- .catch(err => err)
- },
- // 初始化数据
- initData({ order, setting, personal }) {
- const app = this
- app.order = order
- app.personal = personal
- app.setting = setting
- app.order.goodsList.forEach((item) =>{
- item.goods_image = item.goods_image.replace('http://','https://')
- })
- // 显示错误信息
- if (order.hasError) {
- app.$toast(order.errorMsg)
- }
- // 当前选择的配送方式
- app.curDelivery = order.delivery
- // 如果只有一种配送方式则不显示选项卡
- app.isShowTab = setting.deliveryType.length > 1
- // 当前选择支付方式 (如果是微信小程序默认使用微信支付)
- if (app.$platform === 'MP-WEIXIN') {
- app.curPayType = PayTypeEnum.WECHAT.value
- }
- },
- // 获取api请求的参数
- getRequestParam() {
- const app = this
- const { options } = app
- // 结算模式的固定参数
- const modeParam = {}
- // 结算模式: 立即购买
- if (options.mode === 'buyNow') {
- modeParam.goodsId = options.goodsId
- modeParam.goodsNum = options.goodsNum
- modeParam.goodsSkuId = options.goodsSkuId
- }
- // 结算模式: 购物车
- if (options.mode === 'cart') {
- modeParam.cartIds = options.cartIds
- }
- // 订单结算参数(用户选择)
- const orderParam = {
- delivery: app.curDelivery || 0,
- couponId: app.selectCouponId || 0,
- isUsePoints: app.isUsePoints ? 1 : 0,
- }
- return { ...orderParam, ...modeParam }
- },
- // 显示积分说明
- handleShowPoints() {
- this.showPoints = true
- },
- // 显示优惠券弹窗
- handleShowPopup() {
- this.showPopup = true
- },
- // 选择优惠券
- handleSelectCoupon(index) {
- const app = this
- const { couponList } = app.order
- // 当前选择的优惠券
- const couponItem = couponList[index]
- // 判断是否在适用范围
- if (!couponItem.is_apply) {
- app.$toast(couponItem.not_apply_info)
- return
- }
- // 记录选中的优惠券id
- app.selectCouponId = couponItem.user_coupon_id
- // 重新获取订单信息
- app.getOrderData()
- // 隐藏优惠券弹层
- app.showPopup = false
- },
- // 不使用优惠券
- handleNotUseCoupon() {
- const app = this
- app.selectCouponId = 0
- // 重新获取订单信息
- app.getOrderData()
- // 隐藏优惠券弹层
- app.showPopup = false
- },
- // 选择支付方式
- handleSelectPayType(value) {
- this.curPayType = value
- },
- // 快递配送:选择收货地址
- onSelectAddress() {
- this.$navTo('pages/address/index', { from: 'checkout' })
- },
- // 跳转到商品详情页
- onTargetGoods(goodsId) {
- this.$navTo('pages/goods/detail', { goodsId })
- },
- // 订单提交
- onSubmitOrder() {
- const app = this
- if (app.disabled) {
- return false
- }
- // 表单验证
- if (!app.onVerifyFrom()) {
- return false
- }
- // 按钮禁用
- app.disabled = true
- // 请求api
- CheckoutApi.submit(app.options.mode, app.getFormData())
- .then(result => app.onSubmitCallback(result))
- .catch(err => {
- if (err.result) {
- const errData = err.result.data
- if (errData.is_created) {
- app.navToMyOrder()
- return false
- }
- }
- app.disabled = false
- })
- },
- // 订单提交成功后回调
- onSubmitCallback(result) {
- const app = this
- // 发起微信支付
- if (result.data.payType == PayTypeEnum.WECHAT.value) {
- wxPayment(result.data.payment)
- .then(() => app.$success('支付成功'))
- .catch(err => app.$error('订单未支付'))
- .finally(() => {
- app.disabled = false
- app.navToMyOrder()
- })
- }
- // 余额支付
- if (result.data.payType == PayTypeEnum.BALANCE.value) {
- app.$success('支付成功')
- app.disabled = false
- app.navToMyOrder()
- }
- },
- // 跳转到我的订单(等待1秒)
- navToMyOrder() {
- setTimeout(() => {
- this.$navTo('pages/order/index')
- }, 1000)
- },
- // 表单提交的数据
- getFormData() {
- const app = this
- const { options } = app
- // 表单数据
- const form = {
- delivery: app.curDelivery,
- payType: app.curPayType,
- couponId: app.selectCouponId || 0,
- isUsePoints: app.isUsePoints ? 1 : 0,
- remark: app.remark || '',
- }
- // 创建订单-立即购买
- if (options.mode === 'buyNow') {
- form.goodsId = options.goodsId
- form.goodsNum = options.goodsNum
- form.goodsSkuId = options.goodsSkuId
- }
- // 创建订单-购物车结算
- if (options.mode === 'cart') {
- form.cartIds = options.cartIds || null
- }
- return form
- },
- // 表单验证
- onVerifyFrom() {
- const app = this
- if (app.hasError) {
- app.$toast(app.errorMsg)
- return false
- }
- return true
- },
- }
- }
- </script>
- <style lang="scss" scoped>
- @import "./style.scss";
- </style>
|