<template> <view class="parking-lock"> <view class="Jump"> <view class="Jump-btn" @click="jumpArrears"> 欠费补缴 </view> </view> <!-- 车位锁 --> <view class="parking-lock-box"> <!-- 车位锁支付 --> <template v-if="parkingLockStatus === 1"> <view class="parking-lock-pay"> <view class="parking-lock-title">支付停车费</view> <view class="parking-lock-tips">请您确认停车费用,确认后请支付费用,结束停车。谢谢您的使用!</view> <view class="parking-lock-info"> <view class="parking-lock-info-item"> <view>停车场名称</view> <view>{{ orderInfo.roadName }}</view> </view> <view class="parking-lock-info-item"> <view>停车泊位</view> <view>{{ orderInfo.spaceName }}</view> </view> <view class="parking-lock-info-item"> <view>开始计费</view> <view>{{ orderInfo.inTime }}</view> </view> <view class="parking-lock-info-item"> <view>结束计费</view> <view>{{ orderInfo.outTime }}</view> </view> <view class="parking-lock-info-item"> <view>免费时长</view> <view>{{ orderInfo.freeDuration || `0天0时${free_time}分0秒` }}</view> </view> <view class="parking-lock-info-item"> <view>计费时长</view> <view>{{ orderInfo.calcDuration || 0 }}</view> </view> <view class="parking-lock-info-item"> <view>累计停车时长</view> <view>{{ orderInfo.duration || 0 }}</view> </view> <view class="parking-lock-info-item"> <view>应缴金额</view> <view class="really-money">{{ orderInfo.payAmount || 0 }} 元</view> </view> <view class="parking-lock-info-item"> <view>订单编号</view> <view>{{ orderInfo.orderId }}</view> </view> </view> <view class="parking-lock-pay-btn"> <button type="default" @click="payMoney">立即支付</button> </view> <view class="parking-lock-pay-attention"> <text> 温馨提示:车辆计费前您有{{ orderInfo.freeDurationNum / 60 }}分钟免费停车时长,{{ orderInfo.freeDurationNum / 60 }}分钟过后则升板锁车开始计费。 </text> </view> </view> </template> <!-- 车位锁开始状态 --> <template v-else-if="parkingLockStatus === 2"> <view class="parking-lock-begin"> <view class="parking-lock-begin-box"> <view class="parking-lock-begin-bg"> <image src="../../static/img/parking-lock-bg.png" mode=""></image> </view> </view> <view class="parking-lock-begin-info">车位锁正在动作,还未到位</view> </view> </template> <!-- 车位锁正在状态 --> <template v-else-if="parkingLockStatus === 3"> <view class="parking-lock-loading"> <view class="parking-lock-loading-box"> <view class="parking-lock-loading-bg"> <image src="../../static/img/parking-lock-bg.png" mode=""></image> </view> </view> <view class="parking-lock-loading-info">开锁中,请等待!</view> </view> </template> <!-- 开锁完成 --> <template v-else-if="parkingLockStatus === 4"> <view class="parking-lock-success"> <view class="parking-lock-success-box"> <image src="../../static/img/parking-lock-achieve.png" mode=""></image> </view> <view class="parking-lock-success-info">开锁已完成</view> <view class="parking-lock-success-button"> <button @click="cancel">返回</button> </view> </view> </template> <template v-else-if="parkingLockStatus === 5"> <view class="parking-lock-pay"> <view class="parking-lock-tips">{{ tipsMsg }}</view> </view> </template> <!-- 支付方式 --> <ChoosePayment ref="choosePayment" :curOrderList="orderList" :deviceNo="deviceNo" :jumpUrl="jumpUrl" /> <!-- 订单查询加载弹框 --> <u-popup v-model="show" mode="center" border-radius="14" width="200rpx" height="200rpx"> <view class="loadingSelect">订单查询中...</view> <view class="spinner"> <view class="rect1"></view> <view class="rect2"></view> <view class="rect3"></view> <view class="rect4"></view> <view class="rect5"></view> </view> </u-popup> </view> <!-- 广告轮播 --> <ad-banner/> <!-- 参数丢失弹框 --> <parmas-loss-pop :show="lossPopShow" /> <!-- 页面报错弹框 --> <page-error-pop :show="pageErrorShow" :tipText="pageErrorTxt" @pageErrorPopClose="pageErrorPopClose" /> <u-toast ref="uToast" /> </view> </template> <script> import getUrlParams from '@/utils/getUrlParams.js'; import ChoosePayment from '@/pages/choosePayment/choosePayment.vue'; import AdBanner from '@/components/ad-banner/ad-banner.vue'; import ParmasLossPop from '@/components/params-loss-pop/params-loss-pop.vue'; import PageErrorPop from '@/components/page-error-pop/page-error-pop.vue'; export default { components: { ChoosePayment, AdBanner, ParmasLossPop }, data() { return { // 车位锁状态 1:支付 2:开始开锁 3:开锁中 4:开锁完成 parkingLockStatus: 0, // 支付方式选择弹框 payWayPop: false, // 订单编号 orderList: [], // 提示信息 tipsMsg: null, // 设备编号 deviceNo: null, // 设备状态轮询 timer: null, // 订单状态查询轮询 timer1: null, // 订单信息 orderInfo: {}, // 订单id orderId: null, // 重定向地址 jumpUrl: location.href + '&isBack=1', // 订单查询中弹框显示 show: false, // 是否为返回标识 isBack: '', // 预支付订单 polyOrderId: '', lossPopShow: false, pageErrorShow: false, pageErrorTxt: '' }; }, onLoad(page) { if (page.orderId) { this.getOrderDetails(page.orderId); this.orderList = []; this.orderId = page.orderId; this.orderList.push(page.orderId); this.deviceNo = page.deviceNo; this.isBack = page?.isBack; this.polyOrderId = page?.polyOrderId; } else if (page.msg) { this.tipsMsg = page?.msg; this.parkingLockStatus = 5; } else { this.lossPopShow = true; } }, onShow() { if (this.orderId) { if (this.polyOrderId && this.isBack == 1) { this.timer1 = setInterval(() => { this.show = true; this.handlePayStatus(this.polyOrderId); }, 2000); } } else { this.show = false; } }, onUnload() { if (this.timer) { clearInterval(this.timer); } if (this.timer1) { clearInterval(this.timer1); } }, methods: { /** * 跳转欠费页面 * @date 2023-02-22 * @returns {any} */ jumpArrears() { uni.navigateTo({ url: '../center/order/order?orderStatus=2' }); }, /** * 反复查询支付状态 * @param { String } orderId */ handlePayStatus(orderId) { this.$u.api .getOrderInfo({ orderId }) .then((res) => { if (res.code === 200) { if (res.data.payStatus === 1 || res.data.payStatus === 3) { this.show = false; clearInterval(this.timer1); this.getOrderDetails(this.orderId); } } else { this.show = false; clearInterval(this.timer1); this.$refs.uToast.show({ title: res.msg, type: 'error' }); } }) .catch(() => { this.show = false; clearInterval(this.timer1); }); }, /** * 立即支付 * @date 2023-02-22 * @returns {any} */ payMoney() { this.$nextTick(() => { this.$refs['choosePayment'].openPopup({ ...this.orderInfo }, 'single', 'road'); }); }, /** * 根据订单id查询订单信息 * @date 2023-02-22 * @param {any} id * @returns {any} */ getOrderDetails(id) { this.$u.api .getOrderDetail({ id }) .then((res) => { if (res.code === 200 && res.data.id) { this.parkingLockStatus = 1; // 获取页面完整url const local = window.location.href; // 截取url中的isBack let isBack = getUrlParams(local, 'isBack'); // 如果没有isBack,则去请求 if (!isBack) { clearInterval(this.timer1); } this.orderInfo = res.data; if (res.data.payStatus === 1) { clearInterval(this.timer1); this.checkEqupment(); } } else { this.pageErrorShow = true; this.pageErrorTxt = res.msg || '订单无数据' if (this.timer1) { clearInterval(this.timer1); } } }) .catch(() => { if (this.timer1) { clearInterval(this.timer1); } }); }, // 检测设备 checkEqupment() { this.timer = setInterval(() => { this.getEqumentStatus(this.deviceNo); }, 1000); }, // 查询设备状态 getEqumentStatus(orderNo) { this.$u.api .getEquomentInfo({ orderNo }) .then((res) => { if (res.code === 200) { if (res.data.deviceStatus == 0) { this.parkingLockStatus = 4; clearInterval(this.timer); } else if (res.data.deviceStatus == 1 || res.data.deviceStatus == 5) { this.parkingLockStatus = 2; } else if (res.data.deviceStatus == 6) { this.parkingLockStatus = 3; } } else { clearInterval(this.timer); } }) .catch(() => { clearInterval(this.timer); }); }, // 返回首页 cancel() { uni.switchTab({ url: '/pages/index/index' }); }, pageErrorPopClose() { this.pageErrorShow = false; } } }; </script> <style lang="scss" scoped> @import './parkingLock.scss'; .Jump { display: flex; justify-content: flex-end; background-color: #f6f6ff; &-btn { color: rgb(0, 140, 255); padding: 20rpx 30rpx; } } </style>