Эх сурвалжийг харах

Merge pull request #11 from John-Hong/John/Microservices

John/microservices
John-Hong 2 жил өмнө
parent
commit
351014eabc

+ 2 - 1
package.json

@@ -49,7 +49,8 @@
     "sass": "^1.56.2",
     "sass-loader": "^10.4.1",
     "vue-template-compiler": "^2.7.14",
-    "webpack": "^4.36.0"
+    "webpack": "^4.36.0",
+    "terser-webpack-plugin": "^4"
   },
   "browserslist": [
     "Android >= 4.4",

+ 1 - 0
src/App.vue

@@ -295,6 +295,7 @@ export default {
     },
     // 无感积分相关
     async wxEasyPointsCommitStatusInit() {
+      return
       this.$refs.wxPointsCommit.open();
       // 判断用户是否登陆
       if (uni.getStorageSync('openid') && uni.getStorageSync('member') && uni.getStorageSync('member') !== {}) {

+ 1 - 1
src/api/request.js

@@ -217,7 +217,7 @@ export const createAxiosByinterceptors = (config) => {
       }
       // 错误信息提示
       const { code, langMessage } = error.response.data;
-      const codeList = ['INTERNAL_SERVER_ERROR', 'VALIDATION_FAILED']; // 默认处理的错误code
+      const codeList = ['INTERNAL_SERVER_ERROR', 'VALIDATION_FAILED', 'CAR_NOT_FOUND', 'CAR_HAS_PLATE']; // 默认处理的错误code
       if (codeList.indexOf(code) > -1) {
         uni.showToast({ title: langMessage, duration: 3000, icon: 'fail' });
       }

+ 3 - 2
src/components/wx-points-commit/wx-points-commit.vue

@@ -18,7 +18,8 @@
 <script>
 import { mapState } from 'vuex';
 import { kipGetPointsConfig } from '@/utils/api-kip.js';
-const app = getApp();
+// const app = getApp();
+const app = {};
 export default {
   props: {},
   created() {
@@ -139,7 +140,7 @@ export default {
   },
 };
 </script>
-<style>
+<style scoped lang="less">
 .box {
   position: fixed;
   z-index: 10000;

+ 4 - 4
src/pages/parkingFee/components/base/parkingFeeDetailSuccess.vue

@@ -19,7 +19,7 @@
 
           <div class="parking-info-item">
             <span class="info-key">支付时间</span>
-            <span class="info-value">{{ detail.createTime || '' }}</span>
+            <span class="info-value">{{ detail.createTime | momentFormat }}</span>
           </div>
           <div class="parking-info-item">
             <span class="info-key">车牌号</span>
@@ -37,7 +37,7 @@
           </div>
           <div class="parking-info-item">
             <span class="info-key">入场时间</span>
-            <span class="info-value">{{ detail.enterTime }}</span>
+            <span class="info-value">{{ detail.enterTime | momentFormat }}</span>
           </div>
           <!-- <div class="parking-info-item">
             <span class="info-key">离场时间</span>
@@ -45,7 +45,7 @@
           </div> -->
           <div class="parking-info-item">
             <span class="info-key">停车时长</span>
-            <span class="info-value">{{ detail.serviceMin }}</span>
+            <span class="info-value">{{ detail.serviceMin | parkingTime }}</span>
           </div>
           <div class="parking-info-item">
             <span class="info-key">开票状态</span>
@@ -101,7 +101,7 @@
           </div>
           <div class="parking-info-item">
             <span class="info-key">实缴</span>
-            <span class="info-value red">{{ (detail.actualPayFee / 100) | currency }}</span>
+            <span class="info-value red">{{ detail.actualPayFee | currency }}</span>
           </div>
         </div>
       </div>

+ 1 - 1
src/pages/parkingFee/components/base/parkingFeeList.vue

@@ -28,7 +28,7 @@
             {{ item.id + '-' + item.vehicleNo }}
           </div>
           <div style="color: red; margin-right: 6px">
-            {{ (item.actualPayFee / 100) | currency }}
+            {{ (item.totalPaidAmount ) | currency }}
           </div>
         </div>
 

+ 6 - 7
src/pages/parkingFee/components/purple/parkingFee.vue

@@ -1,5 +1,5 @@
 <template>
-  <scroll-view class="theme-mall scroll-Y color-scroll-Y">
+  <scroll-view :class="['scroll-Y' ,'color-scroll-Y', theme]">
     <div class="wrap">
       <div class="parkingFee">
         <!-- 菜单 -->
@@ -99,7 +99,7 @@
           <div class="unlicensed-box" v-else>
             <!-- 无牌车 -->
             <!-- <k-illustration name="no-parking-fee" description="未查询到无牌车信息" /> -->
-            <div class="no-car-unlicensed-box">
+            <div class="no-car-unlicensed-box" v-if="!unlicensedCar">
               <img :src="`${require(`../../static/images/unlicensed-1.png`)}`" />
               <div class="no-car-unlicensed-info">未查询到无牌车信息</div>
               <div class="search-btn" @click="scanCarCode">
@@ -108,15 +108,15 @@
               </div>
             </div>
             <!-- 有无牌车 -->
-            <div class="in-car" v-if="false">
+            <div class="in-car" v-else>
               <div class="car-number-box">
                 <img :src="`${require(`../../static/images/unlicensed-0.png`)}`" />
                 <div class="car-number">
-                  <div class="number">临K 9Q289H</div>
+                  <div class="number">{{ unlicensedCar }}</div>
                   <div class="tips">车辆类型:无牌车辆</div>
                 </div>
               </div>
-              <div class="search-btn">去支付</div>
+              <div class="search-btn" @click="unlicensedToPay">去支付</div>
             </div>
           </div>
         </div>
@@ -331,8 +331,7 @@ export default {
             align-items: center;
             font-size: 120px;
             height: 70px;
-            //line-height: 20px;
-            color: #644a79;
+            color: var(--k-color-primary);
           }
         }
 

+ 3 - 0
src/pages/parkingFee/mixins/base.js

@@ -4,6 +4,7 @@ export default {
   data() {
     return {
       componentName: '',
+      theme: 'theme-mall',
     };
   },
   computed: {
@@ -15,8 +16,10 @@ export default {
     const com = ['purpleCom', 'blueCom', 'greenCom', 'officeBlueCom', 'purpleCom'];
     if ( this.custTypeId < 3 || ! this.custTypeId) {
       this.componentName = 'baseParkingFeeCom';
+      this.theme = 'theme-mall'
     } else {
       this.componentName = com[this.custTypeId];
+      this.theme = 'theme-office'
     }
   },
 }

+ 127 - 225
src/pages/parkingFee/mixins/parkingFee.js

@@ -18,6 +18,12 @@ import uni from '@/utils/uniHooks';
 import { parkingLots, qrCodes, unlicensedCarCheckIn } from '@/api/parking';
 
 export default {
+  props:{
+    theme:{
+      type: String,
+      default: ''
+    }
+  },
   components: {
     plateNumber,
     LoginDom,
@@ -69,6 +75,10 @@ export default {
       member: (state) => state.member,
       mobile: (state) => state.mobile,
       custTypeId: (state) => state.custTypeId,
+      unlicensedCar: (state) => state.order.unlicensedCar,
+      // 如果是扫码进入的无牌车
+      unlicensedInfo: (state) => state.unlicensedInfo,
+      endlessLoop: (state) => state.endlessLoop,
     }),
   },
   beforeRouteLeave(to, from, next) {
@@ -76,17 +86,13 @@ export default {
     next();
   },
   watch: {
-    userInfo() {
-      this.initPage();
-    },
     openid() {
       if (this.openid) {
         this.getParkInfo();
         this.showSq = false;
       }
-    },
+    }
   },
-  async created(params) { },
   async mounted() {
     setTimeout(() => {
       uni.setNavigationBarTitle({
@@ -97,7 +103,13 @@ export default {
     if (platform === 'micromessenger') {
       await initWxJsSdkConfig(['checkJsApi', 'scanQRCode']);
     }
-
+    // 不论是否出入场,都使用此函数获取 gateId(闸口机器的ID)
+    if (this.unlicensedInfo?.type && /unlicensedOut|unlicensedIn/.test(this.unlicensedInfo.type) && this.endlessLoop.length === 0) {
+      console.log('用户是扫码进来的97', this.unlicensedInfo);
+      // 此处记录扫码流程执行次数。如果超过一次则不再执行
+      this.$store.commit('SET_ENDLESS_LOOP', this.unlicensedInfo.type);
+      this.qrCodesRule(this.unlicensedInfo.code)
+    }
     if (this.openid) {
       this.getParkInfo();
       this.showSq = false;
@@ -114,39 +126,6 @@ export default {
     }
   },
   methods: {
-    async initPage() {
-      // ws()
-      console.time('time');
-      const name = {
-        a: 'label',
-        c: 'label',
-      };
-      // const nameD = Encrypt(JSON.stringify(name))
-      // this.options = params;
-      // await this.$onLaunched;
-      this.localimgPic = this.$staticPicUrl + '/wxminilocalimg/parkingFee/';
-      // app.globalData.pullVipcode = params.pullVipcode || '';
-      // app.globalData.mallid = params.mallid || app.globalData.mallid
-      if (this.userInfo) {
-        // this.getParkInfo();
-        return;
-        // app.globalData.isNewMember = '';
-        // 场景二维码记录(是否扫码进入)
-        // app.globalData.paramsScene = {};
-        // this.$saveSceneQrcodeDetail(
-        //   'page',
-        //   'parkingFee',
-        //   '停车缴费',
-        //   '',
-        //   '',
-        //   '',
-        //   ''
-        // );
-      }
-      // 埋点本地化
-      this.preUrl = uni.getStorageSync('previousUrl');
-      uni.setStorageSync('previousUrl', '/pages/parkingFee/home.vue');
-    },
     toggleType(carType) {
       this.ind = 0;
       this.active = 0;
@@ -179,102 +158,17 @@ export default {
       uni.showLoading({
         title: '加载中',
       });
-      /*const openid = uni.getStorageSync('openid') || this.openId;
-       let params = {
-       // mallid: '8a84853b7c91ac5b017c961a9b2a030d',
-       // groupId: '8a84853b7c91ac5b017c962dab55030e',
-       mallid: this.mallId,
-       groupId: this.groupId,
-       openid: openid,
-       vipcode: this.member?.vipcode,
-       };
-       console.log(342, params);
-       this.$md(params);
-       this.$request({
-       url: this.$baseURL + 'api/1.0/park/parkInfo',
-       data: params,
-       method: 'POST',
-       header: JSON.parse(uni.getStorageSync('handleUser')),
-       })
-       .then((res) => {
-       if (res.data.code === 0) {
-       const data = res.data.data || {};
-       this.carList = data.carList;
-       this.parkInfoEntity = data.parkInfoEntity;
-       this.hourMoney =
-       parseFloat(this.parkInfoEntity.needmoney) /
-       parseFloat(this.parkInfoEntity.tohours);
-       let reg = /[;;]/g;
-       this.parkInfoEntity.payinstruction =
-       this.parkInfoEntity.payinstruction.replace(reg, '\r\n');
-       this.parkInfoEntity.hourMoney = this.hourMoney;
-       uni.setStorageSync('parkinfo', JSON.stringify(this.parkInfoEntity));
-       } else {
-       uni.showToast({
-       title: res.data.msg,
-       duration: 2000,
-       icon: 'none',
-       });
-       }
-       })
-       .catch((err) => {
-       uni.showToast({
-       title: '网络超时请稍后再试',
-       duration: 2000,
-       icon: 'none',
-       });
-       console.log(err);
-       });*/
       try {
-        console.log(222222);
-        // const res = await parkingLots('8aaa83397bf7310e017bf7c8fb740009');
-        // const res = await parkingLots('8aaa87bc7ce98224017ce995fd8a0002');
         const res = await parkingLots('8aaa82ea804d07cd0180516ff03b0008'); // TODO: 临时写死
-        /*const data = {
-         parkName: '杭州停车场',
-         parkCode: 'hz01',
-         carList: [],
-         description:
-         '计费基础规则:10元每小时,上不封顶 ;\n线上缴费渠道:CRM小程序 (分会员通道及非会员通道);1\n会员等级减免:铂金卡当日可免费停车4小时,金卡当时可免费停车2小时,银卡无减免 (当日仅限使用1次,可与其它减免共享);\n积分抵扣:1000积分抵扣10元(手动输入抵扣积分);\n消费减免:消费200元可减免2小时,消费400元可减免4小时,消费800元可减免6小时 。仅限会员,当日有效,当日可多次享受该减免,当日最多可享受消费减免6小时。;\n        消费减免举例:;\n        (1) 某顾客第一次进场,消费230元  离场时可看到减免2小时的选项,默认为选中;\n        (2) 如果顾客未使用减免,顾客第二次进场,消费+270  离场时可看到减免金额提高到4小时;\n         如果顾客使用减免:顾客第二次进场,消费+270  离场时可看到还是只能减免2小时;\n        (3) CRM小程序缴费页面停留时长1分钟,1分钟后自动刷新获取最新缴费金额;\n纸质优惠券核销: 顾客在CRM小程序手动扫码获取优惠券金额;\n会员活动及积分兑换优惠 :通过CRM系统获取(详细情况由CRM另行描述)!',
-         };*/
-        // let reg = /[;;]/g;
-        // this.parkInfoEntity.description = data.description.replace(reg, '\r\n');
         let reg = /[;;]/g;
         this.description = res.description.replace(reg, '\r\n').replace(/\r\n/g, '<br/>');
-        // console.log(238238238238238238238, this.description);
-        // const data = res.data.data || {};
-        // console.log(236, uni.getStorageSync('carList'));
         const carList = uni.getStorageSync('carList');
         if (carList) {
           this.carList = JSON.parse(carList);
         }
-        console.log(238, this.carList);
-        // this.parkInfoEntity = data.parkInfoEntity;
-        // this.hourMoney =
-        //   parseFloat(this.parkInfoEntity.needmoney) /
-        //   parseFloat(this.parkInfoEntity.tohours);
-        // let reg = /[;;]/g;
-        // this.parkInfoEntity.payinstruction =
-        //   this.parkInfoEntity.payinstruction.replace(reg, '\r\n');
-        // this.parkInfoEntity.hourMoney = this.hourMoney;
-        // uni.setStorageSync('parkinfo', JSON.stringify(this.parkInfoEntity));
-
-        // console.log(233, res);
       } catch (e) {
         console.log(225225, e);
       }
-      // return;
-      // const data = res.data || {};
-      // this.carList = data.carList;
-      // this.parkInfoEntity = data.parkInfoEntity;
-      // this.hourMoney =
-      //   parseFloat(this.parkInfoEntity.needmoney) /
-      //   parseFloat(this.parkInfoEntity.tohours);
-      // let reg = /[;;]/g;
-      // this.parkInfoEntity.payinstruction =
-      //   this.parkInfoEntity.payinstruction.replace(reg, '\r\n');
-      // this.parkInfoEntity.hourMoney = this.hourMoney;
-      // uni.setStorageSync('parkinfo', JSON.stringify(this.parkInfoEntity));
     },
     //缴费说明隐藏显示
     top_display() {
@@ -497,20 +391,16 @@ export default {
         return;
       }
       // uni.removeStorageSync('passLogin');
-      // 北京停车场开票
-      // if (this.parkInfoEntity.parkMallCode === 3) {
-      //   uni.navigateToMiniProgram({
-      //     appId: this.$etcpAppId,
-      //     path: this.$etcpAppInvoicePath,
-      //     envVersion: 'release',
-      //   })
-      //   return
-      // }
-      // this.$router.push({
-      //   path: './parkingReceipt/parkingReceipt',
-      // })
-      if (this.$store.state.passLogin) {
+      // TODO: 北京停车场开票
+      /* if (this.parkInfoEntity.parkMallCode === 3) {
+        uni.navigateToMiniProgram({
+          appId: this.$etcpAppId,
+          path: this.$etcpAppInvoicePath,
+          envVersion: 'release',
+        })
+        return
       }
+      */
       this.$router.push({ path: 'parkingReceipt' });
     },
     //停车券兑换
@@ -528,113 +418,121 @@ export default {
     },
     tabbarActiveEvent(name) {
       this.tabbarActive = name
-      this.$store.dispatch('order/unlicensedRule', (code) => {
-        // CAR_NOT_FOUND 车场扫描道闸入口,发现无车
-        if (code === 'CAR_NOT_FOUND') {
+      if (name === '无牌缴费') {
+        this.$store.dispatch('order/unlicensedRule', (code) => {
+          // CAR_NOT_FOUND 车场扫描道闸入口,发现无车
+          if (code === 'CAR_NOT_FOUND') {
 
-        }
-        // CAR_HAS_PLATE 车场扫描道闸入口,发现有牌车
-        if (code === 'CAR_HAS_PLATE') {
+          }
+          // CAR_HAS_PLATE 车场扫描道闸入口,发现有牌车
+          if (code === 'CAR_HAS_PLATE') {
 
-        }
-      })
+          }
+        })
+      }
     },
     // 无牌车闸机扫码
     async scanCarCode() {
-      // 模拟失败
-      /* this.$router.push({
-        path: 'parkingFeeMsg',
-        query:{
-          type: 'success'
-        }
-      }) */
-      this.qrCodesRule('e41d4d9dd5534f4aa3de88326a2e6f85')
-      return
-      const runScanFn = (res) => {
-        if (res.scanType == 'QR_CODE' && res.scanType) {
-          console.log(res.result);
-          // 获取二维码参数之后,模拟提取参数
-          const url = res.result;
-          if (url.indexOf('auth/') === -1) { // 单纯的code
-            console.log('提取到的参数', res.result);
-            // this.getPaperCouponInfo(res.result);
-          } else { // 从url中提取参数
-            const start = url.indexOf('auth/');
-            const end = url.indexOf('?');
-            const params = url.slice(start, end).split('/');
-            if (params && params.length) {
-              const couponCode = params[1];
-              console.log('提取到的参数', couponCode);
-              // this.getPaperCouponInfo(couponCode);
+      try {
+        this.qrCodesRule('e41d4d9dd5534f4aa3de88326a2e6f85')
+        return
+        const runScanFn = (res) => {
+          if (res.scanType == 'QR_CODE' && res.scanType) {
+            console.log(res.result);
+            // 获取二维码参数之后,模拟提取参数
+            const url = res.result;
+            if (url.indexOf('auth/') === -1) { // 单纯的code
+              console.log('提取到的参数', res.result);
+              this.qrCodesRule(res.result)
+              // this.getPaperCouponInfo(res.result);
+            } else { // 从url中提取参数
+              const start = url.indexOf('auth/');
+              const end = url.indexOf('?');
+              const params = url.slice(start, end).split('/');
+              if (params && params.length) {
+                const couponCode = params[1];
+                console.log('提取到的参数', couponCode);
+                this.qrCodesRule(couponCode)
+                // this.getPaperCouponInfo(couponCode);
+              }
             }
           }
+        };
+        // 微信小程序
+        const platform = getPlatform();
+        if (platform === 'miniprogram') {
+          window.toWXSendMsg({
+            type: 'scanQRCode',
+          });
+          window.subscribe('scanQRCodeOver', (options) => {
+            console.log('微信扫码结束之后的返回参数', options);
+            runScanFn(options);
+          });
+        } else {
+          this.$wx.scanQRCode({
+            desc: 'scanQRCode desc',
+            needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+            // scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
+            success: (res) => {
+              console.log('H5页面扫码获取到的参数——成功', res);
+              runScanFn(res);
+              // this.formMsg.deviceCode = res.resultStr;
+            },
+            error: (res) => {
+              console.log('H5页面扫码获取到的参数——失败', res);
+              // console.log(242, res);
+            },
+          });
         }
-      };
-      // 微信小程序
-      const platform = getPlatform();
-      if (platform === 'miniprogram') {
-        window.toWXSendMsg({
-          type: 'scanQRCode',
-        });
-        window.subscribe('scanQRCodeOver', (options) => {
-          console.log('微信扫码结束之后的返回参数', options);
-          runScanFn(options);
-        });
-      } else {
-        this.$wx.scanQRCode({
-          desc: 'scanQRCode desc',
-          needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
-          // scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
-          success: (res) => {
-            console.log('H5页面扫码获取到的参数——成功', res);
-            runScanFn(res);
-            // this.formMsg.deviceCode = res.resultStr;
-          },
-          error: (res) => {
-            console.log('H5页面扫码获取到的参数——失败', res);
-            // console.log(242, res);
-          },
-        });
+      } catch (err) {
+        console.log(624, err);
       }
 
-      /* uni.scanCode({
-       onlyFromCamera: false,
-       scanType: ['qrCode'],
-       success: (res) => {
-       console.log('扫码', res);
-       if (res.scanType == 'QR_CODE' && res.scanType) {
-       console.log(res.result);
-       const url = res.result;
-       if (url.indexOf('auth/') === -1) {
-       this.getPaperCouponInfo(res.result);
-       } else {
-       const start = url.indexOf('auth/');
-       const end = url.indexOf('?');
-       const params = url.slice(start, end).split('/');
-       if (params && params.length) {
-       const couponCode = params[1];
-       this.getPaperCouponInfo(couponCode);
-       }
-       }
-       }
-       },
-       }); */
     },
-    // 处理扫码结果
+    // 处理扫码结果: 组装参数,剩余流程,在 缴费支付页面 实现
     async qrCodesRule(code) {
       try {
         const qrCodesres = await qrCodes(code); // 无牌车扫码
-        console.log(626, qrCodesres);
+        // 记录buildingId,确保 buildingId 是最新的数据
         window.localStorage.setItem('buildingId', qrCodesres.buildingId);
+        // 如果是无牌车扫码:出场
+        console.log('模拟出场', this.unlicensedInfo.type);
+        // return
+        if (this.unlicensedInfo?.type === 'unlicensedOut') {
+          // 查询用户是否存在车牌
+          this.$store.dispatch('order/unlicensedRule', (vehicleNo) => {
+            // 出场前,扫码缴费
+            this.$router.push({
+              path: 'parkingFeeDetail',
+              query: {
+                type: 'success',
+                gateId: qrCodesres.gateId,
+                vehicleNo: vehicleNo
+              }
+            })
+          });
+          return
+        }
+        // 如果是无牌车扫码:入场
         const unlicensedCarCheckInres = await unlicensedCarCheckIn({ // 获取无牌车牌
           gateId: qrCodesres.gateId
         });
-        console.log(630, unlicensedCarCheckInres);
+        // 前往 缴费支付页面
+        this.$router.push({
+          path: 'parkingFeeMsg',
+          query: {
+            type: 'success',
+            vehicleNo: unlicensedCarCheckInres.vehicleNo
+          }
+        })
       } catch (err) {
-        console.log(633, err);
-        // if(err?.code === "VALIDATION_FAILED") {
-
-        // }
+        // 车场扫描道闸入口,发现无车/车场扫描道闸入口,发现有牌车 >>> 停止往下执行,默认提示报错信息
+        if (/CAR_NOT_FOUND|CAR_HAS_PLATE/.test(err.code)) {
+          return
+        }
+        console.log('模拟出场的报错', err);
+        return
+        // 如果是其他错误的话,则继续往下执行
         this.$router.push({
           path: 'parkingFeeMsg',
           query: {
@@ -642,6 +540,10 @@ export default {
           }
         })
       }
+    },
+    // 前往支付
+    unlicensedToPay() {
+      this.toHandleSearch(this.unlicensedCar)
     }
   },
 };

+ 18 - 13
src/pages/parkingFee/mixins/parkingFeeDetail.js

@@ -62,16 +62,13 @@ export default {
       usePointsTime: (state) => state.order.usePointsTime,
       enableConsume: (state) => state.order.enableConsume,
       unitAmount: (state) => state.order.unitAmount,
+      unlicensedInfo: state => state.unlicensedInfo
       // checkedTotal: state => state.order.checkedTotal,
     }),
     // 支付按钮状态
     payBtnDisabled() {
-      console.log('62626262626', this.member, this.orderDetail, !this.orderDetail.parkInfo);
-      return false
-      /* return (
-        !this.actualPayFee ||
-        (JSON.stringify(this.member) !== '{}' && !this.orderDetail.parkInfo)
-      ); */
+      // 当存在待支付金额 或者 用户登陆
+      return !this.orderDetail?.parkingRecord?.totalFeeInYuan || (JSON.stringify(this.member) !== '{}' && !this.orderDetail.parkInfo);
     },
     integralDesc() {
       if (this.pointsTime > 0) {
@@ -279,7 +276,11 @@ export default {
         message: '支付失败',
         confirmButtonColor: '#333',
       }).then(() => {
-        this.$store.dispatch('order/orderInit', '粤A51113')
+        this.$store.dispatch('order/orderInit', {
+          gateId: this.$route.query?.gateId,
+          vehicleNo: this.$route.query?.vehicleNo,
+          endlessLoop: this.endlessLoop
+        })
         this.btnLoading = false;
         // this.createParkOrder();
       });
@@ -303,12 +304,12 @@ export default {
       // 纸质优惠券
       // 优惠金额
       // 应付金额
-      console.log(83838383);
-
       // this.$store.commit('order/SET_ORDER_DETAIL', checkOutResponse);
       try {
         this.$store.dispatch('order/orderInit', {
           vehicleNo: this.$route.query.vehicleNo,
+          gateId: this.$route.query?.gateId,
+          endlessLoop: this.endlessLoop,
           callback: (res) => {
             console.log(303, res);
             if (/NOT_FOUND|PARKING_RECORD_NOT_FOUND/.test(res.code)) {
@@ -370,9 +371,9 @@ export default {
     //
     // 计算优惠信息
     discountssss(params) {
-      console.log(275, params);
-      console.log(275, params.discountInfo);
-      console.log(275, params.discountInfo.consume);
+      // console.log(275, params);
+      // console.log(275, params.discountInfo);
+      // console.log(275, params.discountInfo.consume);
       return 1;
     },
     coupon() {
@@ -386,7 +387,11 @@ export default {
     // 重置倒计时
     resetCountDown() {
       this.$refs.countDown.reset();
-      // this.$store.dispatch('order/orderInit', '000')
+      this.$store.dispatch('order/orderInit', {
+        gateId: this.$route.query?.gateId,
+        vehicleNo: this.$route.query?.vehicleNo,
+        endlessLoop: this.endlessLoop
+      })
       // 重新创建订单
       // this.createParkOrder();
     },

+ 22 - 16
src/pages/parkingFee/mixins/parkingFeeDetailSuccess.js

@@ -2,7 +2,8 @@ import { mapState } from 'vuex';
 import uni from '@/utils/uniHooks';
 import { orderInfo } from '@/api/parking';
 import ordersInfoMockData from '@/api/mockData/ordersInfo.json';
-import {ORDER_STATUS} from '@/common/js/BaseDictionary'
+import { ORDER_STATUS } from '@/common/js/BaseDictionary'
+import moment from 'moment'
 export default {
   data() {
     return {
@@ -22,19 +23,7 @@ export default {
     this.getData();
   },
   computed: {
-    parkingTime() {
-      const time = this.detail.serviceMin;
-      const days = parseInt(time / 60 / 24);
-      const hours = parseInt((time / 60) % 24);
-      const minutes = parseInt(time % 60);
-      if (days > 0) {
-        return `${days}天 ${hours}小时 ${minutes}分钟`;
-      }
-      if (hours > 0) {
-        return `${hours}小时 ${minutes}分钟`;
-      }
-      return `${minutes}分钟`;
-    },
+
     ...mapState({
       // custTypeId: (state) => state.custTypeId,
       // paramsScene: (state) => state.paramsScene,
@@ -117,9 +106,26 @@ export default {
       });
     },
   },
-  filters:{
+  filters: {
     orderStatus(val) {
       return ORDER_STATUS[val]
-    } 
+    },
+    parkingTime(val) {
+      const time = val;
+      const days = parseInt(time / 60 / 24);
+      const hours = parseInt((time / 60) % 24);
+      const minutes = parseInt(time % 60);
+      if (days > 0) {
+        return `${days}天 ${hours}小时 ${minutes}分钟`;
+      }
+      if (hours > 0) {
+        return `${hours}小时 ${minutes}分钟`;
+      }
+      return `${minutes}分钟`;
+    },
+    momentFormat(val) {
+      if(!val)return val
+      return moment(val).format('YYYY-MM-DD hh:mm:ss')
+    }
   }
 };

+ 1 - 1
src/pages/parkingFee/parkingFee.vue

@@ -1,5 +1,5 @@
 <template>
-  <component :is="componentName"></component>
+  <component :is="componentName" :theme="theme"></component>
 </template>
 
 <script>

+ 8 - 6
src/pages/parkingFee/parkingFeeMsg.vue

@@ -9,17 +9,17 @@
       <div class="card-box">
         <img :src="`${require(`./static/images/unlicensed-0.png`)}`" />
         <div class="car-number">
-          <div class="number">临K 9Q289H</div>
+          <div class="number">{{ vehicleNo | formatCarno}}</div>
           <div class="tips">车辆类型:无牌车辆</div>
         </div>
       </div>
       <k-button title="进入首页" disabledColor="#D1D2D9" @click="goHome" />
     </div>
     <!-- 领取临牌:失败 -->
-    <div class="fill-box" v-if="type === 'fill'">
-      <img class="icon" :src="require(`./static/images/unlicensed/fill.png`)" />
-      <div class="status-title">临牌领取成功</div>
-      <div class="status-info">若未正常抬杠,请关闭当前页面重新扫码</div>
+    <div class="fail-box" v-if="type === 'fail'">
+      <img class="icon" :src="require(`./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(`./static/images/unlicensed-0.png`)}`" />
@@ -53,6 +53,7 @@ export default {
     return {
       theme: 'theme-mall',
       type: '',
+      vehicleNo: '',
     };
   },
   async created() {
@@ -70,6 +71,7 @@ export default {
       this.type = this.$route.query?.type;
     }
     if (this.type === 'success') {
+      this.vehicleNo = this.$route.query?.vehicleNo;
     }
   },
   mounted() {},
@@ -158,7 +160,7 @@ export default {
 }
 
 .success-box,
-.fill-box {
+.fail-box {
   margin-top: 123px;
   text-align: center;
   padding: 0 24px;

+ 0 - 0
src/pages/parkingFee/static/images/unlicensed/fill.png → src/pages/parkingFee/static/images/unlicensed/fail.png


+ 17 - 1
src/store/index.js

@@ -51,6 +51,10 @@ const store = new Vuex.Store({
     brandInfo: {},
     curMarket: {},
     isInit: true, // 当内嵌在小程序中的H5页面,没有接收到小程序数据时,默认显示骨架屏幕
+    // 无牌车
+    unlicensedInfo: {},
+    // 防止用户在无牌车流程中卡死
+    endlessLoop: ''
   },
   mutations: {
     SET_GROUP_ID(state, payload) {
@@ -149,6 +153,13 @@ const store = new Vuex.Store({
     SET_BRAND_ID(state, payload) {
       state.brandId = payload;
     },
+    // 无牌车
+    SET_UNLICENSED_INFO(state, payload) {
+      state.unlicensedInfo = payload;
+    },
+    SET_ENDLESS_LOOP(state, payload) {
+      state.endlessLoop = payload;
+    },
   },
   actions: {
     async baseInit({ commit, dispatch }, { options, callback }) {
@@ -177,7 +188,8 @@ const store = new Vuex.Store({
           accessToken = '',
           source = '',
           appId = '',
-
+          // 无牌车逻辑
+          unlicensedInfo,
           // CRM
           // brandInfo = {},
           // curMarket = {}
@@ -214,6 +226,10 @@ const store = new Vuex.Store({
         commit('SET_GROUP_ID', groupId);
         commit('SET_MALL_ID', mallId);
         commit('SET_BRAND_ID', brandId);
+        // 如果是无牌车
+        // console.log('218218218218', unlicensedInfo);
+        console.log('用户扫码进入的', unlicensedInfo);
+        commit('SET_UNLICENSED_INFO', unlicensedInfo)
         /*if (/dev-|8080|qa-/.test(href)) {
          commit('SET_GROUP_ID', groupId);
          commit('SET_MALL_ID', mallId);

+ 21 - 6
src/store/order.js

@@ -133,22 +133,31 @@ const mutations = {
 };
 
 const actions = {
-  async orderInit({ commit, dispatch, state }, { gateId, vehicleNo = '浙A616A1', callback }) {
+  /**
+   * 车辆订单的缴费信息初始化
+   * @param {*} param0
+   * @param {*} param1.gateId  车场闸机口ID
+   * @param {*} param1.vehicleNo  车牌号(包含临牌)
+   * @param {*} param1.callback  回调函数,用于接口报错时,展示对应的信息
+   * @param {*} param1.endlessLoop 用于判断当前用户是否扫码进入 
+   */
+  async orderInit({ commit, dispatch, state }, { gateId='124p3LK1', vehicleNo = '浙A616A1', callback, endlessLoop }) {
     try {
       const unlicensed = vehicleNo.indexOf('临') > -1; // true: 临时车牌;false:普通车牌
       // const res = await checkOut('浙A616A1');
       // const res = await checkOut('闽AAQ5519', unlicensed);
       // const res = await checkOut('粤A51113');
       // const res = await checkOut('沪DCJ986');
-      const method = unlicensed ? unlicensedCarCheckout : checkOut
+      // 场内缴费,调 check-out 接口,
+      const method = unlicensed && endlessLoop ? unlicensedCarCheckout : checkOut
       const res = await method(vehicleNo, unlicensed, gateId);
-      console.log(vehicleNo, res);
+      // console.log(vehicleNo, res);
       // 所有的优惠时间长转为金额
       // console.log(112, '所有的优惠时间长转为金额');
       // dispatch('orderInitRule', checkOutQHResponse);
       dispatch('orderInitRule', res);
     } catch (error) {
-      console.log('151151151151151', error);
+      // console.log('151151151151151', error);
       /* if (/NOT_FOUND|PARKING_RECORD_NOT_FOUND/.test(error.code)) {
         callback && callback(error)
       } */
@@ -468,7 +477,7 @@ const actions = {
   },
 
   // 无牌车逻辑
-  async unlicensedRule({ commit, dispatch, state }) {
+  async unlicensedRule({ commit, dispatch, state }, callback) {
     try {
       // const res = await currentUnlicensedPlate(); // 无牌车查询
       // const res = await unlicensedCarCheckIn({gateId: 1}); // 无牌车入场
@@ -476,8 +485,14 @@ const actions = {
        * CAR_NOT_FOUND 车场扫描道闸入口,发现无车
        * CAR_HAS_PLATE 车场扫描道闸入口,发现有牌车
        */
-      const res = unlicensedCarCheckInResponse;
+      // const res = unlicensedCarCheckInResponse;
+      const res = await currentUnlicensedPlate();
       console.log('无牌车的查询记录', res);
+      commit('setUnlicensedCar', res.vehicleNo);
+      // 如果是扫码进入的用户,在出场时需要重新扫码,这时会在此处传入的一个回调函数,在获取到临牌时,返回给 qrCodesRule 函数
+      if(res.vehicleNo && callback) {
+        callback(res.vehicleNo);
+      }
     } catch (err) {
       console.log(err);
     }

+ 1 - 1
src/utils/index.js

@@ -61,7 +61,7 @@ export function getPlatform() {
   if (/micromessenger/g.test(userAgent)) {
     return 'micromessenger';
   }
-  return 'miniprogram';
+  return 'miniprogram'; // TODO: 上线前改为其他
 }
 
 // 是否在微信小程序中运行

+ 7 - 0
vue.config.js

@@ -2,6 +2,7 @@ const path = require('path');
 const postcssPxToViewport = require('./postcss.config');
 const vueSrc = 'src';
 const CDN_URL = process.env.CDN_URL || '';
+const TerserPlugin = require('terser-webpack-plugin')
 
 module.exports = {
   publicPath:
@@ -11,6 +12,8 @@ module.exports = {
         : '/tparking/'
       : '/tparking/',
   assetsDir: 'static',
+  // productionSourceMap: true,
+  productionSourceMap: process.env.NODE_ENV === 'dev',
   css: {
     loaderOptions: {
       // 给 less-loader 传递 Less.js 相关选项
@@ -30,6 +33,7 @@ module.exports = {
       //   additionalData: `@import "~@/uni.scss";`,
       // },
     },
+    sourceMap: true
   },
   // pluginOptions: {
   //   'style-resources-loader': {
@@ -74,8 +78,11 @@ module.exports = {
         return newArgs;
       })
       .end();
+      // 编译之后清理console.log
+      config.optimization.minimizer('vue').use(TerserPlugin, [{ terserOptions: { compress: { drop_console: true } } }])
   },
   configureWebpack: {
+    devtool: process.env.NODE_ENV === 'dev' ? 'source-map' : undefined,
     resolve: {
       alias: {
         '@': path.join(__dirname, vueSrc),