|
|
- <template>
- <view class="payOrder">
- <mNavbar title="确认订单" :leftClick="leftClick" />
-
- <view class="bac"></view>
-
- <view class="box">
- <view class="server-item">
-
- <view class="img-box">
- <image :src="projectDetail.image" mode="aspectFill"></image>
- </view>
-
- <view class="server-info">
-
- <view class="server-title">{{ projectDetail.title }}</view>
-
- <view class="time-coupon">
- <image src="@/static/home/time-icon.png"></image>
- <view class="time">{{ projectDetail.times }}分钟</view>
- </view>
-
- <!-- <view class="price">
- <view class="current-price">
- <text class="unit">¥</text>299
- </view>
- <view class="original-price">
- <text class="unit">¥</text>399
- </view>
- </view> -->
- <!-- <view class="coupon">{{ projectDetail.subTitle }}</view> -->
- <view class="sales-volume">
- <image src="@/static/icons/icon1.png"></image>
- <view class="desc">已售出 {{ projectDetail.payNum }}+ 单</view>
- </view>
-
- </view>
- </view>
-
- <van-cell-group>
- <van-cell title="请选择地址" is-Link @click="selectAddressPopupShow = true"
- :value="(address.name + address.phone + address.addressDetail) || ''">
- <template #icon>
- <image class="icon" src="../../static/payOrder/7.png" mode="aspectFill"></image>
- </template>
- </van-cell>
-
- <van-cell title="服务技师">
-
- <text style="color: #4899a6;">{{ technicianDetail.title }}</text>
-
- <template #icon>
- <image class="icon" src="../../static/payOrder/1.png" mode="aspectFill"></image>
- </template>
-
- </van-cell>
-
- <van-cell title="服务时间" is-Link @click="onServiceTime">
-
- <text style="color: #4899a6;">
- {{ time.timeName ? (dateObj.format('MM-DD') + ' ' + time.timeName) : '' }}
- </text>
-
- <template #icon>
- <image class="icon" src="../../static/payOrder/3.png" mode="aspectFill"></image>
- </template>
-
- </van-cell>
-
- <van-cell title="出行方式">
- <text style="color: #fff;
- background-color: #6fc6ad;
- padding: 5px 10px;
- border-radius: 5px;
- font-size: 12px;">出租车</text>
- <template #icon>
- <image class="icon" src="../../static/payOrder/2.png" mode=""></image>
- </template>
- </van-cell>
-
- <!-- <van-cell title="出行费用">
- <text>¥{{ temp }}</text>
- <template #icon>
- <image class="icon" src="../../static/payOrder/2.png" mode="aspectFill"></image>
- </template>
- </van-cell> -->
-
- <view class="mileage">
- <view class="top">
- 全程共
- <text style="color: #4899a6;
- font-size: 16px;">{{ distance || 0}}</text>
- 公里
- </view>
- <view class="info">
- 2公里内免费 超过2公里每公里{{ travelMoney }}元
- </view>
- </view>
-
- <van-cell title="订单备注" is-Link @click="remarkShow = true">
- <text>{{ remark || '选填' }}</text>
- <template #icon>
- <image class="icon" src="../../static/payOrder/4.png" mode=""></image>
- </template>
- </van-cell>
- </van-cell-group>
-
- <van-cell-group style="margin-top: 10px;">
- <van-radio-group v-model="payMethod">
-
- <van-cell>
- <template #title>
- <text>账户余额</text>
- <text style="color: #888;">(余额:¥{{ userInfo.price }})</text>
- </template>
- <template #icon>
- <image class="icon" src="../../static/payOrder/5.png" mode=""></image>
- </template>
- <template #right-icon>
- <van-radio :name="1"></van-radio>
- </template>
- </van-cell>
-
- <van-cell title="微信支付">
-
- <template #icon>
- <image class="icon" src="../../static/payOrder/9.png" mode=""></image>
- </template>
-
- <template #right-icon>
- <van-radio :name="0"></van-radio>
- </template>
-
- </van-cell>
-
- </van-radio-group>
-
- </van-cell-group>
-
- <van-cell-group style="margin-top: 10px;">
-
- <van-cell title="优惠劵" is-Link @click="selectCouponPopupShow = true">
-
- <text v-if="coupon.money" style="color: #4899a6;">优惠 {{ coupon.money }}¥</text>
- <text v-else style="color: #4899a6;">{{ couponNum == 0 ? '无' : `${couponNum}张` }}</text>
-
- <template #icon>
- <image class="icon" src="../../static/payOrder/5.png" mode=""></image>
- </template>
-
- </van-cell>
-
- </van-cell-group>
-
- <view style="color: #888;font-size: 12px;padding: 10px 0;;">
- 温馨提示:下单前请仔细查看下单须知
- </view>
-
- <view class="agreement">
- <van-checkbox v-model="agreement"></van-checkbox>
- 本人已同意<text @click="configPopupShow = true" style="color: #6FDFBE;">《用户使用协议》</text>
- </view>
-
- </view>
-
- <view class="submit">
- <view class="price">
- <view>
- <text style="color: #000;">合计</text>
- ¥<text style="font-size: 18px;
- font-weight: 600;">{{ count }}</text>元
- </view>
- <view style="font-size: 10px;margin-top: 5px;">
- 已优惠¥{{ coupon.money || 0 }}元
- </view>
- </view>
- <view class="btn" @click="submit">
- 立即支付
- </view>
- </view>
-
- <selectTime :show="selectTimeShow" @select="selectTime" :dateList="dateList" :timeList="timeList"
- :loading="timeLoading" @selectDate="getVipTenOrderList" @close="selectTimeShow = false"
- :title="selectTimeTitle" />
-
- <selectTechnician :serviceId="projectDetail.id" @select="selectTechnician" :show="selectTechnicianShow"
- @close="selectTechnicianShow = false" />
-
- <selectCouponPopup :show="selectCouponPopupShow" @selectCoupon="selectCoupon" @countCouponNum="countCouponNum"
- @close="selectCouponPopupShow = false" />
-
- <selectAddressPopup :show="selectAddressPopupShow" @select="selectAddress"
- @close="selectAddressPopupShow = false" />
-
- <van-popup v-model:show="remarkShow" round position="bottom" @close="remarkShow = false"
- :style="{ height: '160px' }">
- <van-field v-model="remark" rows="4" autosize type="textarea" maxlength="50" placeholder="请输入留言"
- show-word-limit />
- </van-popup>
-
- <configPopup :keyValue="keyValue" :show="configPopupShow" :list="config" @close="configPopupShow = false" />
-
- </view>
- </template>
-
- <script>
- import mNavbar from '@/components/base/m-navbar.vue'
- import selectTime from '@/components/payOrder/selectTime.vue'
- import selectTechnician from '@/components/payOrder/selectTechnicianPopup.vue'
- import selectAddressPopup from '@/components/payOrder/selectAddressPopup.vue'
- import selectCouponPopup from '@/components/payOrder/selectCouponPopup.vue'
- import configPopup from '@/components/configPopup'
- import Position from '@/utils/position.js'
- import { showDialog } from 'vant';
- import { showNotify } from 'vant'
-
- export default {
- components: {
- mNavbar,
- selectTime,
- selectTechnician,
- selectAddressPopup,
- selectCouponPopup,
- configPopup
- },
- data() {
- return {
- payMethod: 1,
- remark: '',
- agreement: false,
- selectTimeShow: false,
- selectTechnicianShow: false,
- selectCouponPopupShow: false,
- selectAddressPopupShow: false,
- remarkShow: false,
- selectTimeTitle: '',
-
- technicianDetail: {},
- projectDetail: {},
- time: {},
- address: {},
- coupon: {},
- userInfo: {},
- order: [],
-
- dateList: [],
- timeList: [],
- timeLoading: false,
- dateObj: '',
- price: 0, //用于保存商品原价
- temp: 0,//路费
- count: 0, //计算出的价格
- configPopupShow: false,
- config: [],
- keyValue: 'protocol',
- distance : 0,
- travelMoney : 0,
- selectDay : '', //用户选择的日期
- couponNum : 0
- }
- },
- onShow() {
- this.getOrderDetail()
- this.getUserInfo()
- this.getConfig()
- let today = this.dayjs()
-
- this.dateList.push(today)
-
- for (let i = 1; i < 7; i++) {
- this.dateList.push(today.add(i, 'day'))
- }
- },
- methods: {
-
- //获取订单详情
- getOrderDetail() {
- this.$api('getOrderVipDetail', {
- id: this.$route.query.orderId
- }, res => {
- if (res.code == 200) {
- this.projectDetail = res.result.shop
- this.technicianDetail = res.result.technician
- this.order = res.result.order
-
- this.getVipTenOrderList(this.dayjs())
- this.initPrice()
- }
- })
- },
-
- //获取技师上钟时间
- getVipTenOrderList(item) {
- this.selectDay = item
- this.timeLoading = true
- this.$api('getVipTenOrderList', {
- tenId: this.technicianDetail.id,
- name: item.format('dddd')
- }, res => {
- if (res.code == 200) {
- this.timeList = res.result
- }
- this.timeLoading = false
- })
- },
-
- //获取用户信息
- getUserInfo() {
- this.$api('getUserInfo', {}, res => {
- if (res.code == 200) {
- this.userInfo = res.result;
- }
- })
- },
-
- //点击返回箭
- leftClick() {
- let {current,id,distance,orderId} = this.$route.query
- if (current == 'technicianDetail') { //返回技师详情
- return uni.navigateTo({
- url: `/pages/technician/technicianDetail?id=${id}&distance=${distance}`
- })
- }
- if (current == 'orderDetail') { //返回订单详情
- return uni.navigateTo({
- url: `/pages/order/orderDetail?id=${orderId}`
- })
- }
- uni.navigateTo({ //返回技师选择列表
- url: `/pages/technician/selectTechnician?serviceId=${this.projectDetail.id}`
- })
- },
-
- //支付
- submit() {
- if (!this.address.id) {
- return this.selectAddressPopupShow = true
- }
- if (!this.time.id) {
- return this.selectTimeShow = true
- }
- if (!this.agreement) {
- return uni.showToast({
- title: '请勾选用户使用协议协议',
- icon: 'none'
- })
- }
- let data = {
- addressId: this.address.id, //地址id
- orderId: this.order.id, //订单id
- payType: this.payMethod, // 支付类型
- remark: this.remark, //备注
- serviceTime: this.time.id, //服务时间
- travelType: 1, //出行方式
- travelDistance: this.distance, //技师距离
- serviceDate : this.selectDay.format('YYYY-MM-DD')//服务时间
- }
-
- if (this.coupon.id) {
- data.couponId = this.coupon.id //优惠劵id
- }
-
- this.$api('payVipOrder', data, res => {
- if (res.code == 200) {
- if (this.payMethod == 1) { //余额支付
- showDialog({
- title: '支付成功',
- message: '订单支付成功!请前往订单查看',
- }).then(() => {
- this.paySusscess()
- });
- } else if (this.payMethod == 0) { //微信支付
- this.$wxPay(res,this.paySusscess,this.paySusscess)
- }
- }else{ //不管订单是否支付成功,直接跳订单页面
- this.paySusscess()
- }
- })
- },
-
- //显示选择技师上钟时间弹框
- onServiceTime() {
- this.selectTimeShow = true
- this.selectTimeTitle = '请选择服务时间'
- },
-
- //选择技师上钟时间
- selectTime(obj) {
- this.selectTimeShow = false
- this.time = obj.time
- this.dateObj = obj.date
- },
-
- //选择技师
- selectTechnician(item) {
- this.selectTechnicianShow = false
- this.technicianDetail = item
- },
-
- //选择优惠券
- selectCoupon(item) {
- if (item.useMoney > this.price) { //判断优惠券使用条件(满多少可用)
- this.selectCouponPopupShow = false
- return uni.showToast({icon: 'none',title: `此券需满${item.useMoney}可用`});
- }
- this.count = this.price //先恢复商品价格,防止多次选择优惠券前端多次减金额
- this.selectCouponPopupShow = false
- this.coupon = item
- this.count = this.price - item.money
- },
-
- //显示选择地址弹框
- selectAddress(item) {
- if(!item.latitude && !item.longitude){ //判断地址信息有没有经纬度信息,避免出现距离计算出现问题
- this.selectAddressPopupShow = false
- return uni.showToast({icon: 'none',title: '选择的地址异常,请选择其他地址或重新添加'});
- }
- this.selectAddressPopupShow = false
- this.address = item
- this.calculatedDistance(); //计算两地距离
- },
-
- wxPay() {
- this.$api('createOrderWXPay', {}, res => {
- if (res.code == 200) {
- this.$wxPay(res,this.paySusscess,this.paySusscess)
- }
- })
- },
-
- //获取配置信息
- getConfig() {
- this.$api('getConfig', {}, res => {
- if (res.code == 200) {
- this.config = res.result
- res.result.forEach(item => {
- if(item.keyValue == 'travel_money'){
- this.travelMoney = item.content
- }
- })
- }
- })
- },
-
- //计算距离
- calculatedDistance(){ //计算距离
- // Position.getLocation(result => {
- // this.distance = Position.calculateDistance(result.latitude, result.longitude, this.technicianDetail.latitude, this.technicianDetail.longitude)
- // //计算路费
- // if (this.distance < 2) {
- // this.temp = 0
- // }else{
- // this.temp = Number((this.distance * this.travelMoney).toFixed(2));
- // this.initPrice()
- // }
- // })
- if(this.$route.query.setKmOpen=='Y'){ //是否打开了假距离
- this.distance = this.$route.query.distance
- }else{
- this.distance = Position.calculateDistance(this.address.latitude, this.address.longitude, this.technicianDetail.latitude, this.technicianDetail.longitude)
- }
- //计算路费
- if (this.distance < 2) {
- this.temp = 0
- }else{
- this.temp = Number((this.distance * this.travelMoney).toFixed(2));
- this.initPrice()
- }
- },
-
- //初始化金额数据(用于前端计算)
- initPrice(){
- this.price = Number(this.order.money + this.temp).toFixed(2)
- this.count = Number(this.order.money + this.temp).toFixed(2)
- },
-
- //支付成功(跳转订单)
- paySusscess(){
- uni.reLaunch({
- url: '/pages/index/order?active=2'
- })
- },
-
- //获取优惠券数量
- countCouponNum(num){
- this.couponNum = num
- }
- }
- }
- </script>
-
- <style scoped lang="scss">
- body {
- background-color: #f3f3f3;
- }
-
- .payOrder {
- .bac {
- position: absolute;
- width: 100%;
- height: 100px;
- background: linear-gradient(to right, #4899a6, #6fc6ad);
- }
-
- .box {
- position: relative;
- width: calc(100% - 30px);
- margin: 15px;
- margin-top: 30rpx;
- min-height: 500px;
- border-radius: 10px;
- padding-bottom: 80px;
-
- .server-item {
- display: flex;
- flex-wrap: wrap;
- justify-content: space-between;
- background: white;
- border-radius: 15rpx;
- box-sizing: border-box;
- padding: 25rpx;
- margin: 20rpx 0rpx;
-
- .img-box {
- width: 150rpx;
- height: 150rpx;
- background: #ccc;
- border-radius: 10rpx;
- overflow: hidden;
-
- image {
- width: 100%;
- height: 100%;
- }
- }
-
- .server-info {
- width: calc(100% - 150rpx);
- box-sizing: border-box;
- padding: 10rpx 15rpx;
- display: flex;
- flex-direction: column;
- justify-content: space-around;
-
- .server-title {
- font-size: 15px;
- }
-
- .time-coupon,
- .price {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- }
-
- .time-coupon {
- margin: 10rpx 0rpx;
- font-size: 26rpx;
-
- image {
- width: 25rpx;
- height: 25rpx;
- }
-
- .time {
- color: #B8B8B8;
- margin-left: 6rpx;
- }
- }
-
- .coupon {
- display: flex;
- justify-content: center;
- align-items: center;
- background: #F29E45;
- color: white;
- width: 140rpx;
- height: 45rpx;
- border-radius: 10rpx;
- margin-left: 10rpx;
- }
-
- // .price {
- // font-size: 26rpx;
- // color: #B8B8B8;
- // .current-price {
- // font-size: 30rpx;
- // font-weight: 600;
- // color: #D34430;
- // }
- // .unit{
- // font-size: 20rpx;
- // }
- // }
-
- .sales-volume {
- display: flex;
- align-items: center;
- color: #B8B8B8;
- font-size: 26rpx;
-
- image {
- width: 25rpx;
- height: 25rpx;
- }
-
- }
-
- }
- }
-
- .icon {
- width: 14px;
- height: 14px;
- vertical-align: middle;
- padding: 6rpx;
- }
-
- .mileage {
- display: flex;
- flex-direction: column;
- padding: 10px;
-
- .top {
- padding: 5px 10px;
- padding-left: 25px;
- background-color: #A1D9CC99;
- font-size: 12px;
- position: relative;
- }
-
- .top::after {
- content: '';
- position: absolute;
- display: block;
- width: 8px;
- height: 8px;
- background-color: #6fc6ad;
- top: 50%;
- left: 10px;
- transform: translate(0, -40%);
- border-radius: 4px;
- }
-
- .info {
- padding: 10px;
- background-color: #ECFFFB;
- color: #888;
- font-size: 11px;
- line-height: 20px;
- }
- }
-
- .agreement {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 10px 0;
-
- .van-checkbox{
- margin-right: 5rpx;
- }
- }
- }
-
- .submit {
- position: fixed;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 60px;
- background-color: #fff;
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .price {
- color: #F39637;
- padding: 0 20px;
- }
-
- .btn {
- background: linear-gradient(178deg, #4FD3BC, #60C285);
- color: white;
- width: 120px;
- height: 45px;
- border-radius: 23px;
- font-size: 16px;
- display: flex;
- justify-content: center;
- align-items: center;
- }
- }
- }
- </style>
|