瀏覽代碼

Merge branch 'release-3.15.0' into John/release-3.14.0/KIP-17684

john 11 月之前
父節點
當前提交
491e917208

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "temporay-parking",
-  "version": "3.13.0",
+  "version": "3.15.0",
   "private": true,
   "scripts": {
     "serve": "cross-env NODE_ENV=dev vue-cli-service serve",

+ 3 - 1
src/api/parking/index.js

@@ -84,7 +84,9 @@ export function currentUnlicensedPlate() {
 export function unlicensedCarCheckIn(params) {
   return window.requestms.post(`/parking/unlicensed-car-check-in`, params, { loading: true });
 }
-
+export function unlicensedCarGetVehicle(qrcode) {
+  return window.requestms.get(`/parking/unlicensed-car-get-vehicle-no?qrCodeId=${qrcode}`, { loading: true });
+}
 /* 开票相关接口api */
 
 // 未开票列表

+ 82 - 138
src/pages/parkingFeeV2/mixins/parkingFeeCoupon.js

@@ -1,13 +1,9 @@
-import { mapState } from 'vuex';
+import {mapState} from 'vuex';
 import uni from '@/utils/uniHooks';
-// import { initWxJsSdkConfig } from '@/utils/login';
-import { Toast } from 'vant';
-import { getPlatform, getAppIdByGroupIdAndMallId, isInWeixinH5 } from '@/utils';
-import { initWxJsSdkConfig } from '@/utils/login';
+import {Toast} from 'vant';
+import {getPlatform, getAppIdByGroupIdAndMallId, isInWeixinH5} from '@/utils';
 import moment from 'moment'
-// import { compare } from '@/utils/location.js';
-// import { isArray } from 'lodash';
-// import { v4 as uuidv4 } from 'uuid';
+import {debounce, throttle} from 'lodash';
 
 export default {
   data() {
@@ -20,7 +16,13 @@ export default {
       maxCouponFee: 0, // 计算优惠券已选的总金额
       remainPrice: 0, // 剩余可用优惠额度
       newAvailableDiscountFee: 0, // 可使用的电子券的优惠金额上限
-      extraData: {}
+      extraData: {},
+      // 虚拟dom
+      offset: 0,
+      height: 0,
+      rowHeight: 105,
+      rowData: [...new Array(30)].map((i, index) => index),
+      handleScrollDebounce: null
     };
   },
   computed: {
@@ -32,47 +34,50 @@ export default {
       maxOneDayDiscountFee: (state) => state.order.maxOneDayDiscountFee, // 深圳单日单次使用上限
       usingTotalDiscount: (state) => state.order.usingTotalDiscount, // 当前已使用优惠
       availableDiscountFee: (state) => state.order.availableDiscountFee, // 当前已使用优惠
-      paperDiscountFee: (state) => state.order.paperDiscountFee, // 当前已使用优惠
       unLimitWeekendPoints: (state) => state.order.unLimitWeekendPoints, // 新的积分上限, 默认为false(不开启), unLimitWeekendPoints: true # 开启无上限功能;   unLimitWeekendPoints: false # 关闭无上限功能;
       lbsId: (state) => state.lbsId, // 楼栋ID
       groupId: (state) => state.groupId, // 楼盘ID
-      remainCoupons: ( state ) => state.order.remainCoupons, // 仅限杭州当前剩余可选电子券上限
-      parkMallCode: ( state ) => state.order.parkMallCode, // 当前车场的数据
-      maxOneDayCoupons: ( state ) => state.order.maxOneDayCoupons,// 仅限杭州当日电子券可选上限
-      paperDiscountFee: ( state ) => state.order.paperDiscountFee,// 纸质券的优惠金额
+      remainCoupons: (state) => state.order.remainCoupons, // 仅限杭州当前剩余可选电子券上限
+      parkMallCode: (state) => state.order.parkMallCode, // 当前车场的数据
+      maxOneDayCoupons: (state) => state.order.maxOneDayCoupons,// 仅限杭州当日电子券可选上限
+      paperDiscountFee: (state) => state.order.paperDiscountFee,// 纸质券的优惠金额
     }),
-    totalFee () {
+    totalFee() {
       return this?.orderDetail?.parkingRecord?.totalFee
     }
   },
-
   mounted() {
-    // console.log('parkingFeeCoupon.js');
-    // setTimeout(() => {
-    //   uni.setNavigationBarTitle({
-    //     title: '优惠券',
-    //   });
-    //   if (isInWeixinH5()) {
-    //     initWxJsSdkConfig(['checkJsApi', 'chooseImage'], ['wx-open-launch-weapp']);
-    //     this.launchPathInit();
-    //   }
-    // }, 300);
-    // setTimeout(() => {
-    //   window?.toWXSendMsg({
-    //     type: 'uni_func',
-    //     funcName: 'setNavigationBarColor',
-    //     options: {
-    //       frontColor: '#000000',
-    //       backgroundColor: '#FBFCFF',
-    //     },
-    //   });
-    // }, 500)
+    this.height = window.document.documentElement.offsetHeight;
+    if(!this.handleScrollDebounce) {
+      this.handleScrollDebounce = debounce(this.handleScroll, 100)
+    }
+    window.addEventListener('scroll', this.handleScrollDebounce, false);
     this.pageInit();
   },
   methods: {
+    handleScroll(e) {
+      const scrollingElement = e.target.scrollingElement;
+      const scrollTop = scrollingElement.scrollTop;
+      const scrollHeight = scrollingElement.scrollHeight;
+      const clientHeight = scrollingElement.clientHeight;
+      // 计算是否已经滚动到底部
+      const isAtBottom = scrollTop + clientHeight >= scrollHeight - this.rowHeight * 2;
+      if (isAtBottom) {
+        // 只有当滚动到底部时才进行计算
+        if (!this.rowHeight && this.coupons.length) {
+          this.rowHeight = scrollTop / (this.coupons.length === 20 ? 20 : this.coupons.length);
+        }
+        if (this.rowHeight > 100 && this.coupons.length > this.rowData.length) {
+          const newRowDataCount = Math.round(scrollTop / this.rowHeight);
+          if (newRowDataCount >= 20) {
+            this.rowData = Array.from({length: this.rowData.length + 10}, (_, index) => index);
+          }
+        }
+      }
+    },
     pageInit() {
       const {parkInfo} = this.orderDetail
-      const { parkMallCode } = parkInfo;
+      const {parkMallCode} = parkInfo;
       /*
        * 电子优惠券初始化逻辑(后端处理)
        *
@@ -83,7 +88,7 @@ export default {
       this.remainPrice = this.usingTotalDiscount - this.paperDiscountFee;
       if ((this.parkMallCode === 4 || this.parkMallCode === 6) && this.orderDetail?.discountInfo?.points?.[0]?.discountFee) {
         this.remainPrice = this.remainPrice - this.orderDetail.discountInfo.points[0].discountFee
-      }   
+      }
       // 前海积分不参与当前电子券优惠上限
       if ( [ 5, 8, 10 ].indexOf(parkMallCode) > -1 && this.orderDetail.discountInfo?.points?.[0]?.discountFee) {
         this.remainPrice = this.remainPrice - this.orderDetail?.discountInfo?.points[0]?.discountFee
@@ -115,7 +120,7 @@ export default {
           this.setAllDisabled()
           if (this.parkMallCode === 4 || this.parkMallCode === 6  || this.parkMallCode === 5 || this.parkMallCode === 8) {
             this.isDisabledByRule(this.couponList[0], 0, 'showMsg');
-          }          
+          }
         })
       }
     },
@@ -123,8 +128,8 @@ export default {
       return Number.parseInt(i.replace(/coupon/g, ''));
     },
     checkboxItemChange(name, index) {
-      const coupon  = this.couponList[index];
-      if ( coupon.disabled ) {
+      const coupon = this.couponList[index];
+      if (coupon.disabled) {
         if (this.getAmountToBePaid() <= 0) {
           Toast('当前无需追加优惠')
           return;
@@ -138,13 +143,11 @@ export default {
       // 取消勾选时
       if (this.checkedCouponList.indexOf(name) > -1) {
         this.checkedCouponList = this.checkedCouponList.filter((i) => i !== name);
-        setTimeout(() => {
-          this.remainPrice = this.remainPrice - this.couponList[index].discountFee
-          this.newAvailableDiscountFee = this.newAvailableDiscountFee + this.couponList[index].discountFee
-          this.newGroupedCouponData()
-          this.setAllDisabled()
-          this.isDisabledByRule(coupon, index, 'showMsg');
-        }, 100)
+        this.remainPrice = this.remainPrice - this.couponList[index].discountFee
+        this.newAvailableDiscountFee = this.newAvailableDiscountFee + this.couponList[index].discountFee
+        this.newGroupedCouponData()
+        this.setAllDisabled()
+        this.isDisabledByRule(coupon, index, 'showMsg');
         return;
       }
       // 如果有选中项
@@ -164,7 +167,6 @@ export default {
         this.setAllDisabled()
         this.isDisabledByRule(coupon, index, 'showMsg');
       })
-
     },
     // 获取还需支付金额
     getAmountToBePaid() {
@@ -172,7 +174,7 @@ export default {
       if([ 5, 8, 10 ].indexOf(this.parkMallCode) > -1 && this.orderDetail.discountInfo?.points?.[0]?.discountFee) {
         amountToBePaid = amountToBePaid - this.orderDetail.discountInfo?.points?.[0]?.discountFee
       }
-      if([ 4, 6 ].indexOf(this.parkMallCode) > -1 && this.orderDetail.discountInfo?.points?.[0]?.discountFee) {
+      if ([4, 6].indexOf(this.parkMallCode) > -1 && this.orderDetail.discountInfo?.points?.[0]?.discountFee) {
         amountToBePaid = amountToBePaid - this.orderDetail.discountInfo?.points?.[0]?.discountFee
       }
       return amountToBePaid
@@ -200,9 +202,9 @@ export default {
         // 计算单日剩余 remainConsumeTime
         // 当前使用优惠 state.usingTotalDiscount
         // 判断符合上限
-        if ( this.remainPrice >= maxOneTimeDiscountFee) {
-          this.couponList = this.couponList.map((elm,iemi) => {
-            if ( !elm.disabled && this.checkedCouponList.indexOf(`coupon${iemi}`) < 0) {
+        if (this.remainPrice >= maxOneTimeDiscountFee) {
+          this.couponList = this.couponList.map((elm, iemi) => {
+            if (!elm.disabled && this.checkedCouponList.indexOf(`coupon${iemi}`) < 0) {
               elm.disabled = true
             }
             return elm
@@ -216,9 +218,9 @@ export default {
         // 计算单日剩余 remainConsumeTime
         // 当前使用优惠 state.usingTotalDiscount
         // 判断符合上限
-        if ( this.remainPrice >= maxOneTimeDiscountFee ) {
-          this.couponList = this.couponList.map((elm,iemi) => {
-            if ( !elm.disabled && this.checkedCouponList.indexOf(`coupon${iemi}`) < 0) {
+        if (this.remainPrice >= maxOneTimeDiscountFee) {
+          this.couponList = this.couponList.map((elm, iemi) => {
+            if (!elm.disabled && this.checkedCouponList.indexOf(`coupon${iemi}`) < 0) {
               elm.disabled = true
             }
             return elm
@@ -247,13 +249,12 @@ export default {
         return
       }
       // 如果杭州、福州的使用券打到上限则不自动计算其余券是否可选
-      if ( this.checkedCouponList.length >= this.remainCoupons && (this.parkMallCode === 2 || this.parkMallCode === 8 || this.parkMallCode === 7 || this.parkMallCode === 9 || this.parkMallCode === 5) ) {
+      if (this.checkedCouponList.length >= this.remainCoupons && (this.parkMallCode === 2 || this.parkMallCode === 8 || this.parkMallCode === 7 || this.parkMallCode === 9 || this.parkMallCode === 5)) {
         return
       }
-      // console.log(292,this.couponList);
       const index = this.item2Number(this.checkedCouponList[0])
       const item = this.couponList[index];
-      const { superposition, limitCountPerOrder = 0, name } = item;
+      const {superposition, limitCountPerOrder = 0, name} = item;
       switch (superposition) {
         case '1': // 不可叠加
           couponList = couponList.map((elm, i) => {
@@ -262,12 +263,12 @@ export default {
           })
           break;
         case '2': // 同类型可叠加
-                  // 找到
+          // 找到
           couponList = couponList.map((elm, i) => {
             // 只有 status === 'available' 的才会赋值为 false
             elm.disabled = elm?.status !== 'available' || !moment().isBefore(elm.expirationDate); // 默认可选
             // 找到所以 superposition === 2 的同类型的券
-            if ( elm?.status === 'unavailable' || moment().isSameOrAfter(elm.expirationDate)) {
+            if (elm?.status === 'unavailable' || moment().isSameOrAfter(elm.expirationDate)) {
               // 这里是做一个阻断,就是避免程序往下执行,没有别的意思
               elm.disabled = true
             } else if (elm.superposition === superposition) { // 这里是找到一样类型的券
@@ -276,7 +277,7 @@ export default {
                 if (selectCouponIds.length >= elm.limitCountPerOrder) { // 如果这个批次的券已经选了一部分,并且超过了可选上限的话。
                   elm.disabled = selectCouponIds.findIndex(iem => iem.code === elm.code) < 0 // 置灰剩余没有选中的电子券
                 }
-              } else if (elm.limitCountPerOrder  === 0) { // 如果是 0 的话,则不做任何限制
+              } else if (elm.limitCountPerOrder === 0) { // 如果是 0 的话,则不做任何限制
                 elm.disabled = false
               } else {
                 elm.disabled = selectCouponIds.findIndex(iem => iem.code === elm.code) < 0 && selectCouponIds.length > 0 // 同类型可选的券,如果可选上限是1,就设为不可选择
@@ -292,7 +293,7 @@ export default {
     },
     // 根据电子券规则判断是否可选
     isDisabledByRule(item, index, showMsg) {
-      const { parkMallCode } = this.orderDetail.parkInfo;
+      const {parkMallCode} = this.orderDetail.parkInfo;
       // 最高优先级,提示未生效的电子券
       if (item.status === 'unavailable' || moment().isSameOrAfter(item.expirationDate)) {
         return Toast({
@@ -305,12 +306,12 @@ export default {
       if ( this.checkedCouponList.length >= this.remainCoupons && (this.parkMallCode === 2 || this.parkMallCode === 8 || this.parkMallCode === 7 || this.parkMallCode === 9 || this.parkMallCode === 5 || this.parkMallCode === 8) ) {
         if ( showMsg ) return true
         return Toast({
-          message: `电子券每天最多可使用${ this.maxOneDayCoupons }张`,
+          message: `电子券每天最多可使用${this.maxOneDayCoupons}张`,
           className: "white-space",
           icon: 'none',
         });
       }
-
+      
       // 浦东每次缴费超限控制、沈阳每日超限控制
       if ([1,4,5,999, 8, 6,10].indexOf(parkMallCode) > -1 && this.crossMessage(showMsg)) {
         this.couponList = this.couponList.map((e, i) => {
@@ -321,9 +322,8 @@ export default {
         });
         return;
       }
-
+      
       // 选中状态赋值
-      // this.groupedCouponData();
       this.newGroupedCouponData();
     },
     // 是否选中
@@ -332,14 +332,16 @@ export default {
     },
     // 超限提示
     crossMessage(showMsg = '') {
-      const { parkMallCode } = this.orderDetail.parkInfo;
-      const { maxOneDayCoupons, maxonedaydiscountFee, maxOneTimeDiscountTime, remainConsumeTime, hourPrice, availableDiscountFee, oneTimeLimitation,oneDayLimitation, maxOneDayDiscountFee } = this.orderDetail.parkingRule;
+      const {parkMallCode} = this.orderDetail.parkInfo;
       const {
-        usingTotalDiscount, // 使用总抵扣
-        coupons,
-      } = this.orderDetail.discountInfo;
+        maxOneTimeDiscountTime,
+        remainConsumeTime,
+        hourPrice,
+        oneTimeLimitation,
+        oneDayLimitation,
+        maxOneDayDiscountFee
+      } = this.orderDetail.parkingRule;
       const {
-        // totalFee, // 应缴
         actualPayFee, // 应付金额
       } = this.orderDetail.parkingRecord;
       // 剩余可使用的优惠金额,支持动态计算; 优惠时长,不可能全部使用,不能超过车费减去优惠的金额;不能超过单次的应付金额
@@ -358,10 +360,10 @@ export default {
           icon: 'none',
         });
       }
-
+      
       // 单日上限
       if (oneDayLimitation && this.remainPrice >= this.availableDiscountFee) {
-        if ( showMsg ) return true
+        if (showMsg) return true
         return Toast({
           message: [5, 8, 10].indexOf(parkMallCode) > -1 ? '当日优惠已达上限,不可再用' : `每日最高可抵扣${maxOneDayDiscountFee}元`,
           className: "white-space",
@@ -383,7 +385,6 @@ export default {
     // 确认
     confirm() {
       // 重新计算兑换券优惠
-      const checkedCouponList = this.checkedCouponList.map((i) => this.item2Number(i));
       const couponList = this.couponList.map((elm, index) => {
         elm.selected = false;
         if (this.checkedCouponList.indexOf(`coupon${index}`) > -1) {
@@ -397,36 +398,6 @@ export default {
           this.$router.back();
         },
       });
-
-      /*uni.setStorageSync('checkedCouponList', this.checkedCouponList);
-       uni.setStorageSync('list', this.list);
-       uni.setStorageSync('couponInfo', {
-       couponfee: this.totalFee,
-       couponcode: this.couponCode.join('#'),
-       });
-       this.$router.back();*/
-    },
-    launchPathInit() {
-      const groupId = uni.getStorageSync('groupId');
-      const mallId = uni.getStorageSync('mallId');
-      const { projectId } = getAppIdByGroupIdAndMallId({
-        groupId: groupId,
-        mallId: mallId,
-        type: 'all',
-      });
-      this.launchPath = `?trackSourceType=运营位&trackSourceName=功能球&projectId=${projectId}&groupId=${groupId}&mallId=${mallId}&source=tparkingH5`;
-
-      let isLogin = false
-      const member = uni.getStorageSync('member');
-      if (member && JSON.stringify(this.member) !== '{}') {
-        isLogin = true
-      }
-      this.extraData = {
-        brandId: this.groupId,
-        lbsId: this.lbsId,
-        isLogin: isLogin,
-        navigate_time:new Date().getTime()
-      }
     },
     // 跳转小程序
     navigateToMiniProgram() {
@@ -447,49 +418,22 @@ export default {
           }
         });
       }
-      if (isInWeixinH5()) {
-        // this.$wx.chooseWXPay({
-        //   timestamp: params?.timeStamp,
-        //   nonceStr: params?.nonceStr,
-        //   package: params?.package,
-        //   signType: params?.signType,
-        //   paySign: params?.paySign,
-        //   success: function (res) {
-        //     // alert('success: ' + JSON.stringify(res));
-        //     // res: {"errMsg":"chooseWXPay:cancel"}
-        //     if (res.errMsg === 'chooseWXPay:ok') {
-        //       resolve({ errMsg: 'requestPayment:ok' });
-        //     } else {
-        //       reject(res);
-        //     }
-        //   },
-        //   cancel: function (res) {
-        //     // alert('cancel: ' + JSON.stringify(res));
-        //     // res: {"errMsg":"chooseWXPay:cancel"}
-        //     resolve({ errMsg: 'requestPayment:cancel' });
-        //   },
-        //   fail: function (err) {
-        //     // eslint-disable-next-line no-console
-        //     console.error(err);
-        //     reject(err);
-        //   },
-        // });
-      }
     },
     // H5 跳转到小程序
-    launchFn({ appId, extInfo }) {
-      // console.log(584, JSON.stringify({ appId, extInfo }));
+    launchFn({appId, extInfo}) {
       this.$store.commit('cachedViews/DEL_CACHED_VIEW', {
         name: 'parkingFeeDetail',
       });
       this.$router.go(-2);
-      // console.log('H5 跳转到 嘉里中心小程序: success');
     },
-    launchErrorFn({ errMsg, appId, extInfo }) {
+    launchErrorFn({errMsg, appId, extInfo}) {
       // console.log('H5 跳转到 嘉里中心小程序: fail', JSON.stringify({ errMsg, appId, extInfo }));
     },
     onLaunchReady() {
       // console.log('H5 跳转到 嘉里中心小程序 的标签 渲染了');
     },
   },
+  destroyed() {
+    window.removeEventListener('scroll', this.handleScrollDebounce, 100);
+  }
 };

+ 1 - 1
src/pages/parkingFeeV2/mixins/parkingFeeDetail.js

@@ -626,7 +626,7 @@ export default {
                   }&unlicensed=${encodeURIComponent(unlicensed)
                   }&vehicleNo=${encodeURIComponent(vehicleNo)}`
                 }
-                my.navigateTo({
+                my.redirectTo({
                   url: alipayUrl,
                   complete: function (res) {
                     console.log('回调::', res)

+ 33 - 32
src/pages/parkingFeeV2/parkingFeeCoupon.vue

@@ -1,41 +1,42 @@
 <template>
-  <div scroll-y="true" :class="['scroll-Y' , theme]">
+  <div scroll-y="true" :class="['scroll-Y', theme]">
     <div>
       <div class="parkingFeeCoupon">
         <van-checkbox-group :value="checkedCouponList">
           <div class="card-list" v-if="couponList.length">
-            <div class="item" v-for="(item, index) in couponList" :key="index">
-              <div class="coupon-active" v-if="checkedCouponList.indexOf(`coupon${index}`) > -1">
-                <svg width="690" height="197" viewBox="0 0 690 197" fill="none" xmlns="http://www.w3.org/2000/svg">
-                  <mask id="path-1-inside-1_304_8" fill="white">
-                    <path fill-rule="evenodd" clip-rule="evenodd" d="M196 0C196 5.52285 191.523 10 186 10C180.477 10 176 5.52285 176 0H4C1.79086 0 0 1.79086 0 4V193C0 195.209 1.79085 197 3.99999 197H176C176 191.477 180.477 187 186 187C191.523 187 196 191.477 196 197H686C688.209 197 690 195.209 690 193V4C690 1.79086 688.209 0 686 0H196Z"/>
-                  </mask>
-                  <path fill-rule="evenodd" clip-rule="evenodd" d="M196 0C196 5.52285 191.523 10 186 10C180.477 10 176 5.52285 176 0H4C1.79086 0 0 1.79086 0 4V193C0 195.209 1.79085 197 3.99999 197H176C176 191.477 180.477 187 186 187C191.523 187 196 191.477 196 197H686C688.209 197 690 195.209 690 193V4C690 1.79086 688.209 0 686 0H196Z" fill="var(--k-color-primary-06)"/>
-                  <path d="M196 0V-1H195V0H196ZM176 0H177V-1H176V0ZM176 197V198H177V197H176ZM196 197H195V198H196V197ZM186 11C192.075 11 197 6.07513 197 0H195C195 4.97056 190.971 9 186 9V11ZM175 0C175 6.07513 179.925 11 186 11V9C181.029 9 177 4.97056 177 0H175ZM4 1H176V-1H4V1ZM1 4C1 2.34314 2.34315 1 4 1V-1C1.23858 -1 -1 1.23857 -1 4H1ZM1 193V4H-1V193H1ZM3.99999 196C2.34314 196 1 194.657 1 193H-1C-1 195.761 1.23856 198 3.99999 198V196ZM176 196H3.99999V198H176V196ZM186 186C179.925 186 175 190.925 175 197H177C177 192.029 181.029 188 186 188V186ZM197 197C197 190.925 192.075 186 186 186V188C190.971 188 195 192.029 195 197H197ZM686 196H196V198H686V196ZM689 193C689 194.657 687.657 196 686 196V198C688.761 198 691 195.761 691 193H689ZM689 4V193H691V4H689ZM686 1C687.657 1 689 2.34314 689 4H691C691 1.23858 688.761 -1 686 -1V1ZM196 1H686V-1H196V1Z" fill="var(--k-color-primary-01)" mask="url(#path-1-inside-1_304_8)"/>
-                  <path d="M185.5 12.486V184.514" stroke="#CCCCCC" stroke-linecap="square" stroke-dasharray="8"/>
-                </svg>  
-              </div>
-              <div class="coupon-active" v-else>
-                <svg width="690" height="197" viewBox="0 0 690 197" fill="none" xmlns="http://www.w3.org/2000/svg">
-                  <path fill-rule="evenodd" clip-rule="evenodd" d="M196 0C196 5.52285 191.523 10 186 10C180.477 10 176 5.52285 176 0H4C1.79086 0 0 1.79086 0 4V193C0 195.209 1.79085 197 3.99999 197H176C176 191.477 180.477 187 186 187C191.523 187 196 191.477 196 197H686C688.209 197 690 195.209 690 193V4C690 1.79086 688.209 0 686 0H196Z" fill="#FAFBFF"/>
-                  <path d="M185.5 10.5V187.5" stroke="#D8DAE0" stroke-linecap="square" stroke-dasharray="8"/>
-                </svg>
-              </div>
-
-              <div class="item-image">
-                <div class="discountFee-box">
-                  <span>¥</span>
-                  <span class="itemValue">{{ item.discountFee }}</span>
+            <div v-for="(item, index) in couponList" :key="index" ref="couponItem">
+              <div v-if="rowData.indexOf(index)> -1" class="item" @click="checkboxItemChange(`coupon${index}`, index)">
+                <div class="coupon-active" v-if="checkedCouponList.indexOf(`coupon${index}`) > -1">
+                  <svg width="690" height="197" viewBox="0 0 690 197" fill="none" xmlns="http://www.w3.org/2000/svg">
+                    <mask id="path-1-inside-1_304_8" fill="white">
+                      <path fill-rule="evenodd" clip-rule="evenodd" d="M196 0C196 5.52285 191.523 10 186 10C180.477 10 176 5.52285 176 0H4C1.79086 0 0 1.79086 0 4V193C0 195.209 1.79085 197 3.99999 197H176C176 191.477 180.477 187 186 187C191.523 187 196 191.477 196 197H686C688.209 197 690 195.209 690 193V4C690 1.79086 688.209 0 686 0H196Z"/>
+                    </mask>
+                    <path fill-rule="evenodd" clip-rule="evenodd" d="M196 0C196 5.52285 191.523 10 186 10C180.477 10 176 5.52285 176 0H4C1.79086 0 0 1.79086 0 4V193C0 195.209 1.79085 197 3.99999 197H176C176 191.477 180.477 187 186 187C191.523 187 196 191.477 196 197H686C688.209 197 690 195.209 690 193V4C690 1.79086 688.209 0 686 0H196Z" fill="var(--k-color-primary-06)"/>
+                    <path d="M196 0V-1H195V0H196ZM176 0H177V-1H176V0ZM176 197V198H177V197H176ZM196 197H195V198H196V197ZM186 11C192.075 11 197 6.07513 197 0H195C195 4.97056 190.971 9 186 9V11ZM175 0C175 6.07513 179.925 11 186 11V9C181.029 9 177 4.97056 177 0H175ZM4 1H176V-1H4V1ZM1 4C1 2.34314 2.34315 1 4 1V-1C1.23858 -1 -1 1.23857 -1 4H1ZM1 193V4H-1V193H1ZM3.99999 196C2.34314 196 1 194.657 1 193H-1C-1 195.761 1.23856 198 3.99999 198V196ZM176 196H3.99999V198H176V196ZM186 186C179.925 186 175 190.925 175 197H177C177 192.029 181.029 188 186 188V186ZM197 197C197 190.925 192.075 186 186 186V188C190.971 188 195 192.029 195 197H197ZM686 196H196V198H686V196ZM689 193C689 194.657 687.657 196 686 196V198C688.761 198 691 195.761 691 193H689ZM689 4V193H691V4H689ZM686 1C687.657 1 689 2.34314 689 4H691C691 1.23858 688.761 -1 686 -1V1ZM196 1H686V-1H196V1Z" fill="var(--k-color-primary-01)" mask="url(#path-1-inside-1_304_8)"/>
+                    <path d="M185.5 12.486V184.514" stroke="#CCCCCC" stroke-linecap="square" stroke-dasharray="8"/>
+                  </svg>
                 </div>
-                <span style=" font-size: 30px">停车券</span>
-              </div>
-              <div class="item-content">
-                <div class="content">
-                  <span class="h3">{{ item.name }}</span>
-                  <span class="span">有效期至 {{ item.expirationDate }}</span>
+                <div class="coupon-active" v-else>
+                  <svg width="690" height="197" viewBox="0 0 690 197" fill="none" xmlns="http://www.w3.org/2000/svg">
+                    <path fill-rule="evenodd" clip-rule="evenodd" d="M196 0C196 5.52285 191.523 10 186 10C180.477 10 176 5.52285 176 0H4C1.79086 0 0 1.79086 0 4V193C0 195.209 1.79085 197 3.99999 197H176C176 191.477 180.477 187 186 187C191.523 187 196 191.477 196 197H686C688.209 197 690 195.209 690 193V4C690 1.79086 688.209 0 686 0H196Z" fill="#FAFBFF"/>
+                    <path d="M185.5 10.5V187.5" stroke="#D8DAE0" stroke-linecap="square" stroke-dasharray="8"/>
+                  </svg>
                 </div>
-                <div class="erwm_box">
-                  <van-checkbox color="#fff" @click="checkboxItemChange(`coupon${index}`, index)" checked-color="var(--k-color-primary)" :disabled="item.disabled" :name="`coupon${index}`"/>
+                <div class="item-image">
+                  <div class="discountFee-box">
+                    <span>¥</span>
+                    <span class="itemValue">{{ item.discountFee }}</span>
+                  </div>
+                  <span style=" font-size: 30px">停车券</span>
+                </div>
+                <div class="item-content">
+                  <div class="content">
+                    <span class="h3">{{ item.name }}</span>
+                    <span class="span">有效期至 {{ item.expirationDate }}</span>
+                  </div>
+                  <div class="erwm_box">
+                    <van-checkbox color="#fff" checked-color="var(--k-color-primary)" :disabled="item.disabled" :name="`coupon${index}`"/>
+                  </div>
                 </div>
               </div>
             </div>
@@ -130,8 +131,8 @@ export default {
   box-sizing: border-box;
   flex: 1;
   position: relative;
-
   .item {
+    box-sizing: border-box;
     width: 100%;
     height: 197px;
     display: flex;

+ 504 - 0
src/pages/parkingFeeV2/qrCodeLicensedCar.vue

@@ -0,0 +1,504 @@
+<template>
+  <div :class="[theme, 'bg']">
+    <!-- 领取临牌:成功 -->
+    <!-- <div @click="qrCodesRule('8b0571a1')">test</div> -->
+    <div class="success-box" v-if="type === 'success'">
+      <img class="icon" :src="require(`@/pages/parkingFee/static/images/unlicensed/success.png`)" />
+      <div class="status-title">临牌领取成功</div>
+      <!-- <div class="status-info">若未正常抬杠,请关闭当前页面重新扫码</div> -->
+      <div class="status-info">或联系车场管理人员处理</div>
+      <div class="card-box">
+        <img :src="`${require(`@/pages/parkingFee/static/images/unlicensed-0.png`)}`" style="margin-left: 10px"/>
+        <div class="car-number">
+          <div class="number">{{ vehicleNo | formatCarno}}</div>
+          <div class="tips">车辆类型:无牌车辆</div>
+        </div>
+      </div>
+      <k-button title="进入首页" disabledColor="#D1D2D9" @click="goHome" />
+    </div>
+    <!-- 领取临牌:失败 -->
+    <div class="fail-box" v-if="type === 'fail'">
+      <img class="icon" :src="require(`@/pages/parkingFee/static/images/unlicensed/fail.png`)" />
+      <div class="status-title">临牌领取失败</div>
+      <div class="status-info">请关闭当前页面重新扫码</div>
+      <div class="status-info">或联系车场管理人员处理</div>
+      <div class="card-box">
+        <img :src="`${require(`@/pages/parkingFee/static/images/unlicensed-0.png`)}`" style="margin-left: 10px"/>
+        <div class="car-number">
+          <div class="number">临K ???</div>
+          <div class="tips">车辆类型:无牌车辆</div>
+        </div>
+      </div>
+      <k-button disabledColor="#D1D2D9" @click="scanCarCode">
+        <template v-slot:left>
+          <img class="unlicensed-scan" :src="`${require(`@/pages/parkingFee/static/images/unlicensed-scan.png`)}`" />
+        </template>
+        重新扫码
+      </k-button>
+    </div>
+    <!-- 支付成功 -->
+    <div class="pay-box" v-if="type === 'pay'">
+      <img class="pay-log" :src="require(`@/pages/parkingFee/static/images/unlicensed/pay.svg`)" />
+      <span class="info">您已缴费成功,欢迎下次光临</span>
+    </div>
+    <!-- 出场临牌:失败 -->
+    <div class="fail-box" v-if="type === 'outFail'">
+      <img class="out-fail-log" :src="require(`@/pages/parkingFee/static/images/unlicensed/no-car-out.svg`)" />
+      <k-button disabledColor="#D1D2D9" @click="scanCarCode">
+        <template v-slot:left>
+          <img class="unlicensed-scan" :src="`${require(`@/pages/parkingFee/static/images/unlicensed-scan.png`)}`" />
+        </template>
+        重新扫码
+      </k-button>
+<!--      <span class="info">您已缴费成功,欢迎下次光临</span>-->
+    </div>
+  </div>
+</template>
+
+<script>
+import { unlicensedCarGetVehicle } from "@/api/parking";
+import baseMixins from "@/pages/parkingFee/mixins/base";
+import uni from '@/utils/uniHooks';
+import { initWxJsSdkConfig } from '@/utils/login';
+import { getPlatform,getUrlParams, theCommunicationBetweenWechatAndH5IsNormal, extractValuesFromString } from '@/utils';
+import {mapState} from "vuex";
+
+export default {
+  mixins: [baseMixins],
+  name: 'parkingFeeMsg',
+  data() {
+    return {
+      type: '',
+      vehicleNo: '',
+      qrCode: ''
+    };
+  },
+  computed:{
+    ...mapState({
+      unlicensedInfo: (state) => state.unlicensedInfo,
+      isLogin: (state) => state.isLogin,
+    })
+  },
+  async created() {
+    // setTimeout(() => {
+    //   window?.toWXSendMsg({
+    //     type: 'nowRoute',
+    //     options: {
+    //       fullPath: '1'
+    //     },
+    //   });
+    // }, 100);
+    // setTimeout(() => {
+    //   uni.setNavigationBarTitle({
+    //     title: '停车缴费提示',
+    //   });
+    // }, 300);
+    // const platform = getPlatform();
+    // console.log(this.$route.query);
+    this.pageInit()
+    try {
+      // await initWxJsSdkConfig(['checkJsApi', 'scanQRCode']);
+    } catch (e) {
+      console.log(e)
+    }
+  },
+  mounted() {},
+  methods: {
+    async getVehicleNo (qrcode) {
+      try {
+        const Vehicle = await unlicensedCarGetVehicle(qrcode); // 无牌车扫码
+        this.type = 'success'
+        console.log('this.type::', this.type)
+        this.vehicleNo = Vehicle
+        console.log('无牌车车牌:::', Vehicle)
+      } catch(err) {
+        this.type = 'fail'
+        console.log('无牌车车牌领取失败', err)
+      }
+    },
+    pageInit(){
+      console.log('this.$route.query::::', this.$route.query)
+      if (this.$route.query?.qrCode) {
+        this.qrCode = this.$route.query?.qrCode;
+        this.getVehicleNo(this.qrCode)
+      }
+    },
+    getParam(url, key) {
+      let u = url.split('?')[1]
+      let l = u.split('&')
+      let o = {}
+      l.forEach(i => {
+        let key = i.split('=')[0]
+        let value = i.split('=')[1]
+        if (key == 'type') {
+          if (value != 'test') {
+            o[key] = value
+          }
+        } else {
+          o[key] = value
+        }
+      })
+      return o[key]
+    },
+    get_sa_utm(options) {
+      return new Promise((resolve) => {
+        try {
+          let temp = ''
+          // #ifdef MP-WEIXIN
+          if (options.q) {
+            temp = decodeURIComponent(options.q)
+          }
+          // #endif
+          // #ifdef MP-ALIPAY
+           // 如果是支付宝这边已经解析过了,则返回false,不做二次解析
+          // const query = CacheTool.getMiniAppOptionsQuery()
+          console.log('options.options::::', options.options)
+          if (options.options.qrCode) {
+            temp = decodeURIComponent(options.options.qrCode)
+          }
+          
+          // #endif
+          // temp = https://crm.kerryplus.com/t-parking?sa_utm=iE
+          if (temp && temp.indexOf('?') > -1) {
+            const sa_utm = this.getParam(temp, 'sa_utm');
+            console.log('utm参数', sa_utm)
+            return resolve(sa_utm || false)
+          }
+          console.log('二码合一参数解析失败', temp);
+          return resolve(false)
+        } catch (err) {
+          resolve(false)
+        }
+      })
+    },
+    asyncRequest(url, data, method = 'GET') {
+      return new Promise((resolve, reject) => {
+        uni.request({
+          url: url,
+          data: data,
+          header: JSON.parse(uni.getStorageSync('handleUser') || "{}"),
+          method: method,
+          success: (res) => {
+            resolve(res.data);
+          },
+          fail: (err) => {
+            reject(err);
+          }
+        });
+      });
+    },
+    // 在异步函数中调用异步请求
+    fetchData(id) {
+      return new Promise(async (resolve, reject) => {
+        try {
+          const res = await this.asyncRequest(`${window.QR_CODE_BASE_URL}/c/${id}`);
+          console.log('baseURLQrCode:::', res)
+          // console.log('baseURLQrCodebaseURLQrCode::', res.data);
+          if (res?.code == 200) {
+            // console.log('77777777', res, queryStringToObject(res.data.url));
+            // const [baseURL, key, value] = res.data.url.match(/(.*)=(.*)/)
+            if (res?.data?.url) {
+              // resolve({ key, value })
+              const insideUrl =
+              `/pages/package-parkingFee/parkingFeeWebViewLogin?${res.data.url}`
+            
+              // resolve(queryStringToObject(`t-page?${res.data.url}`))
+              // #ifdef MP-ALIPAY
+              my.navigateTo({
+                url: `/pages/package-parkingFee/parkingFeeWebViewLogin?${res.data.url}`,
+                complete: function (res) {
+                  console.log('回调::', res)
+                },
+                success: function (res) {
+                  console.log('跳转成功::', res)
+                },
+                fail: function (err) {
+                  console.log('跳转失败::', res)
+                }
+              });
+              // #endif
+            } else {
+              reject(false)
+            }
+          }
+        } catch (error) {
+          console.error('请求失败', error);
+        }
+      })
+    },
+    async getqrcode (options) {
+      
+      try {
+        const sa_utm =  await this.get_sa_utm(options);
+        if (sa_utm) {
+          const params = await this.fetchData(sa_utm)
+          
+          console.log('二码合一参数::::', params)
+        }
+        
+      } catch(err) {
+
+      }
+    },
+    // 无牌车闸机扫码
+    async scanCarCode() {
+      var _this = this
+      const runScanFn = (res) => {
+        /*
+         针对微信的小程序码进行的兼容改造
+         微信扫码结束之后的返回参数 {"errMsg": "scanCode:ok", "scanType": "WX_CODE", "charSet": "ISO8859-1", "rawData": "bGsoP3gyT1Aud3QpbW1JeHRfVHJsUjg4JnR5cGU9dW5saWNlbnNlZElu", "path": "pages/automatic/automaticIndex?scene=code%3D9988%26type%3DunlicensedIn"}
+         */
+        if(res.scanType && res.scanType === 'WX_CODE' && res?.path) {
+          const params = getUrlParams(`?${decodeURIComponent(res.path.replace(/.*scene=/g, ''))}`)
+          this.$store.commit('SET_UNLICENSED_INFO', params);
+          this.$nextTick(() => {
+            this.qrCodesRule(params.code);
+          })
+        }
+        // 兜底逻辑,如果是其他小程序扫描,则提取rawData,进行解析提取入参
+        if(res.scanType && res.scanType === 'WX_CODE' && !res?.path){
+          let path = atob(res.rawData)
+          path = path.replace(/.*([a-z0-9]{6}&type)/g, '8b$1')
+          const regex = /(\w+)&type=(\w+)/;
+          const match = path.match(regex);
+          const obj = { code: match[1], type: match[2] };
+          this.$store.commit('SET_UNLICENSED_INFO', obj);
+          this.$nextTick(() => {
+            this.qrCodesRule(obj.code);
+          })
+        }
+      };
+      // 微信小程序
+      // const platform = getPlatform();
+      if (this.isAlipayClient) {
+        // 判断微信小程序与 h5 是否正常通信
+        // const isReload = await theCommunicationBetweenWechatAndH5IsNormal()
+        // if(!isReload) {
+        //   uni.setStorageSync('isReload', 1)
+        //   window.location.reload()
+        //   return
+        // }
+         // 调用支付宝扫一扫功能
+            window.toWXSendMsg({
+              type: 'scanQRCode',
+            });
+            console.log('二码合一参数::::')
+            
+            // runScanFn({type: "scanQRCodeOver", options: {imageChannel: "camera", qrCode: "https://crm.kerryplus.com/t-parking?sa_utm=mJ", rawData: "aHR0cHM6Ly9jcm0ua2VycnlwbHVzLmNvbS90LXBhcmtpbmc/c2FfdXRtPW1K", result: "https://crm.kerryplus.com/t-parking?sa_utm=mJ", scanType: "QR", errMsg: "scanCode:ok"}});
+            // TODO 兼容支付宝无牌车扫码
+            // this.getqrcode({type: "scanQRCodeOver", options: {imageChannel: "camera", qrCode: "https://crm.kerryplus.com/t-parking?sa_utm=mJ", rawData: "aHR0cHM6Ly9jcm0ua2VycnlwbHVzLmNvbS90LXBhcmtpbmc/c2FfdXRtPW1K", result: "https://crm.kerryplus.com/t-parking?sa_utm=mJ", scanType: "QR", errMsg: "scanCode:ok"}})
+          window.subscribe('scanQRCodeOver', (options) => {
+            console.log('微信扫码结束之后的返回参数', {type: "scanQRCodeOver", options: {imageChannel: "camera", qrCode: "https://crm.kerryplus.com/t-parking?sa_utm=mJ", rawData: "aHR0cHM6Ly9jcm0ua2VycnlwbHVzLmNvbS90LXBhcmtpbmc/c2FfdXRtPW1K", result: "https://crm.kerryplus.com/t-parking?sa_utm=mJ", scanType: "QR", errMsg: "scanCode:ok"}});
+              // const sa_utm =  await this.get_sa_utm(options);
+              // console.log('sa_utm:::', sa_utm)
+              _this.getqrcode(options)
+             
+            
+            // runScanFn(options);
+          });
+      } else {
+        try {
+          this.$wx.scanQRCode({
+            needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+            // onlyFromCamera: false,
+            // desc: 'scanQRCode desc',
+            // needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+            // scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
+            success: (res) => {
+              console.log('H5页面扫码获取到的参数——成功res2', res);
+              // let path = res.resultStr.replace(/.*([a-z0-9]{6}&type)/g, '8b$1')
+              // const regex = /(\w+)&type=(\w+)/;
+              // const match = path.match(regex);
+              // const obj = {code: match[1], type: match[2]};
+              // this.$store.commit('SET_UNLICENSED_INFO', obj);
+              // this.$nextTick(() => {
+              //   this.qrCodesRule(obj.code);
+              // })
+            },
+            error: (res) => {
+              console.log('H5页面扫码获取到的参数——失败res', res);
+              // console.log(242, res);
+            },
+          });  
+        } catch (err) {
+          console.log('H5页面扫码获取到的参数——失败err', err);
+        }
+        
+      }
+    },
+    // 处理扫码结果: 组装参数,剩余流程,在 缴费支付页面 实现
+    async qrCodesRule(code) {
+      try {
+        const qrCodesres = await qrCodes(code); // 无牌车扫码
+        // 记录buildingId,确保 buildingId 是最新的数据
+        window.localStorage.setItem('buildingId', qrCodesres.buildingId);
+        // 如果是无牌车扫码:出场
+        console.log('模拟出场', this.unlicensedInfo?.type);
+        this.$store.commit('cachedViews/DEL_CACHED_VIEW', {
+          name: 'parkingFeeDetail',
+        });
+        if (this.unlicensedInfo?.type === 'unlicensedOut') {
+          setTimeout(() => {
+            this.$router.replace({
+              path: 'parkingFeeDetail',
+              query: {
+                gateId: qrCodesres.gateId,
+                vehicleNo: '',
+                type: 'unlicensedOut'
+              }
+            })  
+          }, 300)
+          return
+        }
+        // 如果是无牌车扫码:入场
+        const unlicensedCarCheckInres = await unlicensedCarCheckIn({ // 获取无牌车牌
+          gateId: qrCodesres.gateId
+        });
+        this.type = 'success'
+        this.vehicleNo = unlicensedCarCheckInres.vehicleNo
+        // 前往 缴费支付页面
+        // this.$router.replace({
+        //   path: 'parkingFeeMsg',
+        //   query: {
+        //     type: 'success',
+        //     vehicleNo: unlicensedCarCheckInres.vehicleNo
+        //   }
+        // })
+      } catch (err) {
+        // 车场扫描道闸入口,发现无车/车场扫描道闸入口,发现有牌车 >>> 停止往下执行,默认提示报错信息
+        if (/CAR_HAS_PLATE/.test(err.code)) {
+          return
+        }
+        if (/CAR_NOT_FOUND|UNLICENSED_PLATE_ACQUISITION_FAILED/.test(err.code)) {
+          setTimeout(() => {
+            // 如果是其他错误的话,则继续往下执行
+            this.$router.replace({
+              path: 'parkingFeeMsg',
+              query: {
+                type: this.unlicensedInfo?.type === 'unlicensedOut' ? 'outFail' : 'fail'
+                // this.type
+              }
+            }) 
+            this.pageInit()
+          }, 300)
+        }
+      }
+    },
+    goHome() {
+      if ((this.isLogin === 'notLoggedIn' || this.isLogin === 'loginDenied') && this.$route.query?.loginCount === 'undefined') {
+        wx.miniProgram.redirectTo({
+          "url": "/pages/package-parkingFee/parkingFeeWebViewLogin?needLogin=1&fromPage=home" // 去 login 页面 1 去登录
+        })
+        return
+      }
+      this.$router.replace({
+        path: 'home',
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.bg {
+  background-color: #FBFCFF;
+}
+.pay-box {
+  text-align: center;
+  height: calc(100vh - 100px);
+  //margin-top: 84px;
+  padding-top: 100px;
+  .pay-log {
+    width: 523px;
+    display: block;
+    margin: 0 auto;
+  }
+  .info {
+    font-family: 'PingFang SC';
+    font-style: normal;
+    font-weight: 400;
+    font-size: 28px;
+    line-height: 39px;
+    text-align: center;
+    color: #919baa;
+  }
+}
+
+.success-box,
+.fail-box {
+  //margin-top: 123px;
+  //padding-top: 123px;
+  text-align: center;
+  padding: 123px 24px 0;
+  .icon {
+    width: 80px;
+    height: 80px;
+    display: block;
+    margin: 0 auto 42px;
+  }
+  .status-title {
+    font-family: 'PingFang SC';
+    font-style: normal;
+    font-weight: 400;
+    font-size: 36px;
+    line-height: 50px;
+    color: #333333;
+    margin-bottom: 42px;
+  }
+  .status-info {
+    font-family: 'PingFang SC';
+    font-style: normal;
+    font-weight: 400;
+    font-size: 26px;
+    line-height: 40px;
+    text-align: center;
+    color: #999999;
+  }
+  .card-box {
+    height: 230px;
+    margin-top: 42px;
+    margin-bottom: 52px;
+    background: #fbfcff;
+    border: 1px solid #d9dbe0;
+    border-radius: 4px;
+    display: flex;
+
+    img {
+      width: 288px;
+      height: 142px;
+      display: block;
+      margin: auto 0;
+    }
+    .car-number {
+      //margin-top: 68px;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      .number {
+        font-size: 50px;
+        line-height: 56px;
+        font-weight: 600;
+        color: #333333;
+        margin-bottom: 23px;
+        letter-spacing: 6.5px;
+      }
+      .tips {
+        color: #999999;
+        text-align: left;
+      }
+    }
+  }
+  .out-fail-log {
+    width: 535px;
+    height: 410px;
+    display: block;
+    margin:  0 auto 68px;
+  }
+  
+  .unlicensed-scan {
+    width: 60px;
+    height: 60px;
+    margin-right: 16px;
+  }
+}
+</style>

+ 4 - 0
src/routes/indexV2.js

@@ -82,6 +82,10 @@ export const routes = [
         path: '/parkingFeeMsg',
         name: 'parkingFeeMsg',
         component: () => import('@/pages/parkingFeeV2/parkingFeeMsg.vue'),
+    },{
+        path: '/qrCodeLicensedCar',
+        name: 'qrCodeLicensedCar',
+        component: () => import('@/pages/parkingFeeV2/qrCodeLicensedCar.vue'),
     },{
         path: '/parkingFeeSuccess',
         name: 'parkingFeeSuccess',