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

Merge pull request #108 from John-Hong/develop

微服务代码迁移
Tron 2 жил өмнө
parent
commit
5b48ad5c8b
100 өөрчлөгдсөн 10965 нэмэгдсэн , 31 устгасан
  1. 3 0
      src/common/js/BaseDictionary.js
  2. 1 1
      src/components/Login/Login.vue
  3. 344 0
      src/components/my-protocol-modal/my-protocol-modal.vue
  4. 54 0
      src/components/uni-button/index.vue
  5. 53 0
      src/components/uni-image/index.vue
  6. 0 18
      src/components/uni-load-more/uni-load-more.vue
  7. 10 0
      src/components/uni-text/index.vue
  8. 23 12
      src/components/uni-view/uni-view.vue
  9. 1619 0
      src/crmPages/parkingFee.vue
  10. 614 0
      src/crmPages/parkingFeeCoupon.vue
  11. 2897 0
      src/crmPages/parkingFeeDetail.vue
  12. 276 0
      src/crmPages/parkingFeeDetailSuccess.vue
  13. 653 0
      src/crmPages/parkingFeeDiscounts.vue
  14. 835 0
      src/crmPages/parkingFeeForm.vue
  15. 97 0
      src/crmPages/parkingFeeHint/parkingFeeHint.vue
  16. 329 0
      src/crmPages/parkingFeeList.vue
  17. 439 0
      src/crmPages/parkingFeePaperCoupon.vue
  18. 98 0
      src/crmPages/parkingFeePayment.vue
  19. 157 0
      src/crmPages/parkingFeeSuccess.vue
  20. 714 0
      src/crmPages/parkingReceipt/parkingApplication.vue
  21. 368 0
      src/crmPages/parkingReceipt/parkingChangeHeader.vue
  22. 346 0
      src/crmPages/parkingReceipt/parkingChooseHeader.vue
  23. 98 0
      src/crmPages/parkingReceipt/parkingHeaderDetail.vue
  24. 251 0
      src/crmPages/parkingReceipt/parkingInvoice.vue
  25. 187 0
      src/crmPages/parkingReceipt/parkingInvoiceApply.vue
  26. 256 0
      src/crmPages/parkingReceipt/parkingInvoiceImage.vue
  27. 192 0
      src/crmPages/parkingReceipt/parkingOrderDetail.vue
  28. BIN
      src/crmPages/static/images/arrows.png
  29. BIN
      src/crmPages/static/images/check.png
  30. BIN
      src/crmPages/static/images/delete.png
  31. BIN
      src/crmPages/static/images/dot.png
  32. BIN
      src/crmPages/static/images/download.png
  33. BIN
      src/crmPages/static/images/edit.png
  34. BIN
      src/crmPages/static/images/hint.png
  35. BIN
      src/crmPages/static/images/icon1-blue.png
  36. BIN
      src/crmPages/static/images/icon1-green.png
  37. BIN
      src/crmPages/static/images/icon1.png
  38. BIN
      src/crmPages/static/images/icon2-blue.png
  39. BIN
      src/crmPages/static/images/icon2-green.png
  40. BIN
      src/crmPages/static/images/icon2.png
  41. BIN
      src/crmPages/static/images/icon3-blue.png
  42. BIN
      src/crmPages/static/images/icon3-green.png
  43. BIN
      src/crmPages/static/images/icon3.png
  44. BIN
      src/crmPages/static/images/icon4-blue.png
  45. BIN
      src/crmPages/static/images/icon4-green.png
  46. BIN
      src/crmPages/static/images/icon4.png
  47. BIN
      src/crmPages/static/images/icon5.png
  48. BIN
      src/crmPages/static/images/money.png
  49. BIN
      src/crmPages/static/images/nodataicon.png
  50. BIN
      src/crmPages/static/images/parking-bgi.png
  51. BIN
      src/crmPages/static/images/rent.png
  52. BIN
      src/crmPages/static/images/sweep.png
  53. BIN
      src/crmPages/static/images/update.png
  54. BIN
      src/images/1v1-40.png
  55. BIN
      src/images/1v1-41.png
  56. BIN
      src/images/1v1-42.png
  57. BIN
      src/images/1v1-43.png
  58. BIN
      src/images/1v1-44.png
  59. 8 0
      src/images/authorize/weixin-2.svg
  60. BIN
      src/images/calendar.png
  61. BIN
      src/images/calendar1.png
  62. BIN
      src/images/chart.png
  63. BIN
      src/images/chooseMarket/location-active.png
  64. 18 0
      src/images/chooseMarket/location-recent.svg
  65. BIN
      src/images/chooseMarket/location.png
  66. 10 0
      src/images/chooseMarket/location.svg
  67. 6 0
      src/images/chooseMarket/miaozhun.svg
  68. 9 0
      src/images/chooseMarket/search.svg
  69. BIN
      src/images/default-shanghai.png
  70. BIN
      src/images/empty.png
  71. BIN
      src/images/home/home-location-icon.png
  72. BIN
      src/images/icon-carType.png
  73. BIN
      src/images/jingan-ticket-icon.png
  74. BIN
      src/images/limitErr.png
  75. BIN
      src/images/location.png
  76. BIN
      src/images/loggedOff/icon-blue.png
  77. BIN
      src/images/loggedOff/icon-green.png
  78. BIN
      src/images/loggedOff/icon-success-blue.png
  79. BIN
      src/images/loggedOff/icon-success-green.png
  80. BIN
      src/images/loggedOff/icon.png
  81. BIN
      src/images/member-center-activity.png
  82. BIN
      src/images/member-center-birthday.png
  83. BIN
      src/images/member-center-park.png
  84. BIN
      src/images/member-center-score.png
  85. BIN
      src/images/membershipInterests-active.png
  86. BIN
      src/images/membershipInterests.png
  87. BIN
      src/images/my/main-ac.png
  88. BIN
      src/images/my/main-qr.png
  89. BIN
      src/images/my/vvip-main-qr.png
  90. BIN
      src/images/parkingReceipt-noData.png
  91. BIN
      src/images/personInfo/address.png
  92. BIN
      src/images/personInfo/birthday.png
  93. BIN
      src/images/personInfo/gender.png
  94. BIN
      src/images/personInfo/name.png
  95. BIN
      src/images/phone.png
  96. BIN
      src/images/points-mail-search.png
  97. BIN
      src/images/pointsMail/nav-classify-actived.png
  98. BIN
      src/images/pointsMail/nav-classify.png
  99. BIN
      src/images/pointsMail/product-card.png
  100. BIN
      src/images/pointsMail/sellOut.png

+ 3 - 0
src/common/js/BaseDictionary.js

@@ -56,6 +56,9 @@ export const lbsDictionary = {
   '8aaa87bc7ce98224017ce995fd8a0002': {
     ...SKC,
   },
+  '8a84854a7cfd947d017d02861a9d0002': {
+    ...SKC,
+  },
   '8a84854a7cfd947d017d0289266a0003': {
     ...SKC,
   },

+ 1 - 1
src/components/Login/Login.vue

@@ -2,7 +2,7 @@
   <div style="color: transparent">login</div>
 </template>
 <script>
-// import { isMini } from '@/utils/common';
+// import { isMini } from '@/utils/mixins';
 
 // import { crmQueryMemberInfo } from '@/utils/api-crm-member';
 // import Ws from '@/utils/websocket';

+ 344 - 0
src/components/my-protocol-modal/my-protocol-modal.vue

@@ -0,0 +1,344 @@
+<template>
+  <div class="authorize-hz" v-if="show" catchtouchmove="ture">
+    <div class="mid">
+      <div class="authorize-box">
+        <div class="bold">{{ title }}</div>
+        <div class="other">
+          感谢您{{ lbsName }}的信任!请您仔细阅读并充分理解我们最新更新的
+          <span
+            v-if="!privacyReminder"
+            style="color: #627ecf"
+            @click="gotoProtocol('privacyPolicy')"
+            >《{{ brandInfo.privacyPolicyName }}》</span
+          >&nbsp;
+          <span
+            v-if="!protocolReminder"
+            style="color: #627ecf"
+            @click="gotoProtocol('protocol')"
+            >《{{ brandInfo.protocolName }}》</span
+          >。
+          新的协议政策将不影响您现有的会员权益,您点击“同意”按钮后,将视为同意本次协议更新。
+        </div>
+      </div>
+      <div class="authorize-footer">
+        <button class="disagree_btn" @click="handleDisagree">不同意</button>
+        <button class="agree_btn" @click="handleConfirm">同意</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+// const app = getApp();
+import {
+  kipGetBrandInfo,
+  kipLogout,
+  kipAgreementCheck,
+  kipAgreementSave,
+} from '@/utils/api-kip.js';
+import MemberCacheTool from '@/utils/member-cache-tool.js';
+import KipCacheTool from '@/utils/kip-cache-tool.js';
+import CacheTool from '@/utils/cache-tool.js';
+import { isKOMiniApp } from '@/utils/utils.js';
+const YES = '1';
+const NO = '0';
+export default {
+  name: 'my-protocol-modal',
+  props: {
+    title: {
+      type: String,
+      default: '亲爱的会员',
+    },
+  },
+  data() {
+    return {
+      show: false,
+      curMarket: null,
+      brandInfo: null,
+      cacheKey: '',
+      privacyReminder: true,
+      protocolReminder: true,
+    };
+  },
+  mounted() {},
+  computed: {
+    lbsName() {
+      if (!this.curMarket) {
+        return '';
+      }
+      const lbsName = this.curMarket?.name || '';
+      return lbsName ? `对${lbsName}` : '';
+    },
+  },
+  methods: {
+    gotoProtocol(type) {
+      const brandId = app.globalData.groupId || uni.getStorageSync('groupId');
+      const lbsId = app.globalData.mallid || uni.getStorageSync('mallid');
+      uni.navigateTo({
+        url: `/pages/protocol/protocol?type=${type}&brandId=${brandId}&lbsId=${lbsId}&noBtn=1`,
+      });
+    },
+    handleConfirm() {
+      this.saveAgreementAction(YES);
+    },
+    handleDisagree() {
+      this.saveAgreementAction(NO);
+    },
+    open() {
+      // 获取当前商场
+      const { brandInfo, curMarket } = app.globalData;
+      const mallid = app.globalData.mallid || uni.getStorageSync('mallid');
+      const groupId = app.globalData.groupId || uni.getStorageSync('groupId');
+      if (!groupId || !mallid) {
+        console.warn('===>groupId活mallid不存在');
+        this.show = false;
+        return;
+      }
+      // 判断是否已登录
+      const member = uni.getStorageSync('member');
+      if (!member) {
+        console.warn('===>没有登录');
+        this.show = false;
+        return;
+      }
+      // 找到商场信息
+      if (curMarket) {
+        this.curMarket = curMarket;
+      }
+      // 找到品牌信息
+      if (brandInfo && brandInfo.id === groupId) {
+        this.brandInfo = brandInfo;
+        this.checkVersion();
+      } else {
+        // 根据brandId和lbsId请求
+        const params = {
+          id: groupId,
+          lbsId: mallid,
+        };
+        kipGetBrandInfo(params)
+          .then((resp) => {
+            const result = resp.data;
+            if (result && result.code === '000000') {
+              const brandArray = result.data;
+              if (brandArray && brandArray.length > 0 && brandArray[0]) {
+                const brandInfo = brandArray[0].brand;
+                // 拿到商场信息,版本号
+                this.brandInfo = brandInfo;
+                // 请求接口判断是否需要弹出
+                this.checkVersion();
+                // this.show = true;
+              }
+            } else {
+              uni.showToast({
+                title: result.message,
+                duration: 2000,
+                icon: 'none',
+              });
+            }
+          })
+          .catch((err) => {
+            this.show = false;
+            console.error(err);
+            uni.showToast({
+              title: '请求错误',
+              duration: 2000,
+              icon: 'none',
+            });
+          });
+      }
+    },
+    logout() {
+      const member = uni.getStorageSync('member');
+      const openid = member ? member.openid : '';
+      kipLogout()
+        .then((resp) => {
+          uni.hideLoading();
+          const result = resp.data;
+          if (result && (result.code == '000000' || result.code == '300000')) {
+            // 用户不同意协议直接静默退出
+            // 清除所有缓存,跳转到首页
+            MemberCacheTool.cleanMemberCache(app);
+            KipCacheTool.cleanKipCache();
+            uni.redirectTo({
+              url: '/pages/automatic/automaticIndex',
+            });
+          } else {
+            uni.showToast({
+              title: result.message,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        })
+        .catch((err) => {
+          uni.hideLoading();
+          console.error(err);
+          uni.showToast({
+            title: '请求错误',
+            duration: 2000,
+            icon: 'none',
+          });
+        });
+    },
+    getKeyByMallid(mallid) {
+      if (CacheTool.isShenZhenMallid(mallid)) {
+        return 'agreeProtocolSZ';
+      } else if (CacheTool.isShenYangMallid(mallid)) {
+        return 'agreeProtocolSY';
+      }
+      return '';
+    },
+    checkVersion() {
+      kipAgreementCheck()
+        .then((resp) => {
+          const result = resp.data;
+          if (result && result.code === '000000') {
+            const { agreementStatus, privacyReminder, protocolReminder } =
+              result.data || {};
+            this.privacyReminder = privacyReminder;
+            this.protocolReminder = protocolReminder;
+            if (privacyReminder && protocolReminder) {
+              this.show = false;
+            } else {
+              this.show = true;
+            }
+          } else {
+            uni.showToast({
+              title: result.message,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        })
+        .catch((err) => {
+          console.error(err);
+          uni.showToast({
+            title: '请求错误',
+            duration: 2000,
+            icon: 'none',
+          });
+        });
+    },
+    saveAgreementAction(status) {
+      const params = {};
+      if (!this.protocolReminder) {
+        params.protocolStatus = status;
+      }
+      if (!this.privacyReminder) {
+        params.privacyStatus = status;
+      }
+      kipAgreementSave(params)
+        .then((resp) => {
+          const result = resp.data;
+          if (!result || result.code !== '000000') {
+            uni.showToast({
+              title: result.message,
+              duration: 2000,
+              icon: 'none',
+            });
+          } else {
+            // 如果不同意协议则调用退出接口
+            this.show = false;
+            if (NO === status) {
+              this.logout();
+            }
+          }
+        })
+        .catch((err) => {
+          console.error(err);
+          uni.showToast({
+            title: '请求错误',
+            duration: 2000,
+            icon: 'none',
+          });
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less">
+// new
+.authorize-hz {
+  background: rgba(0, 0, 0, 0.6);
+  position: fixed;
+  z-index: 998;
+  width: 100%;
+  height: 100%;
+  left: 0;
+  top: 0;
+
+  .mid {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translateX(-50%) translateY(-50%);
+    width: 588rpx;
+    background: #fff;
+    border-radius: 17rpx;
+    padding: 56rpx 44rpx;
+
+    .authorize-box {
+      width: 100%;
+
+      .bold {
+        text-align: center;
+        color: #333333;
+        padding-bottom: 44rpx;
+      }
+
+      .other {
+        color: #666666;
+        line-height: 48rpx;
+        font-size: 28rpx;
+        color: #666666;
+        opacity: 1;
+      }
+
+      .checkBox {
+        display: flex;
+        justify-content: flex-start;
+        align-items: flex-start;
+        margin-top: 40rpx;
+
+        .popup-a {
+          color: #4e99ff;
+          text-decoration: underline;
+        }
+      }
+    }
+
+    .authorize-footer {
+      display: flex;
+      justify-content: space-between;
+      color: #ffffff;
+      margin-top: 56rpx;
+
+      .disagree_btn {
+        width: 176rpx;
+        height: 68rpx;
+        line-height: 68rpx;
+        border: 2rpx solid #b3b3b3;
+        border-radius: 34rpx;
+        color: #999999;
+        font-size: 30rpx;
+      }
+
+      .agree_btn {
+        width: 286rpx;
+        height: 68rpx;
+        line-height: 68rpx;
+        background: linear-gradient(90deg, #662d91 0%, #1b1464 100%);
+        opacity: 0.83;
+        border-radius: 34rpx;
+        color: #ffffff;
+        font-size: 30rpx;
+      }
+
+      .disabled {
+        background: #999999;
+      }
+    }
+  }
+}
+</style>

+ 54 - 0
src/components/uni-button/index.vue

@@ -0,0 +1,54 @@
+<template>
+  <div class="uni-button">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'uni-button',
+  props: {
+    src: {
+      type: String,
+      default: '',
+    },
+  },
+};
+</script>
+
+<style lang="less">
+.uni-button {
+  position: relative;
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+  padding-left: 14px;
+  padding-right: 14px;
+  box-sizing: border-box;
+  font-size: 18px;
+  text-align: center;
+  text-decoration: none;
+  line-height: 2.55555556;
+  border-radius: 5px;
+  -webkit-tap-highlight-color: transparent;
+  overflow: hidden;
+  color: #000;
+  background-color: #f8f8f8;
+  cursor: pointer;
+  &:after {
+    content: " ";
+    width: 200%;
+    height: 200%;
+    position: absolute;
+    top: 0;
+    left: 0;
+    border: 1px solid rgba(0,0,0,.2);
+    -webkit-transform: scale(.5);
+    transform: scale(.5);
+    -webkit-transform-origin: 0 0;
+    transform-origin: 0 0;
+    box-sizing: border-box;
+    border-radius: 10px;
+  }
+}
+</style>

+ 53 - 0
src/components/uni-image/index.vue

@@ -0,0 +1,53 @@
+<template>
+  <div class="uni-image" v-if="src">
+    <div
+      :style="{
+        backgroundImage: `url(${src})`,
+        backgroundPosition: '0% 0%',
+        backgroundSize: '100% 100%',
+        backgroundRepeat: 'no-repeat',
+      }"
+    >
+      <img :src="src" draggable="false" />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'image',
+  props: {
+    src: {
+      type: String,
+      default: '',
+    },
+  },
+};
+</script>
+
+<style lang="less">
+.uni-image {
+  width: 320px;
+  height: 240px;
+  display: inline-block;
+  overflow: hidden;
+  position: relative;
+
+  div,
+  img {
+    width: 100%;
+    height: 100%;
+  }
+
+  img {
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    opacity: 0;
+  }
+}
+</style>

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 18
src/components/uni-load-more/uni-load-more.vue


+ 10 - 0
src/components/uni-text/index.vue

@@ -0,0 +1,10 @@
+<template>
+  <span>
+    <slot></slot>
+  </span>
+</template>
+<script>
+export default {
+  name: 'uniText',
+}
+</script>

+ 23 - 12
src/components/uni-view/uni-view.vue

@@ -1,13 +1,24 @@
-<template>
-  <div>
-    <slot></slot>
-  </div>
-</template>
-<script>
-export default {
-  name: 'uni-view'
-}
+<template>
+  <div class="uni-view">
+    <slot></slot>
+  </div>
+</template>
+<script>
+export default {
+  name: 'uniView',
+  props: {
+    // style: {
+    //   type: [Object, String],
+    //   default: '',
+    // },
+  },
+  mounted() {
+    console.log(this.style)
+  },
+};
 </script>
-
-
-
+<style>
+.uni-view {
+  display: block;
+}
+</style>

+ 1619 - 0
src/crmPages/parkingFee.vue

@@ -0,0 +1,1619 @@
+<template>
+  <scroll-view
+    scroll-y="true"
+    :class="{ 'scroll-Y': true, 'color-scroll-Y': custTypeId !== 0 }"
+    scroll-bottom="1000"
+  >
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+<!--    <authorize ref="authorize"></authorize>-->
+    <my-protocol-modal
+      ref="szProtocolModal"
+      title="会员协议政策更新提示"
+    ></my-protocol-modal>
+    <view class="wrap">
+      <view class="parkingFee">
+        <view
+          class="parkingFee-top"
+          :style="{
+            'background-image':
+              'url(./static/images/parking-bgi.png);background-attachment: fixed;',
+          }"
+        >
+          <view
+            :class="{
+              top_content: true,
+              blue_top_content: custTypeId === 1,
+              green_top_content: custTypeId === 2,
+            }"
+            :style="{
+              'background-image':
+                custTypeId === 1 ? `url(${picUrl}${blueHeadBg});` : '',
+            }"
+          >
+            <view class="title_box">
+              <text class="btn">缴费说明</text>
+            </view>
+            <view class="info" :class="!init_ch ? 'info_show' : ''"
+              ><text>{{ parkInfoEntity.payinstruction }}</text></view
+            >
+          </view>
+          <view
+            class="top_down"
+            @click="top_display"
+            v-if="!init_ch && parkInfoEntity.payinstruction.length > 60"
+            >︾</view
+          >
+          <view class="top_down" @click="top_display" v-else>︽</view>
+          <view
+            :class="{
+              top_menu: true,
+              blue_top_menu: custTypeId === 1,
+              green_top_menu: custTypeId === 2,
+            }"
+            v-if="custTypeId >= 0"
+          >
+            <view class="menu_item" @click="doRouter">
+              <image
+                :src="`./static/images/icon2${colorAry[custTypeId]}.png`"
+              />
+              <text>缴费记录</text>
+            </view>
+            <view class="menu_item" @click="doRouter3">
+              <image
+                :src="`./static/images/icon3${colorAry[custTypeId]}.png`"
+              />
+              <text>停车劵兑换</text>
+            </view>
+            <view class="menu_item" @click="doRouter1">
+              <image
+                :src="`./static/images/icon4${colorAry[custTypeId]}.png`"
+              />
+              <text>停车开票</text>
+            </view>
+            <view class="menu_item" @click="doRouter2">
+              <image
+                :src="`./static/images/icon1${colorAry[custTypeId]}.png`"
+              />
+              <text>车辆管理</text>
+            </view>
+          </view>
+        </view>
+        <view
+          :class="{
+            'parkingFee-bottom': true,
+            'blue-parkingFee-bottom': custTypeId === 1,
+            'green-parkingFee-bottom': custTypeId === 2,
+          }"
+        >
+          <view class="parkingFee-search">
+            <view class="search_tip" v-if="custTypeId === 0">
+              <view>车辆类型</view>
+              <view class="search_tip_pt">
+                <view
+                  :class="carType == 0 ? 'search_tip_pt_index' : ''"
+                  @click="toggleType(0)"
+                  >普通车牌</view
+                >
+                <view
+                  :class="carType == 1 ? 'search_tip_pt_index' : ''"
+                  @click="toggleType(1)"
+                  >新能源</view
+                >
+                <view
+                  :class="carType == 2 ? 'search_tip_pt_index' : ''"
+                  @click="toggleType(2)"
+                  >特殊车牌</view
+                >
+              </view>
+            </view>
+            <view
+              :class="{
+                blueClassify: custTypeId === 1,
+                greenClassify: custTypeId === 2,
+              }"
+              v-else
+            >
+              <view
+                :class="{ classifyItem: true, isChecked: carType === index }"
+                v-for="(item, index) in classifyList"
+                :key="index"
+              >
+                <view @click="toggleType(index)">{{ item }}</view>
+              </view>
+            </view>
+            <view class="input-box">
+              <view
+                class="li"
+                @click="clickShowKeyboard(0)"
+                :class="[active === 0 ? 'active' : '']"
+              >
+                {{ numArr[0] }}
+              </view>
+              <view
+                class="li"
+                @click="clickShowKeyboard(1)"
+                :class="[active === 1 ? 'active' : '']"
+              >
+                {{ numArr[1] }}
+              </view>
+              <view class="input_box_dian">·</view>
+              <view
+                class="li"
+                @click="clickShowKeyboard(2)"
+                :class="[active === 2 ? 'active' : '']"
+              >
+                {{ numArr[2] }}
+              </view>
+              <view
+                class="li"
+                @click="clickShowKeyboard(3)"
+                :class="[active === 3 ? 'active' : '']"
+              >
+                {{ numArr[3] }}
+              </view>
+              <view
+                class="li"
+                @click="clickShowKeyboard(4)"
+                :class="[active === 4 ? 'active' : '']"
+              >
+                {{ numArr[4] }}
+              </view>
+              <view
+                class="li"
+                @click="clickShowKeyboard(5)"
+                :class="[active === 5 ? 'active' : '']"
+              >
+                {{ numArr[5] }}
+              </view>
+              <view
+                class="li"
+                @click="clickShowKeyboard(6)"
+                :class="[active === 6 ? 'active' : '']"
+              >
+                {{ numArr[6] }}
+              </view>
+              <view
+                class="li"
+                @click="clickShowKeyboard(7)"
+                :class="[active === 7 ? 'active' : '']"
+                v-if="carType == 1"
+              >
+                <text v-if="numArr[7]">{{ numArr[7] }}</text>
+              </view>
+            </view>
+            <uni-button
+              type="primary"
+              class="search-btn"
+              :class="disabledBtn ? 'disabled-btn' : ''"
+              :disabled="disabledBtn"
+              @click="preHandleSearch"
+            >
+              查询缴费
+            </uni-button>
+          </view>
+          <view class="vehicleMgt-list">
+            <view class="vehicleMgt-title">
+              <view>历史车辆</view>
+              <!-- <image src="./static/images/icon5.png" class="vehicleMgt-title-img"/> -->
+            </view>
+            <view class="vehicleMgt-content" v-if="carList.length">
+              <view
+                class="item"
+                v-for="(item, index) in carList"
+                :key="index"
+                @click="toHandleSearch(item, 1)"
+                :class="vehicleNumber == item ? 'vehicleMgt-content_cls' : ''"
+                >{{ item | formatCarno }}</view
+              >
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <plate-number
+      ref="plateKeyboard"
+      :carType="carType"
+      :active="active"
+      :ind="ind"
+      :numArr="numArr"
+      @carnoArr="updateCarno"
+    ></plate-number>
+  </scroll-view>
+</template>
+
+<script>
+import authorize from '@/components/authorize/authorize.vue';
+import plateNumber from '@/components/plate-number/plateNumber.vue';
+import { REG_SOURCE } from '@/constants.js';
+import { mapState } from 'vuex';
+import MemberCacheTool from '@/utils/member-cache-tool.js';
+import { buildShareSource } from '@/utils/utils.js';
+const app = getApp();
+export default {
+  components: {
+    authorize,
+    plateNumber,
+  },
+  data() {
+    return {
+      vehicleMgt_content_index: -1, //历史车辆选中
+      carType: 0, //车辆类型
+      init_ch: false, // 字体超出隐藏显示
+      search_price: false, //查询按钮隐藏显示
+      parkInfoEntity: {},
+      show_chinese: false, //是否显示汉字键盘
+      show_allBoard: false, //是否显示英文数字键盘
+      plate_number: '', //车牌号
+      ind: null,
+      numArr: ['', '', '', '', '', '', ''],
+      active: null,
+      carList: [], // 车辆列表
+      classifyList: ['普通车牌', '新能源', '特殊车牌'], // 车牌类型
+      vehicleNumber: '',
+      localimgPic: '',
+      hourMoney: '',
+      showSq: false,
+      blueHeadBg: 'parkingFee/fee-head-bg.png',
+      picUrl: this.$picUrl,
+      colorAry: ['', '-blue', '-green'],
+      openId: null,
+      options: null,
+      preUrl: '',
+      radiusType: null,
+      payUrl: '',
+    };
+  },
+  mounted() {
+    this.$request({
+      // url: this.$baseURL + 'api/1.0/park/checkCarIsInPark',
+      url: this.$baseURL + 'api/1.0/park/parkingOrderSwitchBj',
+      method: 'POST',
+      header: JSON.parse(uni.getStorageSync('handleUser')),
+      timeout: 10000,
+    })
+      .then((res) => {
+        // console.log(res.data, 'radius')
+        if (res.data.code === 0) {
+          this.radiusType = res.data.data;
+        } else {
+          uni.showToast({
+            title: res.data.msg,
+            duration: 2000,
+            icon: 'none',
+          });
+        }
+      })
+      .catch((err) => {
+        uni.hideLoading();
+        uni.showToast({
+          title: '网络超时请稍后再试',
+          duration: 2000,
+          icon: 'none',
+        });
+        console.log(err);
+      });
+  },
+  computed: {
+    disabledBtn() {
+      return this.numArr.findIndex((val) => !val) !== -1;
+    },
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  // 分享
+  onShareAppMessage() {
+    let mallid = app.globalData.mallid;
+    let pullVipcode = app.globalData?.member?.vipcode ?? null;
+    let shareLink = 'pages/parkingFee/parkingFee?mallid=' + mallid;
+    if (pullVipcode) {
+      shareLink += '&pullVipcode=' + pullVipcode;
+    }
+    shareLink += '&' + buildShareSource('parking', '');
+    // console.log('share app link ===> ', shareLink)
+    return {
+      title: '停车缴费', // 分享标题
+      imageUrl: '', // 分享图标
+      path: shareLink,
+    };
+  },
+  // 分享
+  onShareTimeline() {
+    let mallid = app.globalData.mallid;
+    let pullVipcode = app.globalData?.member?.vipcode ?? null;
+    let shareLink = 'pages/parkingFee/parkingFee?mallid=' + mallid;
+    if (pullVipcode) {
+      shareLink += '&pullVipcode=' + pullVipcode;
+    }
+    shareLink += '&' + buildShareSource('parking', '');
+    // console.log('share app link ===> ', shareLink)
+    return {
+      title: '停车缴费', // 分享标题
+      imageUrl: '', // 分享图标
+      path: shareLink,
+    };
+  },
+  async onLoad(params) {
+    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
+    var ths = this;
+    if (app.globalData.member) {
+      // ths.getParkInfo()
+      app.globalData.isNewMember = '';
+      // 场景二维码记录(是否扫码进入)
+      app.globalData.paramsScene = {};
+      ths.$saveSceneQrcodeDetail(
+        'page',
+        'parkingFee',
+        '停车缴费',
+        '',
+        '',
+        '',
+        ''
+      );
+    }
+    // 埋点初始化
+    this.parkingTrack = new this.$trackFactory('parking_query_payment', {});
+    this.parkingTrack.track(1);
+    // console.log('this.parkingTrack::::', this.parkingTrack)
+    // 埋点本地化
+    this.preUrl = uni.getStorageSync('previousUrl');
+    uni.setStorageSync('previousUrl', '/pages/parkingFee/home.vue');
+  },
+  onShow() {
+    const _this = this;
+    const openId =
+      uni.getStorageSync('openId') ||
+      uni.getStorageSync('member').openid ||
+      app.globalData.openId;
+    if (openId) {
+      this.openId = openId;
+      this.getParkInfo();
+      this.showSq = false;
+    } else {
+      const regSource = REG_SOURCE.PARKING;
+      app.globalData.regSource = regSource;
+      if (this.options?.regSource) {
+        app.globalData.regSource = REG_SOURCE[this.options?.regSource];
+      }
+      if (this.options?.tpName) {
+        app.globalData.tpName = this.options?.tpName;
+      }
+      this.$refs.authorize.login('/pages/parkingFee/parkingFee', () => {
+        const openId =
+          uni.getStorageSync('openId') ||
+          uni.getStorageSync('member').openid ||
+          app.globalData.openId;
+        _this.openId = openId;
+        _this.getParkInfo();
+      });
+      this.showSq = true;
+    }
+    this.$refs['szProtocolModal'].open();
+  },
+  methods: {
+    toggleType(carType) {
+      this.ind = 0;
+      this.active = 0;
+      this.carType = carType;
+      // console.log(this.numArr)
+      if (carType === 1) {
+        this.numArr = [
+          this.numArr[0],
+          this.numArr[1],
+          this.numArr[2],
+          this.numArr[3],
+          this.numArr[4],
+          this.numArr[5],
+          this.numArr[6],
+          this.numArr[7],
+        ];
+      } else {
+        this.numArr = [
+          this.numArr[0],
+          this.numArr[1],
+          this.numArr[2],
+          this.numArr[3],
+          this.numArr[4],
+          this.numArr[5],
+          this.numArr[6],
+        ];
+      }
+    },
+    // 获取停车场信息
+    getParkInfo: function () {
+      uni.showLoading({
+        title: '加载中',
+      });
+      const openId =
+        uni.getStorageSync('openId') ||
+        uni.getStorageSync('member').openid ||
+        app.globalData.openId;
+      let params = {
+        mallid: app.globalData.mallid,
+        groupId: app.globalData.groupId,
+        openid: openId,
+        // vipcode: app.globalData.member.vipcode
+      };
+      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) => {
+          uni.hideLoading();
+          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.hideLoading();
+          uni.showToast({
+            title: '网络超时请稍后再试',
+            duration: 2000,
+            icon: 'none',
+          });
+          console.log(err);
+        });
+    },
+    //缴费说明隐藏显示
+    top_display() {
+      this.init_ch = !this.init_ch;
+    },
+    // 唤起键盘
+    clickShowKeyboard(index) {
+      this.ind = index;
+      this.active = index;
+      if (index === 0) {
+        this.$refs['plateKeyboard'].openKeyboardCN();
+      } else {
+        this.$refs['plateKeyboard'].closeKeyboardCN();
+        this.$refs['plateKeyboard'].openKeyboardEN();
+      }
+    },
+    // 接收子组件数据
+    updateCarno(val) {
+      this.numArr = val.numArr;
+      this.vehicleNumber = this.numArr.join('');
+      this.active = val.active;
+      this.ind = val.ind;
+    },
+
+    // 节流函数
+    throttle(fc, waitTime = 500, imme = true) {
+      if (imme) {
+        if (!this.flag) {
+          this.flag = true;
+          typeof fc === 'function' && fc();
+          this.timer = setTimeout(() => {
+            this.flag = false;
+          }, waitTime);
+        }
+      } else {
+        if (!this.flag) {
+          this.flag = true;
+          this.timer = setTimeout(() => {
+            this.flag = false;
+            typeof fc === 'function' && fc();
+          }, waitTime);
+        }
+      }
+    },
+
+    // 校验车牌号
+    preHandleSearch() {
+      this.throttle(() => {
+        this.handleSearch(this.vehicleNumber, '$ClickQueryAndPayment', 0);
+      }, 3000);
+    },
+    // 历史车牌快速查询
+    toHandleSearch(carno, history) {
+      this.throttle(() => {
+        this.handleSearch(carno, '$ClickHistoryAndPayment', history);
+      }, 3000);
+    },
+    // 查询车费信息
+    handleSearch(carno, clickEvent = '$ClickQueryAndPayment', history) {
+      this.vehicleNumber = carno;
+      uni.showLoading({
+        title: '加载中',
+      });
+      const openId = MemberCacheTool.getOpenId(app);
+      const params = {
+        carno,
+        mallid: app.globalData.mallid,
+        openid: openId,
+        vipcode: app.globalData.member?.vipcode,
+        mobile: app.globalData.member?.mobile,
+        groupId: app.globalData.groupId,
+        createuser: 'sys_miniprogram',
+      };
+      // TODO: 暂定埋点传参为车牌类型,是否需要其他参数比如车牌号码;埋点位置是否要放在查询接口回调函数中
+      this.$md(params);
+      // console.log('this.radiusType:::::',this.radiusType)
+      if (this.radiusType === null) {
+        this.payUrl = 'api/1.0/park/checkCarIsInParkAndCarFee';
+      } else if (this.radiusType === 0) {
+        this.payUrl = 'api/1.0/park/checkCarIsInPark';
+      }
+      this.$store.commit('setRadiusType', this.radiusType);
+      var myDate = new Date();
+      Date.prototype.Format = function (fmt) {
+        // author: meizz
+        var o = {
+          'M+': this.getMonth() + 1, // 月份
+          'd+': this.getDate(), // 日
+          'h+': this.getHours(), // 小时
+          'm+': this.getMinutes(), // 分
+          's+': this.getSeconds(), // 秒
+          'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
+          S: this.getMilliseconds(), // 毫秒
+        };
+        if (/(y+)/.test(fmt))
+          fmt = fmt.replace(
+            RegExp.$1,
+            (this.getFullYear() + '').substr(4 - RegExp.$1.length)
+          );
+        for (var k in o)
+          if (new RegExp('(' + k + ')').test(fmt))
+            fmt = fmt.replace(
+              RegExp.$1,
+              RegExp.$1.length == 1
+                ? o[k]
+                : ('00' + o[k]).substr(('' + o[k]).length)
+            );
+        return fmt;
+      };
+      var time2 = new Date().Format('yyyy-MM-dd hh:mm:ss');
+      this.parkingTrack.track(100, {
+        source_type: '首页',
+        source_name: '停车功能球',
+        plate_type: this.carType,
+        plate_num: carno,
+        is_historical_license: history,
+        query_time: time2,
+      });
+      this.$request({
+        // url: this.$baseURL + 'api/1.0/park/checkCarIsInPark',
+        url: this.$baseURL + this.payUrl,
+        data: params,
+        method: 'POST',
+        timeout: 60000 * 2,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        // timeout: 10000,
+      })
+        .then((res) => {
+          uni.hideLoading();
+          if (res.data.code === 0) {
+            // 埋点-业务查询成功
+            this.parkingTrack.track(200);
+            uni.navigateTo({
+              url: './parkingFeeDetail?carno=' + carno,
+            });
+          } else if (res.data.code === 1) {
+            // 当前车辆没有查到账单
+            this.parkingTrack.track(400, {
+              fail_reason: res.data?.msg,
+              query_time: time2,
+            });
+            uni.navigateTo({
+              url:
+                './parkingFeePayment?msg=' + res.data.msg + '&carno=' + carno,
+            });
+          } else if (res.data.code === 2) {
+            // 月租车
+            uni.navigateTo({
+              url: './parkingFeeHint/parkingFeeHint?carno=' + carno,
+            });
+          } else {
+            this.parkingTrack.track(400, {
+              fail_reason: res.data?.msg,
+              query_time: time2,
+            });
+            uni.showToast({
+              title: res.data?.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        })
+        .catch((err) => {
+          this.parkingTrack.track(400, {
+            fail_reason: '网络超时请稍后再试',
+            query_time: time2,
+          });
+          uni.hideLoading();
+          uni.showToast({
+            title: '网络超时请稍后再试',
+            duration: 2000,
+            icon: 'none',
+          });
+          console.log(err);
+        });
+    },
+    // 车牌号校验
+    // isVehicleNumber(vehicleNumber) {
+    // 	if (vehicleNumber.length == 7) {
+    // 		this.vehicleNumber = vehicleNumber.join('')
+    // 		var express =
+    // 			/^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/;
+    // 		if (!express.test(this.vehicleNumber)) {
+    // 			uni.showToast({
+    // 				title: '请输入正确的车牌号',
+    // 				duration: 2000,
+    // 				icon: 'none'
+    // 			})
+    // 			return false
+    // 		}
+    // 		return true
+    // 	}
+    // 	if (vehicleNumber.length == 8) {
+    // 		this.vehicleNumber = vehicleNumber.join('')
+    // 		var express =
+    // 			/^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[a-zA-Z](([DF]((?![IO])[a-zA-Z0-9](?![IO]))[0-9]{4})|([0-9]{5}[DF]))|[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})$/;
+    // 		if (!express.test(this.vehicleNumber)) {
+    // 			uni.showToast({
+    // 				title: '请输入正确的车牌号',
+    // 				duration: 2000,
+    // 				icon: 'none'
+    // 			})
+    // 			return false
+    // 		}
+    // 		return true
+    // 	}
+    // },
+    // 缴费记录
+    doRouter: function () {
+      // 埋点
+      this.parkingTrack.track(101);
+      uni.navigateTo({
+        url: './parkingFeeList',
+      });
+    },
+    // 车牌管理
+    doRouter2: function () {
+      // 埋点
+      this.parkingTrack.track(104);
+      uni.navigateTo({
+        url: './vehicleManagement',
+      });
+    },
+    //停车发票
+    doRouter1: function () {
+      // 埋点
+      this.parkingTrack.track(103);
+      // 北京停车场开票
+      // if (this.parkInfoEntity.parkMallCode === 3) {
+      //   uni.navigateToMiniProgram({
+      //     appId: this.$etcpAppId,
+      //     path: this.$etcpAppInvoicePath,
+      //     envVersion: 'release',
+      //   })
+      //   return
+      // }
+      uni.navigateTo({
+        url: './parkingReceipt/parkingReceipt',
+      });
+    },
+    //停车券兑换
+    doRouter3: function () {
+      // 埋点
+      this.parkingTrack.track(102);
+      uni.navigateTo({
+        url: '/pages/pointsMall/pointsMall?exchangeTypes=2',
+      });
+    },
+  },
+};
+</script>
+<style lang="less"></style>
+<style lang="less" scoped>
+@import '../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  // display: flex;
+  // flex-direction: column;
+  height: 100vh;
+}
+.color-scroll-Y {
+  background: #e7e9ea;
+}
+
+.wrap {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+
+  .parkingFee {
+    display: flex;
+    flex-direction: column;
+
+    .parkingFee-top {
+      display: flex;
+      flex-direction: column;
+      background-size: 100% 30%;
+      // height: 350rpx;
+      // margin-bottom: 25px;
+
+      .top_content {
+        padding: 25rpx 35rpx;
+        box-sizing: border-box;
+        display: flex;
+        flex-direction: column;
+
+        text {
+          font-size: 24rpx;
+          color: #898989;
+          text-align: left;
+        }
+
+        .title_box {
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          margin-bottom: 20rpx;
+
+          .btn {
+            padding: 0rpx 14rpx;
+            box-sizing: border-box;
+            border-radius: 20rpx;
+            font-size: 30rpx;
+            color: #000;
+            text-align: center;
+          }
+        }
+        .info {
+          padding-left: 18rpx;
+          font-size: 27rpx;
+          width: 95%;
+          color: #666;
+          line-height: 45rpx;
+        }
+        .info_show {
+          word-break: break-all;
+          text-overflow: ellipsis;
+          overflow: hidden;
+          display: -webkit-box;
+          -webkit-line-clamp: 2;
+          -webkit-box-orient: vertical;
+        }
+      }
+      .blue_top_content {
+        .color_top_content('blue');
+        background-position: 0 0;
+        background-size: 100% 100%;
+        background-repeat: no-repeat;
+      }
+      .green_top_content {
+        .color_top_content('green');
+      }
+      .color_top_content(@value) {
+        @color: 'color-@{value}';
+        background-color: @@color;
+        text {
+          color: @color-white;
+        }
+        .title_box {
+          .btn {
+            color: @color-gold;
+          }
+        }
+        .info {
+          font-size: 24rpx;
+        }
+      }
+      .top_down {
+        width: 100%;
+        text-align: center;
+        color: #b0a9a9;
+      }
+    }
+    .top_menu {
+      margin-top: 10rpx;
+      background: #fff;
+      padding-top: 50rpx;
+      box-sizing: border-box;
+      display: flex;
+      justify-content: space-between;
+      border-radius: 15rpx;
+      // position: absolute;
+      // left: 50%;
+      box-shadow: 0 0 5rpx #666;
+      // transform: translateX(-50%);
+      top: 160rpx;
+      width: 700rpx;
+      margin-left: 25rpx;
+      height: 250rpx;
+      .menu_item {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 33.3%;
+        image {
+          width: 100rpx;
+          height: 100rpx;
+        }
+        text {
+          font-size: 30rpx;
+          margin-top: 10rpx;
+        }
+      }
+    }
+    .blue_top_menu {
+      .color_top_menu('blue');
+      background: @color-pink;
+    }
+    .green_top_menu {
+      .color_top_menu('green');
+      background: @color-light-green;
+    }
+    .color_top_menu(@value) {
+      @color: 'color-@{value}';
+      margin-top: 0;
+      margin-left: 0;
+      padding-top: 0;
+      width: 100%;
+      height: 211rpx;
+      color: @@color;
+      border-radius: 0;
+      align-items: center;
+      .menu_item {
+        width: 25%;
+        image {
+          width: 83rpx;
+          height: 83rpx;
+        }
+        text {
+          font-size: 24rpx;
+          margin-top: 20rpx;
+        }
+      }
+    }
+    .parkingFee-bottom {
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      padding: 14rpx 25rpx;
+      box-sizing: border-box;
+      padding-bottom: 65px;
+      // 车牌号查询
+      .parkingFee-search {
+        width: 100%;
+        display: flex;
+        flex-direction: column;
+        background: #fff;
+        border-radius: 15rpx;
+        padding: 26rpx 25rpx 20rpx;
+        box-sizing: border-box;
+
+        .search_tip {
+          margin-bottom: 10rpx;
+          width: 100%;
+          margin-left: -1rpx;
+          font-size: 24rpx;
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          font-size: 30rpx;
+          .search_tip_pt {
+            font-size: 28rpx;
+            width: 470rpx;
+            display: flex;
+            justify-content: space-around;
+            align-items: center;
+            border: 1rpx solid #8d8d8d;
+            height: 70rpx;
+            color: #8d8d8d;
+            overflow: hidden;
+            border-radius: 50rpx;
+            view {
+              height: 100%;
+              border-radius: 50rpx;
+              line-height: 65rpx;
+              text-align: center;
+            }
+            view:nth-child(1) {
+              width: 37%;
+            }
+            view:nth-child(2) {
+              width: 36%;
+            }
+            view:nth-child(3) {
+              width: 37%;
+            }
+            .search_tip_pt_index {
+              color: #fff;
+              background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+            }
+          }
+        }
+        // 车牌号 & 虚拟键盘
+        .input-box {
+          width: 100%;
+          height: 100rpx;
+          margin: auto;
+          background: rgba(255, 255, 255, 1);
+          border-radius: 0.4rem;
+          margin: 1rem auto;
+          display: flex;
+          justify-content: center;
+
+          .li {
+            flex: 1;
+            border: 1px solid rgba(206, 208, 210, 1);
+            box-sizing: border-box;
+            margin: 0 2px;
+            font-size: 50rpx;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            color: #703a98;
+
+            image {
+              width: 80%;
+              height: 100%;
+            }
+
+            &.active {
+              border-color: #3e67ff;
+            }
+          }
+          .input_box_dian {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            font-size: 120rpx;
+            color: #703a98;
+          }
+        }
+
+        .search-btn {
+          color: #fff;
+          margin: 0 auto;
+          height: 90rpx;
+          width: 98%;
+          line-height: 90rpx;
+          border-radius: 80rpx;
+          font-size: 34rpx;
+          text-align: center;
+          background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+        }
+        .disabled-btn {
+          background-color: #c1c1c1 !important;
+          background-image: none !important;
+        }
+      }
+
+      .vehicleMgt-list {
+        display: flex;
+        flex-direction: column;
+        margin-bottom: 35rpx;
+        margin-top: 20rpx;
+        .vehicleMgt-title {
+          width: 91%;
+          display: flex;
+          justify-content: space-between;
+          margin-left: 4%;
+          // padding-left: 30rpx;
+          padding-top: 30rpx;
+          box-sizing: border-box;
+          border-top: 1px solid #f2f2f2;
+          font-size: 30rpx;
+          .vehicleMgt-title-img {
+            width: 30rpx;
+            height: 30rpx;
+          }
+        }
+
+        .vehicleMgt-content {
+          width: 94%;
+          margin-left: 3%;
+          display: flex;
+          flex-wrap: wrap;
+          // justify-content: space-around;
+          border-radius: 15rpx;
+          .item {
+            width: 30%;
+            height: 60rpx;
+            margin-top: 30rpx;
+            margin-left: 16rpx;
+            text-align: center;
+            box-sizing: border-box;
+            border: 2rpx solid #dcdcdc;
+            line-height: 60rpx;
+            font-size: 26rpx;
+            border-radius: 10rpx;
+            color: #a5a5a5;
+          }
+          .vehicleMgt-content_cls {
+            color: #703a98;
+            border: 2rpx solid #703a98;
+          }
+          // .item::after {
+          // 	content: '';
+          // 	display: block;
+          // 	height: 1px;
+          // 	width: 92%;
+          // 	position: absolute;
+          // 	background-color: #F2F2F2;
+          // 	bottom: 0px;
+          // 	left: 4%;
+          // }
+          // .item:last-child::after {
+          // 	display: none;
+          // }
+        }
+      }
+
+      .search-list {
+        display: flex;
+        flex-direction: column;
+        background: #fff;
+        padding: 0 30rpx;
+        box-sizing: border-box;
+        margin-top: 20rpx;
+        border-radius: 15rpx;
+        width: 100%;
+
+        .list_item {
+          padding: 38rpx 0;
+          box-sizing: border-box;
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          border-bottom: 1px solid #f2f2f2;
+
+          text {
+            font-size: 28rpx;
+          }
+
+          button {
+            height: 60rpx;
+            line-height: 60rpx;
+            margin: 0;
+          }
+        }
+      }
+    }
+    .blue-parkingFee-bottom {
+      .color-parkingFee-bottom('blue');
+    }
+    .green-parkingFee-bottom {
+      .color-parkingFee-bottom('green');
+    }
+    .color-parkingFee-bottom(@value) {
+      @color: 'color-@{value}';
+      width: auto;
+      padding-bottom: 0;
+      padding: 22rpx 20rpx 0 20rpx;
+      .parkingFee-search {
+        padding: 0 0 31rpx 0;
+        .blueClassify {
+          .colorClassify('blue');
+        }
+        .greenClassify {
+          .colorClassify('green');
+        }
+        .input-box {
+          width: 682rpx;
+          .li {
+            color: @@color;
+            &.active {
+              border-color: @@color;
+            }
+          }
+          .input_box_dian {
+            color: @@color;
+          }
+        }
+        .search-btn {
+          font-size: 34rpx;
+          background-image: none;
+          background-color: @@color;
+        }
+      }
+      .vehicleMgt-list {
+        background-color: @color-white;
+        .vehicleMgt-title {
+          padding-top: 0;
+          padding: 23rpx;
+          margin-left: 0;
+        }
+        .vehicleMgt-content {
+          width: 100%;
+          margin-left: 0;
+          padding: 16rpx 35rpx 25rpx 35rpx;
+          box-sizing: border-box;
+          .item {
+            font-size: 28rpx;
+            margin-top: 0;
+            margin-left: 0;
+            margin-right: 30rpx;
+            margin-top: 41rpx;
+            &:nth-child(-n + 3) {
+              margin-top: 0;
+            }
+            &:nth-child(3n) {
+              margin-right: 0;
+            }
+          }
+          .vehicleMgt-content_cls {
+            color: @color-white;
+            border: 0px;
+            background-color: @@color;
+          }
+        }
+      }
+    }
+  }
+}
+
+// 缴费说明
+.payInstruct_wrap {
+  width: 300px;
+  margin: 0 auto;
+  display: flex;
+  flex-direction: column;
+  background: #fff;
+  border-radius: 20rpx;
+
+  .scroll {
+    height: 600rpx;
+    display: flex;
+    flex-direction: column;
+    padding: 20rpx;
+    box-sizing: border-box;
+
+    .payInstruct_title {
+      font-size: 30rpx;
+      text-align: center;
+      padding: 20rpx 0;
+      box-sizing: border-box;
+      border-bottom: 1px solid #f2f2f2;
+    }
+
+    .payInstruct_con {
+      display: flex;
+      width: 100%;
+      padding: 20rpx 10rpx;
+      box-sizing: border-box;
+
+      text {
+        font-size: 28rpx;
+        color: #999;
+      }
+    }
+  }
+}
+
+.class-van-button-small {
+  min-width: 0;
+  border-radius: 10rpx;
+  margin: 10rpx 3rpx;
+  box-shadow: 10rpx 10rpx 10rpx #aaa;
+}
+
+.class-plate-box {
+  width: 100%;
+  padding: 24rpx 0;
+  box-sizing: border-box;
+  position: relative;
+}
+
+.plate_number {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+
+  .plate_number_wrap {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    background: #eaf1f9;
+    padding: 0 0 10rpx;
+    box-sizing: border-box;
+
+    .close-box {
+      width: 100%;
+      font-size: 24rpx;
+      color: #3e67ff;
+      text-align: right;
+      margin-right: 1.25rem;
+
+      view {
+        padding: 10px;
+      }
+    }
+
+    .plate_chinese_box {
+      width: 100%;
+      display: flex;
+      flex-wrap: wrap;
+      justify-content: center;
+
+      button {
+        width: 9%;
+        height: 2.5rem;
+        line-height: 2.5rem;
+        text-align: center;
+        padding: 0;
+        font-size: 28rpx;
+        .class-van-button-small;
+      }
+    }
+  }
+}
+
+.allBoard {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+
+  .allBoard_wrap {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    background: #eaf1f9;
+    padding: 0 0 10rpx;
+    box-sizing: border-box;
+  }
+
+  .close-box {
+    padding-top: 22rpx;
+    box-sizing: border-box;
+    font-size: 24rpx;
+    color: #3e67ff;
+    text-align: right;
+    margin-right: 1.25rem;
+  }
+
+  .plate_number_box {
+    width: 100%;
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+
+    button {
+      width: 9%;
+      height: 2.5rem;
+      line-height: 2.5rem;
+      text-align: center;
+      padding: 0;
+      font-size: 28rpx;
+      .class-van-button-small;
+    }
+  }
+}
+
+.delBtn {
+  color: #fff;
+  height: 38rpx;
+  line-height: 38rpx;
+  font-size: 20rpx;
+  width: 124rpx;
+  border-radius: 7px;
+  text-align: center;
+  padding: 4px;
+  background-color: #c69c6d;
+}
+
+.payThe {
+  background-color: #fff;
+  width: 100%;
+
+  .pay_index {
+    text-align: center;
+    width: 200rpx;
+    padding-top: 10rpx;
+    margin: 0rpx auto;
+  }
+
+  .pay_title {
+    width: 500rpx;
+    display: flex;
+    align-items: center;
+    margin-top: 30rpx;
+  }
+
+  .pay_title1 {
+    width: 100%;
+    margin-top: 20rpx;
+    display: flex;
+    align-items: center;
+  }
+
+  .pay_title_yhj {
+    margin-left: 60rpx;
+    font-size: 20rpx;
+  }
+
+  .pay_title_yhj1 {
+    margin-left: 35rpx;
+    font-size: 20rpx;
+  }
+
+  .payjf {
+    font-size: 20rpx;
+    margin-left: 30rpx;
+  }
+
+  .paySelect {
+    color: rgba(16, 16, 16, 100);
+    font-size: 20rpx;
+    font-family: Arial;
+    border: 1px solid rgba(187, 187, 187, 100);
+    border-radius: 10rpx;
+    margin-left: 80rpx;
+    width: 260rpx;
+    height: 80rpx;
+  }
+
+  .paySelect1 {
+    color: rgba(16, 16, 16, 100);
+    font-size: 20rpx;
+    font-family: Arial;
+    border: 1px solid rgba(187, 187, 187, 100);
+    border-radius: 10rpx;
+    margin-left: 80rpx;
+    width: 260rpx;
+    height: 80rpx;
+    display: flex;
+    align-items: center;
+  }
+
+  .pay-se {
+    width: 120rpx;
+    height: 100%;
+    background-color: #d8dce6;
+
+    .pay-se-l {
+      height: 48%;
+      text-align: center;
+      font-size: 50rpx;
+      line-height: 68rpx;
+    }
+
+    .pay-se-l1 {
+      border-left: 1px solid rgba(187, 187, 187, 100);
+      border-bottom: 1px solid rgba(187, 187, 187, 100);
+    }
+
+    .pay-se-l2 {
+      border-left: 1px solid rgba(187, 187, 187, 100);
+    }
+  }
+
+  .payjfzk {
+    font-size: 20rpx;
+    color: #8b8c8b;
+    margin-top: 10rpx;
+    margin-left: 210rpx;
+  }
+
+  .pay_time {
+    font-size: 28rpx;
+    margin-left: 180rpx;
+    padding-bottom: 40rpx;
+  }
+
+  .pay_time1 {
+    margin-top: 26rpx;
+  }
+}
+
+.pay_jiaof {
+  width: 97%;
+  height: 60rpx;
+  line-height: 60rpx;
+  margin-left: 10rpx;
+  background-color: #c69c6d;
+  text-align: center;
+  color: rgba(255, 255, 255, 100);
+  font-size: 28rpx;
+  font-family: Microsoft Yahei;
+  border-radius: 10rpx;
+  margin-top: 20rpx;
+}
+
+.sq_content {
+  width: 700rpx;
+  background-color: #fff;
+  position: fixed;
+  bottom: 25px;
+  left: 25rpx;
+  height: 50px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  border-radius: 15rpx;
+  font-size: 16px;
+  color: #c69c6d;
+  padding: 0rpx 30rpx;
+  box-sizing: border-box;
+}
+.sq_content .btn {
+  width: 180rpx;
+  height: 30px;
+  line-height: 30px;
+  text-align: center;
+  color: #fff;
+  background-color: #c69c6d;
+  margin-top: -3px;
+  border-radius: 25px;
+}
+
+// 停车券弹窗
+.ticketPopup {
+  display: flex;
+  flex-direction: column;
+  background: #fff;
+  border-radius: 20rpx 20rpx 0 0;
+  z-index: 999;
+
+  .popup-title {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    padding: 30rpx 42rpx;
+    box-sizing: border-box;
+    border-bottom: 1px solid #f2f2f2;
+    position: relative;
+
+    text {
+      color: #999;
+      font-size: 28rpx;
+    }
+
+    .useRule-text {
+      position: absolute;
+      right: 42rpx;
+      color: rgb(58, 130, 248);
+    }
+  }
+
+  .popup_scroll {
+    height: 70vh;
+    background: #f2f2f2;
+  }
+  .popup_content {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    padding: 10rpx 20rpx;
+    box-sizing: border-box;
+
+    .item {
+      display: flex;
+      background: #fff;
+      margin-bottom: 20rpx;
+      border-radius: 10rpx;
+
+      .item-left {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        padding: 20rpx 0;
+        box-sizing: border-box;
+        position: relative;
+
+        .item-type {
+          position: absolute;
+          top: 0;
+          left: 0;
+          background: #fff5f1;
+          border-radius: 10rpx 0 10rpx 0;
+          width: 205rpx;
+          display: flex;
+          justify-content: center;
+
+          text {
+            color: #999;
+            font-size: 20rpx;
+            text-align: center;
+            line-height: 28rpx;
+          }
+        }
+
+        .item-value {
+          color: #c69c6d;
+          font-size: 40rpx;
+          padding: 10rpx 30rpx;
+          box-sizing: border-box;
+          width: 205rpx;
+          display: flex;
+          justify-content: center;
+
+          .b {
+            color: #c69c6d;
+            font-weight: 600;
+            font-size: 60rpx;
+          }
+        }
+
+        .color_disabled {
+          color: #999 !important;
+        }
+      }
+      .item-right {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border-radius: 0 8rpx 8rpx 0;
+        position: relative;
+
+        text {
+          color: #c69c6d;
+          font-size: 24rpx;
+          padding: 0 20rpx;
+          box-sizing: border-box;
+        }
+
+        .color_disabled {
+          color: #999;
+        }
+
+        // 对勾
+        .dot {
+          position: absolute;
+          top: 0;
+          right: 0;
+          width: 2.25rem;
+          height: 2.375rem;
+        }
+      }
+    }
+  }
+}
+// 弹窗按钮
+.popup_button {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 10rpx 20rpx;
+  box-sizing: border-box;
+
+  text {
+    height: 110rpx;
+    line-height: 110rpx;
+    text-align: center;
+  }
+
+  .cancel_btn {
+    background: #fff;
+    color: #ed1c24 !important;
+  }
+
+  .ok_btn {
+    background: #c69c6d;
+    color: #fff !important;
+    width: 120px;
+    height: 40px;
+    line-height: 40px;
+    border-radius: 40px;
+  }
+}
+</style>

+ 614 - 0
src/crmPages/parkingFeeCoupon.vue

@@ -0,0 +1,614 @@
+<template>
+  <scroll-view scroll-y="true" class="scroll-Y">
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <checkbox-group @change="checkboxChange">
+      <view class="card-list">
+        <view
+          class="item"
+          v-for="(item, index) in list"
+          :key="index"
+          :class="index == list.length - 1 ? 'mgb-110' : ''"
+        >
+          <view class="item-image cro">
+            <div class="cro_right_top"></div>
+            <div class="cro_right_bottom"></div>
+            <view class="img">
+              <view>
+                <text style="font-weight: bold; color: #ed1c24">¥</text>
+                <text
+                  style="font-weight: bold; color: #ed1c24; font-size: 50rpx"
+                  >{{ item.value }}</text
+                >
+              </view>
+              <text style="color: #989898; font-size: 30rpx">停车劵</text>
+            </view>
+          </view>
+          <view class="item-content cro_">
+            <div class="cro_left_top"></div>
+            <div class="cro_left_bottom"></div>
+            <view class="content">
+              <text class="h3">{{ item.ticketName }}</text>
+              <text class="span">有效期至 {{ item.cancelEndTime }}</text>
+            </view>
+            <view class="erwm_box">
+              <checkbox
+                :value="index"
+                color="#fff"
+                :disabled="item.disabled"
+                :checked="item.checked"
+              />
+            </view>
+          </view>
+        </view>
+      </view>
+    </checkbox-group>
+    <view class="flewx">
+      <view class="flewx-content"
+        >应付<text style="color: red; font-size: 32rpx; padding-left: 20rpx">{{
+          actualFee | currency
+        }}</text>
+        元
+        <text style="color: #8d8d8d; padding-left: 30rpx; font-size: 28rpx"
+          >已优惠{{ discountFee | currency }}元</text
+        ></view
+      >
+      <view
+        :class="{
+          flewx_index3: true,
+          blue_flewx_index3: custTypeId === 1,
+          green_flewx_index3: custTypeId === 2,
+          'btn-disabled': !parkInfo.servicefee,
+        }"
+        @click="confirm"
+        >确定</view
+      >
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+import { mapState } from 'vuex';
+export default {
+  onLoad() {
+    // 纸质优惠券
+    if (uni.getStorageSync('paperCouponInfo')) {
+      this.paperCouponFee =
+        uni.getStorageSync('paperCouponInfo').paperDiscountFee || 0;
+    }
+    this.servicefee = uni.getStorageSync('servicefee'); // 应缴金额
+    this.parkDiscountTotal = uni.getStorageSync('parkingTotal'); // 总停车优惠
+    // 本页面数据缓存
+    this.couponInfo = uni.getStorageSync('couponInfo');
+    if (this.couponInfo) {
+      this.parkDiscountTotal.feeCopy -= this.couponInfo.couponfee;
+    }
+    this.checkedCouponList = uni.getStorageSync('checkedCouponList') || [];
+  },
+  onShow() {
+    const list = uni.getStorageSync('list');
+    this.parkFee = JSON.parse(uni.getStorageSync('parkFee'));
+    this.parkFee.parkInfoEntity.useReduceTime = this.parkFee.parkInfoEntity
+      .useReduceTime
+      ? this.parkFee.parkInfoEntity.useReduceTime
+      : 0;
+    this.parkMallCode = this.parkFee.parkInfoEntity.parkMallCode;
+    // 上限金额
+    this.maxonetimediscountFee =
+      this.parkFee.parkInfoEntity.maxonetimediscount *
+      this.parkFee.parkInfoEntity.needmoney;
+    // 深圳特殊处理(单位:金额)
+    if (this.parkMallCode === 5) {
+      this.maxonedaydiscountFee =
+        this.parkFee.parkInfoEntity.maxOneDayHour -
+          this.parkFee.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour ||
+        0;
+    } else {
+      this.maxonedaydiscountFee =
+        (this.parkFee.parkInfoEntity.maxOneDayHour -
+          this.parkFee.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour) *
+          this.parkFee.parkInfoEntity.needmoney || 0;
+    }
+    if (this.maxonedaydiscountFee < 0) {
+      this.maxonedaydiscountFee = 0;
+    }
+    if (list && list.length > 0) {
+      this.list = list;
+      if (this.checkedCouponList.length > 0) {
+        const index = this.checkedCouponList[0];
+        const item = this.list[index];
+        // 根据电子券规则判断是否可选
+        this.isDisabledByRule(item);
+      } else {
+        this.list.map((e) => {
+          // 没有选中项初始化状态
+          e.checked = false;
+          e.disabled = false;
+        });
+      }
+      // 浦东上限控制
+      if (
+        this.parkMallCode === 1 ||
+        this.parkMallCode === 4 ||
+        this.parkMallCode === 5 ||
+        this.parkMallCode === 6
+      ) {
+        if (this.crossMessage()) {
+          this.list.forEach((item) => {
+            if (!item.checked) {
+              item.disabled = true;
+            }
+          });
+        }
+      }
+    } else {
+      this.list = this.parkFee.memberTicketList;
+      this.list.forEach((item) => {
+        item.disabled = false;
+        item.checked = false;
+        if (
+          (this.parkMallCode === 1 ||
+            this.parkMallCode === 4 ||
+            this.parkMallCode === 5 ||
+            this.parkMallCode === 6) &&
+          this.crossMessage()
+        ) {
+          item.disabled = true;
+        }
+        if (item.carType == '2') {
+          item.value = item.parktime * this.parkFee.parkInfoEntity.needmoney;
+        } else if (item.carType == '1') {
+          item.value = item.ticketValue;
+        }
+      });
+    }
+  },
+  data() {
+    return {
+      parkFee: {}, // 停车规则信息及优惠信息
+      list: [], // 电子券列表
+      checkedCouponList: [], // 选中的电子券列表
+      couponCode: [], // 选中的电子券码组
+      servicefee: 0, // 应缴金额
+      parkDiscountTotal: {}, // 总停车优惠
+      couponInfo: {}, // 页面缓存(电子券优惠)
+      maxonetimediscountFee: 0, // 每次优惠上限金额
+      maxonedaydiscountFee: 0, // 每天优惠上限金额
+      parkMallCode: 1, // 0静安 1浦东 2杭州 3北京 4沈阳 5深圳 6天津
+      paperCouponFee: 0, // 纸质优惠金额
+    };
+  },
+  computed: {
+    // 电子券优惠金额总计
+    totalFee() {
+      this.couponCode = [];
+      let total = 0;
+      this.checkedCouponList.forEach((i) => {
+        this.couponCode.push(this.list[i].couponCode);
+        total += this.list[i].value;
+      });
+      return total;
+    },
+    // 实际支付金额
+    actualFee() {
+      const fee = this.servicefee - this.discountFee;
+      return fee > 0 ? fee : 0;
+    },
+    // 已优惠金额
+    discountFee() {
+      let total = this.parkDiscountTotal.feeCopy + this.totalFee;
+      // 超出上限按上限计算
+      if (this.parkMallCode === 1) {
+        if (total - this.paperCouponFee > this.maxonetimediscountFee) {
+          total = this.maxonetimediscountFee + this.paperCouponFee;
+        }
+      }
+      if (this.parkMallCode === 4 || this.parkMallCode === 6) {
+        if (
+          total - this.paperCouponFee - this.parkDiscountTotal.bonusfee >
+          this.maxonedaydiscountFee
+        ) {
+          total =
+            this.maxonedaydiscountFee +
+            this.parkDiscountTotal.bonusfee +
+            this.paperCouponFee;
+        }
+      }
+      if (this.parkMallCode === 5) {
+        if (total > this.maxonedaydiscountFee) {
+          total = this.maxonedaydiscountFee;
+        }
+      }
+      return total;
+    },
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  methods: {
+    // 选择回调
+    checkboxChange(e) {
+      // 获取动作项目索引
+      const current = e.detail.value;
+      const pre = this.checkedCouponList;
+      const diff = pre.concat(current).filter((v, i, arr) => {
+        return arr.indexOf(v) === arr.lastIndexOf(v);
+      });
+      console.log(diff);
+
+      this.checkedCouponList = e.detail.value;
+
+      // 如果有选中项
+      if (this.checkedCouponList.length > 0) {
+        const index = diff[0];
+        const item = this.list[index];
+        // 根据电子券规则判断是否可选
+        this.isDisabledByRule(item);
+      } else {
+        this.list.map((e) => {
+          // 没有选中项初始化状态
+          e.checked = false;
+          e.disabled = false;
+        });
+      }
+      console.log(this.list);
+    },
+
+    // 根据电子券规则判断是否可选
+    isDisabledByRule(item) {
+      // 杭州电子券使用上限(单位: 张)
+      if (this.parkMallCode === 2) {
+        // 达到上限
+        if (
+          this.checkedCouponList.length ===
+          this.parkFee.parkInfoEntity.useTicketNum -
+            this.parkFee.parkInfoEntity.couponcodeNum
+        ) {
+          this.list.forEach((e, i) => {
+            if (this.checkedCouponList.findIndex((c) => c == i) === -1) {
+              e.disabled = true;
+            } else {
+              e.checked = true;
+            }
+          });
+          return uni.showToast({
+            title: `电子券每天最多可使用${this.parkFee.parkInfoEntity.useTicketNum}张`,
+            icon: 'none',
+          });
+        } else {
+          this.list.forEach((e) => {
+            e.disabled = false;
+          });
+        }
+      }
+
+      // 浦东每次缴费超限控制、沈阳每日超限控制
+      if (
+        (this.parkMallCode === 1 ||
+          this.parkMallCode === 4 ||
+          this.parkMallCode === 5 ||
+          this.parkMallCode === 6) &&
+        this.crossMessage()
+      ) {
+        this.list.forEach((e, i) => {
+          if (this.checkedCouponList.findIndex((c) => c == i) === -1) {
+            e.disabled = true;
+            e.checked = false;
+          } else {
+            e.checked = true;
+          }
+        });
+        return;
+      }
+
+      // 选中状态赋值
+      this.list.forEach((e, i) => {
+        if (this.checkedCouponList.findIndex((c) => c == i) !== -1) {
+          e.checked = true;
+        } else {
+          e.checked = false;
+        }
+        // superpositionrule  叠加使用规则 (1不可叠加,2仅同类型可叠加,3可叠加)
+        if (item.superpositionrule == '1') {
+          if (e.couponCode !== item.couponCode) {
+            e.disabled = true;
+          }
+        } else if (item.superpositionrule == '2') {
+          if (e.superpositionrule == '2') {
+            // 统计当前(同类型&同可叠加次数)
+            let count = 0;
+            this.checkedCouponList.forEach((i) => {
+              if (this.list[i].ticketId === item.ticketId) {
+                count++;
+              }
+            });
+            console.log(item.ticketId + '合计:' + count);
+            if (item.ticketId === e.ticketId) {
+              // 超限判断
+              if (item.limitUseNum !== 0 && count + 1 > item.limitUseNum) {
+                if (e.checked === false) {
+                  e.disabled = true;
+                }
+              } else {
+                e.disabled = false;
+              }
+            } else {
+              e.disabled = false;
+            }
+          } else {
+            // 异类
+            e.disabled = true;
+          }
+        } else {
+          // 类型3可叠加
+          e.disabled = false;
+        }
+      });
+    },
+
+    // 是否选中
+    isCheck(val) {
+      return this.checkedCouponList.findIndex((e) => e == val) !== -1;
+    },
+
+    // 超限提示
+    crossMessage() {
+      let totalFee = this.parkDiscountTotal.feeCopy;
+      totalFee += this.totalFee;
+      // 浦东每次优惠上限
+      if (
+        this.parkMallCode === 1 &&
+        totalFee - this.paperCouponFee >= this.maxonetimediscountFee
+      ) {
+        return uni.showToast({
+          title: `超出抵扣上限,每次最高可抵扣${this.parkFee.parkInfoEntity.maxonetimediscount}小时`,
+          icon: 'none',
+        });
+      }
+      // 沈阳超限处理(maxonedaydiscountFee 会员、消费、电子券减免)
+      if (
+        (this.parkMallCode === 4 || this.parkMallCode === 6) &&
+        totalFee - this.paperCouponFee - this.parkDiscountTotal.bonusfee >=
+          this.maxonedaydiscountFee
+      ) {
+        return uni.showToast({
+          title: `(会员等级、消费、电子券)每日最高可抵扣${this.parkFee.parkInfoEntity.maxOneDayHour}小时`,
+          icon: 'none',
+        });
+      }
+      // 深圳超限处理
+      if (this.parkMallCode === 5 && totalFee >= this.maxonedaydiscountFee) {
+        return uni.showToast({
+          title: `每日最高可抵扣${this.parkFee.parkInfoEntity.maxOneDayHour}元`,
+          icon: 'none',
+        });
+      }
+    },
+
+    // 确认
+    confirm() {
+      uni.setStorageSync('checkedCouponList', this.checkedCouponList);
+      uni.setStorageSync('list', this.list);
+      uni.setStorageSync('couponInfo', {
+        couponfee: this.totalFee,
+        couponcode: this.couponCode.join('#'),
+      });
+      uni.navigateBack();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f1f1f1;
+}
+.card-list {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  padding: 10rpx 20rpx;
+  box-sizing: border-box;
+  flex: 1;
+  position: relative;
+
+  .item {
+    display: flex;
+    margin-bottom: 16rpx;
+
+    .item-image {
+      border: 2rpx solid #f2f2f2;
+      border-right: 2rpx dashed #f2f2f2;
+      padding: 16rpx;
+      border-radius: 16rpx 0 0 16rpx;
+      box-sizing: border-box;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      background: #fff;
+
+      &.cro {
+        position: relative;
+      }
+
+      .img {
+        width: 130rpx;
+        height: 130rpx;
+        border-radius: 8rpx;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+
+        image {
+          width: 100%;
+          height: 100%;
+        }
+      }
+    }
+
+    .item-content {
+      flex: 1;
+      border: 2rpx solid #f2f2f2;
+      border-radius: 0 8rpx 8rpx 0;
+      padding: 16rpx;
+      box-sizing: border-box;
+      background: #fff;
+      display: flex;
+
+      &.cro_ {
+        position: relative;
+      }
+
+      .content {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        flex: 1;
+
+        .h3 {
+          font-size: 28rpx;
+          line-height: 48rpx;
+          font-weight: 500;
+        }
+
+        .span {
+          font-size: 24rpx;
+          color: #838181;
+          line-height: 40rpx;
+        }
+      }
+
+      .erwm_box {
+        display: flex;
+        align-items: center;
+        position: relative;
+
+        image {
+          width: 52rpx;
+          height: 52rpx;
+        }
+
+        .tag {
+          position: absolute;
+          bottom: 0;
+          right: 0;
+          border-radius: 16rpx;
+          padding: 5rpx 10rpx;
+          box-sizing: border-box;
+          background: #f7931e;
+          text-align: center;
+          color: #fff;
+          width: 122rpx;
+          font-size: 24rpx;
+        }
+      }
+    }
+  }
+}
+// 凹圆角
+.cro_left_top,
+.cro_left_bottom,
+.cro_right_top,
+.cro_right_bottom {
+  position: absolute;
+  width: 8rpx;
+  height: 8rpx;
+  border: 1px solid #eee;
+  z-index: 1;
+  background: #f2f2f2;
+}
+
+.cro_left_top {
+  top: -1px;
+  left: -1px;
+  border-radius: 0px 0px 8rpx 0px;
+  border-bottom: 1px solid #f2f2f2;
+  border-top: 1px solid #f2f2f2;
+  border-right: 1px solid #f2f2f2;
+  border-left: 1px solid #f2f2f2;
+}
+
+.cro_left_bottom {
+  left: -1px;
+  bottom: -1px;
+  border-radius: 0px 8rpx 0px 0px;
+  border-top: 1px solid #f2f2f2;
+  border-bottom: 1px solid #f2f2f2;
+  border-right: 1px solid #f2f2f2;
+  border-left: 1px solid #f2f2f2;
+}
+
+.cro_right_top {
+  top: -1px;
+  right: -1px;
+  border-radius: 0px 0px 0px 8rpx;
+  border-top: 1px solid #f2f2f2;
+  border-bottom: 1px solid #f2f2f2;
+  border-left: 1px solid #f2f2f2;
+  border-right: 1px solid #f2f2f2;
+}
+
+.cro_right_bottom {
+  right: -1px;
+  bottom: -1px;
+  border-radius: 8rpx 0px 0px 0px;
+  border-top: 1px solid #f2f2f2;
+  border-bottom: 1px solid #f2f2f2;
+  border-left: 1px solid #f2f2f2;
+  border-right: 1px solid #f2f2f2;
+}
+.mgb-110 {
+  margin-bottom: 110rpx !important;
+}
+.flewx {
+  width: 100%;
+  height: 100rpx;
+  background-color: #fff;
+  position: fixed;
+  bottom: 0;
+  font-size: 30rpx;
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  // padding-bottom: constant(safe-area-inset-bottom);
+  // padding-bottom: env(safe-area-inset-bottom);
+  padding-bottom: 20rpx;
+  .flewx-content {
+    position: absolute;
+    left: 16px;
+  }
+  .flewx_index3 {
+    width: 150rpx;
+    height: 70rpx;
+    border-radius: 50rpx;
+    text-align: center;
+    font-size: 28rpx;
+    line-height: 70rpx;
+    color: #fff;
+    background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+    box-shadow: 2px 3px 5px #888888;
+    position: absolute;
+    right: 16px;
+  }
+  .blue_flewx_index3 {
+    .color-background-color('blue');
+  }
+  .green_flewx_index3 {
+    .color-background-color('green');
+  }
+}
+/deep/ checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+  background-color: red !important;
+  border-radius: 50% !important;
+  border: 1px solid red;
+}
+/deep/ checkbox .wx-checkbox-input {
+  border-radius: 50% !important;
+}
+</style>

+ 2897 - 0
src/crmPages/parkingFeeDetail.vue

@@ -0,0 +1,2897 @@
+<template>
+  <scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y">
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="warp">
+      <view
+        :class="{
+          warp_index: true,
+          warp_index1: true,
+          'bgc-blue': custTypeId === 1,
+          'bgc-green': custTypeId === 2,
+        }"
+        >{{ parkInfo.carno | formatCarno }}</view
+      >
+      <view class="warp_index">
+        <view>停车场</view>
+        <view class="warp_index_color">{{ parkInfo.parkname }}</view>
+      </view>
+      <view class="warp_index">
+        <view>入场时间</view>
+        <view class="warp_index_color">{{ parkInfo.entertime }}</view>
+      </view>
+      <view class="warp_index">
+        <view>已停车时长</view>
+        <view class="warp_index_color">{{ parkingTime }}</view>
+      </view>
+      <view class="warp_index">
+        <view>应缴</view>
+        <view class="warp_index_color">{{
+          (parkInfo.servicefee / 100) | currency
+        }}</view>
+      </view>
+    </view>
+    <view class="warp">
+      <view
+        class="warp_index warp_index_da"
+        v-if="
+          parkFee.parkInfoEntity.consumeReduce ||
+          parkFee.parkInfoEntity.memberLevelReduce
+        "
+      >
+        <view>停车优惠</view>
+        <view class="warp_index_color" @click="discounts">
+          <view
+            style="margin-right: 10rpx"
+            :class="hasDiscount ? 'text-red' : ''"
+            >{{ discountDesc }}</view
+          >
+          <image
+            style="width: 26rpx; height: 26rpx"
+            src="static/images/arrows.png"
+          />
+        </view>
+      </view>
+      <view
+        class="warp_index warp_index_da"
+        v-if="
+          parkFee.parkInfoEntity.isuseintegral === 1 &&
+          parkFee.discountKind === 7
+        "
+      >
+        <view>新会员积分优惠</view>
+        <view class="warp_index_color" @click="newToggle('bottom')">
+          <view
+            style="margin-right: 10rpx"
+            :class="bonusCopy >= integralNew || durationNew ? 'text-red' : ''"
+            >{{ integralDescNew }}</view
+          >
+          <image
+            style="width: 26rpx; height: 26rpx"
+            src="static/images/arrows.png"
+          />
+        </view>
+      </view>
+      <view
+        class="warp_index warp_index_da"
+        v-if="parkFee.parkInfoEntity.isuseintegral === 1"
+      >
+        <view>积分减免</view>
+        <view class="warp_index_color" @click="toggle('bottom')">
+          <view
+            style="margin-right: 10rpx"
+            :class="bonusCopy >= integral || duration ? 'text-red' : ''"
+            >{{ integralDesc }}</view
+          >
+          <image
+            style="width: 26rpx; height: 26rpx"
+            src="static/images/arrows.png"
+          />
+        </view>
+      </view>
+      <view
+        class="warp_index warp_index_da"
+        v-if="parkFee.parkInfoEntity.isuseticket === 1"
+      >
+        <view>优惠劵</view>
+        <view class="warp_index_color" @click="coupon">
+          <view
+            style="margin-right: 10rpx"
+            :class="couponCount > 0 ? 'text-red' : ''"
+            >{{ couponDesc }}</view
+          >
+          <image
+            style="width: 26rpx; height: 26rpx"
+            src="static/images/arrows.png"
+          />
+        </view>
+      </view>
+      <!-- 纸质券 -->
+      <view
+        class="warp_index warp_index_da"
+        v-if="parkFee.parkInfoEntity.papercoupons === 1 || isShowPapercoupons"
+      >
+        <view>纸质优惠劵</view>
+        <view class="warp_index_color" @click="paperCoupon">
+          <view style="margin-right: 10rpx" class="text-red"
+            >扫描纸质优惠劵二维码</view
+          >
+          <image
+            style="width: 26rpx; height: 26rpx"
+            src="static/images/arrows.png"
+          />
+        </view>
+      </view>
+      <view
+        :class="{
+          warp_index: true,
+          color_warp_index: custTypeId !== 0,
+          warp_index_da: true,
+        }"
+      >
+        <view>优惠金额:</view>
+        <view class="warp_index_color" style="color: #ff0000"
+          >-{{ discountTotalFee | currency }}</view
+        >
+      </view>
+      <view :class="{ warp_index: true, color_warp_index: custTypeId !== 0 }">
+        <view>应付金额:</view>
+        <view class="warp_index_color" style="color: #ff0000">{{
+          actualFee | currency
+        }}</view>
+      </view>
+    </view>
+    <view class="top_content" v-if="parkFee.parkInfoEntity.payinstruction">
+      <view class="title_box">
+        <text class="btn">缴费说明</text>
+      </view>
+      <view class="info" :class="!isShow ? 'is-show' : ''">
+        <text>{{ parkFee.parkInfoEntity.payinstruction }}</text>
+      </view>
+      <view
+        class="top-down"
+        @click="togglePayinstruction"
+        v-if="!isShow && parkFee.parkInfoEntity.payinstruction.length > 60"
+        >︾</view
+      >
+      <view
+        class="top-down"
+        @click="togglePayinstruction"
+        v-if="isShow && parkFee.parkInfoEntity.payinstruction.length > 60"
+        >︽</view
+      >
+    </view>
+    <view class="flewx">
+      <view class="flewx-content"
+        >应付<text
+          style="color: #ff0000; font-size: 32rpx; padding-left: 20rpx"
+          >{{ actualFee | currency }}</text
+        >
+        元
+        <text style="color: #8d8d8d; padding-left: 30rpx; font-size: 28rpx"
+          >已优惠{{ discountTotalFee | currency }}元</text
+        >
+        <uni-countdown
+          v-if="payCarno"
+          splitorColor="#FF0000"
+          color="#FF0000"
+          :show-day="false"
+          :show-hour="false"
+          :second="refreshTime"
+          @timeup="resetCountDown()"
+        >
+          <text style="align-self: center; font-size: 26rpx; color: #ff0000"
+            >后同步最新费用</text
+          >
+        </uni-countdown>
+      </view>
+      <view
+        :class="{
+          flewx_index3: true,
+          blue_flewx_index3: custTypeId === 1,
+          green_flewx_index3: custTypeId === 2,
+          'btn-disabled': payBtnDisabled,
+        }"
+        @click="toPay"
+        >支付</view
+      >
+    </view>
+    <uni-popup ref="popup" type="bottom" :animation="false" :maskClick="false">
+      <view class="popue_box">
+        <view class="popue_box_index1">积分减免</view>
+        <view class="popue_box_index">
+          <view>减免规则</view>
+          <view style="color: #989898"
+            >{{ integral }}积分抵扣{{
+              parkMallCode === 5 ? integralToValue + '元' : '1小时'
+            }}</view
+          >
+        </view>
+        <view class="popue_box_index">
+          <view style="font-weight: 700">可用积分</view>
+          <view style="color: #ed1c24">{{ bonus }}分</view>
+        </view>
+        <view class="popue_box_index">
+          <view>抵扣{{ parkMallCode === 5 ? '金额' : '时长' }}</view>
+          <view class="popue_box_index" style="width: 325rpx">
+            <view class="popue_box_index4_xs">
+              <view class="popue_box_index4_xs_index1" @click="durationMinus"
+                >-</view
+              >
+              <view class="popue_box_index4_xs_index2">{{ duration }}</view>
+              <view class="popue_box_index4_xs_index3" @click="durationAdd"
+                >+</view
+              >
+            </view>
+            <view style="color: #808080">{{
+              parkMallCode === 5 ? '元' : '小时'
+            }}</view>
+          </view>
+        </view>
+        <view class="popue_box_index5">
+          <view
+            :class="{
+              popue_box_index4_by: true,
+              blue_popue_box_index4_by: custTypeId === 1,
+              green_popue_box_index4_by: custTypeId === 2,
+            }"
+            @click="cancel(1)"
+            >取消</view
+          >
+          <view
+            :class="{
+              popue_box_index4_by1: true,
+              blue_popue_box_index4_by1: custTypeId === 1,
+              green_popue_box_index4_by1: custTypeId === 2,
+            }"
+            @click="confirm(1)"
+            >确定</view
+          >
+        </view>
+      </view>
+    </uni-popup>
+    <uni-popup
+      ref="newpopup"
+      type="bottom"
+      :animation="false"
+      :maskClick="false"
+    >
+      <view class="popue_box">
+        <view class="popue_box_index1">积分优惠减免</view>
+        <view class="popue_box_index">
+          <view>减免规则</view>
+          <view style="color: #989898">{{ integralNew }}积分抵扣1小时</view>
+        </view>
+        <view class="popue_box_index">
+          <view style="font-weight: 700">可用积分</view>
+          <view style="color: #ed1c24">{{ bonus }}分</view>
+        </view>
+        <view class="popue_box_index">
+          <view>抵扣{{ parkMallCode === 5 ? '金额' : '时长' }}</view>
+          <view class="popue_box_index" style="width: 325rpx">
+            <view class="popue_box_index4_xs">
+              <view class="popue_box_index4_xs_index1" @click="durationMinusNew"
+                >-</view
+              >
+              <view class="popue_box_index4_xs_index2">{{ durationNew }}</view>
+              <view class="popue_box_index4_xs_index3" @click="durationAddNew"
+                >+</view
+              >
+            </view>
+            <view style="color: #808080">{{
+              parkMallCode === 5 ? '元' : '小时'
+            }}</view>
+          </view>
+        </view>
+        <view class="popue_box_index5">
+          <view
+            :class="{
+              popue_box_index4_by: true,
+              blue_popue_box_index4_by: custTypeId === 1,
+              green_popue_box_index4_by: custTypeId === 2,
+            }"
+            @click="cancel(2)"
+            >取消</view
+          >
+          <view
+            :class="{
+              popue_box_index4_by1: true,
+              blue_popue_box_index4_by1: custTypeId === 1,
+              green_popue_box_index4_by1: custTypeId === 2,
+            }"
+            @click="confirm(2)"
+            >确定</view
+          >
+        </view>
+      </view>
+    </uni-popup>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import moment from '@/common/js/moment.min.js';
+import { mapState } from 'vuex';
+import MemberCacheTool from '@/utils/member-cache-tool.js';
+import log from '@/utils/log.js';
+import { compare } from '@/utils/location.js';
+export default {
+  data() {
+    return {
+      bindflag: '',
+      initFlag: true, // 用作应缴费用为0时的提示弹框标记
+      animationChilc: false,
+      duration: 0, // 积分兑换时长
+      durationNew: 0, // 北京新会员积分兑换时长
+      durationCopy: 0, // 积分兑换时长备份
+      durationNewCopy: 0, // 积分兑换时长备份
+      orderno: '',
+      params: {},
+      integral: 0, // 积分
+      integralNew: 0, // 北京新会员积分
+      bonus: 0, // 当前积分
+      bonusCopy: 0, // 积分备份
+      bonusfee: 0, // 积分减免金额
+      newBonusfee: 0, // 新会员减免金额
+      hourMoney: 15,
+      payCarno: '',
+      picUrl: '',
+      parkInfo: {},
+      parkFee: {},
+      checkedTotal: 0, // 已选择优惠项目数
+      discountTotal: {}, // 已选择优惠项目统计(时间、费用)
+      couponCount: 0, // 可选优惠券数量
+      checkedCouponCount: 0, // 已选优惠券数量
+      couponInfo: {}, // 已选择电子券信息
+      paperCouponInfo: {}, // 已选择纸质优惠券信息
+      isShowPapercoupons: false, // 未登录时显示纸质优惠券
+      // dimension: 1, // 计算维度 浦东0.5小时 其它停车场1小时
+      maxonetimediscountFee: 0, // 每次优惠上限金额
+      maxonedaydiscountFee: 0, // 每天优惠上限金额
+      discountTotalFeeCopy: 0, // 用于超限判断
+      parkMallCode: 0, // 0静安 1浦东 2杭州 3北京 4沈阳 5深圳
+      hasDiscount: false, // 是否有会员减免、消费减免
+      isShow: true, // 缴费说明true:显示全部 false:显示部分
+      orderCreateTime: '', // 订单创建时间
+      refreshTime: 180, // 停车场重置费用倒计时3分钟
+      isPageHide: false, // 用于其它有人吗倒计时重置时不再弹出优惠框
+      isShowPopup: false, // 优惠提示是否显示
+      preUrl: '',
+      integralToValue: 0, // 深圳前海停车500积分兑换5元
+      integralMaxMoney: 0, // 深圳前海停车积分上限
+      integralNewToValue: 0, // 北京新会员积分
+      integralNewMaxMoney: 0, // 北京新会员积分
+      discountKind: null,
+      parkingTrack: null,
+      reFresh: '',
+    };
+  },
+  onBackPress(event) {
+    return true;
+  },
+  computed: {
+    // 支付按钮状态
+    payBtnDisabled() {
+      return (
+        !this.parkInfo.servicefee ||
+        (app.globalData.member && !this.parkFee.parkInfoEntity)
+      );
+    },
+
+    // 已停车时长
+    parkingTime() {
+      const time = this.parkInfo.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}分钟`;
+    },
+
+    // 停车优惠(首停、会员减免、消费减免)
+    discountDesc() {
+      if (this.hasDiscount) {
+        if (this.checkedTotal > 0) {
+          return `已选择${this.checkedTotal}项优惠`;
+        }
+        return '立即使用';
+      } else {
+        return '暂无可用优惠';
+      }
+    },
+
+    // 积分减免
+    integralDesc() {
+      if (this.duration > 0) {
+        // 深圳特殊处理(单位:金额)
+        if (this.parkMallCode === 5) {
+          return `已选择兑换${this.duration}元`;
+        }
+        return `已选择兑换${this.duration}小时`;
+      }
+      if (this.bonusCopy < this.integral) {
+        return `${this.integral}积分可停车1小时`;
+      }
+      if (
+        this.parkMallCode === 3 &&
+        app.globalData.member?.currnentintegral >= this.integral &&
+        !this.bonus
+      ) {
+        return `今日已达上限`;
+      }
+      return `${this.bonus}积分可减免`;
+    },
+    // 北京新会员积分减免
+    integralDescNew() {
+      if (this.durationNew > 0) {
+        return `已选择兑换${this.durationNew}小时`;
+      }
+      if (this.bonusCopy < this.integralNew) {
+        return `${this.integralNew}积分可停车1小时`;
+      }
+      if (
+        this.parkMallCode === 3 &&
+        app.globalData.member?.currnentintegral >= this.integralNew &&
+        !this.bonus
+      ) {
+        return `今日已达上限`;
+      }
+      return `${this.bonus}积分可减免`;
+    },
+    // 电子券
+    couponDesc() {
+      if (this.checkedCouponCount > 0) {
+        return `已选择${this.checkedCouponCount}张优惠劵`;
+      } else {
+        if (this.couponCount > 0) {
+          return `您有${this.couponCount}张可用优惠劵`;
+        }
+        return `暂无可用优惠券`;
+      }
+    },
+
+    // 实际支付金额
+    actualFee() {
+      const fee = this.parkInfo.servicefee / 100 - this.discountTotalFee;
+      return fee > 0 ? fee : 0;
+    },
+
+    // 优惠金额
+    discountTotalFee() {
+      let total = 0;
+      if (this.discountTotal.fee > 0) {
+        total += this.discountTotal.fee; // 首停、会员、消费减免
+      }
+      if (this.bonusfee > 0) {
+        total += this.bonusfee; // 积分减免
+      }
+      if (this.newBonusfee > 0) {
+        total += this.newBonusfee; // 积分减免
+      }
+      if (this.couponInfo.couponfee > 0) {
+        total += this.couponInfo.couponfee; // 电子券减免
+      }
+      this.discountTotalFeeCopy = total;
+      // 超出上限按上限计算(parkMallCode: 0静安 1浦东 2杭州 3北京 4沈阳 5深圳)
+      if (this.parkMallCode === 1) {
+        if (total > this.maxonetimediscountFee) {
+          total = this.maxonetimediscountFee;
+        }
+      }
+      if (this.parkMallCode === 5) {
+        if (total > this.maxonedaydiscountFee) {
+          total = this.maxonedaydiscountFee;
+        }
+      }
+      // 沈阳超限处理(maxonedaydiscountFee 会员、消费、电子券减免)
+      if (this.parkMallCode === 4) {
+        if (total - this.bonusfee > this.maxonedaydiscountFee) {
+          total = this.maxonedaydiscountFee + this.bonusfee;
+        }
+      }
+      if (this.paperCouponInfo.paperDiscountFee > 0) {
+        total += this.paperCouponInfo.paperDiscountFee; // 纸质券减免
+        this.discountTotalFeeCopy += this.paperCouponInfo.paperDiscountFee;
+      }
+      uni.setStorageSync('parkingTotal', {
+        time: total / this.hourMoney,
+        fee: total,
+        feeCopy: this.discountTotalFeeCopy,
+        bonusfee: this.bonusfee || 0,
+        newBonusfee: this.newBonusfee || 0,
+      });
+      return total;
+    },
+
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  // 分享好友
+  onShareAppMessage: function (res) {
+    return {
+      title: '缴费详情', // 分享标题
+      // desc: this.params.shareDescribe, // 分享描述
+      imageUrl: '', // 分享图标
+      path: `/pages/parkingFee/parkingFeeDetail?orderno=${this.orderno}&id=${this.id}&mallid=${app.globalData.mallid}`,
+    };
+  },
+  // 分享朋友圈
+  onShareTimeline: function (res) {
+    return {
+      title: '缴费详情', // 分享标题
+      // desc: this.params.shareDescribe, // 分享描述
+      imageUrl: '', // 分享图标
+      path: `/pages/parkingFee/parkingFeeDetail?orderno=${this.orderno}&id=${this.id}&mallid=${app.globalData.mallid}`,
+    };
+  },
+  onLoad(option) {
+    this.picUrl = this.$picUrl;
+    this.payCarno = option.carno;
+    this.orderno = option.orderno;
+    this.id = option.id;
+    // 埋点初始化
+    this.parkingTrack = new this.$trackFactory('parking_pay_order', {});
+    this.parkingTrack.track(1);
+    // 场景二维码记录(是否扫码进入)
+    app.globalData.paramsScene = {};
+    this.$saveSceneQrcodeDetail(
+      'page',
+      'parkingFeeDetail:' + option.id,
+      '缴费详情',
+      '',
+      '',
+      '',
+      ''
+    );
+    this.init();
+    // if (JSON.stringify(app.globalData.userInfo) !== "{}" && JSON.stringify(app.globalData.member) !== "{}") {
+    this.createParkOrder();
+    // } else {
+    // 	this.$refs.authorize.login("/pages/parkingFee/parkingFeeDetail", () => {
+    // 		this.createParkOrder();
+    // 	});
+    // }
+    // 埋点本地化
+    this.preUrl = uni.getStorageSync('previousUrl');
+    uni.setStorageSync('previousUrl', '/pages/parkingFee/parkingFeeDetail.vue');
+  },
+  onBackPress(event) {
+    uni.redirectTo({
+      url: './parkingFee.vue',
+    });
+    return true;
+  },
+  onShow() {
+    log.info('订单时间:' + this.orderCreateTime);
+    this.isPageHide = false;
+    // 如果订单时间+3分钟-当前时间<=0 刷新订单
+    if (this.orderCreateTime) {
+      const countDownTime = moment(this.orderCreateTime)
+        .add(180, 's')
+        .diff(moment(), 's');
+      log.info('剩余时间:' + countDownTime);
+      if (countDownTime <= 0) {
+        this.createParkOrder();
+      } else {
+        this.refreshTime = countDownTime;
+      }
+    }
+
+    // 优惠减免(首停、会员、消费)
+    this.checkedTotal = uni.getStorageSync('checkedTotal');
+    this.discountTotal = uni.getStorageSync('discountTotal');
+
+    // 电子券减免(停车券)
+    this.couponInfo = uni.getStorageSync('couponInfo');
+    this.checkedCouponCount = uni.getStorageSync('checkedCouponList').length;
+
+    // 纸质优惠券
+    this.paperCouponInfo = uni.getStorageSync('paperCouponInfo');
+  },
+  onHide() {
+    this.isPageHide = true;
+  },
+  watch: {
+    reFresh: function () {
+      this.getList();
+      console.log('页面已重新加载');
+    },
+  },
+  methods: {
+    // 触发返回按钮
+    getList() {
+      var pages = getCurrentPages(); //当前页面栈
+      let beforePage = pages[pages.length - 2]; //获取上一个页面实例对象
+      beforePage.$vm.reFresh = Math.random(); //触发上一页监听器
+      uni.navigateBack();
+    },
+    // 页面初始清空缓存
+    init() {
+      // 优惠减免(首停、会员、消费)
+      uni.removeStorageSync('checkedList'); // 选中list
+      uni.removeStorageSync('checkedTotal'); // 选中count数
+      uni.removeStorageSync('discountTotal'); // 减免信息(时长、费用)
+
+      // 停车减免(优惠、积分、停车券)
+      uni.removeStorageSync('parkFee');
+
+      // 电子券优惠信息
+      uni.removeStorageSync('checkedCouponList'); // 选中list
+      uni.removeStorageSync('couponInfo'); // 减免信息(时长、费用)
+      uni.removeStorageSync('list'); // 电子券list
+
+      // 总停车优惠信息(时长、费用)
+      uni.removeStorageSync('parkingTotal');
+
+      // 应缴金额
+      uni.removeStorageSync('servicefee');
+
+      // 订单号
+      uni.removeStorageSync('orderno');
+
+      // 纸质优惠券
+      uni.removeStorageSync('paperCouponInfo');
+    },
+
+    // 重置倒计时
+    resetCountDown() {
+      this.refreshTime = 0;
+      this.createParkOrder();
+    },
+
+    // 创建订单
+    createParkOrder() {
+      uni.showLoading({
+        title: '加载中',
+      });
+      const openId = MemberCacheTool.getOpenId(app);
+      const member = uni.getStorageSync('member');
+      const params = {
+        carno: this.payCarno,
+        mallid: app.globalData.mallid,
+        openId: openId,
+        vipcode:
+          app.globalData.member?.vipcode ||
+          uni.getStorageSync('member')?.vipcode,
+        mobile:
+          app.globalData.member?.mobile || uni.getStorageSync('member')?.mobile,
+        groupId: app.globalData.groupId,
+        kipUserId: app.globalData.member?.kipUserId || member.kipUserId || '',
+        createuser: 'sys_miniprogram',
+      };
+      this.$md(params);
+      if (this.$store.state.radiusType === null) {
+        this.payUrl = 'api/1.0/park/createParkOrderAndCarFee';
+      } else if (this.$store.state.radiusType === 0) {
+        this.payUrl = 'api/1.0/park/createParkOrder';
+      }
+      this.$request({
+        // url: this.$baseURL + 'api/1.0/park/createParkOrder',
+        url: this.$baseURL + this.payUrl,
+
+        // url: 'http://172.21.202.252:8083/xcrm-api/api/1.0/park/createParkOrderAndCarFee',
+        data: params,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+      })
+        .then((res) => {
+          uni.hideLoading();
+          if (res.data.code === 0) {
+            this.bindflag = res.data.data.bind;
+            this.parkInfo = res.data.data;
+            this.parkMallCode = this.parkInfo.parkMallCode;
+            this.orderCreateTime = this.parkInfo.createDate;
+            uni.setStorageSync('servicefee', this.parkInfo.servicefee / 100);
+            uni.setStorageSync('orderno', this.parkInfo.orderno);
+
+            if (!this.parkInfo.servicefee && this.initFlag) {
+              this.initFlag = false;
+              return uni.showModal({
+                showCancel: false,
+                title: '提示',
+                content: '当前无需缴费',
+                complete: () => {
+                  // this.createParkOrder();
+                  uni.navigateBack();
+                },
+              });
+            }
+            if (app.globalData.member) {
+              this.getDiscount();
+            } else {
+              // 未登录状态显示纸质券
+              this.isShowPapercoupons = true;
+            }
+            this.refreshTime = 180;
+          } else {
+            uni.showModal({
+              showCancel: false,
+              title: '提示',
+              content: res.data.msg,
+              complete(r) {
+                uni.navigateBack();
+              },
+            });
+          }
+        })
+        .catch((err) => {
+          console.log(err);
+        });
+    },
+
+    // 获取优惠、停车场相关配置
+    getDiscount() {
+      uni.showLoading({
+        title: '加载中',
+      });
+      let _this = this;
+      const params = {
+        carno: this.payCarno,
+        mallid: app.globalData.mallid,
+        vipcode: app.globalData.member.vipcode,
+        groupId: app.globalData.groupId,
+      };
+      this.$md(params);
+      this.$request({
+        // url:  'http://172.21.202.252:8083/xcrm-api/api/1.0/park/discount',
+        url: this.$baseURL + 'api/1.0/park/discount',
+        data: params,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+      })
+        .then((res) => {
+          uni.hideLoading();
+          if (res.data.code === 0) {
+            this.parkFee = res.data.data;
+            if (this.parkFee.parkIntegraltomoneyList) {
+              this.integral = this.parkFee.parkIntegraltomoneyList[0].integral;
+              this.integralToValue =
+                this.parkFee.parkIntegraltomoneyList[0].value || 0;
+              this.integralMaxMoney =
+                this.parkFee.parkIntegraltomoneyList[0].integralMaxHour || 0;
+              this.bonus = this.parkFee.parkIntegraltomoneyList[0].bonus;
+              // this.bonus = 600
+              // this.bonus = this.parkFee.parkIntegraltomoneyList[0].bonus;
+              this.discountKind = this.parkFee.discountKind;
+              if (this.parkFee.discountKind === 7) {
+                // console.log('this.parkFee.parkIntegraltomoneyList[1]::::::', res.data.data.parkIntegraltomoneyList)
+                this.integralNew =
+                  _this.parkFee.parkIntegraltomoneyList[1].integral;
+                this.integralNewToValue =
+                  this.parkFee.parkIntegraltomoneyList[1].value || 0;
+                this.integralNewMaxMoney =
+                  this.parkFee.parkIntegraltomoneyList[1].integralMaxHour || 0;
+              }
+              // 深圳特殊处理(单位:金额)
+              if (this.parkMallCode === 5) {
+                if (this.duration) {
+                  this.bonus -=
+                    (this.duration * this.integral) / this.integralToValue;
+                  this.bonusfee = this.duration;
+                  this.durationCopy = this.duration;
+                }
+              } else {
+                if (this.duration) {
+                  this.bonus -= this.duration * this.integral;
+                  this.bonusfee = this.duration * this.hourMoney;
+                  this.durationCopy = this.duration;
+                }
+              }
+              this.bonusCopy = this.bonus;
+            }
+            if (!this.parkFee.parkInfoEntity) {
+              return;
+            }
+            const reg = /[;;]/g;
+            this.parkFee.parkInfoEntity.payinstruction =
+              this.parkFee.parkInfoEntity.payinstruction.replace(reg, '\r\n');
+            this.hourMoney = this.parkFee.parkInfoEntity.needmoney;
+            this.parkMallCode = this.parkFee.parkInfoEntity.parkMallCode;
+            if (this.parkFee.memberTicketList) {
+              this.couponCount = this.parkFee.memberTicketList.length;
+            }
+            // 上限金额
+            this.maxonetimediscountFee =
+              this.parkFee.parkInfoEntity.maxonetimediscount * this.hourMoney;
+            // 深圳特殊处理(单位:金额)
+            if (this.parkMallCode === 5) {
+              this.maxonedaydiscountFee =
+                this.parkFee.parkInfoEntity.maxOneDayHour -
+                  this.parkFee.parkInfoEntity
+                    .ticketandMemeberGradeAndConsumeUseHour || 0;
+            } else {
+              this.maxonedaydiscountFee =
+                (this.parkFee.parkInfoEntity.maxOneDayHour -
+                  this.parkFee.parkInfoEntity
+                    .ticketandMemeberGradeAndConsumeUseHour) *
+                  this.hourMoney || 0;
+            }
+            if (this.maxonedaydiscountFee < 0) {
+              this.maxonedaydiscountFee = 0;
+            }
+            uni.setStorageSync('parkFee', JSON.stringify(this.parkFee));
+            // 如果有可使用会员减免、消费减免,追加弹框提示
+            if (
+              this.parkFee.parkInfoEntity.consumeReduce ||
+              this.parkFee.parkInfoEntity.memberLevelReduce
+            ) {
+              if (
+                (this.parkFee.parkMemberOrderReducesEntityList &&
+                  this.parkFee.parkMemberOrderReducesEntityList[0]) ||
+                (this.parkFee.parkConsumeReducesEntityList &&
+                  this.parkFee.parkConsumeReducesEntityList[0])
+              ) {
+                this.hasDiscount = true;
+                // if (!this.parkInfo.servicefee) {
+                // 	return;
+                // }
+                // let confirmColor = '#703a98';
+                // if (this.custTypeId === 1) {
+                // 	confirmColor = '#023694';
+                // }
+                // if (this.custTypeId === 2) {
+                // 	confirmColor = '#0B683A';
+                // }
+                // if (this.checkedTotal || this.isPageHide || this.isShowPopup) {
+                // 	return;
+                // }
+                // this.isShowPopup = true;
+                // uni.showModal({
+                // 	title: '停车优惠',
+                // 	content: '您有停车优惠可使用, 前往使用!',
+                // 	cancelText: '返回',
+                // 	confirmText: '点击查看',
+                // 	confirmColor: confirmColor,
+                // 	success: res => {
+                // 		if (res.confirm) {
+                // 			this.discounts();
+                // 		}
+                // 		this.isShowPopup = false;
+                // 	}
+                // })
+              }
+            }
+            // 自动勾选优惠
+            if (
+              !this.discountTotalFee &&
+              (this.hasDiscount ||
+                this.bonusCopy >= this.integral ||
+                this.bonusCopy >= this.integralNew ||
+                this.couponCount)
+            ) {
+              this.autoCheckDiscounts();
+            }
+          } else {
+            uni.showModal({
+              showCancel: false,
+              title: '提示',
+              content: res.data.msg,
+              complete(r) {
+                // uni.navigateBack();
+              },
+            });
+          }
+        })
+        .catch((err) => {
+          console.log(err);
+        });
+    },
+
+    // 积分取消
+    cancel(flag) {
+      if (flag === 1) {
+        this.duration = this.durationCopy;
+        this.bonus = this.bonusCopy;
+        // 深圳特殊处理(单位:金额)
+        if (this.parkMallCode === 5) {
+          this.bonusfee = this.duration;
+        } else {
+          this.bonusfee = this.duration * this.hourMoney;
+        }
+        this.$refs.popup.close();
+      } else if (flag === 2) {
+        // 北京新会员积分减免操作后取消
+        this.durationNew = this.durationCopy2;
+        this.bonus = this.bonusCopy;
+        this.newBonusfee = this.durationNew * this.hourMoney;
+        this.$refs.newpopup.close();
+      }
+    },
+
+    // 积分确认
+    confirm(type) {
+      if (type === 1) {
+        this.bonusCopy = this.bonus;
+        this.durationCopy = this.duration;
+        this.$refs.popup.close();
+      } else if (type === 2) {
+        this.bonusCopy = this.bonus;
+        this.durationCopy2 = this.durationNew;
+        this.$refs.newpopup.close();
+      }
+    },
+
+    // 减积分
+    durationMinus() {
+      if (this.duration > 0) {
+        // 深圳特殊处理(单位:金额)
+        if (this.parkMallCode === 5) {
+          this.duration -= this.integralToValue;
+        } else {
+          this.duration--;
+        }
+        this.bonus += this.integral;
+      }
+      // 深圳特殊处理(单位:金额)
+      if (this.parkMallCode === 5) {
+        this.bonusfee = this.duration;
+      } else {
+        this.bonusfee = this.duration * this.hourMoney;
+      }
+    },
+
+    // 加积分
+    durationAdd() {
+      // 浦东每次缴费超限控制
+      if (
+        this.parkMallCode === 1 &&
+        this.discountTotalFee >= this.maxonetimediscountFee
+      ) {
+        return uni.showToast({
+          title: `超出抵扣上限,每次最高可抵扣${this.parkFee.parkInfoEntity.maxonetimediscount}小时`,
+          icon: 'none',
+        });
+      }
+      // 北京积分上限控制
+      if (this.parkMallCode === 3) {
+        const bonusMax =
+          this.parkFee.parkInfoEntity.integralMaxHour -
+            this.parkFee.parkInfoEntity.integralUseHour || 0;
+        if (this.duration >= bonusMax) {
+          return uni.showToast({
+            title: `超出抵扣上限,每日最高可抵扣${this.parkFee.parkInfoEntity.integralMaxHour}小时`,
+            icon: 'none',
+          });
+        }
+      }
+      // 深圳积分上限控制
+      if (this.parkMallCode === 5) {
+        if (this.discountTotalFee >= this.maxonedaydiscountFee) {
+          return uni.showToast({
+            title: `超出抵扣上限,每日最高可抵扣${this.parkFee.parkInfoEntity.maxOneDayHour}元`,
+            icon: 'none',
+          });
+        }
+        if (this.duration >= this.integralMaxMoney) {
+          return uni.showToast({
+            title: `超出抵扣上限,每次最高可抵扣${this.integralMaxMoney}元`,
+            icon: 'none',
+          });
+        }
+      }
+
+      if (this.bonus - this.integral >= 0) {
+        this.bonus -= this.integral;
+        // 深圳特殊处理(单位:金额)
+        if (this.parkMallCode === 5) {
+          this.duration += this.integralToValue;
+        } else {
+          this.duration++;
+        }
+      } else {
+        uni.showToast({
+          title: '积分不足',
+          icon: 'none',
+        });
+      }
+      // 深圳特殊处理(单位:金额)
+      if (this.parkMallCode === 5) {
+        this.bonusfee = this.duration;
+      } else {
+        this.bonusfee = this.duration * this.hourMoney;
+      }
+    },
+    // 北京新会员加积分
+    durationAddNew() {
+      const bonusMaxNew =
+        this.parkFee.parkIntegraltomoneyList[1].integralMaxHour -
+          this.parkFee.parkIntegraltomoneyList[1].integralUseHour || 0;
+      if (this.durationNew >= bonusMaxNew) {
+        return uni.showToast({
+          title: `超出抵扣上限,每日最高可抵扣${this.parkFee.parkIntegraltomoneyList[1].integralMaxHour}小时`,
+          icon: 'none',
+        });
+      }
+      if (this.bonus - this.integralNew >= 0) {
+        this.bonus -= this.integralNew;
+        this.durationNew++;
+        this.newBonusfee = this.durationNew * this.hourMoney;
+      } else {
+        uni.showToast({
+          title: '积分不足',
+          icon: 'none',
+        });
+      }
+    },
+    // 北京新会员减积分
+    durationMinusNew() {
+      if (this.durationNew > 0) {
+        this.bonus += this.integralNew;
+        this.durationNew--;
+        this.newBonusfee = this.durationNew * this.hourMoney;
+      }
+    },
+    // 积分减免弹出
+    toggle(type) {
+      if (
+        this.parkFee.parkIntegraltomoneyList &&
+        this.parkFee.parkIntegraltomoneyList.length
+      ) {
+        this.$refs['popup'].open();
+      }
+    },
+    // 积分减免弹出
+    newToggle(type) {
+      if (
+        this.parkFee.parkIntegraltomoneyList &&
+        this.parkFee.parkIntegraltomoneyList.length
+      ) {
+        this.$refs['newpopup'].open();
+      }
+    },
+    // 跳转纸质优惠
+    paperCoupon() {
+      uni.navigateTo({
+        url: './parkingFeePaperCoupon',
+      });
+    },
+
+    // 电子优惠劵
+    coupon() {
+      if (!this.couponCount) {
+        return uni.showToast({
+          title: '暂无可使用的优惠券,请前往积分商城兑换优惠券',
+          icon: 'none',
+        });
+      }
+      uni.navigateTo({
+        url: './parkingFeeCoupon',
+      });
+    },
+
+    // 跳转首停、会员、消费减免页面
+    discounts() {
+      if (!this.hasDiscount && this.parkMallCode !== 2) {
+        return uni.showToast({
+          title: '暂无可用优惠',
+          icon: 'none',
+        });
+      }
+      uni.navigateTo({
+        url: '/pages/parkingFee/parkingFeeDiscounts',
+      });
+    },
+
+    // 自动勾选优惠 优先级:会员/消费->电子券->积分
+    autoCheckDiscounts() {
+      // console.log('if外1',this.bonusCopy, this.integral)
+      if (!this.parkFee || !this.parkInfo.servicefee) {
+        return;
+      }
+      const serviceFee = this.parkInfo.servicefee / 100; // 应缴费用
+
+      // 自动选取消费减免
+      if (
+        this.parkFee.parkConsumeReducesEntityList &&
+        this.parkFee.parkConsumeReducesEntityList[0] &&
+        this.parkFee.parkConsumeReducesEntityList[0].recuceContent
+      ) {
+        this.autoConsume(serviceFee);
+      }
+
+      // 自动选取会员等级减免
+      if (
+        this.parkFee.parkMemberOrderReducesEntityList &&
+        this.parkFee.parkMemberOrderReducesEntityList[0] &&
+        this.parkFee.parkMemberOrderReducesEntityList[0].reduceContent &&
+        Number.parseInt(
+          this.parkFee.parkMemberOrderReducesEntityList[0].reduceContent
+        ) > 0
+      ) {
+        this.autoMember();
+      }
+
+      // 自动选取电子券减免
+      if (this.couponCount) {
+        this.autoCoupon(serviceFee);
+      }
+      // 自动选取北京新会员积分减免
+      if (this.discountKind === 7) {
+        // console.log('this.bonusCopy::::::',this.bonusCopy, this.integral)
+        if (this.bonusCopy >= this.integralNew) {
+          this.newMemberautoBonus(serviceFee);
+        }
+      }
+      // console.log('this.bonusCopy::::::',this.bonusCopy, this.integral)
+      // 自动选取积分减免
+      if (this.bonusCopy >= this.integral) {
+        // this.newMemberautoBonus(serviceFee);
+        this.autoBonus(serviceFee);
+      }
+    },
+
+    // 自动选取消费减免
+    autoConsume(serviceFee) {
+      let consumeTime =
+        +this.parkFee.parkConsumeReducesEntityList[0].recuceContent || 0; // 消费减免时长
+      let consumeFee = 0; // 消费减免费用
+      const isSplit = this.parkFee.parkInfoEntity.isSplit === 0 ? 0 : 1; // 是否拆分 0: 可拆 1: 不可拆
+      const serviceTime = Math.ceil(serviceFee / this.hourMoney); // 停车时长(防止有小数情况向上取整)
+
+      /*************************************************** 静安 ***************************************************/
+      if (this.parkMallCode === 0) {
+        // 超过上限取上限
+        if (consumeTime > this.parkFee.parkInfoEntity.remainReduceTime) {
+          consumeTime = this.parkFee.parkInfoEntity.remainReduceTime;
+        }
+        // 拆分消费减免
+        if (isSplit === 0) {
+          // 减免时长超出停车时长取停车时长
+          if (consumeTime > serviceTime) {
+            consumeTime = serviceTime;
+          }
+        }
+        // 消费减免费用
+        consumeFee = consumeTime * this.hourMoney;
+      }
+
+      /*************************************************** 浦东 ***************************************************/
+      if (this.parkMallCode === 1) {
+        // 可用消费减免时长上限
+        let remainReduceTime = this.parkFee.parkInfoEntity.remainReduceTime;
+        if (remainReduceTime > this.parkFee.parkInfoEntity.maxonetimediscount) {
+          remainReduceTime = this.parkFee.parkInfoEntity.maxonetimediscount;
+        }
+        // 超过上限取上限
+        if (consumeTime > remainReduceTime) {
+          consumeTime = remainReduceTime;
+        }
+        // 拆分消费减免
+        if (isSplit === 0) {
+          // 减免时长超出停车时长取停车时长
+          if (consumeTime > serviceTime) {
+            consumeTime = serviceTime;
+          }
+        }
+        // 消费减免费用
+        consumeFee = consumeTime * this.hourMoney;
+      }
+
+      /*************************************************** 杭州 ***************************************************/
+      if (this.parkMallCode === 2) {
+        // 超过上限取上限
+        if (consumeTime > this.parkFee.parkInfoEntity.remainReduceTime) {
+          consumeTime = this.parkFee.parkInfoEntity.remainReduceTime;
+        }
+        // 消费减免费用
+        consumeFee = consumeTime * this.hourMoney;
+      }
+
+      /*************************************************** 沈阳 ***************************************************/
+      if (this.parkMallCode === 4) {
+        // 超过上限取上限
+        if (
+          consumeTime >
+          this.parkFee.parkInfoEntity.maxOneDayHour -
+            this.parkFee.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour
+        ) {
+          consumeTime =
+            this.parkFee.parkInfoEntity.maxOneDayHour -
+            this.parkFee.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour;
+        }
+        // 消费减免费用
+        consumeFee = consumeTime * this.hourMoney;
+      }
+
+      // 实时显示
+      this.checkedTotal++;
+      this.discountTotal = {
+        memberGradeFee: 0,
+        consumeFee: consumeFee,
+        useConsumeFee:
+          this.parkFee.parkConsumeReducesEntityList[0].consumerLimit,
+        time: consumeTime,
+        fee: consumeFee,
+      };
+
+      // 存入缓存(用于子页面停车优惠画面显示)
+      uni.setStorageSync('checkedList', ['reduces']);
+      uni.setStorageSync('checkedTotal', this.checkedTotal);
+      uni.setStorageSync('discountTotal', this.discountTotal);
+    },
+
+    // 自动选取会员等级减免
+    autoMember() {
+      // 支付金额0 则无需后续减免
+      if (!this.actualFee) {
+        return;
+      }
+
+      const memberGradeTime =
+        +this.parkFee.parkMemberOrderReducesEntityList[0].reduceContent || 0; // 会员等级减免时长
+      const memberGradeFee = memberGradeTime * this.hourMoney; // 会员等级减免费用
+
+      // 浦东每次超限
+      if (this.parkMallCode === 1) {
+        // 超出每次减免上限 则无需后续
+        if (this.discountTotalFee >= this.maxonetimediscountFee) {
+          return;
+        }
+      }
+
+      // 沈阳(会员等级+消费+电子券)、深圳每日超限
+      if (this.parkMallCode === 4 || this.parkMallCode === 5) {
+        // 超出每日减免上限 则无需后续
+        if (this.discountTotalFee >= this.maxonedaydiscountFee) {
+          return;
+        }
+      }
+
+      // 实时显示
+      let checkedList = [];
+      if (uni.getStorageSync('discountTotal')) {
+        this.discountTotal.memberGradeFee = memberGradeFee;
+        this.discountTotal.time += memberGradeTime;
+        this.discountTotal.fee += memberGradeFee;
+        checkedList = ['reduces', 'member'];
+      } else {
+        this.discountTotal = {
+          memberGradeFee: memberGradeFee,
+          consumeFee: 0,
+          useConsumeFee: 0,
+          time: memberGradeTime,
+          fee: memberGradeFee,
+        };
+        checkedList = ['member'];
+      }
+      this.checkedTotal++;
+
+      // 存入缓存(用于子页面停车优惠画面显示)
+      uni.setStorageSync('checkedList', checkedList);
+      uni.setStorageSync('checkedTotal', this.checkedTotal);
+      uni.setStorageSync('discountTotal', this.discountTotal);
+    },
+
+    // 自动选取电子券减免
+    autoCoupon(serviceFee) {
+      // 支付金额0 则无需后续减免
+      if (!this.actualFee) {
+        return;
+      }
+
+      // 浦东 超出每次减免上限 则无需后续
+      if (
+        this.parkMallCode === 1 &&
+        this.discountTotalFee >= this.maxonetimediscountFee
+      ) {
+        return;
+      }
+
+      // 沈阳(会员等级+消费+电子券)、深圳 超出每日减免上限 则无需后续
+      if (
+        (this.parkMallCode === 4 || this.parkMallCode === 5) &&
+        this.discountTotalFee >= this.maxonedaydiscountFee
+      ) {
+        return;
+      }
+
+      // 杭州 超出电子券使用数量上限 则无需后续
+      if (
+        this.parkMallCode === 2 &&
+        this.parkFee.parkInfoEntity.useTicketNum ===
+          this.parkFee.parkInfoEntity.couponcodeNum
+      ) {
+        return;
+      }
+
+      const checkedCouponList = []; // 所选电子券
+      let couponList = this.parkFee.memberTicketList; // 所有电子券
+      let couponFee = 0;
+      let couponCode = '';
+
+      // 电子券价值统一转换金额方便后续排序 type 1: 金额 2: 时长
+      couponList.forEach((e) => {
+        e.disabled = true;
+        e.checked = false;
+        if (e.carType == '2') {
+          e.value = e.parktime * this.hourMoney;
+        } else if (e.carType == '1') {
+          e.value = e.ticketValue;
+        }
+      });
+
+      // 电子券按叠加规则分组
+      const couponListRule1 = couponList.filter(
+        (e) => e.superpositionrule == '1'
+      ); // 不可叠加
+      const couponListRule2 = couponList.filter(
+        (e) => e.superpositionrule == '2'
+      ); // 同类型可叠加
+
+      // 电子券按价值排序
+      if (couponListRule1 && couponListRule1.length > 1) {
+        couponListRule1.sort(compare('value'));
+      }
+      if (couponListRule2 && couponListRule2.length > 1) {
+        couponListRule2.sort(compare('value'));
+      }
+
+      // 排序后的全部电子券
+      couponList = [...couponListRule1, ...couponListRule2];
+
+      // 如果不可叠加电子券价值大于可叠加总和则使用不可叠加电子券
+      let couponListRule1Max = 0;
+      if (couponListRule1 && couponListRule1.length) {
+        couponListRule1Max = couponListRule1[couponListRule1.length - 1].value;
+      }
+      let couponListRule2Sum = 0;
+      if (couponListRule2 && couponListRule2.length) {
+        couponListRule2.forEach((e) => {
+          couponListRule2Sum += e.value;
+        });
+      }
+      let isCheckedRule1 = false;
+      if (
+        couponListRule1Max >= couponListRule2Sum &&
+        couponListRule2Sum < serviceFee - this.discountTotalFee
+      ) {
+        isCheckedRule1 = true;
+      }
+
+      // 使用不可叠加电子券
+      if (isCheckedRule1 && couponListRule1 && couponListRule1.length) {
+        for (let i = 0; i < couponListRule1.length; i++) {
+          const coupon = couponListRule1[i];
+          const checkedIndex = couponList.findIndex(
+            (e) => e.couponCode === coupon.couponCode
+          );
+
+          // 浦东每次上限处理
+          if (this.parkMallCode === 1) {
+            if (
+              this.discountTotalFee + coupon.value >
+              this.maxonetimediscountFee
+            ) {
+              couponList[checkedIndex - 1].checked = true;
+              couponList[checkedIndex - 1].disabled = false;
+              checkedCouponList.push(checkedIndex - 1);
+              couponFee += coupon.value;
+              couponCode += coupon.couponCode + '#';
+              break;
+            }
+          }
+
+          // 沈阳(会员等级+消费+电子券)、深圳 超出每日减免上限处理
+          if (this.parkMallCode === 4 || this.parkMallCode === 5) {
+            if (
+              this.discountTotalFee + coupon.value >
+              this.maxonedaydiscountFee
+            ) {
+              couponList[checkedIndex - 1].checked = true;
+              couponList[checkedIndex - 1].disabled = false;
+              checkedCouponList.push(checkedIndex - 1);
+              couponFee += coupon.value;
+              couponCode += coupon.couponCode + '#';
+              break;
+            }
+          }
+
+          // 若当前减免已经使费用减免为0则跳出循环
+          if (coupon.value >= serviceFee - this.discountTotalFee) {
+            couponList[checkedIndex].checked = true;
+            couponList[checkedIndex].disabled = false;
+            checkedCouponList.push(checkedIndex);
+            couponFee += coupon.value;
+            couponCode += coupon.couponCode + '#';
+            break;
+          }
+
+          // 循环到最后一张券
+          if (i === couponListRule1.length - 1) {
+            couponList[checkedIndex].checked = true;
+            couponList[checkedIndex].disabled = false;
+            checkedCouponList.push(checkedIndex);
+            couponFee += coupon.value;
+            couponCode += coupon.couponCode + '#';
+          }
+        }
+      }
+
+      // 未使用规则1的电子券则继续
+      if (!isCheckedRule1 && couponListRule2 && couponListRule2.length) {
+        // 使用同类型可叠加电子券
+        let sum = 0; // 电子券价值累加
+        for (const coupon of couponListRule2) {
+          sum += coupon.value;
+          // 浦东每次上限处理
+          if (
+            this.parkMallCode === 1 &&
+            this.discountTotalFee + sum > this.maxonetimediscountFee
+          ) {
+            break;
+          }
+          // 沈阳(会员等级+消费+电子券)、深圳每日上限处理
+          if (
+            (this.parkMallCode === 4 || this.parkMallCode === 5) &&
+            this.discountTotalFee + sum > this.maxonedaydiscountFee
+          ) {
+            break;
+          }
+          const checkedIndex = couponList.findIndex(
+            (e) => e.couponCode === coupon.couponCode
+          );
+          couponList[checkedIndex].checked = true;
+          couponList[checkedIndex].disabled = false;
+          checkedCouponList.push(checkedIndex);
+          couponFee = sum;
+          couponCode += coupon.couponCode + '#';
+
+          // 杭州电子券使用数量上限处理
+          if (
+            this.parkMallCode === 2 &&
+            checkedCouponList.length ===
+              this.parkFee.parkInfoEntity.useTicketNum -
+                this.parkFee.parkInfoEntity.couponcodeNum
+          ) {
+            break;
+          }
+
+          // 若当前减免已经使费用减免为0则跳出循环
+          if (sum >= serviceFee - this.discountTotalFee) {
+            break;
+          }
+        }
+      }
+
+      // 实时显示
+      if (couponCode.lastIndexOf('#') === couponCode.length - 1) {
+        couponCode = couponCode.slice(0, couponCode.length - 1);
+      }
+      this.couponInfo = {
+        couponfee: couponFee,
+        couponcode: couponCode,
+      };
+      this.checkedCouponCount = checkedCouponList.length;
+
+      // 存入缓存(用于子页面停车优惠画面显示)
+      uni.setStorageSync('checkedCouponList', checkedCouponList);
+      uni.setStorageSync('list', couponList);
+      uni.setStorageSync('couponInfo', this.couponInfo);
+    },
+
+    // 自动选取积分减免
+    autoBonus(serviceFee) {
+      // 支付金额0 则无需后续减免
+      if (!this.actualFee) {
+        return;
+      }
+
+      // 浦东 超出每次减免上限 则无需后续
+      if (
+        this.parkMallCode === 1 &&
+        this.discountTotalFee >= this.maxonetimediscountFee
+      ) {
+        return;
+      }
+
+      // 深圳积分特殊处理(金额计算) 其它停车场小时计算
+      if (this.parkMallCode === 5) {
+        if (this.discountTotalFee >= this.maxonedaydiscountFee) {
+          return;
+        }
+        let bonus = this.bonus;
+        // 剩余可减免金额
+        const remainDiscountFee =
+          this.maxonedaydiscountFee - this.discountTotalFee;
+        // 剩余停车金额
+        let remainFee = serviceFee - this.discountTotalFee;
+        if (remainFee > remainDiscountFee) {
+          remainFee = remainDiscountFee;
+        }
+        let bonusAll = (remainFee * this.integral) / this.integralToValue; // 全部减免所需积分
+        if (bonusAll < this.integral) {
+          bonusAll = this.integral;
+        }
+        // 取余
+        const remainBonus = bonusAll % this.integral;
+        const remainMyBonus = this.bonus % this.integral;
+        // 如果有余数 做倍数处理
+        if (remainBonus) {
+          bonusAll = bonusAll - remainBonus + this.integral;
+        }
+        if (remainMyBonus) {
+          bonus = this.bonus - remainMyBonus;
+        }
+        if (bonus <= bonusAll) {
+          // 积分可兑换多少金额 小数向下取整
+          this.duration = Math.floor(
+            (bonus * this.integralToValue) / this.integral
+          );
+        } else {
+          this.duration = (bonusAll * this.integralToValue) / this.integral;
+        }
+        if (this.duration > this.integralMaxMoney) {
+          this.duration = this.integralMaxMoney;
+        }
+      } else {
+        // 剩余停车时长(有小数情况因此向上取整)
+        const serviceTime = Math.ceil(
+          (serviceFee - this.discountTotalFee) / this.hourMoney
+        );
+        // if (this.parkFee.discountKind === 6) {
+        //   const newMemberBonusAll = serviceTime * this.integralNew; // 全部新会员积分减免所需积分
+        //   if (this.bonus <= newMemberBonusAll) {
+        //     // 积分不够兑换整小时 向下取整
+        //     this.durationNew = Math.floor(this.bonus / this.integralNew);
+        //   }
+        // }
+        const bonusAll = serviceTime * this.integral; // 全部减免所需积分
+        // console.log('this.bonusAll::::::::::', this.bonusAll, this.bonus)
+        if (this.bonus <= bonusAll) {
+          // 积分不够兑换整小时 向下取整
+          // console.log('1111111this.duration::::::::::', this.duration,)
+          this.duration = Math.floor(this.bonus / this.integral);
+          // console.log('this.duration::::::::::', this.duration, )
+        } else {
+          this.duration = serviceTime;
+        }
+      }
+
+      // 浦东每次减免上限处理
+      if (this.parkMallCode === 1) {
+        const bonusMax = Math.floor(
+          (this.maxonetimediscountFee - this.discountTotalFee) / this.hourMoney
+        );
+        if (this.duration > bonusMax) {
+          this.duration = bonusMax;
+        }
+      }
+      // 北京积分减免每日上限处理
+      if (this.parkMallCode === 3) {
+        const bonusMax =
+          this.parkFee.parkInfoEntity.integralMaxHour -
+            this.parkFee.parkInfoEntity.integralUseHour || 0;
+        if (this.duration > bonusMax) {
+          this.duration = bonusMax;
+          // console.log('this.duration::', this.duration)
+        }
+      }
+
+      // 深圳特殊处理(单位:金额)
+      if (this.parkMallCode === 5) {
+        this.bonus -= (this.duration * this.integral) / this.integralToValue;
+        this.bonusfee = this.duration;
+      } else {
+        this.bonus -= this.duration * this.integral;
+
+        this.bonusfee = this.duration * this.hourMoney;
+      }
+      this.durationCopy = this.duration;
+      this.bonusCopy = this.bonus;
+    },
+    //北京新会员自动选取积分减免
+    newMemberautoBonus(serviceFee) {
+      const serviceTime = Math.ceil(
+        (serviceFee - this.discountTotalFee) / this.hourMoney
+      );
+      const bonusAll = serviceTime * this.integralNew; // 全部减免所需积分
+      if (this.bonus <= bonusAll) {
+        // 积分不够兑换整小时 向下取整
+        this.durationNew = Math.floor(this.bonus / this.integralNew);
+      } else {
+        this.durationNew = serviceTime;
+      }
+
+      const bonusMaxNew =
+        this.parkFee.parkIntegraltomoneyList[1].integralMaxHour -
+          this.parkFee.parkIntegraltomoneyList[1].integralUseHour || 0;
+      if (this.durationNew > bonusMaxNew) {
+        this.durationNew = bonusMaxNew;
+      }
+
+      this.bonus -= this.integralNew * this.durationNew;
+      this.durationCopy2 = this.durationNew;
+      this.newBonusfee = this.durationNew * this.hourMoney;
+      this.bonusCopy = this.bonus;
+    },
+    // 节流函数
+    throttle(fc, waitTime = 1500, imme = true) {
+      if (imme) {
+        if (!this.flag) {
+          this.flag = true;
+          typeof fc === 'function' && fc();
+          this.timer = setTimeout(() => {
+            this.flag = false;
+          }, waitTime);
+        }
+      } else {
+        if (!this.flag) {
+          this.flag = true;
+          this.timer = setTimeout(() => {
+            this.flag = false;
+            typeof fc === 'function' && fc();
+          }, waitTime);
+        }
+      }
+    },
+
+    // 支付前
+    toPay() {
+      this.throttle(() => {
+        // 北京特殊处理
+        if (this.parkMallCode === 3 && this.discountTotalFee) {
+          return uni.showModal({
+            title: '提示',
+            content: '请确认是否使用优惠,确认后无法返还!',
+            success: (res) => {
+              if (res.confirm) {
+                this.goPay();
+              }
+            },
+          });
+        }
+        this.goPay();
+      }, 3000);
+    },
+
+    // 支付
+    goPay() {
+      if (
+        !this.parkInfo.servicefee ||
+        (app.globalData.member && !this.parkFee.parkInfoEntity)
+      ) {
+        return;
+      }
+      uni.showLoading({
+        title: '加载中',
+      });
+      let bonus = this.duration * this.integral;
+      let newMemberBonus = this.durationNew * this.integralNew;
+      // 深圳特殊处理(单位:金额)
+      if (this.parkMallCode === 5) {
+        bonus = (this.duration * this.integral) / this.integralToValue;
+      }
+
+      const openId = MemberCacheTool.getOpenId(app);
+      // 埋点-点击 提交支付
+      // console.log(this.parkingTrack, '数据埋点')
+
+      const params = {
+        carno: this.parkInfo.carno,
+        mallid: app.globalData.mallid,
+        groupId: app.globalData.groupId,
+        openId: openId,
+        vipcode:
+          app.globalData.member?.vipcode ||
+          uni.getStorageSync('member')?.vipcode,
+        createuser: 'sys_miniprogram',
+        orderno: this.parkInfo.orderno,
+        bonusfee: this.bonusfee * 100,
+        newMemeberBonusFee: this.newBonusfee * 100 || 0,
+        bonus: bonus,
+        couponfee: this.couponInfo.couponfee * 100 || 0,
+        couponfeeMin: (this.couponInfo.couponfee / this.hourMoney) * 60 || 0,
+        couponcode: this.couponInfo.couponcode,
+        paperCoupons: JSON.stringify(this.paperCouponInfo.paperCouponList), // 纸质优惠券券码 多个以#分割
+        paperCouponCode: this.paperCouponInfo.paperCouponcode, // 纸质优惠券券码 多个以#分割
+        paperCouponFee: this.paperCouponInfo.paperDiscountFee * 100 || 0, // 纸质优惠券优惠金额,单位:分
+        paperCouponFeeMin:
+          parseInt(this.paperCouponInfo.paperDiscountTime * 60) || 0, // 纸质优惠券优惠时长,单位:分钟
+        bonusFeeMin: this.duration * 60, // 积分抵扣时长,单位:分钟
+        newMemberBonusMin: this.durationNew * 60, // 新会员积分抵扣时间, 单位:分钟
+        consumeFeeMin:
+          (this.discountTotal.consumeFee / this.hourMoney) * 60 || 0, // 消费减免时长,单位:分钟
+        firstParkFeeMin:
+          (this.discountTotal.firstParkFee / this.hourMoney) * 60 || 0, // 首停减免时长 单位 分钟
+        memberGradeFeeMin:
+          (this.discountTotal.memberGradeFee / this.hourMoney) * 60 || 0, // 会员等级减免时长,单位:分钟
+        consumeFee: this.discountTotal.consumeFee * 100 || 0,
+        consumeFeeHour: this.discountTotal.consumeFee / this.hourMoney || 0,
+        useConsumeFee:
+          this.parkMallCode === 3 ? '0.0' : this.discountTotal.useConsumeFee,
+        memberGradeFee: this.discountTotal.memberGradeFee * 100 || 0,
+        memberGradeFeeHour:
+          this.discountTotal.memberGradeFee / this.hourMoney || 0,
+        firstParkFee: this.discountTotal.firstParkFee * 100 || 0,
+        usetotalfee:
+          ((this.discountTotal.memberGradeFee || 0) +
+            (this.discountTotal.consumeFee || 0) +
+            this.bonusfee +
+            (this.newBonusfee || 0) +
+            (this.couponInfo.couponfee || 0) +
+            (this.paperCouponInfo.paperDiscountFee || 0)) *
+          100,
+        payfee: parseFloat((this.actualFee * 100).toFixed(2)),
+        // payfee: 1,
+        totalfee:
+          this.discountTotalFee * 100 < this.parkInfo.servicefee
+            ? this.discountTotalFee * 100
+            : this.parkInfo.servicefee,
+        paytype: this.actualFee > 0 ? 3 : 1,
+        projectId: app.globalData.curMarket.projectId,
+        newMemberBonus: newMemberBonus,
+      };
+      // 北京新会员积分兑换
+      // if (this.parkMallCode === 3 || this.discountKind === 6) {
+      //   console.log('params.newMemberBonus::::::', params.newMemberBonus)
+      //   params.newMemberBonus = this.newBonusfee * 100
+      // }
+      let url =
+        this.actualFee > 0
+          ? 'api/1.0/park/weixinPay'
+          : 'api/1.0/park/notWeixinPay';
+      // 北京特殊处理
+      if (this.parkMallCode === 3) {
+        url = 'api/1.0/park/dealParkOrderBj';
+      }
+      this.$md(params);
+      this.$request({
+        url: this.$baseURL + url,
+        // url: 'http://172.21.202.252:8083/xcrm-api/' + url,
+
+        data: params,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+      })
+        .then((res) => {
+          uni.hideLoading();
+          if (res.data.code === 0) {
+            this.parkingTrack.track(100, {
+              order_id: this.parkInfo.orderno,
+              plate_type: 1,
+              plate_num: this.parkInfo.carno,
+              area: this.parkInfo.parkname,
+              parking_duration: this.parkInfo.servicehour * 3600,
+              start_time: this.parkInfo.createDate,
+              total_amount: (this.parkInfo.servicefee / 100).toFixed(2),
+              pay_amount: this.actualFee,
+              // total_point: this.parkInfo.parkname,
+              pay_point: this.integral * this.duration,
+              coupon_type: this.parkInfo.paykind || '',
+              coupon_id: this.parkInfo.couponcode || '',
+              // coupon_name: this.parkInfo.parkname,
+              coupon_value: this.parkInfo.bonusfee || 0,
+              pay_type: this.parkInfo.paytype || '',
+              pay_time: this.parkInfo.createDate || '',
+            });
+            uni.setStorageSync('actualFee', this.actualFee);
+            uni.setStorageSync('bonus', this.bonusfee);
+            // 北京特殊处理
+            if (this.parkMallCode === 3) {
+              if (!res.data.data.syncId) {
+                uni.showToast({
+                  title: '缴费成功',
+                  icon: 'none',
+                });
+                uni.navigateBack();
+                return;
+              }
+              // console.log(this.bindflag, 'bindflag')
+              // const accountInfo = uni.getAccountInfoSync();
+              //                 const { miniProgram: { envVersion }} = accountInfo;
+
+              // 				if (this.bindflag === 0) {
+              // 					uni.navigateToMiniProgram({
+              // 					  appId: this.$etcpAppId,
+              // 					  path: this.$etcpAppPath,
+              // 					  extraData: {
+              // 					    params : {
+              // 					      token: res.data.data.token,
+              // 					      syncId: res.data.data.syncId,
+              // 					      payType: 6,
+              // 					      CarNumber: res.data.data.CarNumber,
+              // 					      actionId: 1,
+              // 						  payAcType: 2
+              // 					    }
+              // 					  },
+              // 					  envVersion: 'release',
+              // 					  success: res => {
+              // 					    console.log(res);
+              // 					    uni.navigateBack();
+              // 					  }
+              // 					});
+              // 				} else if (this.bindflag === 1) {
+              // 					uni.navigateToMiniProgram({
+              // 					  appId: this.$etcpAppId,
+              // 					  path: this.$etcpAppPath,
+              // 					  extraData: {
+              // 					    params : {
+              // 					      token: res.data.data.token,
+              // 					      syncId: res.data.data.syncId,
+              // 					      payType: 6,
+              // 					      CarNumber: res.data.data.CarNumber,
+              // 					      actionId: 1
+              // 					    }
+              // 					  },
+              // 					  envVersion: 'release',
+              // 					  success: res => {
+              // 					    console.log(res);
+              // 					    uni.navigateBack();
+              // 					  }
+              // 					});
+              // 				}
+              if (this.bindflag === 0) {
+                uni.navigateToMiniProgram({
+                  appId: this.$etcpAppId,
+                  path: this.$etcpAppPath,
+                  extraData: {
+                    params: {
+                      token: res.data.data.token,
+                      syncId: res.data.data.syncId,
+                      payType: 6,
+                      CarNumber: res.data.data.CarNumber,
+                      actionId: 1,
+                      payAcType: 2,
+                    },
+                  },
+                  // envVersion: 'trial',
+                  envVersion: this.$etcpEnv_Version,
+                  success: (res) => {
+                    console.log(res);
+                    uni.navigateBack();
+                  },
+                });
+              } else if (this.bindflag === 1) {
+                uni.navigateToMiniProgram({
+                  appId: this.$etcpAppId,
+                  path: this.$etcpAppPath,
+                  extraData: {
+                    params: {
+                      token: res.data.data.token,
+                      syncId: res.data.data.syncId,
+                      payType: 6,
+                      CarNumber: res.data.data.CarNumber,
+                      actionId: 1,
+                    },
+                  },
+                  // envVersion: 'trial',
+                  envVersion: this.$etcpEnv_Version,
+                  success: (res) => {
+                    uni.navigateBack();
+                  },
+                });
+              }
+
+              return;
+            }
+            if (this.actualFee > 0) {
+              this.kerryPayment(res.data.data, params);
+            } else {
+              uni.redirectTo({
+                url: './parkingFeeSuccess?carno=' + this.parkInfo.carno,
+              });
+            }
+          } else {
+            uni.showModal({
+              showCancel: false,
+              title: '提示',
+              content: res.data.msg,
+              complete: (r) => {
+                // uni.navigateBack({})
+                this.createParkOrder();
+              },
+            });
+          }
+        })
+        .catch((err) => {
+          console.log(err);
+          uni.hideLoading();
+          uni.showToast({
+            title: JSON.stringify(err),
+            icon: 'none',
+          });
+        });
+    },
+    // 嘉里第三方支付接口
+    kerryPayment(session, payParams) {
+      const openId = MemberCacheTool.getOpenId(app);
+      const appId = uni.getAccountInfoSync().miniProgram.appId;
+      const params = {
+        region: 'cn',
+        payChannel: 'MINI_PROGRAM',
+        payOption: 'WECHATPAY',
+        appId: appId,
+        openId: openId,
+      };
+      this.$md(params);
+      let url =
+        this.$kipPaymentUrl + '/services/session/' + session + '/transactions';
+      this.$request({
+        url: url,
+        data: params,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+      })
+        .then((res) => {
+          if (res.data?.code == '000000') {
+            const prepayJson = res.data.data.params;
+            // 微信支付接口
+            uni.requestPayment({
+              provider: 'wxpay',
+              timeStamp: prepayJson.timeStamp,
+              nonceStr: prepayJson.nonceStr,
+              package: prepayJson.package,
+              signType: prepayJson.signType,
+              paySign: prepayJson.paySign,
+              success: () => {
+                uni.showModal({
+                  showCancel: false,
+                  title: '提示',
+                  content: '支付成功',
+                  complete: () => {
+                    uni.redirectTo({
+                      url: './parkingFeeSuccess?carno=' + this.parkInfo.carno,
+                    });
+                  },
+                });
+              },
+              fail: () => {
+                this.failedParkOrder();
+              },
+            });
+          } else {
+            this.failedParkOrder();
+          }
+        })
+        .catch((err) => {
+          console.log(err);
+          this.failedParkOrder();
+        });
+    },
+
+    // 支付失败弹框 重新创建订单
+    reCreateParkOrder() {
+      uni.showModal({
+        showCancel: false,
+        title: '提示',
+        content: '支付失败',
+        complete: (r) => {
+          this.createParkOrder();
+        },
+      });
+    },
+
+    // 支付失败后返还优惠券
+    failedParkOrder() {
+      const param = {
+        orderno: this.parkInfo.orderno,
+      };
+      this.$md(param);
+      this.$request({
+        url: this.$baseURL + 'api/1.0/park/failedParkOrder',
+        data: param,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+      })
+        .then((res) => {
+          this.reCreateParkOrder();
+        })
+        .catch((err) => {
+          this.reCreateParkOrder();
+        });
+    },
+
+    //缴费说明隐藏显示
+    togglePayinstruction() {
+      this.isShow = !this.isShow;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  padding-bottom: 20rpx;
+}
+
+.wrap {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+
+  .parkingFee {
+    display: flex;
+    flex-direction: column;
+
+    .parkingFee-top {
+      display: flex;
+      flex-direction: column;
+      background: #c69c6d;
+
+      .top_content {
+        padding: 35rpx;
+        box-sizing: border-box;
+        display: flex;
+        flex-direction: column;
+
+        text {
+          font-size: 24rpx;
+          color: #fff;
+          text-align: left;
+        }
+
+        .title_box {
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          margin-bottom: 30rpx;
+
+          .btn {
+            padding: 8rpx 14rpx;
+            box-sizing: border-box;
+            color: #c69c6d;
+            background: #fff;
+            border-radius: 20rpx;
+            text-align: center;
+          }
+        }
+      }
+
+      .top_menu {
+        background: #fff;
+        padding: 30rpx 0;
+        box-sizing: border-box;
+        display: flex;
+        justify-content: space-between;
+        border-radius: 15rpx 15rpx 0 0;
+
+        .menu_item {
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          width: 33.3%;
+
+          image {
+            width: 102rpx;
+            height: 102rpx;
+          }
+
+          text {
+            font-size: 24rpx;
+            margin-top: 24rpx;
+          }
+        }
+      }
+    }
+
+    .parkingFee-bottom {
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      padding: 14rpx 25rpx;
+      box-sizing: border-box;
+
+      // 车牌号查询
+      .parkingFee-search {
+        width: 100%;
+        display: flex;
+        flex-direction: column;
+        background: #fff;
+        border-radius: 24rpx;
+        padding: 26rpx 25rpx 20rpx;
+        box-sizing: border-box;
+
+        .search_tip {
+          color: #999;
+          font-size: 24rpx;
+          text-align: center;
+        }
+
+        .searchPrice {
+          margin: 0 auto;
+          width: 40%;
+          height: 60rpx;
+          line-height: 60rpx;
+          border-radius: 20rpx;
+        }
+      }
+
+      .search-list {
+        display: flex;
+        flex-direction: column;
+        background: #fff;
+        padding: 0 30rpx;
+        box-sizing: border-box;
+        margin-top: 20rpx;
+        border-radius: 24rpx;
+        width: 100%;
+
+        .list_item {
+          padding: 38rpx 0;
+          box-sizing: border-box;
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          border-bottom: 1px solid #f2f2f2;
+
+          text {
+            font-size: 28rpx;
+          }
+
+          button {
+            height: 60rpx;
+            line-height: 60rpx;
+            margin: 0;
+          }
+        }
+      }
+    }
+  }
+}
+
+// 缴费说明
+.payInstruct_wrap {
+  width: 300px;
+  margin: 0 auto;
+  display: flex;
+  flex-direction: column;
+  background: #fff;
+  border-radius: 20rpx;
+
+  .scroll {
+    height: 600rpx;
+    display: flex;
+    flex-direction: column;
+    padding: 20rpx;
+    box-sizing: border-box;
+
+    .payInstruct_title {
+      font-size: 30rpx;
+      text-align: center;
+      padding: 20rpx 0;
+      box-sizing: border-box;
+      border-bottom: 1px solid #f2f2f2;
+    }
+
+    .payInstruct_con {
+      display: flex;
+      width: 100%;
+      padding: 20rpx 10rpx;
+      box-sizing: border-box;
+
+      text {
+        font-size: 28rpx;
+        color: #999;
+      }
+    }
+  }
+}
+
+// 车牌号 & 虚拟键盘
+.input-box {
+  width: 100%;
+  height: 70rpx;
+  margin: auto;
+  background: rgba(255, 255, 255, 1);
+  box-shadow: 0px 6px 8px 0px rgba(96, 100, 112, 0.1);
+  border-radius: 0.4rem;
+  margin: 1rem auto;
+  display: flex;
+  justify-content: center;
+
+  .li {
+    flex: 1;
+    border: 1px solid rgba(206, 208, 210, 1);
+    box-sizing: border-box;
+    margin: 0 2px;
+    font-size: 30rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: #323233;
+
+    image {
+      width: 80%;
+      height: 100%;
+    }
+
+    &.active {
+      border-color: #3e67ff;
+    }
+
+    &:nth-child(2) {
+      margin-right: 26rpx;
+    }
+  }
+}
+
+.class-van-button-small {
+  min-width: 0;
+  border-radius: 10rpx;
+  margin: 10rpx 3rpx;
+  box-shadow: 10rpx 10rpx 10rpx #aaa;
+}
+
+.class-plate-box {
+  width: 100%;
+  padding: 24rpx 0;
+  box-sizing: border-box;
+  position: relative;
+}
+
+.plate_number {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+
+  .plate_number_wrap {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    background: #eaf1f9;
+    padding: 0 0 10rpx;
+    box-sizing: border-box;
+
+    .close-box {
+      width: 100%;
+      font-size: 24rpx;
+      color: #3e67ff;
+      text-align: right;
+      margin-right: 1.25rem;
+
+      view {
+        padding: 10px;
+      }
+    }
+
+    .plate_chinese_box {
+      width: 100%;
+      display: flex;
+      flex-wrap: wrap;
+      justify-content: center;
+
+      button {
+        width: 9%;
+        height: 2.5rem;
+        line-height: 2.5rem;
+        text-align: center;
+        padding: 0;
+        font-size: 28rpx;
+        .class-van-button-small;
+      }
+    }
+  }
+}
+
+.allBoard {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+
+  .allBoard_wrap {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    background: #eaf1f9;
+    padding: 0 0 10rpx;
+    box-sizing: border-box;
+  }
+
+  .close-box {
+    padding-top: 22rpx;
+    box-sizing: border-box;
+    font-size: 24rpx;
+    color: #3e67ff;
+    text-align: right;
+    margin-right: 1.25rem;
+  }
+
+  .plate_number_box {
+    width: 100%;
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+
+    button {
+      width: 9%;
+      height: 2.5rem;
+      line-height: 2.5rem;
+      text-align: center;
+      padding: 0;
+      font-size: 28rpx;
+      .class-van-button-small;
+    }
+  }
+}
+
+.vehicleMgt-list {
+  display: flex;
+  flex-direction: column;
+  margin-bottom: 35rpx;
+
+  .vehicleMgt-title {
+    display: flex;
+    padding: 30rpx;
+    box-sizing: border-box;
+    border-bottom: 1px solid #f2f2f2;
+
+    text {
+      font-size: 28rpx;
+    }
+  }
+
+  .vehicleMgt-content {
+    display: flex;
+    flex-direction: column;
+    background: #fff;
+
+    .item {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 15rpx 36rpx;
+      box-sizing: border-box;
+      border-bottom: 1px solid #f2f2f2;
+
+      text {
+        font-size: 28rpx;
+      }
+    }
+  }
+}
+
+.delBtn {
+  color: #c69c6d;
+  height: 38rpx;
+  line-height: 38rpx;
+  font-size: 20rpx;
+  width: 124rpx;
+  border: 1px solid #c69c6d;
+  border-radius: 19rpx;
+  text-align: center;
+}
+
+.payThe {
+  width: 100%;
+
+  .pay_index {
+    text-align: center;
+    padding: 20rpx 0;
+    font-size: 20px;
+    margin-bottom: 5px;
+    background-color: #fff;
+    font-weight: 600;
+  }
+
+  .pay_title {
+    display: flex;
+    justify-content: space-between;
+    background-color: #fff;
+    border-bottom: 1px solid #eee;
+    padding: 15px 30rpx;
+    .title {
+      font-size: 16px;
+    }
+    .dk_desc {
+      font-size: 12px;
+      color: #999;
+      margin-top: 3px;
+    }
+    .value {
+      font-size: 14px;
+      color: #999;
+    }
+  }
+
+  .payjf {
+    font-size: 12px;
+    color: #999;
+    margin-right: 18rpx;
+    margin-top: 12px;
+  }
+
+  .paySelect {
+    color: rgba(16, 16, 16, 100);
+    font-size: 20rpx;
+    font-family: Arial;
+    border: 1px solid rgba(187, 187, 187, 100);
+    border-radius: 10rpx;
+    margin-left: 80rpx;
+    width: 260rpx;
+    height: 80rpx;
+  }
+
+  .paySelect1 {
+    color: rgba(16, 16, 16, 100);
+    font-size: 20rpx;
+    font-family: Arial;
+    border: 1px solid rgba(187, 187, 187, 100);
+    width: 200rpx;
+    height: 50rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    background-color: #f2f2f2;
+    margin-top: 5px;
+
+    .pay-se-l {
+      height: 50rpx;
+      width: 50rpx;
+      line-height: 50rpx;
+      text-align: center;
+      font-size: 50rpx;
+      background-color: #fff;
+    }
+  }
+
+  .payjfzk {
+    font-size: 20rpx;
+    color: #8b8c8b;
+    margin-top: 10rpx;
+    margin-left: 210rpx;
+  }
+
+  .pay_time {
+    font-size: 28rpx;
+    margin-left: 180rpx;
+    padding-bottom: 40rpx;
+  }
+
+  .pay_time1 {
+    margin-top: 26rpx;
+  }
+}
+
+.pay_jiaof {
+  width: 80%;
+  height: 70rpx;
+  line-height: 70rpx;
+  background-color: #c69c6d;
+  text-align: center;
+  color: rgba(255, 255, 255, 100);
+  font-size: 28rpx;
+  font-family: Microsoft Yahei;
+  border-radius: 10rpx;
+  margin: 20rpx auto;
+}
+
+// 停车券弹窗
+.ticketPopup {
+  display: flex;
+  flex-direction: column;
+  background: #fff;
+  border-radius: 20rpx 20rpx 0 0;
+  z-index: 999;
+
+  .popup-title {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    padding: 30rpx 42rpx;
+    box-sizing: border-box;
+    border-bottom: 1px solid #f2f2f2;
+    position: relative;
+
+    text {
+      color: #999;
+      font-size: 28rpx;
+    }
+
+    .useRule-text {
+      position: absolute;
+      right: 42rpx;
+      color: rgb(58, 130, 248);
+    }
+  }
+
+  .popup_scroll {
+    height: 70vh;
+    background: #f2f2f2;
+  }
+
+  .popup_content {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    padding: 10rpx 20rpx;
+    box-sizing: border-box;
+
+    .item {
+      display: flex;
+      margin-bottom: 16rpx;
+
+      .item-image {
+        border: 2rpx solid #f2f2f2;
+        border-right: 2rpx dashed #f2f2f2;
+        padding: 16rpx;
+        border-radius: 16rpx 0 0 16rpx;
+        box-sizing: border-box;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        background: #fff;
+
+        &.cro {
+          position: relative;
+        }
+
+        .img {
+          width: 130rpx;
+          height: 130rpx;
+          border-radius: 8rpx;
+
+          image {
+            width: 100%;
+            height: 100%;
+          }
+        }
+      }
+
+      .item-content {
+        flex: 1;
+        border: 2rpx solid #f2f2f2;
+        border-radius: 0 8rpx 8rpx 0;
+        padding: 16rpx;
+        box-sizing: border-box;
+        background: #fff;
+        display: flex;
+        position: relative;
+
+        &.cro_ {
+          position: relative;
+        }
+
+        .content {
+          display: flex;
+          flex-direction: column;
+          justify-content: center;
+          flex: 1;
+
+          .h3 {
+            font-size: 28rpx;
+            line-height: 48rpx;
+            font-weight: 600;
+          }
+          .h3.color_disabled {
+            color: #838181;
+            font-weight: 400;
+          }
+
+          .span {
+            font-size: 24rpx;
+            color: #838181;
+            line-height: 40rpx;
+          }
+        }
+
+        .erwm_box {
+          display: flex;
+          flex-direction: column;
+          align-items: flex-end;
+          justify-content: space-between;
+
+          image {
+            width: 52rpx;
+            height: 52rpx;
+          }
+
+          .tag {
+            position: absolute;
+            bottom: 0;
+            right: 0;
+            border-radius: 16rpx;
+            padding: 5rpx 10rpx;
+            box-sizing: border-box;
+            background: #f7931e;
+            text-align: center;
+            color: #fff;
+            width: 122rpx;
+            font-size: 24rpx;
+          }
+        }
+      }
+    }
+  }
+  // 对勾
+  .dot {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 2.25rem;
+    height: 2.375rem;
+  }
+}
+
+// 弹窗按钮
+.popup_button {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 10rpx 20rpx;
+  box-sizing: border-box;
+
+  .desc .num {
+    color: #c69c6d;
+    font-size: 18px;
+  }
+
+  .ok_btn {
+    height: 110rpx;
+    line-height: 110rpx;
+    text-align: center;
+    background: #c69c6d;
+    color: #fff !important;
+    width: 120px;
+    height: 40px;
+    line-height: 40px;
+    border-radius: 40px;
+  }
+}
+
+.warp {
+  width: 94%;
+  margin-left: 3%;
+  margin-top: 20rpx;
+  background-color: #fff;
+  border-radius: 10rpx;
+  padding-bottom: 10rpx;
+  .warp_index {
+    width: 650rpx;
+    margin-left: 27.5rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 20rpx 0;
+    font-size: 28rpx;
+  }
+  .warp_index1 {
+    justify-content: center;
+    font-size: 40rpx;
+    padding: 30rpx 0;
+    border-bottom: 1rpx solid #f2f2f2;
+  }
+  .color_warp_index {
+    color: #000000;
+  }
+  .bgc-blue {
+    .bgc-color('blue');
+  }
+  .bgc-green {
+    .bgc-color('green');
+  }
+  .bgc-color(@value) {
+    @color: 'color-@{value}';
+    color: #fff;
+    background-color: @@color;
+    margin: 0;
+    width: 100%;
+    border-radius: 10rpx 10rpx 0 0;
+  }
+  .warp_index_da {
+    padding: 30rpx 0;
+    border-bottom: 1rpx solid #f2f2f2;
+  }
+  .warp_index_color {
+    color: #999999;
+    display: flex;
+    align-items: center;
+  }
+}
+
+.flewx {
+  width: 100%;
+  height: 130rpx;
+  background-color: #fff;
+  position: fixed;
+  bottom: 0;
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  // padding-bottom: constant(safe-area-inset-bottom);
+  // padding-bottom: env(safe-area-inset-bottom);
+  padding-bottom: 20rpx;
+  .flewx-content {
+    position: absolute;
+    left: 16px;
+  }
+  .flewx_index3 {
+    width: 150rpx;
+    height: 70rpx;
+    border-radius: 50rpx;
+    text-align: center;
+    font-size: 28rpx;
+    line-height: 70rpx;
+    color: #fff;
+    background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+    box-shadow: 2px 3px 5px #888888;
+    position: absolute;
+    right: 16px;
+  }
+  .blue_flewx_index3 {
+    .color_flewx_index3('blue');
+  }
+  .green_flewx_index3 {
+    .color_flewx_index3('green');
+  }
+  .color_flewx_index3(@value) {
+    @color: 'color-@{value}';
+    background-image: none;
+    background-color: @@color;
+  }
+  .btn-disabled {
+    color: hsla(0, 0%, 100%, 0.6);
+    cursor: not-allowed;
+    background-color: rgb(128, 128, 128);
+    background-image: none;
+  }
+}
+.popue_box {
+  height: 530rpx;
+  background-color: #fff;
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  .popue_box_index {
+    width: 92%;
+    margin-left: 4%;
+    font-size: 30rpx;
+    height: 90rpx;
+    border-bottom: 1px solid #f5f5f5;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+  .popue_box_index1 {
+    font-size: 32rpx;
+    width: 92%;
+    margin-left: 4%;
+    font-weight: 700;
+    height: 90rpx;
+    line-height: 90rpx;
+    border-bottom: 1px solid #f5f5f5;
+    text-align: center;
+  }
+  .popue_box_index4_xs {
+    width: 250rpx;
+    height: 55rpx;
+    border: 2rpx solid #e5e6ec;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    border-radius: 10rpx;
+    .popue_box_index4_xs_index1 {
+      width: 54rpx;
+      height: 54rpx;
+      background-color: #f5f8fb;
+      text-align: center;
+      line-height: 54rpx;
+      border-right: 1rpx solid #e5e6ec;
+    }
+    .popue_box_index4_xs_index3 {
+      width: 54rpx;
+      height: 54rpx;
+      background-color: #f5f8fb;
+      text-align: center;
+      line-height: 54rpx;
+      border-left: 1rpx solid #e5e6ec;
+    }
+  }
+  .popue_box_index5 {
+    font-size: 30rpx;
+    width: 92%;
+    margin-left: 4%;
+    font-weight: 700;
+    height: 140rpx;
+    line-height: 90rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+  .popue_box_index4_by {
+    width: 320rpx;
+    height: 90rpx;
+    line-height: 90rpx;
+    color: #fff;
+    border-radius: 60rpx;
+    text-align: center;
+    color: #7e4fa1;
+    font-weight: 700;
+    border: 1rpx solid #7e4fa1;
+  }
+  .blue_popue_box_index4_by {
+    .color_popue_box_index4_by('blue');
+  }
+  .green_popue_box_index4_by {
+    .color_popue_box_index4_by('green');
+  }
+  .color_popue_box_index4_by(@value) {
+    @color: 'color-@{value}';
+    color: @@color;
+    border: 1rpx solid @@color;
+  }
+  .popue_box_index4_by1 {
+    width: 320rpx;
+    height: 90rpx;
+    line-height: 90rpx;
+    color: #fff;
+    border-radius: 60rpx;
+    text-align: center;
+    background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+    border: 1rpx solid #7e4fa1;
+  }
+  .blue_popue_box_index4_by1 {
+    .color-background-color('blue');
+  }
+  .green_popue_box_index4_by1 {
+    .color-background-color('green');
+  }
+}
+.text-purple {
+  color: #703a98;
+}
+.text-red {
+  color: #ff0000;
+}
+.top_content {
+  padding: 25rpx 35rpx 120rpx;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+
+  text {
+    font-size: 24rpx;
+    color: #898989;
+    text-align: left;
+  }
+
+  .title_box {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 20rpx;
+
+    .btn {
+      padding: 0rpx 14rpx;
+      box-sizing: border-box;
+      border-radius: 20rpx;
+      font-size: 30rpx;
+      color: #000;
+      text-align: center;
+    }
+  }
+  .info {
+    padding-left: 18rpx;
+    font-size: 27rpx;
+    width: 95%;
+    color: #666;
+    line-height: 45rpx;
+  }
+  .is-show {
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+  }
+  .top-down {
+    text-align: center;
+    color: #d6d2d2;
+  }
+}
+</style>

+ 276 - 0
src/crmPages/parkingFeeDetailSuccess.vue

@@ -0,0 +1,276 @@
+<template>
+  <scroll-view scroll-y="true" class="scroll-Y">
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="parking-info">
+      <view class="parking-price">
+        <view class="price">{{ (detail.payfee / 100) | currency }}</view>
+        <view class="price-text">{{
+          detail.refundStatus === 1
+            ? '已退款'
+            : detail.payStatus === 1
+            ? '支付成功'
+            : '支付失败'
+        }}</view>
+      </view>
+      <view class="parking-part parking-detail">
+        <view class="parking-info-item">
+          <text class="info-key">支付方式</text>
+          <text class="info-value">{{ detail.paykind || '' }}</text>
+        </view>
+
+        <view class="parking-info-item">
+          <text class="info-key">支付时间</text>
+          <text class="info-value">{{ detail.createDate || '' }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">车牌号</text>
+          <text class="info-value">{{ detail.carno | formatCarno }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">停车场</text>
+          <text class="info-value">{{ detail.parkname }}</text>
+        </view>
+      </view>
+      <view class="parking-part parking-detail">
+        <view class="parking-info-item">
+          <text class="info-key">订单号</text>
+          <text class="info-value">{{ detail.orderno }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">入场时间</text>
+          <text class="info-value">{{ detail.entertime }}</text>
+        </view>
+        <!-- <view class="parking-info-item">
+          <text class="info-key">离场时间</text>
+          <text class="info-value">{{ detail.outtime || "" }}</text>
+        </view> -->
+        <view class="parking-info-item">
+          <text class="info-key">停车时长</text>
+          <text class="info-value">{{ parkingTime }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">开票状态</text>
+          <text class="info-value">{{ isInvoiceName }}</text>
+        </view>
+      </view>
+    </view>
+    <view class="parking-info mgb-40">
+      <view class="parking-part">
+        <view class="parking-info-item" v-if="false"
+          ><!--todo: 杭州首停不显示暂时根据groupId写死-->
+          <text class="info-key">首停优惠</text>
+          <text class="info-value">{{
+            (detail.firstParkFee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">会员等级减免</text>
+          <text class="info-value">{{
+            (detail.memberGradeFee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">消费减免</text>
+          <text class="info-value">{{
+            (detail.consumeFee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">新会员积分减免</text>
+          <text class="info-value">{{
+            (detail.newMemeberBonusFee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">积分减免</text>
+          <text class="info-value">{{
+            (detail.bonusfee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">会员卡券</text>
+          <text class="info-value">{{
+            (detail.couponfee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item" v-if="detail.paperCouponCode">
+          <text class="info-key">纸质优惠券</text>
+          <text class="info-value">{{
+            (detail.paperCouponFee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">使用优惠总计</text>
+          <text class="info-value">{{
+            ((detail.usetotalfee || 0) / 100) | currency
+          }}</text>
+        </view>
+        <view
+          class="parking-info-item"
+          v-if="detail.usetotalfee > detail.totalfee"
+        >
+          <text class="info-key">实际优惠总计</text>
+          <text class="info-value">{{
+            (detail.totalfee / 100) | currency
+          }}</text>
+        </view>
+      </view>
+      <view class="parking-part parking-detail">
+        <view class="parking-info-item">
+          <text class="info-key">应缴</text>
+          <text class="info-value">{{
+            (detail.servicefee / 100) | currency
+          }}</text>
+        </view>
+        <view class="parking-info-item">
+          <text class="info-key">实缴</text>
+          <text class="info-value red">{{
+            (detail.payfee / 100) | currency
+          }}</text>
+        </view>
+      </view>
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+export default {
+  data() {
+    return {
+      orderNo: '',
+      isInvoiceName: '',
+      detail: {},
+      groupId: app.globalData.groupId,
+    };
+  },
+  onLoad(params) {
+    this.orderNo = params.orderNo;
+  },
+  onShow() {
+    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}分钟`;
+    },
+  },
+  methods: {
+    getData() {
+      const params = {
+        orderno: this.orderNo,
+      };
+      uni.showLoading({
+        title: '加载中',
+      });
+      this.$md(params);
+      uni.request({
+        url: this.$baseURL + 'api/1.0/park/parkOrderDetail',
+        data: params,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          uni.hideLoading();
+          if (res.data.code == 0) {
+            this.detail = res.data.data;
+            const isInvoice = this.detail.isInvoice;
+            if (isInvoice == 0) {
+              this.isInvoiceName = '未开票';
+            } else if (isInvoice == 1) {
+              this.isInvoiceName = '已申请开票';
+            } else if (isInvoice == 2) {
+              this.isInvoiceName = '开票中';
+            } else if (isInvoice == 3) {
+              this.isInvoiceName = '开票完成';
+            } else if (isInvoice == 4) {
+              this.isInvoiceName = '开票失败';
+            }
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: (err) => {
+          uni.hideLoading();
+          uni.showToast({
+            title: res.data.msg,
+            duration: 2000,
+            icon: 'none',
+          });
+        },
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  padding-bottom: 20rpx;
+  .parking-info {
+    margin: 20rpx;
+    padding: 20rpx;
+    border-radius: 30rpx;
+    background-color: #ffffff;
+    .parking-price {
+      text-align: center;
+      padding: 20rpx 0rpx 40rpx;
+      .price {
+        color: rgb(255, 0, 0);
+        font-weight: 600;
+        font-size: 52rpx;
+      }
+      .price-text {
+        font-weight: 300;
+        font-size: 30rpx;
+      }
+    }
+    .parking-detail {
+      border-top: 2rpx solid #f5f5f5;
+    }
+    .parking-part {
+      padding: 20rpx;
+      .parking-info-item {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        padding: 20rpx 0rpx;
+        font-size: 32rpx;
+        .info-key {
+          text-align: left;
+          color: #242424;
+        }
+        .info-value {
+          text-align: right;
+          color: #999999;
+        }
+        .red {
+          color: #ee2c34;
+        }
+      }
+    }
+  }
+  .mgb-40 {
+    margin-bottom: 20px;
+  }
+}
+</style>

+ 653 - 0
src/crmPages/parkingFeeDiscounts.vue

@@ -0,0 +1,653 @@
+<template>
+  <scroll-view scroll-y="true" class="scroll-Y">
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <checkbox-group @change="checkboxChange">
+      <view class="container" v-if="false"
+        ><!--todo: 杭州首停不显示暂时根据groupId写死-->
+        <view class="item">
+          <view class="title">首停优惠</view>
+          <view class="content"
+            >首停减免{{ parkInfoEntity.parkHour }}小时。可优惠{{
+              firstParkDiscountFee
+            }}元</view
+          >
+        </view>
+        <checkbox
+          value="firstPark"
+          color="#fff"
+          :checked="isCheck('firstPark')"
+        />
+      </view>
+
+      <view class="container" v-if="parkInfoEntity.memberLevelReduce">
+        <view class="item">
+          <view class="title">会员等级减免</view>
+          <view class="content"
+            >{{ memberDiscount.memberOrderdesc || '' }}减免{{
+              memberDiscount.reduceContent || 0
+            }}小时。可优惠{{ memberDiscountFee || 0 }}元</view
+          >
+        </view>
+        <checkbox
+          value="member"
+          color="#fff"
+          :disabled="
+            (!isCheck('member') && isDiscountDisabled) ||
+            isMemberDiscountDisabled ||
+            memberDiscount.reduceContent <= 0
+          "
+          :checked="isCheck('member')"
+        />
+        <view class="member-discount-info" v-if="isMemberDiscountDisabled"
+          >当日已使用</view
+        >
+      </view>
+      <view class="container" v-if="isShowReduceDiscount">
+        <view class="item">
+          <view class="title">消费减免</view>
+          <!-- <view class="content" v-if="parkInfoEntity.parkMallCode === 1 && parkInfoEntity.expirationDate">{{reduceDiscountMessage}}</view> -->
+          <view class="content" v-if="parkInfoEntity.parkMallCode !== 1">{{
+            todayReduceDiscountMessage
+          }}</view>
+          <uni-number-box
+            v-if="parkInfoEntity.isSplit === 0 && maxReduceDiscount > 0"
+            :min="1"
+            :max="maxReduceDiscount"
+            v-model="reduceHours"
+            @input="reducesChange"
+          ></uni-number-box>
+        </view>
+        <checkbox
+          value="reduces"
+          color="#fff"
+          :disabled="
+            (!isCheck('reduces') && isDiscountDisabled) ||
+            !reducesDiscount.recuceContent
+          "
+          :checked="isCheck('reduces')"
+        />
+      </view>
+      <view class="flewx">
+        <view class="flewx-content"
+          >应付<text
+            style="color: red; font-size: 32rpx; padding-left: 20rpx"
+            >{{ actualFee | currency }}</text
+          >
+          元
+          <text style="color: #8d8d8d; padding-left: 30rpx; font-size: 28rpx"
+            >已优惠{{ discountFee | currency }}元</text
+          ></view
+        >
+        <view
+          :class="{
+            flewx_index3: true,
+            blue_flewx_index3: custTypeId === 1,
+            green_flewx_index3: custTypeId === 2,
+            'btn-disabled': !parkInfo.servicefee,
+          }"
+          @click="confirm"
+          >确定</view
+        >
+      </view>
+    </checkbox-group>
+  </scroll-view>
+</template>
+
+<script>
+import { mapState } from 'vuex';
+import uniNumberBox from '@/components/uni-number-box/uni-number-box.vue';
+const app = getApp();
+export default {
+  components: { uniNumberBox },
+  onLoad() {
+    // 纸质优惠券
+    if (uni.getStorageSync('paperCouponInfo')) {
+      this.paperCouponFee =
+        uni.getStorageSync('paperCouponInfo').paperDiscountFee || 0;
+    }
+    // 电子券
+    if (uni.getStorageSync('couponInfo')) {
+      this.couponFee = uni.getStorageSync('couponInfo').couponfee || 0;
+    }
+    this.servicefee = uni.getStorageSync('servicefee'); // 应缴金额
+    this.parkDiscountTotal = uni.getStorageSync('parkingTotal'); // 总停车优惠
+    // 重置优惠 防止二次叠加
+    this.discountTotal = uni.getStorageSync('discountTotal');
+    if (this.discountTotal) {
+      this.parkDiscountTotal.feeCopy -= this.discountTotal.fee;
+    }
+
+    this.parkFee = JSON.parse(uni.getStorageSync('parkFee'));
+    this.parkInfoEntity = this.parkFee.parkInfoEntity;
+    this.parkInfoEntity.useReduceTime = this.parkInfoEntity.useReduceTime
+      ? this.parkInfoEntity.useReduceTime
+      : 0; // 已用优惠时长
+    this.parkInfoEntity.remainReduceTime =
+      this.parkInfoEntity.remainReduceTime > 0
+        ? this.parkInfoEntity.remainReduceTime
+        : 0; // 剩余可用优惠时长
+    this.parkMallCode = this.parkInfoEntity.parkMallCode;
+    // 浦东每次上限处理
+    if (
+      this.parkMallCode === 1 &&
+      this.parkInfoEntity.remainReduceTime >
+        this.parkInfoEntity.maxonetimediscount
+    ) {
+      this.parkInfoEntity.remainReduceTime =
+        this.parkInfoEntity.maxonetimediscount;
+    }
+
+    // 沈阳上限处理
+    if (this.parkMallCode === 4 || this.parkMallCode === 6) {
+      this.parkInfoEntity.remainReduceTime =
+        this.parkInfoEntity.maxOneDayHour -
+        this.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour;
+      if (this.couponFee) {
+        this.parkInfoEntity.remainReduceTime -=
+          this.couponFee / this.parkInfoEntity.needmoney;
+      }
+    }
+
+    // 上限金额
+    this.maxonetimediscountFee =
+      this.parkInfoEntity.maxonetimediscount * this.parkInfoEntity.needmoney;
+    this.maxonedaydiscountFee =
+      (this.parkInfoEntity.maxOneDayHour -
+        this.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour) *
+        this.parkInfoEntity.needmoney || 0;
+    if (this.maxonedaydiscountFee < 0) {
+      this.maxonedaydiscountFee = 0;
+    }
+
+    // 会员优惠
+    if (
+      this.parkFee.parkMemberOrderReducesEntityList &&
+      this.parkFee.parkMemberOrderReducesEntityList[0]
+    ) {
+      this.memberDiscount = this.parkFee.parkMemberOrderReducesEntityList[0];
+    }
+
+    // 消费减免
+    if (
+      this.parkFee.parkConsumeReducesEntityList &&
+      this.parkFee.parkConsumeReducesEntityList.length
+    ) {
+      this.reducesDiscount = this.parkFee.parkConsumeReducesEntityList[0];
+    } else {
+      this.reducesDiscount = { consumerLimit: 0, recuceContent: 0 };
+    }
+
+    // 消费减免可拆分上限
+    this.maxReduceDiscount = this.reducesDiscount.recuceContent;
+    if (this.maxReduceDiscount > this.parkInfoEntity.remainReduceTime) {
+      this.maxReduceDiscount = this.parkInfoEntity.remainReduceTime;
+    }
+    this.reduceHours = this.maxReduceDiscount;
+
+    // 反显处理
+    if (this.discountTotal.consumeFee) {
+      this.reduceHours =
+        this.discountTotal.consumeFee / this.parkInfoEntity.needmoney || 0;
+    }
+    const checkedList = uni.getStorageSync('checkedList');
+    if (checkedList && checkedList.length) {
+      this.checkedList = checkedList;
+    } /* else {
+			if (this.memberDiscount.reduceContent > 0) {
+				// 浦东上限控制
+				if (this.parkMallCode === 1) {
+					if (!this.crossMessage()) {
+						this.checkedList = ['member'];
+						this.maxReduceDiscount = this.parkInfoEntity.remainReduceTime - this.memberDiscount.reduceContent - (this.discountTotal.time || 0);
+						this.reduceHours = this.maxReduceDiscount;
+					}
+				} else {
+					this.checkedList = ['member'];
+				}
+			} else {
+				if (this.parkMallCode === 1) {
+					if (!this.isCheck('reduces')) {
+						this.maxReduceDiscount = this.parkInfoEntity.remainReduceTime - (this.parkDiscountTotal.time || 0);
+						this.reduceHours = this.maxReduceDiscount;
+					}
+				}
+			}
+		}*/
+    // 浦东上限控制
+    if (
+      this.parkMallCode === 1 ||
+      this.parkMallCode === 4 ||
+      this.parkMallCode === 6
+    ) {
+      if (this.discountTotal.memberGradeFee) {
+        this.maxReduceDiscount =
+          this.parkInfoEntity.remainReduceTime -
+          this.discountTotal.memberGradeFee / this.parkInfoEntity.needmoney;
+        if (
+          (this.parkMallCode === 4 || this.parkMallCode === 6) &&
+          this.maxReduceDiscount > this.reducesDiscount.recuceContent
+        ) {
+          this.maxReduceDiscount = this.reducesDiscount.recuceContent;
+        }
+      }
+      this.reduceHours = this.maxReduceDiscount;
+      if (this.crossMessage()) {
+        if (this.isCheck('reduces')) {
+          this.maxReduceDiscount = this.reduceHours;
+        } else {
+          this.maxReduceDiscount = 0;
+          this.reduceHours = 0;
+        }
+      } else {
+        if (!this.isCheck('reduces')) {
+          this.reduceHours = this.maxReduceDiscount;
+        }
+      }
+    }
+
+    // 会员优惠每天只可使用一次
+    if (this.parkInfoEntity.memberLevelFlag == 1) {
+      this.isMemberDiscountDisabled = true;
+      const memberIndex = this.checkedList.indexOf('member');
+      if (memberIndex !== -1) {
+        this.checkedList.splice(memberIndex, 1);
+      }
+    }
+
+    // 超限提示
+    this.crossMessage();
+  },
+  data() {
+    return {
+      parkFee: {}, // 停车规则信息及优惠信息
+      parkInfoEntity: {}, // 停车规则信息
+      memberDiscount: {}, // 会员优惠
+      isMemberDiscountDisabled: false, // 会员等级减免是否可用(当天仅限使用一次)
+      isDiscountDisabled: false, // 浦东减免是否超限
+      reducesDiscount: {}, // 消费优惠
+      checkedList: [], // 已选优惠列表
+      firstPark: 0, // 首停减免金额
+      member: 0, // 会员优惠金额
+      reduces: 0, // 消费减免金额
+      reduceHours: 0, // 消费减免拆分时长
+      maxReduceDiscount: 0, // 消费减免规则最大优惠
+      servicefee: 0, // 应缴金额
+      parkDiscountTotal: {}, // 总停车优惠
+      discountTotal: {}, // 首停、会员、消费优惠合计
+      groupId: app.globalData.groupId,
+      maxonetimediscountFee: 0, // 每次优惠上限金额
+      maxonedaydiscountFee: 0, // 每天优惠上限金额
+      parkMallCode: 1, // 0静安 1浦东 2杭州 3北京 4沈阳 5深圳 6天津
+      paperCouponFee: 0, // 纸质优惠金额
+      couponFee: 0, // 电子券优惠金额
+    };
+  },
+  computed: {
+    // 是否显示消费减免
+    isShowReduceDiscount() {
+      if (
+        this.parkInfoEntity.parkMallCode === 0 ||
+        this.parkInfoEntity.parkMallCode === 1
+      ) {
+        return (
+          this.parkInfoEntity.consumeReduce &&
+          this.reducesDiscount.consumerLimit
+        );
+      }
+      return this.parkInfoEntity.consumeReduce;
+    },
+    // 首停减免金额
+    firstParkDiscountFee() {
+      return this.parkInfoEntity.parkHour * this.parkInfoEntity.needmoney;
+    },
+    // 会员减免金额
+    memberDiscountFee() {
+      return this.memberDiscount.reduceContent * this.parkInfoEntity.needmoney;
+    },
+    // 消费减免金额
+    reducesDiscountFee() {
+      return this.reduceHours * this.parkInfoEntity.needmoney;
+    },
+    // 浦东有效期内消费提示
+    reduceDiscountMessage() {
+      return (
+        this.parkInfoEntity.expirationDate +
+        '日内消费了' +
+        this.parkInfoEntity.totalAmont +
+        '元,已使用' +
+        parseInt(
+          this.parkInfoEntity.useConsumeFee / this.parkInfoEntity.needmoney
+        ) +
+        '小时满减抵扣。'
+      );
+    },
+    // 消费减免(拆分部分)提示文本
+    reduceSplitMessage() {
+      if (this.parkInfoEntity.isSplit === 0) {
+        return `选择${this.reduceHours}小时,`;
+      }
+      return '';
+    },
+    // 当日消费提示
+    todayReduceDiscountMessage() {
+      if (
+        this.parkInfoEntity.remainReduceTime ||
+        this.parkInfoEntity.maxOneDayHour -
+          this.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour
+      ) {
+        if (this.reducesDiscount.consumerLimit) {
+          if (this.parkMallCode === 0) {
+            return `今日可减免${this.reducesDiscount.recuceContent}小时`;
+          }
+          // 沈阳提示信息
+          if (this.parkMallCode === 4 || this.parkMallCode === 6) {
+            return `未达上限时今日可减免${this.reducesDiscount.recuceContent}小时`;
+          }
+          if (
+            this.reducesDiscount.recuceContent >
+            this.parkInfoEntity.remainReduceTime
+          ) {
+            return `消费已满${this.reducesDiscount.consumerLimit}元,减免${this.reducesDiscount.recuceContent}小时。超出优惠上限,可减免${this.maxReduceDiscount}小时,${this.reduceSplitMessage}可优惠${this.reducesDiscountFee}元`;
+          }
+          return `消费已满${this.reducesDiscount.consumerLimit}元,减免${this.reducesDiscount.recuceContent}小时。${this.reduceSplitMessage}可优惠${this.reducesDiscountFee}元`;
+        }
+        return '消费金额未达到最低优惠要求';
+      }
+      if (this.parkInfoEntity.dateReduceUpperliLimit) {
+        return `您今日消费减免已达${this.parkInfoEntity.dateReduceUpperliLimit}小时上限`;
+      }
+    },
+    // 选择优惠数量
+    checkedTotal() {
+      return this.checkedList.length;
+    },
+    // 首停、会员、消费优惠总计金额
+    totalFee() {
+      this.first = 0;
+      this.member = 0;
+      this.reduces = 0;
+      let total = 0;
+      this.checkedList.forEach((item) => {
+        this[item] = this[item + 'DiscountFee'];
+        total += this[item + 'DiscountFee'];
+      });
+      return total;
+    },
+    // 首停、会员、消费优惠总计时长
+    totalTime() {
+      return this.totalFee / this.parkInfoEntity.needmoney;
+    },
+    // 实际支付金额
+    actualFee() {
+      const fee = this.servicefee - this.discountFee;
+      return fee > 0 ? fee : 0;
+    },
+    // 已优惠金额
+    discountFee() {
+      let total = this.parkDiscountTotal.feeCopy + this.totalFee;
+      // 超出上限按上限计算
+      if (this.parkMallCode === 1) {
+        if (total - this.paperCouponFee > this.maxonetimediscountFee) {
+          total = this.maxonetimediscountFee + this.paperCouponFee;
+        }
+      }
+      if (this.parkMallCode === 4 || this.parkMallCode === 6) {
+        if (
+          total - this.paperCouponFee - this.parkDiscountTotal.bonusfee >
+          this.maxonedaydiscountFee
+        ) {
+          total =
+            this.maxonedaydiscountFee +
+            this.parkDiscountTotal.bonusfee +
+            this.paperCouponFee;
+        }
+      }
+      return total;
+    },
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  methods: {
+    // 选择回调
+    checkboxChange(e) {
+      console.log('checkboxChange');
+      console.log('paperCouponFee------>', this.paperCouponFee);
+      this.checkedList = e.detail.value;
+      // 浦东上限控制
+      if (this.parkMallCode === 1) {
+        if (this.isCheck('member')) {
+          this.maxReduceDiscount =
+            this.parkInfoEntity.remainReduceTime -
+            (this.discountFee - this.paperCouponFee - this.reduces) /
+              this.parkInfoEntity.needmoney;
+          this.reduceHours = this.maxReduceDiscount;
+        } else {
+          if (this.isCheck('reduces')) {
+            this.maxReduceDiscount =
+              this.parkInfoEntity.remainReduceTime -
+              (this.discountFee - this.paperCouponFee - this.reduces) /
+                this.parkInfoEntity.needmoney;
+          } else {
+            this.maxReduceDiscount =
+              this.parkInfoEntity.remainReduceTime -
+              (this.discountFee - this.paperCouponFee) /
+                this.parkInfoEntity.needmoney;
+            this.reduceHours = this.maxReduceDiscount;
+          }
+        }
+      }
+      // 沈阳上限控制
+      if (this.parkMallCode === 4 || this.parkMallCode === 6) {
+        if (this.isCheck('member')) {
+          this.maxReduceDiscount =
+            this.parkInfoEntity.remainReduceTime -
+            this.memberDiscount.reduceContent;
+          if (this.maxReduceDiscount < 0) {
+            this.maxReduceDiscount = 0;
+          }
+          if (this.maxReduceDiscount > this.reducesDiscount.recuceContent) {
+            this.maxReduceDiscount = this.reducesDiscount.recuceContent;
+          }
+          this.reduceHours = this.maxReduceDiscount;
+        } else {
+          this.maxReduceDiscount = this.parkInfoEntity.remainReduceTime;
+          if (this.maxReduceDiscount > this.reducesDiscount.recuceContent) {
+            this.maxReduceDiscount = this.reducesDiscount.recuceContent;
+          }
+          this.reduceHours = this.maxReduceDiscount;
+        }
+      }
+      this.crossMessage();
+    },
+
+    // 是否选中
+    isCheck(val) {
+      return this.checkedList.findIndex((e) => e == val) !== -1;
+    },
+
+    // 计数器回调
+    reducesChange() {
+      console.log('reducesChange');
+      if (this.isCheck('reduces')) {
+        this.crossMessage();
+      }
+    },
+
+    // 超限提示
+    crossMessage() {
+      let totalFee = this.parkDiscountTotal.feeCopy;
+      const remainReduceFee =
+        this.parkInfoEntity.remainReduceTime * this.parkInfoEntity.needmoney;
+      // if (this.discountTotal && this.discountTotal.fee !== 0) {
+      // 	totalFee += this.totalFee - this.discountTotal.fee;
+      // } else {
+      // 	totalFee += this.totalFee;
+      // }
+      totalFee += this.totalFee;
+      // 浦东每次总优惠上限
+      this.isDiscountDisabled = false;
+      if (
+        this.parkMallCode === 1 &&
+        totalFee - this.paperCouponFee >= this.maxonetimediscountFee
+      ) {
+        this.isDiscountDisabled = true;
+        return uni.showToast({
+          title: `超出抵扣上限,每次最高可抵扣${this.parkInfoEntity.maxonetimediscount}小时`,
+          icon: 'none',
+        });
+      }
+      // 沈阳超限处理(maxonedaydiscountFee 会员、消费、电子券减免)
+      if (
+        (this.parkMallCode === 4 || this.parkMallCode === 6) &&
+        totalFee - this.paperCouponFee - this.parkDiscountTotal.bonusfee >=
+          this.maxonedaydiscountFee
+      ) {
+        this.isDiscountDisabled = true;
+        return uni.showToast({
+          title: `(会员等级、消费、电子券)每日最高可抵扣${this.parkInfoEntity.maxOneDayHour}小时`,
+          icon: 'none',
+        });
+      }
+      // 消费每天优惠上限(非浦东、沈阳)
+      if (
+        this.parkMallCode !== 1 &&
+        this.parkMallCode !== 4 &&
+        this.parkMallCode !== 6 &&
+        this.reduces > remainReduceFee
+      ) {
+        this.reduces = remainReduceFee;
+        return uni.showToast({
+          title: `超出抵扣上限,消费减免每天最高可抵扣${this.parkInfoEntity.dateReduceUpperliLimit}小时,可使用${this.parkInfoEntity.remainReduceTime}小时`,
+          icon: 'none',
+        });
+      }
+    },
+
+    // 确认
+    confirm() {
+      // 计算单价
+      const cost =
+        this.reducesDiscount.consumerLimit / this.reducesDiscount.recuceContent;
+      // 算出消费减免在哪个档
+      let useConsumeFee = 0;
+      if (this.reduces) {
+        if (this.parkInfoEntity.isSplit === 0) {
+          useConsumeFee = this.reduceHours * cost;
+        } else {
+          useConsumeFee = this.reducesDiscount.consumerLimit;
+        }
+      }
+      uni.setStorageSync('checkedList', this.checkedList);
+      uni.setStorageSync('checkedTotal', this.checkedTotal);
+      uni.setStorageSync('discountTotal', {
+        firstParkFee: this.firstPark,
+        memberGradeFee: this.member,
+        consumeFee: this.reduces,
+        useConsumeFee: useConsumeFee,
+        time: this.totalTime,
+        fee: this.totalFee,
+      });
+      uni.navigateBack();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f1f1f1;
+}
+.container {
+  background-color: #fff;
+  width: 650rpx;
+  margin: 25rpx 30rpx;
+  padding-left: 40rpx;
+  border-radius: 10rpx;
+  display: flex;
+  align-items: center;
+  line-height: 70rpx;
+  position: relative;
+  .item {
+    width: 570rpx;
+    padding: 20rpx 0;
+    .title {
+      font-size: 34rpx;
+    }
+    .content {
+      font-size: 28rpx;
+      color: #989898;
+    }
+  }
+  .member-discount-info {
+    font-size: 20rpx;
+    position: absolute;
+    right: 12rpx;
+    bottom: 0;
+    color: #989898;
+  }
+  .page_img {
+    width: 49rpx;
+    height: 49rpx;
+    border: 1rpx solid #e6e6e6;
+    border-radius: 50%;
+    overflow: hidden;
+    image {
+      width: 50rpx;
+      height: 50rpx;
+      margin-left: -1rpx;
+    }
+  }
+}
+.flewx {
+  width: 100%;
+  height: 100rpx;
+  background-color: #fff;
+  position: fixed;
+  bottom: 0;
+  font-size: 30rpx;
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  // padding-bottom: constant(safe-area-inset-bottom);
+  // padding-bottom: env(safe-area-inset-bottom);
+  padding-bottom: 20rpx;
+  .flewx-content {
+    position: absolute;
+    left: 16px;
+  }
+  .flewx_index3 {
+    width: 150rpx;
+    height: 70rpx;
+    border-radius: 50rpx;
+    text-align: center;
+    font-size: 28rpx;
+    line-height: 70rpx;
+    color: #fff;
+    background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+    box-shadow: 2px 3px 5px #888888;
+    position: absolute;
+    right: 16px;
+  }
+  .blue_flewx_index3 {
+    .color-background-color('blue');
+  }
+  .green_flewx_index3 {
+    .color-background-color('green');
+  }
+}
+/deep/ checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+  background-color: red !important;
+  border-radius: 50% !important;
+  border: 1px solid red;
+}
+/deep/ checkbox .wx-checkbox-input {
+  border-radius: 50% !important;
+}
+</style>

+ 835 - 0
src/crmPages/parkingFeeForm.vue

@@ -0,0 +1,835 @@
+<template>
+	<scroll-view scroll-y="true" class="scroll-Y">
+    <wx-points-commit ref='wxPointsCommit'></wx-points-commit>
+
+		<view class="wrap">
+			<view class="form">
+				<view class="form-item">
+					<text class="label">车牌</text>
+					<text>{{parkOrderEntity.carno}}</text>
+				</view>
+				<view class="form-item">
+					<text class="label">入场时间</text>
+					<text>{{parkOrderEntity.entertime}}</text>
+				</view>
+				<view class="form-item">
+					<text class="label">停车时长</text>
+					<text>{{parkOrderEntity.servicehour}}小时</text>
+				</view>
+				<view class="form-item">
+					<text class="label"></text>
+					<text>订单金额:¥{{parkOrderEntity.servicefee}}</text>
+				</view>
+			</view>
+			<view class="form">
+				<view class="form-item" @click="openPark" v-if="parkInfoEntity.isuseticket == 1">
+					<text class="label">停车券</text>
+					<view>
+						<text>{{parkingCouponName}}</text>
+						<uni-icons type="arrowright" size="20" class="arrowright"></uni-icons>
+					</view>
+				</view>
+        <view class="form-item" v-if="couponfee">
+        	<text class="label">停车券抵扣</text>
+        	<text style="color: #ed1c24;">¥{{couponfee}}元</text>
+        </view>
+				<view class="form-item" @click="openIntegral" v-if="parkInfoEntity.isuseintegral == 1">
+					<text class="label">积分抵扣</text>
+					<view>
+						<text>{{integralName}}</text>
+						<uni-icons type="arrowright" size="20" class="arrowright"></uni-icons>
+					</view>
+				</view>
+        <view class="form-item" v-if="bonusfee">
+        	<text class="label">积分抵扣</text>
+        	<text style="color: #ed1c24;">¥{{bonusfee}}元</text>
+        </view>
+			</view>
+      <!-- 福州 -->
+      <view class="tip" v-if="mallid === '000586'">注:每次支付最多抵扣{{parkInfoEntity.maxonetimediscount}}元</text></view>
+      <!-- 天津 -->
+      <view class="tip" v-if="mallid === '000719'">注:每次支付最多抵扣{{parkInfoEntity.maxonetimediscount}}元</text></view>
+      <!-- 慈溪 -->
+      <view class="tip" v-if="mallid === '00000914'">注:周一每次支付最多抵扣50元,周二至周日每次支付最多抵扣6元</text></view>
+			<view class="tip" v-if="mallid !== '000586' && mallid !== '000719' && mallid !== '00000914'">注:卡券和积分每天累计最多抵扣<text>{{parkInfoEntity.maxonedaydiscount}}元</text>,<text>每次支付最多抵扣{{parkInfoEntity.maxonetimediscount}}元,今日已抵扣{{todayDiscountMoney}}元</text>
+			</view>
+		</view>
+		<!-- 底部导航 -->
+		<view class="submit_bar">
+			<view class="submit_text">
+				<view class="text_top">
+					<text>实付款:</text>
+					<text class="price">¥ {{total}}</text>
+				</view>
+				<view class="text_bottom" v-if="parkingCouponName !== '' || integralName !== ''">
+					<text v-if="parkingCouponName && !integralName">已选择:{{parkingCouponName}}</text>
+					<text v-if="integralName && !parkingCouponName">已选择:{{integralName}}</text>
+					<text v-if="parkingCouponName && integralName">已选择:{{parkingCouponName+'/'+integralName}}</text>
+				</view>
+			</view>
+			<uni-button class="mini-btn" type="warn" size="mini" @click="onSubmit">立即支付</uni-button>
+		</view>
+		<!-- 停车券弹窗 -->
+		<view class="parking_pop popup">
+			<uni-popup ref="parkingCoupon_popup" type="bottom" class="uni-popup" style="z-index: 1000">
+				<view class="popup_wrap parkingCoupon_wrap">
+					<div class="popup_title">
+						<text>选择停车券</text>
+						<uni-icons type="clear" size="30" color="#d4d4d4" class="clear" @click="closePark"></uni-icons>
+					</div>
+					<view class="popup_content">
+						<scroll-view scroll-y="true" style="height: 500rpx;" class="scroll">
+							<view class="radio-group">
+								<view class="uni-list-cell uni-list-cell-pd" @click="parkChange(index, item)"
+									v-for="(item, index) in memberTicketList" :key="index">
+									<view style="color: #999; font-size: 28rpx;">{{item.ticketName}}</view>
+									<image v-if="item.checked" :src="localimgPic + 'car-checked.png'" mode="widthFix" />
+									<image v-else :src="localimgPic + 'pay-unchecked.png'" mode="widthFix" />
+								</view>
+							</view>
+						</scroll-view>
+						<view class="popup_button">
+							<text class="cancel_btn" @click="closePark">取消</text>
+							<text class="ok_btn" @click="doParkOK">确定</text>
+						</view>
+					</view>
+					<!-- <view v-html="formText">{{formText}}</view> -->
+				</view>
+			</uni-popup>
+		</view>
+		<!-- 积分抵扣弹窗 -->
+		<view class="integral_pop popup">
+			<uni-popup ref="integral_popup" type="bottom" class="uni-popup" style="z-index: 1000">
+				<view class="popup_wrap integral_wrap">
+					<div class="popup_title">
+            <view style="display: flex;align-items: center;justify-content: space-between;flex: 1;">
+              <text>选择积分抵扣</text>
+              <text style="color: #ed1c24;">我的积分:{{exintegral || 0}}</text>
+            </view>
+						<uni-icons type="clear" size="30" color="#d4d4d4" class="clear" @click="closeIntegral">
+						</uni-icons>
+					</div>
+					<view class="popup_content">
+						<scroll-view scroll-y="true" style="height: 500rpx;" class="scroll">
+							<radio-group class="radio-group" @change="integralChange">
+								<label class="uni-list-cell uni-list-cell-pd"
+									v-for="(item, index) in parkIntegraltomoneyList" :key="index">
+									<view style="color: #999; font-size: 28rpx;">{{item.name}}</view>
+									<view>
+										<radio :value="item.value" color="#ed1c24" />
+									</view>
+								</label>
+							</radio-group>
+						</scroll-view>
+						<view class="popup_button">
+							<text class="cancel_btn" @click="closeIntegral">取消</text>
+							<text class="ok_btn" @click="doIntegralOK">确定</text>
+						</view>
+					</view>
+				</view>
+			</uni-popup>
+		</view>
+	</scroll-view>
+</template>
+
+<script>
+	import uniPop from '@/components/uni-popup/uni-popup.vue'
+	const app = getApp()
+	export default {
+		components: {
+			uniPop
+		},
+		data() {
+			return {
+				parkOrderEntity: {}, // 停车信息
+				parkInfoEntity: {},
+				price: 0,
+				parkingCouponVal: '',
+				parkingCouponName: '',
+				integralVal: '',
+				integralName: '',
+				carno: '', // 车牌号
+				todayDiscountMoney: 0, // 今日抵扣金额
+				memberTicketList: [{
+					ticketValue: 0,
+					ticketName: '不使用'
+				}], //会员停车券
+				parkIntegraltomoneyList: [{
+					integral: 0,
+					name: '不使用',
+					value: 0
+				}], //积分抵现
+				bonus: '', // 积分
+				bonusfee: 0, // 积分抵钱
+				couponcode: '', // 停车券
+				couponfee: 0, // 停车抵钱
+				payfee: '', // 微信钱
+				ind: '', // 停车券索引
+				total: 0, // 实付款
+				localimgPic: '',
+				formText: '',
+        mallid: '',
+        exintegral: '' // 我的积分
+			}
+		},
+		// 分享好友
+		onShareAppMessage: function(res) {
+			return {
+				title: '停车缴费', // 分享标题
+				// desc: this.params.shareDescribe, // 分享描述
+				imageUrl: '', // 分享图标
+				path: `/pages/parkingFee/parkingFeeForm?carno=${this.carno}&mallid=${app.globalData.mallid}`
+			}
+		},
+		// 分享朋友圈
+		onShareTimeline: function(res) {
+			return {
+				title: '停车缴费', // 分享标题
+				// desc: this.params.shareDescribe, // 分享描述
+				imageUrl: '', // 分享图标
+				path: `/pages/parkingFee/parkingFeeForm?carno=${this.carno}&mallid=${app.globalData.mallid}`
+			}
+		},
+		onLoad(option) {
+			this.localimgPic = this.$staticPicUrl + '/wxminilocalimg/parkingFee/'
+			this.carno = option.carno
+      this.mallid = app.globalData.mallid
+			// #ifdef H5
+			app.globalData.member = JSON.parse(uni.getStorageSync('member'))
+			app.globalData.userInfo = JSON.parse(uni.getStorageSync('userinfo'))
+			app.globalData.openId = app.globalData.userInfo.openid
+      this.getTicket()
+			// #endif
+			// 场景二维码记录(是否扫码进入)
+			app.globalData.paramsScene = {}
+			this.$saveSceneQrcodeDetail('page', 'parkingFeeForm', '停车缴费', '', '', '', '')
+			this.createParkOrder()
+      this.getVoterBonus()
+		},
+		methods: {
+			// h5获取配置---公众号支付
+			getTicket: function() {
+				let self = this
+				var datas = {
+					groupId: app.globalData.groupId,
+					mallid: app.globalData.mallid,
+					url: window.location.href.split("#")[0]
+				}
+				self.$md(datas)
+				uni.request({
+					url: self.$baseURL + "api/1.0/login/getTicket",
+					method: 'POST',
+					data: datas,
+					header: JSON.parse(uni.getStorageSync('handleUser')),
+					success: (res) => {
+						if (res.data.code == 0) {
+							self.$wx.config({
+								debug: false, // 开启调试模式
+								appId: res.data.data.appId, // 必填,公众号的唯一标识
+								timestamp: res.data.data.timestamp, // 必填,生成签名的时间戳
+								nonceStr: res.data.data.nonceStr, // 必填,生成签名的随机串
+								signature: res.data.data.signature, // 必填,签名
+								jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表
+							});
+							self.$wx.ready(function() {
+								self.$wx.checkJsApi({
+									jsApiList: ['chooseWXPay'],
+									success: res => {
+										console.log('checked api:', res)
+									},
+									fail: err => {
+										console.log('check api fail:', err)
+									}
+								})
+							});
+							self.$wx.error(function(res) {
+								console.log('err', res)
+							});
+						} else {
+							uni.showToast({
+								title: res.data.msg,
+								duration: 2000,
+								icon: 'none'
+							})
+						}
+					}
+				});
+			},
+			// 获取积分
+			getVoterBonus: function() {
+				var params = {
+					groupId: app.globalData.groupId,
+					mallid: app.globalData.mallid,
+					mobile: app.globalData.member.mobile
+				}
+				this.$md(params)
+				this.$request({
+					method: "POST",
+					url: this.$baseURL + "api/1.0/member/getMemberInfo",
+					header: JSON.parse(uni.getStorageSync('handleUser')),
+					data: params,
+					}).then((r) => {
+						if (r.data.code == 0) {
+							var result = r.data.data;
+							this.exintegral = result.currnentintegral + '';
+						} else {
+							uni.showToast({
+								title: r.data.msg,
+								duration: 2000,
+								icon: 'none'
+							})
+						}
+					}).catch(err => {
+						console.log(err)
+				});
+			},
+      // 创建订单
+			createParkOrder: function() {
+        this.parkIntegraltomoneyList = []
+        this.memberTicketList = []
+				uni.showLoading({
+					title: '加载中'
+				});
+				let params = {
+					mallid: app.globalData.mallid,
+					vipcode: app.globalData.member.vipcode,
+					groupId: app.globalData.groupId,
+					carno: this.carno,
+					openId: app.globalData.openId
+				}
+				this.$md(params)
+				this.$request({
+					url: this.$baseURL + 'api/1.0/park/createParkOrder',
+					data: params,
+					method: 'POST',
+					header: JSON.parse(uni.getStorageSync('handleUser')),
+					}).then((res) => {
+						uni.hideLoading();
+						if (res.data.code === 0) {
+							const data = res.data.data
+							this.parkOrderEntity = data.parkOrderEntity
+							this.parkInfoEntity = data.parkInfoEntity
+              if (data.parkIntegraltomoneyList) {
+                this.parkIntegraltomoneyList.push(...data.parkIntegraltomoneyList)
+              }
+              console.log('积分', this.parkIntegraltomoneyList)
+              if (data.memberTicketList) {
+                this.memberTicketList.push(...data.memberTicketList)
+                this.memberTicketList.map(t => {
+                	t.checked = false
+                })
+              }
+							this.parkOrderEntity.servicefee = this.parkOrderEntity.servicefee / 100
+							this.total = this.parkOrderEntity.servicefee
+              this.bonus = 0
+              this.payfee = 0
+              this.couponfee = 0
+              this.bonusfee = 0
+              this.ind = 0
+							setTimeout(() => {
+								this.createParkOrder()
+							}, 180000)
+						} else {
+							uni.showToast({
+								title: res.data.msg,
+								duration: 2000,
+								icon: 'none'
+							})
+						}
+					}).catch(err => {
+						console.log(err)
+				});
+			},
+			// 打开停车券
+			openPark: function() {
+				this.$refs['parkingCoupon_popup'].open()
+			},
+			// 关闭停车券
+			closePark: function() {
+				this.$refs['parkingCoupon_popup'].close()
+			},
+			// 停车券选择
+			parkChange: function(index, item) {
+				item.checked = !item.checked
+				if (index === 0 && item.checked) {
+					this.memberTicketList.map(t => {
+						t.checked = false
+					})
+					this.memberTicketList[index].checked = true
+				} else {
+					this.memberTicketList[0].checked = false
+				}
+				this.ind = index
+				this.$forceUpdate()
+			},
+			// 确定停车券
+			doParkOK: function() {
+				const filter_data = this.memberTicketList.filter(t => t.checked == true && t.ticketValue !== 0)
+				if (this.todayDiscountMoney == this.parkInfoEntity.maxonedaydiscount) {
+					uni.showToast({
+						title: '今日抵扣金额上限',
+						icon: 'none'
+					})
+				} else {
+					let couponcode = ''
+					let couponfee = 0
+					if (filter_data.length === 0) { //不使用
+						this.couponfee = 0
+						this.couponcode = ''
+						let price = Math.round(this.bonusfee * 100 + this.couponfee * 100) / 100
+						this.total = Math.round((this.parkOrderEntity.servicefee - price) * 100) / 100
+						// console.log('停车券积分', this.couponcode)
+						// console.log('不使用停车券抵扣', this.couponfee)
+						// console.log('不使用停车券-价钱', this.total)
+						this.closePark()
+					} else { // 使用
+						filter_data.map(t => {
+							couponcode += t.couponCode + '#'
+							couponfee += t.ticketValue
+						})
+						this.couponfee = couponfee
+						this.couponcode = couponcode
+						let price = this.bonusfee + this.couponfee
+						if (price > this.parkInfoEntity.maxonetimediscount) {
+							uni.showToast({
+								title: '每次最多抵扣'+this.parkInfoEntity.maxonetimediscount+'元',
+								icon: 'none'
+							})
+							// 对选中不满足条件的进行删除
+							this.memberTicketList[this.ind].checked = false
+							this.couponfee = Math.round(this.couponfee - this.memberTicketList[this.ind].ticketValue)
+							let couponcodeSplit = this.couponcode.split('#')
+							couponcodeSplit.map((t, i) => {
+								if (t.couponcode === this.memberTicketList[this.ind].couponcode) {
+									couponcodeSplit.splice(i, 1)
+								}
+							})
+							this.couponcode = couponcodeSplit.join("#")
+							// console.log(this.couponcode)
+							// console.log(this.couponfee)
+						} else {
+							this.price = price
+							// 抵扣金额超出订单金额,实付款为0
+							if (this.price > this.parkOrderEntity.servicefee) {
+								this.total = 0
+							} else {
+								this.total = Math.round((this.parkOrderEntity.servicefee - price) * 100) / 100
+							}
+							// console.log('停车券积分', this.couponcode)
+							// console.log('停车券抵扣', this.couponfee)
+							// console.log('价钱', this.total)
+							this.closePark()
+						}
+					}
+				}
+			},
+			// 打开抵扣积分
+			openIntegral: function() {
+				this.$refs['integral_popup'].open()
+			},
+			// 关闭抵扣积分
+			closeIntegral: function() {
+				this.$refs['integral_popup'].close()
+			},
+			// 抵扣积分选择
+			integralChange: function(e) {
+				let val = e.detail.value
+				this.bonusfee = Number(val)
+				this.parkIntegraltomoneyList.map(t => {
+					if (t.value == val) {
+						this.bonus = t.integral
+					}
+				})
+			},
+			// 确定抵扣积分
+			doIntegralOK: function() {
+				let price = Math.round(this.bonusfee * 100 + this.couponfee * 100) / 100
+				if (this.todayDiscountMoney == this.parkInfoEntity.maxonedaydiscount) {
+					uni.showToast({
+						title: '今日抵扣金额上限',
+						icon: 'none'
+					})
+				} else {
+					if (price > this.parkInfoEntity.maxonetimediscount) {
+						uni.showToast({
+							title: '每次最多抵扣'+this.parkInfoEntity.maxonetimediscount+'元',
+							icon: 'none'
+						})
+					} else {
+						this.price = price
+						// 抵扣金额超出订单金额,实付款为0
+						if (this.price > this.parkOrderEntity.servicefee) {
+							this.total = 0
+						} else {
+							this.total = Math.round(this.parkOrderEntity.servicefee * 100 - price * 100) / 100
+						}
+						console.log('积分抵扣', this.bonusfee)
+						console.log('价钱', this.total)
+						this.closeIntegral()
+					}
+				}
+			},
+			// 支付
+			onSubmit: function() {
+				uni.showLoading({
+					title: '加载中'
+				});
+				let params = {
+					mallid: app.globalData.mallid,
+					groupId: app.globalData.groupId,
+					orderno: this.parkOrderEntity.orderno,
+					// #ifdef MP-WEIXIN
+					createuser: 'sys_miniprogram'
+					// #endif
+					// #ifdef H5
+					createuser: 'sys_gzh'
+					// #endif
+				}
+				let url = ''
+				// 是否微信支付
+				if (this.total !== 0) {
+					params.payfee = this.total * 100
+					url = 'api/1.0/park/weixinPay'
+					// 广福路
+					if (app.globalData.groupId === '1329609284362932225' && app.globalData.mallid === '000002') {
+						url = 'interfaceController/park/icbcPay'
+					}
+				} else {
+					url = 'api/1.0/park/notWeixinPay'
+				}
+				// 是否积分抵扣
+				if (this.bonus) {
+					params.bonus = this.bonus
+					params.bonusfee = this.bonusfee * 100
+				}
+				// 是否停车券抵扣
+				if (this.couponcode) {
+					params.couponcode = this.couponcode
+					params.couponfee = this.couponfee * 100
+				}
+				// 积分+卡券+微信
+				if (this.bonus && this.couponcode && this.total !== 0) {
+					params.paytype = 7
+				}
+				// 卡券+微信
+				if (!this.bonus && this.couponcode && this.total !== 0) {
+					params.paytype = 6
+				}
+				// 积分+微信
+				if (this.bonus && !this.couponcode && this.total !== 0) {
+					params.paytype = 5
+				}
+				// 积分+卡券
+				if (this.bonus && this.couponcode && this.total == 0) {
+					params.paytype = 4
+				}
+				// 微信
+				if (!this.bonus && !this.couponcode && this.total !== 0) {
+					params.paytype = 3
+				}
+				// 卡券
+				if (!this.bonus && this.couponcode && this.total == 0) {
+					params.paytype = 2
+				}
+				// 积分
+				if (this.bonus && !this.couponcode && this.total == 0) {
+					params.paytype = 1
+				}
+				console.log('支付', params)
+				this.$md(params)
+				const that = this
+				this.$request({
+					url: that.$baseURL + url,
+					data: params,
+					method: 'POST',
+					header: JSON.parse(uni.getStorageSync('handleUser')),
+					}).then((res) => {
+						uni.hideLoading();
+						if (res.data.code === 0) {
+							// 需要微信支付传参
+							if (that.total !== 0) {
+								// #ifdef MP-WEIXIN
+								var prepayJson = JSON.parse(res.data.data);
+								uni.requestPayment({
+									provider: 'wxpay',
+									timeStamp: prepayJson.timeStamp,
+									nonceStr: prepayJson.nonceStr,
+									package: prepayJson.package1,
+									signType: prepayJson.signType,
+									paySign: prepayJson.paySign,
+									success: function(res) {
+										console.log(that.parkOrderEntity.orderno)
+										uni.navigateTo({
+											url: './parkingFeeDetail?orderno=' + that
+												.parkOrderEntity.orderno
+										})
+									},
+									fail: function(err) {
+										uni.showToast({
+											title: '支付已取消!',
+											icon: 'none',
+											duration: 2000
+										})
+									}
+								});
+								// #endif
+								// #ifdef H5
+								if (app.globalData.groupId === '1329609284362932225' && app.globalData
+									.mallid === '000002') {
+									that.formText = res.data.data
+									that.$nextTick(() => {
+										document.querySelector('body').innerHTML = that.formText;
+										document.forms[0].submit()
+										// document.forms['alipaysubmit'].submit()
+										// console.log('idauto_submit_form', document.forms['alipaysubmit'])
+										// document.getElementByName('idauto_submit_form').submit()
+									})
+								} else {
+									var prepayJson = JSON.parse(res.data.data);
+									that.$wx.chooseWXPay({
+										timestamp: result.prepayId.timeStamp, // 支付签名时间戳
+										nonceStr: result.prepayId.nonceStr, // 支付签名随机串,不长于 32 位
+										package: result.prepayId
+										.package1, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
+										signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
+										paySign: result.prepayId.paySign, // 支付签名
+										success(res) {
+											// 支付成功后的回调函数
+											console.log(that.parkOrderEntity.orderno)
+											uni.navigateTo({
+												url: './parkingFeeDetail?orderno=' + that
+													.parkOrderEntity.orderno
+											})
+											// cb(res);
+										},
+										fail(err) {
+											uni.showToast({
+												title: '支付已取消!',
+												icon: 'none',
+												duration: 2000
+											})
+										}
+									});
+								}
+								// #endif
+							} else {
+								uni.navigateTo({
+									url: './parkingFeeDetail?orderno=' + that.parkOrderEntity
+										.orderno
+								})
+							}
+						} else {
+							uni.showToast({
+								title: res.data.msg,
+								duration: 2000,
+								icon: 'none'
+							})
+						}
+					}).catch(err => {
+						console.log(err)
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	.scroll-Y {
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		height: 100vh;
+		background: #f2f2f2;
+	}
+
+	.wrap {
+		display: flex;
+		flex-direction: column;
+		width: 100%;
+
+		.form {
+			margin-top: 10rpx;
+			display: flex;
+			flex-direction: column;
+			background: #fff;
+
+			.form-item {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 25rpx 35rpx;
+				box-sizing: border-box;
+				border-bottom: 1px solid #f2f2f2;
+
+				text {
+					font-size: 28rpx;
+					color: #999;
+				}
+
+				.label {
+					color: #000;
+				}
+
+				view {
+					display: flex;
+					align-items: center;
+				}
+			}
+		}
+
+		.tip {
+			padding: 17rpx 38rpx;
+			color: #999;
+			font-size: 28rpx;
+
+			text {
+				color: #999;
+				font-size: 28rpx;
+			}
+		}
+	}
+
+	// 底部导航
+	.submit_bar {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		z-index: 99;
+		width: 100%;
+		padding-bottom: env(safe-area-inset-bottom);
+		background-color: #fff;
+		user-select: none;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		.submit_text {
+			padding: 0 40rpx;
+			box-sizing: border-box;
+			display: flex;
+			flex-direction: column;
+			flex: 1;
+
+			text {
+				font-size: 28rpx;
+				color: #999;
+			}
+
+			.text_top {
+				display: flex;
+				align-items: center;
+
+				text {
+					color: #000;
+				}
+
+				.price {
+					color: #ed1c24;
+					font-size: 30rpx;
+				}
+			}
+
+			.text_bottom {}
+		}
+
+		button {
+			margin: 0;
+			padding: 0;
+			height: 100rpx;
+			background: linear-gradient(to right, #ff6034, #ee0a24);
+			width: 220rpx;
+			font-weight: 500;
+			border: none;
+			border-radius: 0;
+			line-height: 100rpx;
+			text-align: center;
+			transition: opacity .2s;
+		}
+	}
+
+	// 弹窗
+	.popup {
+		.popup_wrap {
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			background: #fff;
+			border-radius: 20rpx 20rpx 0 0;
+
+			text {
+				color: #999;
+				font-size: 28rpx;
+			}
+		}
+
+		.popup_title {
+			width: 100%;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding: 30rpx 42rpx;
+			box-sizing: border-box;
+			border-bottom: 1px solid #f2f2f2;
+		}
+
+		.popup_content {
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			flex: 1;
+
+			.radio-group {
+				display: flex;
+				flex-direction: column;
+				width: 100%;
+				padding: 0 42rpx;
+				box-sizing: border-box;
+
+				image {
+					width: 48rpx;
+					height: 48rpx;
+				}
+
+				.uni-list-cell-pd {
+					display: flex;
+					justify-content: space-between;
+					padding: 42rpx 0;
+					box-sizing: border-box;
+					align-items: center;
+					border-bottom: 1px solid #f2f2f2;
+					margin: 0;
+
+					.radio {
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						width: 100%;
+					}
+				}
+			}
+		}
+
+		.popup_button {
+			width: 100%;
+			display: flex;
+			align-items: center;
+
+			text {
+				width: 50%;
+				height: 110rpx;
+				line-height: 110rpx;
+				text-align: center;
+			}
+
+			.cancel_btn {
+				background: #fff;
+				color: #ed1c24;
+			}
+
+			.ok_btn {
+				background: #ed1c24;
+				color: #fff;
+			}
+		}
+	}
+</style>

+ 97 - 0
src/crmPages/parkingFeeHint/parkingFeeHint.vue

@@ -0,0 +1,97 @@
+<template>
+	<view class="box">
+    <wx-points-commit ref='wxPointsCommit'></wx-points-commit>
+
+		<image :src="custTypeId === 0 ? '../static/images/rent.png' : `${picUrl}parkingFee/rent-${colorAry[custTypeId - 1]}.png`" v-if="custTypeId >= 0"/>
+		<view>[月租车,可直接离场]</view>
+		<uni-button type="primary" :class="{'searchPrice': true, 'blueSearchPrice': custTypeId === 1, 'greenSearchPrice': custTypeId === 2}" @click="search">重新查询</uni-button>
+	</view>
+</template>
+
+<script>
+	import { mapState } from 'vuex'
+	const app = getApp();
+	export default {
+		onLoad(params) {
+			this.carno = params.carno;
+		},
+		data() {
+			return {
+				carno: '',
+				picUrl: this.$picUrl,
+				colorAry: ['blue', 'green']
+			}
+		},
+		computed: {
+			...mapState({
+				custTypeId: state => state.custTypeId
+			})
+		},
+		methods: {
+			search() {
+				uni.navigateBack();
+				// const params = {
+				// 	carno: this.carno,
+				// 	mallid: app.globalData.mallid,
+				// 	openid: app.globalData.openId,
+				// 	vipcode: app.globalData.member.vipcode,
+        //   groupId: app.globalData.groupId,
+        //   createuser: "sys_miniprogram",
+				// }
+				// this.$md(params)
+				// uni.request({
+				// 	url: this.$baseURL + 'api/1.0/park/checkCarIsInPark',
+				// 	data: params,
+				// 	method: 'POST',
+				// 	header: JSON.parse(uni.getStorageSync('handleUser')),
+				// 	success: (res) => {
+				// 		uni.hideLoading();
+				// 		if (res.data.code === 0) {
+				// 			uni.navigateTo({
+				// 				url: '../parkingFeeDetail?carno=' + this.carno
+				// 			})
+				// 		}
+				// 	}
+				// });
+			}
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	@import '../../../styles/common.less';
+.box {
+	text-align: center;
+	image {
+		width: 200rpx;
+		height: 200rpx;
+		margin-top: 200rpx;
+	}
+	view {
+		margin-top: 20rpx;
+		font-weight:bold;
+	}
+	.searchPrice {
+		color: #fff !important;
+		margin: 0 auto;
+		margin-top: 40rpx;
+		height: 90rpx;
+		width: 80%;
+		line-height: 90rpx;
+		border-radius: 80rpx;
+		font-size: 17px;
+		background-image: linear-gradient(to right, #7e4fa1 , #433c7f);
+	}
+	.blueSearchPrice {
+		.colorSearchPrice('blue')
+	}
+	.greenSearchPrice {
+		.colorSearchPrice('green')
+	}
+	.colorSearchPrice(@value) {
+		@color: 'color-@{value}';
+		background-image: none;
+		background-color: @@color;
+	}
+}
+</style>

+ 329 - 0
src/crmPages/parkingFeeList.vue

@@ -0,0 +1,329 @@
+<template>
+  <scroll-view
+    class="scroll-Y"
+    id="slideview"
+    scroll-y
+    lower-threshold="50"
+    scroll-top="0"
+    scroll-left="0"
+    scroll-with-animation="false"
+    enable-back-to-top="false"
+    @scrolltolower="bindscrolltolower"
+  >
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+<!--    <authorize ref="authorize"></authorize>-->
+    <view
+      class="choice_card"
+      v-for="(item, index) in list"
+      :key="index"
+      @click="toDetail(item.orderno)"
+    >
+      <view
+        class="choice_card_index choice_card_index1"
+        style="font-size: 30rpx; margin: 0 12rpx"
+      >
+        <view style="margin-left: 6rpx">{{
+          item.orderno + '-' + item.carno
+        }}</view>
+        <view style="color: red; margin-right: 6rpx">{{
+          (item.servicefee / 100) | currency
+        }}</view>
+      </view>
+
+      <view class="choice_card_index choice_card_index2">{{
+        item.parkname
+      }}</view>
+      <view class="choice_card_index choice_card_index3">
+        <view>入场时间 : {{ item.entertime }}</view>
+        <view style="margin-right: 20rpx">
+          <uni-icons
+            class="align-top"
+            color="#B3B3B3"
+            size="14"
+            type="arrowright"
+          />
+        </view>
+      </view>
+      <view
+        class="choice_card_index choice_card_index3"
+        style="padding-bottom: 20rpx"
+      >
+        <view>停车时长 : {{ item.serviceMin | parkingTime }}</view>
+        <view style="margin-right: 20rpx">
+          {{
+            item.refundStatus === 1
+              ? '已退款'
+              : item.payStatus === 1
+              ? '支付成功'
+              : '支付失败'
+          }}
+        </view>
+      </view>
+    </view>
+    <view class="notice-info">
+      <view>{{ list.length === 4 ? '查看更多' : '没有更多数据了' }}</view>
+      <uni-icons
+        v-if="list.length === 4"
+        type="arrowdown"
+        size="14"
+        color="##b5b3b3"
+      ></uni-icons>
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+let canloading = true;
+let pageNum = 1;
+import authorize from '@/components/authorize/authorize.vue';
+export default {
+  components: {
+    authorize,
+  },
+  data() {
+    return {
+      list: [],
+    };
+  },
+  // 分享
+  onShareAppMessage() {
+    return {
+      title: '缴费记录', // 标题
+      path: '/pages/parkingFee/parkingFeeList?mallid=' + app.globalData.mallid,
+      imageUrl: '', // 图标
+    };
+  },
+  // 分享
+  onShareTimeline() {
+    return {
+      title: '缴费记录', // 标题
+      path: '/pages/parkingFee/parkingFeeList?mallid=' + app.globalData.mallid,
+      imageUrl: '', // 图标
+    };
+  },
+  onLoad: function () {
+    // 埋点初始化
+    // this.parkingTrack = new this.$trackFactory('parking_query_payment', {})
+    // this.parkingTrack.track(1)
+  },
+  onShow: function () {
+    this.list = [];
+    // 重新获取数据
+    canloading = true;
+    pageNum = 1;
+    const member = uni.getStorageSync('member');
+    if (member) {
+      this.loadData();
+    } else {
+      this.$refs.authorize.login('/pages/parkingFee/parkingFee', () => {
+        this.loadData();
+      });
+    }
+  },
+  // onReachBottom: function() {
+  //   console.log('canloading', canloading)
+  //   if (canloading) {
+  //     pageNum++
+  //     this.loadData()
+  //   }
+  // },
+  filters: {
+    parkingTime(val) {
+      const days = parseInt(val / 60 / 24);
+      const hours = parseInt((val / 60) % 24);
+      const minutes = parseInt(val % 60);
+      if (days > 0) {
+        return `${days}天 ${hours}小时 ${minutes}分钟`;
+      }
+      if (hours > 0) {
+        return `${hours}小时 ${minutes}分钟`;
+      }
+      return `${minutes}分钟`;
+    },
+  },
+  methods: {
+    bindscrolltolower: function () {
+      if (canloading) {
+        pageNum++;
+        this.loadData();
+      }
+    },
+    // 获取停车记录
+    loadData: function () {
+      canloading = false;
+      const params = {
+        mallid: app.globalData.mallid,
+        vipcode: app.globalData.member?.vipcode,
+        openId: app.globalData.openId,
+        page: pageNum || 1,
+        pageSize: 4,
+      };
+      uni.showLoading({
+        title: '加载中',
+      });
+      this.$md(params);
+      uni.request({
+        url: this.$baseURL + 'api/1.0/park/parkOrderList',
+        data: params,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          uni.hideLoading();
+          if (res.data.code !== 0) {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+            this.initPage();
+          } else {
+            // // 点击缴费记录埋点
+            // res.data.data.forEach(element => {
+            // 	this.parkingTrack.track(101, {
+            // 	plate_num: element.carno,
+            // 	query_time: element.createDate
+            // })
+            // });
+
+            // 合并数据
+            const records = res.data.data || [];
+            if (records.length) {
+              const list = this.list;
+              this.list = [...list, ...records];
+            } else {
+              this.initPage();
+            }
+          }
+          canloading = true;
+        },
+        fail: (err) => {
+          uni.hideLoading();
+          canloading = true;
+          this.initPage();
+          uni.showToast({
+            title: res.data.msg,
+            duration: 2000,
+            icon: 'none',
+          });
+        },
+      });
+    },
+    // 页码复原
+    initPage: function () {
+      pageNum--;
+      if (pageNum <= 0) {
+        pageNum = 0;
+      }
+    },
+    // 查看详情
+    toDetail(orderno) {
+      uni.navigateTo({
+        url: './parkingFeeDetailSuccess?orderNo=' + orderno,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+}
+
+.wrap {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+}
+
+.parkingFeeList-item {
+  background: #fff;
+  display: flex;
+  flex-direction: column;
+  margin-top: 8rpx;
+
+  .item {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 30rpx 36rpx;
+    box-sizing: border-box;
+
+    text {
+      font-size: 16px;
+    }
+  }
+
+  .item-bottom {
+    border-top: 1px solid #f2f2f2;
+    display: flex;
+    flex-direction: column;
+    padding: 0rpx 36rpx;
+    box-sizing: border-box;
+    padding-top: 8px;
+
+    view {
+      display: flex;
+      flex-direction: column;
+    }
+
+    text {
+      color: #999;
+      font-size: 14px;
+      margin-bottom: 10px;
+    }
+  }
+}
+
+.choice_card {
+  width: 92%;
+  margin-left: 4%;
+  margin-top: 30rpx;
+  margin-bottom: 30rpx;
+  border-radius: 20rpx;
+  background-color: #fff;
+  position: relative;
+  .choice_card_index {
+    margin-left: 18rpx;
+    padding-top: 6rpx;
+    padding-bottom: 6rpx;
+    font-size: 28rpx;
+  }
+  .choice_card_index1 {
+    border-bottom: 1px solid #f2f2f2;
+    display: flex;
+    align-items: center;
+    padding-top: 22rpx;
+    padding-bottom: 22rpx;
+    justify-content: space-between;
+  }
+  .choice_card_index2 {
+    padding-top: 20rpx;
+    color: #808080;
+  }
+  .choice_card_index3 {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    color: #808080;
+  }
+  .choice_card_index4 {
+    color: #808080;
+    padding-bottom: 20rpx;
+  }
+}
+.notice-info {
+  text-align: center;
+  color: #b5b3b3;
+  padding-bottom: 30px;
+  view {
+    margin-bottom: -7px;
+  }
+}
+</style>

+ 439 - 0
src/crmPages/parkingFeePaperCoupon.vue

@@ -0,0 +1,439 @@
+<template>
+  <scroll-view scroll-y="true" class="scroll-Y">
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="worp">
+      <view style="font-size: 32rpx">纸质优惠劵减免说明</view>
+      <view style="font-size: 28rpx; color: #808080; padding-top: 12rpx">{{
+        parkPaperCouponRemark
+      }}</view>
+    </view>
+    <template v-if="paperCouponList.length">
+      <view
+        class="worp_index1"
+        v-for="(item, index) in paperCouponList"
+        :key="item.discountCode"
+      >
+        <view class="worp_index1_index">
+          <view class="content">劵码 {{ item.discountCode }}</view>
+          <view @click="deleteCoupon(index)"
+            ><image
+              src="static/images/delete.png"
+              style="width: 30rpx; height: 30rpx; margin-right: 20rpx"
+          /></view>
+        </view>
+        <view
+          style="
+            padding-bottom: 25rpx;
+            margin-left: 20rpx;
+            margin-top: 20rpx;
+            font-size: 28rpx;
+          "
+          >优惠劵金额 :<text style="color: #ed1c24">{{
+            item.discountValueMoney | currency
+          }}</text></view
+        >
+      </view>
+    </template>
+
+    <view
+      :class="{
+        worp_button: true,
+        blue_flewx_index3: custTypeId === 1,
+        green_flewx_index3: custTypeId === 2,
+      }"
+      @click="scanCode"
+    >
+      <image
+        src="static/images/sweep.png"
+        style="width: 35rpx; height: 35rpx; margin-right: 20rpx"
+      />
+      <view>扫码用劵</view>
+    </view>
+    <view class="flewx">
+      <view class="flewx-content"
+        >应付<text style="color: red; font-size: 32rpx; padding-left: 20rpx">{{
+          actualFee | currency
+        }}</text>
+        元
+        <text style="color: #8d8d8d; padding-left: 30rpx; font-size: 28rpx"
+          >已优惠{{ discountFee | currency }}元</text
+        ></view
+      >
+      <view
+        :class="{
+          flewx_index3: true,
+          blue_flewx_index3: custTypeId === 1,
+          green_flewx_index3: custTypeId === 2,
+          'btn-disabled': !parkInfo.servicefee,
+        }"
+        @click="confirm"
+        >确定</view
+      >
+    </view>
+    <!-- 新的toast -->
+    <fui-toast ref="toast"></fui-toast>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import { mapState } from 'vuex';
+import fuiToast from '@/components/fui-toast/fui-toast.vue';
+
+export default {
+  components: {
+    fuiToast,
+  },
+  onLoad() {
+    this.servicefee = uni.getStorageSync('servicefee'); // 应缴金额
+    this.parkDiscountTotal = uni.getStorageSync('parkingTotal'); // 总停车优惠
+    if (uni.getStorageSync('parkFee')) {
+      this.parkFee = JSON.parse(uni.getStorageSync('parkFee')); // discount接口返回的数据
+      this.parkMallCode = this.parkFee.parkInfoEntity.parkMallCode;
+      // 上限金额
+      this.maxonetimediscountFee =
+        this.parkFee.parkInfoEntity.maxonetimediscount *
+        this.parkFee.parkInfoEntity.needmoney;
+      this.maxonedaydiscountFee =
+        (this.parkFee.parkInfoEntity.maxOneDayHour -
+          this.parkFee.parkInfoEntity.ticketandMemeberGradeAndConsumeUseHour) *
+          this.parkFee.parkInfoEntity.needmoney || 0;
+      if (this.maxonedaydiscountFee < 0) {
+        this.maxonedaydiscountFee = 0;
+      }
+
+      // 纸质优惠券说明
+      if (
+        this.parkFee.parkPaperCouponsEntities &&
+        this.parkFee.parkPaperCouponsEntities[0]
+      ) {
+        this.parkPaperCouponRemark =
+          this.parkFee.parkPaperCouponsEntities[0].remark;
+      }
+    }
+
+    // 本页面数据缓存
+    this.paperCouponInfo = uni.getStorageSync('paperCouponInfo');
+    if (this.paperCouponInfo && this.paperCouponInfo.paperCouponList) {
+      this.paperCouponList = this.paperCouponInfo.paperCouponList;
+      this.paperDiscountFee = this.paperCouponInfo.paperDiscountFee;
+      this.paperDiscountTime = this.paperCouponInfo.paperDiscountTime;
+      this.parkDiscountTotal.feeCopy -= this.paperCouponInfo.paperDiscountFee;
+    }
+  },
+  data() {
+    return {
+      parkFee: {}, // 停车规则相关信息
+      parkPaperCouponRemark: '', // 纸质优惠券说明
+      servicefee: 0, // 应缴金额
+      paperDiscountFee: 0, // 纸质优惠券减免金额
+      paperDiscountTime: 0, // 纸质优惠券减免时长
+      parkDiscountTotal: {}, // 总停车优惠
+      paperCouponList: [], // 纸质券list
+      paperCouponInfo: {}, // 页面缓存
+      maxonetimediscountFee: 0, // 每次优惠上限金额
+      maxonedaydiscountFee: 0, // 每天优惠上限金额
+      parkMallCode: 1, // 0静安 1浦东 2杭州 3北京 4沈阳 5深圳 6天津
+    };
+  },
+  computed: {
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+    // 实际支付金额
+    actualFee() {
+      const fee = this.servicefee - this.discountFee;
+      return fee > 0 ? fee : 0;
+    },
+    // 已优惠金额
+    discountFee() {
+      // 超出上限按上限计算
+      if (this.parkMallCode === 1) {
+        if (this.parkDiscountTotal.feeCopy > this.maxonetimediscountFee) {
+          this.parkDiscountTotal.feeCopy = this.maxonetimediscountFee;
+        }
+      }
+      if (this.parkMallCode === 4 || this.parkMallCode === 6) {
+        if (
+          this.parkDiscountTotal.feeCopy - this.parkDiscountTotal.bonusfee >
+          this.maxonedaydiscountFee
+        ) {
+          this.parkDiscountTotal.feeCopy =
+            this.maxonedaydiscountFee + this.parkDiscountTotal.bonusfee;
+        }
+      }
+      return this.parkDiscountTotal.feeCopy + this.paperDiscountFee;
+    },
+  },
+  methods: {
+    showToast(text) {
+      let options = {};
+      options.text = text;
+      this.$refs.toast.show(options);
+    },
+    // 扫码
+    scanCode() {
+      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);
+              }
+            }
+          }
+        },
+      });
+    },
+
+    // 根据卡券ID查询卡券信息
+    getPaperCouponInfo(couponCode) {
+      uni.showLoading({
+        title: '加载中',
+      });
+      const params = {
+        groupId: app.globalData.groupId,
+        mallid: app.globalData.mallid,
+        couponcode: couponCode,
+        orderno: uni.getStorageSync('orderno'),
+      };
+      this.$md(params);
+      uni.request({
+        url: this.$baseURL + 'api/1.0/park/queryTicketCount',
+        data: params,
+        method: 'POST',
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          uni.hideLoading();
+          // console.log(res);
+          if (res.data.code !== 0) {
+            // return uni.showToast({
+            // 	title: res.data.msg,
+            // 	duration: 2000,
+            // 	icon: 'none'
+            // })
+            return this.showToast(res.data.msg);
+          }
+          if (res.data.data.type === 2) {
+            if (res.data.data.discountType == '0') {
+              return uni.showToast({
+                title: '该纸质优惠券未激活',
+                duration: 2000,
+                icon: 'none',
+              });
+            }
+            if (res.data.data.discountRuleId == '1') {
+              return uni.showToast({
+                title: '该纸质优惠券已领取',
+                duration: 2000,
+                icon: 'none',
+              });
+            }
+            if (res.data.data.discountRuleId == '2') {
+              return uni.showToast({
+                title: '该纸质优惠券已使用',
+                duration: 2000,
+                icon: 'none',
+              });
+            }
+            if (res.data.data.discountRuleId == '3') {
+              return uni.showToast({
+                title: '该纸质优惠券已核销',
+                duration: 2000,
+                icon: 'none',
+              });
+            }
+          }
+          if (this.paperCouponList.length) {
+            const index = this.paperCouponList.findIndex(
+              (e) => e.discountCode === couponCode
+            );
+            if (index === -1) {
+              this.paperCouponList.push(res.data.data);
+              this.paperDiscountFee += Number(res.data.data.discountValueMoney);
+              this.paperDiscountTime =
+                this.paperDiscountFee / this.parkFee.parkInfoEntity.needmoney;
+            }
+          } else {
+            this.paperCouponList.push(res.data.data);
+            this.paperDiscountFee += Number(res.data.data.discountValueMoney);
+            this.paperDiscountTime =
+              this.paperDiscountFee / this.parkFee.parkInfoEntity.needmoney;
+          }
+          // this.crossMessage();
+        },
+        fail: (err) => {
+          uni.hideLoading();
+          console.log(err);
+        },
+      });
+    },
+
+    // 删除
+    deleteCoupon(i) {
+      this.paperDiscountFee -= Number(
+        this.paperCouponList[i].discountValueMoney
+      );
+      this.paperDiscountTime =
+        this.paperDiscountFee / this.parkFee.parkInfoEntity.needmoney;
+      this.paperCouponList.splice(i, 1);
+    },
+
+    /**
+     * 2021-12-24 微信小群确定取消纸质券限制
+     */
+    // 超限提示
+    // crossMessage() {
+    // 	let totalFee = this.parkDiscountTotal.feeCopy;
+    // 	if (this.paperCouponInfo && this.paperCouponInfo.paperDiscountFee !== 0) {
+    // 		totalFee += this.paperDiscountFee - this.paperCouponInfo.paperDiscountFee;
+    // 	} else {
+    // 		totalFee += this.paperDiscountFee;
+    // 	}
+    // 	// 是否受每次最大优惠限制(浦东)
+    // 	if (this.parkFee.parkPaperCouponsEntities[0].isMaxLimit !== 1) {
+    // 		if (totalFee > this.maxonetimediscountFee) {
+    // 			return uni.showToast({
+    // 				title: `超出抵扣上限,每次最高可抵扣${this.parkFee.parkInfoEntity.maxonetimediscount}小时`,
+    // 				icon: 'none'
+    // 			});
+    // 		}
+    // 	}
+    // 	// 浦东总优惠不包含纸质券
+    // 	if (this.parkMallCode !== 1) {
+    // 		if (totalFee > this.maxonedaydiscountFee) {
+    // 			return uni.showToast({
+    // 				title: `超出抵扣上限,每天最高可抵扣${this.parkFee.parkInfoEntity.maxonedaydiscount}小时`,
+    // 				icon: 'none'
+    // 			});
+    // 		}
+    // 	}
+    // },
+
+    // 确认
+    confirm() {
+      let paperCouponcode = '';
+      this.paperCouponList.forEach((e, i) => {
+        if (i === this.paperCouponList.length - 1) {
+          paperCouponcode += e.discountCode;
+        } else {
+          paperCouponcode += e.discountCode + '#';
+        }
+      });
+      uni.setStorageSync('paperCouponInfo', {
+        paperDiscountFee: this.paperDiscountFee,
+        paperDiscountTime: this.paperDiscountTime,
+        paperCouponcode: paperCouponcode,
+        paperCouponList: this.paperCouponList,
+      });
+      uni.navigateBack();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f1f1f1;
+}
+.worp {
+  padding-left: 30rpx;
+  margin-top: 30rpx;
+  overflow: hidden;
+}
+.worp_index1 {
+  width: 92%;
+  background-color: #fff;
+  margin-top: 30rpx;
+  border-radius: 10rpx;
+  margin-left: 4%;
+  font-size: 30rpx;
+}
+.worp_index1_index {
+  width: 650rpx;
+  height: 60rpx;
+  margin-left: 20rpx;
+  border-bottom: 1px solid #f2f2f2;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding-top: 10rpx;
+  .content {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+  }
+}
+.worp_button {
+  width: 690rpx;
+  height: 80rpx;
+  border-radius: 50rpx;
+  text-align: center;
+  font-size: 30rpx;
+  line-height: 80rpx;
+  color: #fff;
+  margin-top: 40rpx;
+  background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+  margin-left: 30rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.flewx {
+  width: 100%;
+  height: 100rpx;
+  background-color: #fff;
+  position: fixed;
+  bottom: 0;
+  display: flex;
+  align-items: center;
+  // padding-bottom: constant(safe-area-inset-bottom);
+  // padding-bottom: env(safe-area-inset-bottom);
+  padding-bottom: 20rpx;
+  .flewx-content {
+    position: absolute;
+    left: 16px;
+  }
+  .flewx_index3 {
+    width: 150rpx;
+    height: 70rpx;
+    border-radius: 50rpx;
+    text-align: center;
+    font-size: 28rpx;
+    line-height: 70rpx;
+    color: #fff;
+    background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+    box-shadow: 2px 3px 5px #888888;
+    position: absolute;
+    right: 16px;
+  }
+}
+.blue_flewx_index3 {
+  .color_flewx_index3('blue');
+}
+.green_flewx_index3 {
+  .color_flewx_index3('green');
+}
+.color_flewx_index3(@value) {
+  @color: 'color-@{value}';
+  background-image: none !important;
+  background-color: @@color !important;
+}
+</style>

+ 98 - 0
src/crmPages/parkingFeePayment.vue

@@ -0,0 +1,98 @@
+<template>
+	<view class="box">
+    <wx-points-commit ref='wxPointsCommit'></wx-points-commit>
+
+		<image :src="custTypeId === 0 ? './static/images/icon1.png' : `${picUrl}parkingFee/icon-car-${colorAry[custTypeId - 1]}.png`" v-if="custTypeId >= 0"/>
+		<view>{{carno | formatCarno}}<br/>{{msg}}</view>
+		<uni-button type="primary" :class="{'searchPrice': true, 'blueSearchPrice': custTypeId === 1, 'greenSearchPrice': custTypeId === 2}" @click="search">重新查询</uni-button>
+	</view>
+</template>
+
+<script>
+	import { mapState } from 'vuex'
+	const app = getApp();
+	export default {
+		onLoad(params) {
+			this.msg = params.msg;
+			this.carno = params.carno;
+		},
+		data() {
+			return {
+				msg: '',
+				carno: '',
+				picUrl: this.$picUrl,
+				colorAry: ['blue', 'green']
+			}
+		},
+		computed: {
+			...mapState({
+				custTypeId: state => state.custTypeId
+			})
+		},
+		methods: {
+			search() {
+				uni.navigateBack();
+				// const params = {
+				// 	carno: this.carno,
+				// 	mallid: app.globalData.mallid,
+				// 	openid: app.globalData.openId,
+				// 	vipcode: app.globalData.member.vipcode,
+        //   groupId: app.globalData.groupId,
+        //   createuser: "sys_miniprogram",
+				// }
+				// this.$md(params)
+				// uni.request({
+				// 	url: this.$baseURL + 'api/1.0/park/checkCarIsInPark',
+				// 	data: params,
+				// 	method: 'POST',
+				// 	header: JSON.parse(uni.getStorageSync('handleUser')),
+				// 	success: (res) => {
+				// 		uni.hideLoading();
+				// 		if (res.data.code === 0) {
+				// 			uni.navigateTo({
+				// 				url: './parkingFeeDetail?carno=' + this.carno
+				// 			})
+				// 		}
+				// 	}
+				// });
+			}
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	@import '../../styles/common.less';
+.box {
+	text-align: center;
+	image {
+		width: 200rpx;
+		height: 200rpx;
+		margin-top: 200rpx;
+	}
+	view {
+		margin-top: 20rpx;
+	}
+	.searchPrice {
+		color: #fff !important;
+		margin: 0 auto;
+		margin-top: 40rpx;
+		height: 90rpx;
+		width: 80%;
+		line-height: 90rpx;
+		border-radius: 80rpx;
+		font-size: 17px;
+		background-image: linear-gradient(to right, #7e4fa1 , #433c7f);
+	}
+	.blueSearchPrice {
+		.colorSearchPrice('blue');
+	}
+	.greenSearchPrice {
+		.colorSearchPrice('green');
+	}
+	.colorSearchPrice(@value) {
+		@color: 'color-@{value}';
+		background-image: none;
+		background-color: @@color;
+	}
+}
+</style>

+ 157 - 0
src/crmPages/parkingFeeSuccess.vue

@@ -0,0 +1,157 @@
+<template>
+  <scroll-view scroll-y="true" class="scroll-Y">
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <image :src="icon"></image>
+    <view style="font-weight: bold; font-size: 32rpx">[支付成功]</view>
+    <view style="font-size: 30rpx; color: #888888; margin-top: 10rpx"
+      >{{ carno | formatCarno }}停车费支付成功</view
+    >
+    <view style="font-size: 30rpx; color: #888888; margin-top: 10rpx"
+      >请在<text style="color: red">{{ outParkCharging }}分钟</text>内离场</view
+    >
+    <view
+      :class="{
+        page_button: true,
+        blue_page_button: custTypeId === 1,
+        green_page_button: custTypeId === 2,
+      }"
+      @click="page_button"
+      >查看缴费记录</view
+    >
+    <view
+      :class="{
+        page_button1: true,
+        blue_page_button1: custTypeId === 1,
+        green_page_button1: custTypeId === 2,
+      }"
+      @click="page_button1"
+      >返回首页</view
+    >
+  </scroll-view>
+</template>
+
+<script>
+import payIcon from './static/images/hint.png';
+import { mapState } from 'vuex';
+export default {
+  onLoad(params) {
+    const parkInfo = JSON.parse(uni.getStorageSync('parkinfo'));
+    const actualFee = uni.getStorageSync('actualFee');
+    const bonus = uni.getStorageSync('bonus');
+    this.parkingTrack = new this.$trackFactory('parking_pay_order', {});
+    this.parkingTrack.track(1);
+    this.parkingTrack.track(200, {
+      order_id: parkInfo.orderno,
+      plate_type: 1,
+      plate_num: parkInfo.carno,
+      area: parkInfo.parkname,
+      parking_duration: parkInfo.servicehour * 3600,
+      start_time: parkInfo.createDate,
+      total_amount: (parkInfo.servicefee / 100).toFixed(2),
+      pay_amount: actualFee,
+      // total_point: this.parkInfo.parkname,
+      pay_point: bonus,
+      coupon_type: parkInfo.paykind || '',
+      coupon_id: parkInfo.couponcode || '',
+      // coupon_name: this.parkInfo.parkname,
+      coupon_value: parkInfo.bonusfee || 0,
+      pay_type: parkInfo.paytype || '',
+      pay_time: parkInfo.createDate || '',
+    });
+    this.carno = params.carno;
+    if (parkInfo && parkInfo.outParkCharging) {
+      this.outParkCharging = parkInfo.outParkCharging;
+    }
+  },
+  data() {
+    return {
+      parkingTrack: null,
+      carno: '',
+      outParkCharging: 15,
+      blueIcon: this.$picUrl + '/images/icon-success-blue.png',
+      greenIcon: this.$picUrl + '/images/icon-success-green.png',
+    };
+  },
+  computed: {
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+    icon() {
+      return this.custTypeId === 0
+        ? payIcon
+        : this.custTypeId === 1
+        ? this.blueIcon
+        : this.greenIcon;
+    },
+  },
+  methods: {
+    page_button() {
+      uni.redirectTo({
+        url: './parkingFeeList',
+      });
+    },
+    page_button1() {
+      uni.redirectTo({
+        url: '/pages/automatic/automaticIndex',
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #fff;
+  text-align: center;
+  image {
+    width: 160rpx;
+    height: 160rpx;
+    margin-top: 250rpx;
+  }
+}
+.page_button {
+  width: 86%;
+  height: 80rpx;
+  line-height: 80rpx;
+  border-radius: 40rpx;
+  margin-top: 40rpx;
+  margin-left: 7%;
+  font-size: 30rpx;
+  color: #fff;
+  background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+}
+.blue_page_button {
+  .color-background-color('blue');
+}
+.green_page_button {
+  .color-background-color('green');
+}
+.page_button1 {
+  width: 86%;
+  height: 80rpx;
+  line-height: 80rpx;
+  border-radius: 40rpx;
+  margin-top: 40rpx;
+  margin-left: 7%;
+  font-size: 30rpx;
+  color: #7e4fa1;
+  border: 1rpx solid #7e4fa1;
+}
+.style-color(@value) {
+  @color: 'color-@{value}';
+  color: @@color;
+  border-color: @@color;
+}
+.blue_page_button1 {
+  .style-color('blue');
+}
+.green_page_button1 {
+  .style-color('green');
+}
+</style>

+ 714 - 0
src/crmPages/parkingReceipt/parkingApplication.vue

@@ -0,0 +1,714 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <scroll-view class="push-box">
+      <view class="choose-invoice-header lines" @click="changeHeader">
+        <view class="invoice-header-info" v-if="headerInfo.invoiceTitleName">
+          <view
+            class="invoice-header-name"
+            :class="headerInfo.invoiceTitleType == 1 ? 'header-name' : ''"
+          >
+            <view>
+              {{ headerInfo.invoiceTitleName }}
+              <text class="isDefault" v-if="headerInfo.setDefault == 1"
+                >默认</text
+              >
+            </view>
+            <image
+              class="invoice-header-arrow"
+              :src="arrowIcon"
+              mode="widthFix"
+            ></image>
+          </view>
+          <view v-if="headerInfo.invoiceTitleType == 0" class="duty-paragraph"
+            >税号:{{ headerInfo.corporationTax }}</view
+          >
+        </view>
+        <view class="invoice-header-info" v-else>
+          <view class="invoice-header-name">
+            <view>请选择发票抬头</view>
+            <image
+              class="invoice-header-arrow"
+              :src="arrowIcon"
+              mode="widthFix"
+            ></image>
+          </view>
+          <view class="duty-paragraph">未选择发票抬头</view>
+        </view>
+      </view>
+      <view class="tab-header" v-if="headerInfo.invoiceTitleName"
+        >发票详情</view
+      >
+      <view class="part" v-if="headerInfo.invoiceTitleName">
+        <view class="invoice-header">
+          <!-- <view class="part-item">
+          			<text class="part-item-key">开票订单号</text>
+          			<text class="part-item-value">{{ orderInfo.orderNo }}</text>
+          		</view> -->
+          <view class="part-item">
+            <text class="part-item-key">发票类型</text>
+            <text class="part-item-value">增值税普通发票</text>
+          </view>
+          <view class="part-item">
+            <text class="part-item-key">抬头类型</text>
+            <text class="part-item-value">{{
+              headerInfo.invoiceTitleType === 0 ? '单位' : '个人/非企业单位'
+            }}</text>
+          </view>
+          <view
+            class="part-item"
+            :class="headerInfo.invoiceTitleType == 1 ? 'header-name' : ''"
+          >
+            <text class="part-item-key">抬头名称</text>
+            <text class="part-item-value">{{
+              headerInfo.invoiceTitleName
+            }}</text>
+          </view>
+          <view
+            class="part-item lines"
+            v-if="headerInfo.invoiceTitleType === 0"
+          >
+            <text class="part-item-key">公司税号</text>
+            <text class="part-item-value">{{ headerInfo.corporationTax }}</text>
+          </view>
+        </view>
+        <view class="invoice-more" v-if="headerInfo.invoiceTitleType === 0">
+          <view class="tab-title show-more" @click="changeShowMore">
+            <text class="c">更多信息</text>
+            <!--  :class="!isShowMore ? 'toBottom' : 'toRight'" -->
+            <view class="arrow-box">
+              <image :src="arrowIcon" mode="widthFix"></image>
+            </view>
+          </view>
+          <view class="is-show-more" v-if="isShow">
+            <view class="part-item">
+              <text class="part-item-key">公司地址</text>
+              <text class="part-item-value">{{
+                headerInfo.companyAddress
+              }}</text>
+            </view>
+            <view class="part-item">
+              <text class="part-item-key">公司电话</text>
+              <text class="part-item-value">{{ headerInfo.companyTel }}</text>
+            </view>
+            <view class="part-item">
+              <text class="part-item-key">开户银行</text>
+              <text class="part-item-value">{{ headerInfo.depositBank }}</text>
+            </view>
+            <view class="part-item top">
+              <text class="part-item-key">开户账户</text>
+              <text class="part-item-value">{{
+                headerInfo.accountNumber
+              }}</text>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="part middle">
+        <view class="part-item lines">
+          <text class="part-item-key">总金额</text>
+          <text class="part-item-value"
+            ><text class="purple">{{ invoiceAmount }} 元</text></text
+          >
+        </view>
+        <view class="part-item top" v-if="type == ''">
+          <text class="part-item-key"
+            >共<text class="purple">{{ orderQuantity }}笔</text>缴费记录</text
+          >
+          <view class="part-item-value" @click="gotoDetail">
+            <text>查看详情</text>
+            <image
+              class="invoice-header-arrow"
+              :src="arrowIcon"
+              mode="widthFix"
+            ></image>
+          </view>
+        </view>
+      </view>
+      <view class="tab-header">接收方式</view>
+      <view class="part footer">
+        <view class="part-item lines">
+          <text class="part-item-key">电子邮箱</text>
+          <view class="part-item-value">
+            <!-- sota_xu@hafengkeji.com -->
+            <input
+              type="text"
+              placeholder="请输入电子邮箱"
+              v-model="condition.mailbox"
+            />
+          </view>
+        </view>
+        <view class="part-item default-email top" @click="changeDefaultEMail">
+          <label>
+            <radio
+              style="transform: scale(0.7); position: relative; top: -2rpx"
+              color="#ED1C24"
+              value="all"
+              :checked="isDefaultEMail"
+            />
+            保存电子邮箱为默认邮箱
+          </label>
+        </view>
+      </view>
+      <view class="tab-header">备注</view>
+      <view class="textarea-remark">
+        <textarea
+          placeholder-style="color:#999999"
+          placeholder="选填"
+          v-model="condition.remark"
+        />
+      </view>
+    </scroll-view>
+    <view class="push-btn">
+      <view
+        v-if="headerInfo.invoiceTitleName"
+        :class="{
+          btn: true,
+          'push-again-btn': true,
+          'blue-push-again-btn': custTypeId === 1,
+          'green-push-again-btn': custTypeId === 2,
+        }"
+        @click="submit"
+        >提交</view
+      >
+      <view v-else class="btn disable-btn" disabled>请选择发票抬头</view>
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import arrowIcon from '../static/images/arrows.png';
+import { mapState } from 'vuex';
+import MemberCacheTool from '@/utils/member-cache-tool.js';
+export default {
+  data() {
+    return {
+      picUrl: this.$picUrl,
+      globalData: app.globalData,
+      arrowIcon: arrowIcon,
+      isShow: false,
+      isDefaultEMail: false,
+      ids: [],
+      condition: {
+        openid: MemberCacheTool.getOpenId(app),
+        groupId: app.globalData.groupId,
+        vipcode: app.globalData.member.vipcode,
+        invoiceName: '', // 否|发票名称
+        invoiceCategory: 0, // 发票类型 0:停车缴费  1:活动
+        invoiceType: 0, // 发票类型:0:增值税普通电子发票
+        remark: '',
+        invoiceTitleId: 0, // long|发票抬头id
+        ids: [], // 被选中的缴费记录id
+        isDefaultEmail: '1', // 是|邮箱是否默认 0:否 1:是
+        mailbox: '',
+      },
+      headerInfo: {},
+      // 总金额,单位分
+      invoiceAmount: 0,
+      orderInfo: {},
+      type: '', // 当前是活动还是停车
+      isSubmitFlag: true, // 发票提交申请的flag,
+      pageOptions: null,
+      preUrl: '',
+      orderQuantity: 0,
+      parkingOrder: null,
+    };
+  },
+  onLoad(options) {
+    console.log('===>onLoad', options);
+    this.pageOptions = options;
+    // 埋点初始化
+    this.parkingTrack = new this.$trackFactory('invoice_apply', {});
+    this.parkingTrack.track(1);
+    // 埋点本地化
+    this.invoice_track = uni.getStorageSync('invoice_track');
+    // console.log('this.invoice_track::::', this.invoice_track)
+    this.preUrl = uni.getStorageSync('previousUrl');
+    uni.setStorageSync(
+      'previousUrl',
+      '/pages/parkingFee/parkingReceipt/parkingApplication.vue'
+    );
+  },
+  onShow() {
+    if (this.pageOptions) {
+      const options = this.pageOptions;
+      console.log('===>onShow', options);
+      if (options.type && options.money) {
+        this.type = options.type;
+        this.invoiceAmount = options.money;
+      }
+      if (options.ids) {
+        const ids = options.ids;
+        if (ids.indexOf(',') > -1) {
+          this.ids = ids.split(',');
+        } else {
+          this.ids = [ids];
+        }
+        this.orderQuantity = this.ids.length;
+        this.getParkOrderInfo();
+        this.getInvoiceEmailInfo();
+      }
+      if (options.header) {
+        if (typeof options.header == 'string') {
+          this.headerInfo = JSON.parse(options.header);
+        } else if (typeof options.header == 'object') {
+          this.headerInfo = options.header;
+        }
+      } else {
+        this.getInvoiceTitle();
+      }
+    }
+  },
+  computed: {
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  methods: {
+    changeShowMore() {
+      this.isShow = !this.isShow;
+    },
+    changeDefaultEMail() {
+      this.isDefaultEMail = !this.isDefaultEMail;
+    },
+    changeHeader() {
+      uni.navigateTo({
+        url:
+          '/pages/parkingFee/parkingReceipt/parkingChooseHeader?id=' +
+          this.ids[0],
+      });
+    },
+    gotoDetail() {
+      this.$store.commit('setTempParkingOrder', this.parkingOrder);
+      uni.navigateTo({
+        url: '/pages/parkingFee/parkingReceipt/parkingOrderDetail?useParkingOrderCache=true',
+      });
+      // uni.navigateTo({
+      //   url:
+      //     '/pages/parkingFee/parkingFeeDetailSuccess?orderNo=' +
+      //     this.orderInfo.orderNo,
+      // })
+    },
+    // 查询全部抬头列表信息
+    getInvoiceTitle() {
+      const self = this;
+      const params = {
+        vipcode: this.globalData.member.vipcode,
+      };
+      self.$md(params);
+      uni.request({
+        url: self.$baseURL + 'api/1.0/invoiceTitle/page',
+        method: 'GET',
+        data: params,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          // console.log(res.data)
+          if (res.data.code === 0) {
+            const list = res.data.data;
+            let currentIndex = 0;
+            list.map((item, index) => {
+              if (item.setDefault == 1) currentIndex = index;
+            });
+            const headerInfo = list[currentIndex] || {};
+            self.headerInfo = headerInfo;
+            console.log('发票抬头--', self.headerInfo);
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+    // 根据选中的停车缴费记录id获取详情信息
+    getParkOrderInfo() {
+      // 如果当前是活动开票的话,则不差详情
+      if (this.type) return;
+      const self = this;
+      self.$md(this.ids);
+      uni.request({
+        url: self.$baseURL + 'api/1.0/invoice/myParkOrderListByIds',
+        method: 'POST',
+        data: this.ids,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          if (res.data.code === 0) {
+            const datas = res.data.data;
+            // console.log('获取详情信息', datas)
+            self.parkingOrder = datas;
+            self.invoiceAmount = (datas.invoiceAmount / 100).toFixed(2);
+            self.orderInfo = datas.list[0];
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+    // 获取用户邮箱信息
+    getInvoiceEmailInfo() {
+      const self = this;
+      const openId = MemberCacheTool.getOpenId(app);
+      var data = {
+        openid: openId,
+        groupId: app.globalData.groupId,
+        vipcode: app.globalData.member.vipcode,
+      };
+      self.$md(data);
+      uni.request({
+        url: self.$baseURL + 'api/1.0/invoice/getInvoiceEmailInfo',
+        method: 'POST',
+        data: data,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          if (res.data.code === 0) {
+            console.log('获取用户邮箱信息', res.data);
+            if (res.data.data) {
+              this.isDefaultEMail = true;
+              this.condition.mailbox = res.data.data;
+            } else {
+              this.isDefaultEMail = false;
+              this.condition.mailbox = '';
+            }
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+    submit() {
+      const self = this;
+      if (!self.condition.mailbox) {
+        uni.showToast({
+          title: '请输入电子邮箱地址',
+          duration: 2000,
+          icon: 'none',
+        });
+        return false;
+      }
+      // const re = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
+      // if (re.test(self.condition.mailbox)) {
+      //     uni.showToast({
+      //         title: '电子邮箱格式有误,请输入正确的电子邮箱',
+      //         duration: 2000,
+      //         icon: 'none'
+      //     });
+      //     return false;
+      // }
+      if (self.type && self.type == 'activity') {
+        self.condition.invoiceCategory = 1;
+      }
+      const params = self.condition;
+      params.ids = self.ids;
+      params.isDefaultEmail = self.isDefaultEMail ? '1' : '0';
+      params.invoiceTitleId = self.headerInfo.id;
+      console.log('params::::', params);
+      // console.log('提交发票请求的入参', params);
+      self.$md(params);
+      if (self.isSubmitFlag) {
+        self.isSubmitFlag = false;
+        uni.request({
+          url: self.$baseURL + 'api/1.0/invoice/addMyInvoiceInfo',
+          method: 'POST',
+          data: params,
+          header: JSON.parse(uni.getStorageSync('handleUser')),
+          success: (res) => {
+            console.log('提交发票请求', res.data);
+            this.parkingTrack.track(100, {
+              type: '停车',
+              selected_invoice_list_id: params.ids,
+              selected_invoice_list_price:
+                this.invoice_track.selected_invoice_list_price,
+              num: this.invoice_track.num,
+              title_type: this.headerInfo.invoiceTitleType === 0 ? 2 : 1,
+              detail: `${this.headerInfo.invoiceTitleName},${this.headerInfo.corporationTax}`,
+              receive_email: this.condition.mailbox,
+            });
+            if (res.data.code === 0) {
+              this.parkingTrack.track(200);
+              // 因为合并开票接口中无法判断是否是一个CO(一个发票id可以直接进发票详情)还是两个CO,所以统一返回到发票列表页面
+              uni.redirectTo({
+                url: '/pages/parkingFee/parkingReceipt/parkingReceipt',
+              });
+            } else {
+              this.parkingTrack.track(400);
+              uni.showToast({
+                title: res.data.msg,
+                duration: 2000,
+                icon: 'none',
+              });
+            }
+          },
+          fail: () => {
+            this.parkingTrack.track(400);
+            self.isSubmitFlag = true;
+            uni.showToast({
+              title: '服务器开小差了呢,请您稍后再试',
+              icon: 'none',
+            });
+          },
+        });
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  // height: 88vh;
+  background-color: #f1f1f1;
+  // padding: 30rpx 20rpx;
+  box-sizing: border-box;
+  .push-box {
+    padding: 30rpx 20rpx;
+    width: 750rpx;
+    box-sizing: border-box;
+    margin-bottom: 180rpx;
+  }
+  .choose-invoice-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    // padding: 20rpx 30rpx;
+    padding: 32rpx;
+    font-size: 28rpx;
+    background-color: #ffffff;
+    margin-bottom: 20rpx;
+    border-radius: 20rpx;
+
+    .invoice-header-info {
+      flex: 1;
+
+      .invoice-header-name {
+        color: #333333;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        padding-bottom: 32rpx;
+        border-bottom: 1px solid #f8f8f8;
+
+        .isDefault {
+          color: #8cc63f;
+          border: 1px solid #8cc63f;
+          margin-left: 30rpx;
+          border-radius: 20rpx;
+          display: inline-block;
+          padding: 0 21rpx;
+        }
+      }
+
+      .duty-paragraph {
+        color: #999;
+        margin-top: 32rpx;
+      }
+    }
+  }
+
+  .tab-header {
+    color: #808080;
+    padding: 10rpx 20rpx 20rpx;
+  }
+
+  .part {
+    background-color: #ffffff;
+    // padding-left: 30rpx;
+    margin-bottom: 25rpx;
+    border-radius: 20rpx;
+    padding: 32rpx;
+
+    .part-item {
+      font-size: 28rpx;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding-bottom: 32rpx;
+
+      .part-item-key {
+        color: #333333;
+        min-width: 146rpx;
+      }
+
+      .part-item-value {
+        color: #999;
+        text-align: right;
+        display: flex;
+        align-items: center;
+      }
+    }
+    .is-show-more {
+      .part-item {
+        padding-top: 32rpx;
+      }
+    }
+
+    .tab-title {
+      color: #676767;
+      padding-top: 30rpx;
+    }
+
+    .show-more {
+      display: flex;
+      justify-content: space-between;
+      align-content: center;
+      // padding-right: 30rpx;
+
+      .arrow-box {
+        // transform: rotate(90deg);
+        // transition-duration:0.1s;
+        > image {
+          width: 30rpx;
+        }
+      }
+    }
+
+    .default-email {
+      justify-content: flex-start;
+      color: #999999;
+    }
+  }
+
+  .top {
+    padding-top: 32rpx;
+    padding-bottom: 0 !important;
+  }
+
+  .middle {
+    // padding: 20rpx 0;
+
+    > .part-item {
+      background-color: #ffffff;
+      // padding-left: 30rpx;
+    }
+
+    .purple {
+      color: #ed1c24;
+    }
+  }
+
+  .footer {
+    // padding-top: 20rpx;
+    border-radius: 20rpx;
+  }
+
+  .textarea-remark {
+    margin-bottom: 20rpx;
+    > textarea {
+      background-color: #fff;
+      width: 100%;
+      padding: 32rpx;
+      // padding: 10rpx 20rpx;
+      border-radius: 20rpx;
+      box-sizing: border-box;
+    }
+  }
+
+  .push-btn {
+    width: 100%;
+    height: 170rpx;
+    background-color: #fff;
+    // padding: 0 41rpx;
+    position: fixed;
+    bottom: 0;
+    z-index: 999;
+    box-sizing: border-box;
+    padding-bottom: constant(safe-area-inset-bottom);
+    padding-bottom: env(safe-area-inset-bottom);
+    box-shadow: 0 0 10px 0 hsla(0, 6%, 58%, 0.6);
+    -webkit-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+    -moz-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+    // width: 100%;
+    // padding: 20rpx 0;
+    // position: fixed;
+    // bottom: 0rpx;
+    // height: 110rpx;
+    // padding-bottom: constant(safe-area-inset-bottom);
+    // padding-bottom: env(safe-area-inset-bottom);
+    // box-shadow: 0 0 10px 0 hsla(0, 6%, 58%, 0.6);
+    // -webkit-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+    // -moz-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+
+    .btn {
+      // margin: 20rpx 60rpx;
+      color: #ffffff;
+      border-radius: 50rpx;
+      text-align: center;
+      // padding: 20rpx 0;
+      height: 80rpx;
+      line-height: 80rpx;
+      width: 90%;
+      margin: 0 auto;
+      margin-top: 25rpx;
+    }
+
+    .push-again-btn {
+      background-image: linear-gradient(to right, #7d4ea1, #40397c);
+    }
+    .blue-push-again-btn {
+      .color-background-color('blue');
+    }
+    .green-push-again-btn {
+      .color-background-color('green');
+    }
+
+    .disable-btn {
+      background-color: #bdbdbd;
+    }
+  }
+
+  .invoice-header-arrow {
+    width: 30rpx;
+  }
+
+  .lines {
+    border-bottom: 2rpx solid #ececec;
+  }
+
+  .toBottom {
+    transform: rotate(90deg);
+    transition-duration: 0.1s;
+  }
+
+  .toRight {
+    transform: rotate(-90deg);
+    transition-duration: 0.1s;
+  }
+  .header-name {
+    padding: 0 !important;
+    border: unset !important;
+  }
+}
+</style>

+ 368 - 0
src/crmPages/parkingReceipt/parkingChangeHeader.vue

@@ -0,0 +1,368 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="part top">
+      <view class="invoice-header">
+        <view class="part-item header-type lines">
+          <text class="part-item-key">抬头类型</text>
+          <radio-group class="part-item-value" @change="radioChange">
+            <label v-for="(item, index) in items" :key="item.value">
+              <radio
+                style="transform: scale(0.7)"
+                color="#ED1C24"
+                :value="item.value"
+                :checked="index === condition.invoiceTitleType"
+              />
+              {{ item.name }}
+            </label>
+          </radio-group>
+        </view>
+        <view class="part-item lines">
+          <text class="part-item-key">抬头名称</text>
+          <view class="part-item-value">
+            <input
+              type="text"
+              placeholder="请输入抬头名称"
+              v-model="condition.invoiceTitleName"
+            />
+          </view>
+        </view>
+        <view class="part-item lines" v-if="isCompany">
+          <text class="part-item-key">公司税号</text>
+          <view class="part-item-value">
+            <input
+              type="text"
+              placeholder="请输入公司税号"
+              v-model="condition.corporationTax"
+            />
+          </view>
+        </view>
+        <view class="part-item lines">
+          <text class="part-item-key">设为默认</text>
+          <view class="part-item-value">
+            <switch
+              color="#8CC63F"
+              :checked="isDefault"
+              @change="switch1Change"
+            />
+          </view>
+        </view>
+      </view>
+      <view class="invoice-more" v-if="isCompany">
+        <view class="tab-title">更多信息(以下为选填内容)</view>
+        <view class="part-item lines">
+          <text class="part-item-key">公司地址</text>
+          <view class="part-item-value">
+            <input
+              type="text"
+              placeholder="请输入公司地址"
+              v-model="condition.companyAddress"
+            />
+          </view>
+        </view>
+        <view class="part-item lines">
+          <text class="part-item-key">公司电话</text>
+          <view class="part-item-value">
+            <input
+              type="text"
+              placeholder="请输入公司电话"
+              v-model="condition.companyTel"
+            />
+          </view>
+        </view>
+        <view class="part-item lines">
+          <text class="part-item-key">开户银行</text>
+          <view class="part-item-value">
+            <input
+              type="text"
+              placeholder="请输入开户银行"
+              v-model="condition.depositBank"
+            />
+          </view>
+        </view>
+        <view class="part-item lines" style="border: none">
+          <text class="part-item-key">开户账户</text>
+          <view class="part-item-value">
+            <input
+              type="text"
+              placeholder="请输入开户银行"
+              v-model="condition.accountNumber"
+            />
+          </view>
+        </view>
+      </view>
+    </view>
+    <!-- <view class="part middle">
+            <view class="part-item">
+                <text class="part-item-key">总金额</text>
+                <text class="part-item-value"><text class="purple">10.00</text>元</text>
+            </view>
+        </view> -->
+    <view class="part footer">
+      <!-- <view class="tab-title">接收方式</view>
+            <view class="part-item lines">
+                <text class="part-item-key">电子邮箱</text>
+                <text class="part-item-value">sota_xu@hafengkeji.com</text>
+            </view> -->
+      <view
+        :class="{
+          'push-again-btn': true,
+          'blue-push-again-btn': custTypeId === 1,
+          'green-push-again-btn': custTypeId === 2,
+        }"
+        @click="submit"
+        >保存</view
+      >
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import { mapState } from 'vuex';
+import MemberCacheTool from '@/utils/member-cache-tool.js';
+export default {
+  data() {
+    return {
+      picUrl: this.$picUrl,
+      type: 'add',
+      id: '',
+      globalData: app.globalData,
+      items: [
+        { value: '0', name: '单位' },
+        { value: '1', name: '个人/非企业单位' },
+      ],
+      isDefault: true, // 记录
+      condition: {
+        id: '', // |Long|否|抬头id
+        invoiceTitleType: 0, // |int|是|抬头类型( 0:单位,1:个人/非企业单位)
+        invoiceTitleName: '', // |String|是|抬头名称
+        corporationTax: '', // |String|是|公司税号|
+        setDefault: '', // |int|是|设为默认(0:不默认,1:默认)
+        depositBank: '', // |String|否|开户银行
+        accountNumber: '', // |String|否|开户账号
+        companyAddress: '', // |String|否|公司地址
+        companyTel: '', // |String|否|公司电话
+        createUser: '', // |String|是|创建人
+        creator: '', // |Long|是|创建者id
+        updateUser: app.globalData.wxMember.nickname, // |String|是|更新人
+        updater: app.globalData.wxMember.id, // |Long|是|更新人id
+        mobile: app.globalData.wxMember.mobile, // |String|是|手机号
+        vipcode: app.globalData.member.vipcode, // |String|是|会员号
+        openid: MemberCacheTool.getOpenId(app), // |String|是|openid
+      },
+      preUrl: '',
+    };
+  },
+  computed: {
+    isCompany: function () {
+      return this.condition.invoiceTitleType == 0;
+    },
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  onLoad(options) {
+    console.log(this.globalData);
+    if (options.type) this.type = options.type;
+    if (options.id) (this.id = options.id), this.getInvoiceTitleById();
+    // 埋点本地化
+    this.preUrl = uni.getStorageSync('previousUrl');
+    uni.setStorageSync(
+      'previousUrl',
+      '/pages/parkingFee/parkingReceipt/parkingChangeHeader.vue'
+    );
+  },
+  methods: {
+    radioChange: function (e) {
+      for (let i = 0; i < this.items.length; i++) {
+        if (this.items[i].value === e.detail.value) {
+          this.condition.invoiceTitleType = i;
+          break;
+        }
+      }
+    },
+    switch1Change: function (e) {
+      console.log('switch1 发生 change 事件,携带值为', e.target.value);
+      this.isDefault = e.target.value;
+    },
+    // 根据抬头ID获取抬头详情信息  api/1.0/invoiceTitle/{id}
+    getInvoiceTitleById() {
+      const self = this;
+      const params = {
+        id: this.id,
+      };
+      self.$md(params);
+      uni.request({
+        url: self.$baseURL + 'api/1.0/invoiceTitle/' + this.id,
+        method: 'GET',
+        data: params,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log('获取抬头详情信息', res.data);
+          if (res.data.code === 0) {
+            self.condition = res.data.data;
+            // 单独对默认选项进行赋值
+            self.isDefault = res.data.data.setDefault === 1 ? true : false;
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+    // 添加、编辑抬头信息
+    submit() {
+      const self = this;
+      const url =
+        self.type === 'add' ? 'api/1.0/invoiceTitle' : 'api/1.0/invoiceTitle';
+      const methodType = self.type === 'add' ? 'POST' : 'PUT';
+      if (self.type === 'add') {
+        self.condition.createUser = self.globalData.wxMember.nickname;
+        self.condition.creator = self.globalData.wxMember.id;
+      }
+      self.condition.setDefault = self.isDefault ? 1 : 0;
+      const params = {
+        ...self.condition,
+      };
+      console.log('提交信息', params);
+      self.$md(params);
+      uni.request({
+        url: self.$baseURL + url,
+        method: methodType,
+        data: params,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log(res.data);
+          if (res.data.code === 0) {
+            uni.navigateBack({ delta: 1 });
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  .part {
+    background-color: #ffffff;
+    .part-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      // padding: 32rpx 0;
+      font-size: 28rpx;
+      width: 91.4%;
+      height: 87rpx;
+      margin: 0 auto;
+      .part-item-key {
+        color: #333;
+      }
+      .part-item-value {
+        color: #999;
+        text-align: right;
+        > label {
+          margin-left: 20rpx;
+        }
+      }
+    }
+    .tab-title {
+      color: #676767;
+      padding: 30rpx 35rpx;
+      background-color: #f1f1f1;
+    }
+    .lines {
+      border-bottom: 2rpx solid #ececec;
+    }
+    .invoice-more {
+      padding-bottom: 8rpx;
+    }
+  }
+  .top {
+    padding-top: 20rpx;
+  }
+  .middle {
+    margin: 20rpx 0;
+    .purple {
+      color: #a668b1;
+    }
+  }
+  .footer {
+    width: 100%;
+    height: 110rpx;
+    position: fixed;
+    bottom: 0rpx;
+    // padding-bottom: constant(safe-area-inset-bottom);
+    // padding-bottom: env(safe-area-inset-bottom);
+    padding-bottom: 20rpx;
+    box-shadow: 0 0 10px 0 hsla(0, 6%, 58%, 0.6);
+    -webkit-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+    -moz-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+    // padding-top: 20rpx;
+    .invoive-img {
+      text-align: center;
+      > image {
+        width: 100%;
+      }
+      .download {
+        margin-top: 20rpx;
+        margin-bottom: 20rpx;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        > image {
+          width: 32rpx;
+        }
+        > text {
+          margin-left: 10rpx;
+          color: #808080;
+        }
+      }
+    }
+    .push-again-btn {
+      margin: 25rpx 30rpx;
+      background-image: linear-gradient(to right, #7d4ea1, #40397c);
+      border-radius: 50rpx;
+      color: #ffffff;
+      text-align: center;
+      padding: 25rpx 0;
+    }
+    .blue-push-again-btn {
+      .color-background-color('blue');
+    }
+    .green-push-again-btn {
+      .color-background-color('green');
+    }
+  }
+}
+</style>

+ 346 - 0
src/crmPages/parkingReceipt/parkingChooseHeader.vue

@@ -0,0 +1,346 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="choose-invoice-header" v-if="list.length">
+      <radio-group class="radios">
+        <label
+          class="uni-list-cell uni-list-cell-pd radio-label lines"
+          v-for="(item, index) in list"
+          :key="index"
+          :index="item.id"
+        >
+          <view
+            class="invoice-header-info"
+            @click.native="chooseHeader(item, index)"
+          >
+            <!-- <view><radio :value="item.id" :checked="index === current" /></view> -->
+            <view class="invoice-header-text">
+              <view class="invoice-header-name">
+                <view class="invoice-header-name-text">
+                  {{ item.invoiceTitleName
+                  }}<text class="isDefault" v-if="item.setDefault === 1"
+                    >默认</text
+                  >
+                </view>
+                <view class="invoice-header-name-icon">
+                  <view
+                    class="edit-header"
+                    @click.stop="changeHeader('edit', item.id)"
+                  >
+                    <image
+                      class="invoice-header-arrow"
+                      :src="editwIcon"
+                      mode="widthFix"
+                    ></image>
+                  </view>
+                  <view class="edit-header" @click.stop="delHeader(item.id)">
+                    <image
+                      class="invoice-header-arrow"
+                      :src="delwIcon"
+                      mode="widthFix"
+                    ></image>
+                  </view>
+                </view>
+              </view>
+              <view class="duty-paragraph">
+                税号 {{ item.corporationTax }}
+              </view>
+            </view>
+          </view>
+          <!-- <view class="invoice-header-icon">
+                        <view class="edit-header" @click.native="changeHeader('edit', item.id)">
+                            <image class="invoice-header-arrow" :src="editwIcon" mode="widthFix"></image>
+                        </view>
+                        <view class="edit-header" @click.native="delHeader(item.id)">
+                            <image class="invoice-header-arrow" :src="delwIcon" mode="widthFix"></image>
+                        </view>
+                    </view> -->
+        </label>
+      </radio-group>
+    </view>
+    <view class="choose-invoice-header noData" v-else>
+      <image class="noDataImg" :src="noDataIcon" mode="widthFix"></image>
+      <view class="">您还没添加发票抬头</view>
+    </view>
+    <view class="footer">
+      <view
+        :class="{
+          'push-again-btn': true,
+          'blue-push-again-btn': custTypeId === 1,
+          'green-push-again-btn': custTypeId === 2,
+        }"
+        @click="changeHeader('add')"
+        >添加抬头</view
+      >
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import editwIcon from '../static/images/edit.png';
+import delwIcon from '../static/images/delete.png';
+import noDataIcon from '../static/images/nodataicon.png';
+import { mapState } from 'vuex';
+
+export default {
+  data() {
+    return {
+      picUrl: this.$picUrl,
+      editwIcon: editwIcon,
+      delwIcon: delwIcon,
+      noDataIcon: noDataIcon,
+      globalData: app.globalData,
+      current: -1,
+      id: '',
+      list: [],
+      preUrl: '',
+    };
+  },
+  onLoad(options) {
+    if (options.id) this.id = options.id;
+    // 埋点本地化
+    this.preUrl = uni.getStorageSync('previousUrl');
+    uni.setStorageSync(
+      'previousUrl',
+      '/pages/parkingFee/parkingReceipt/parkingChooseHeader.vue'
+    );
+  },
+  onShow() {
+    // console.log('全剧信息', this.globalData);
+    this.getInvoiceTitle();
+  },
+  onBackPress() {
+    console.log('===> 点击返回按钮');
+    const pages = getCurrentPages();
+    const prePage = pages[pages.length - 2];
+    const options = {
+      header: this.list[this.current] || {},
+    };
+    // TODO 开票界面选择了 A,两个列表中如果有当前是 A,删除 A之后,点击返回按钮 开票界面 A 还存在
+    prePage.$vm.pageOptions = options;
+  },
+  computed: {
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  methods: {
+    changeHeader(type, id) {
+      if (id)
+        uni.navigateTo({
+          url:
+            '/pages/parkingFee/parkingReceipt/parkingChangeHeader?type=' +
+            type +
+            '&id=' +
+            id,
+        });
+      else
+        uni.navigateTo({
+          url:
+            '/pages/parkingFee/parkingReceipt/parkingChangeHeader?type=' + type,
+        });
+    },
+    // 删除抬头
+    delHeader(id) {
+      const self = this;
+      self.$md([id]);
+      uni.showModal({
+        content: '确认要删除该发票抬头吗?',
+        success: function (res) {
+          if (res.confirm) {
+            uni.request({
+              url: self.$baseURL + 'api/1.0/invoiceTitle',
+              method: 'delete',
+              data: [id],
+              header: JSON.parse(uni.getStorageSync('handleUser')),
+              success: (res) => {
+                console.log('删除抬头', res.data);
+                if (res.data.code === 0) {
+                  self.getInvoiceTitle();
+                } else {
+                  uni.showToast({
+                    title: res.data.msg,
+                    duration: 2000,
+                    icon: 'none',
+                  });
+                }
+              },
+              fail: () => {
+                uni.showToast({
+                  title: '服务器开小差了呢,请您稍后再试',
+                  icon: 'none',
+                });
+              },
+            });
+          }
+        },
+      });
+    },
+    // 选择抬头
+    chooseHeader(item, index) {
+      this.current = index;
+      if (!this.id) return false;
+      const pages = getCurrentPages();
+      const prePage = pages[pages.length - 2];
+      const options = {
+        header: this.list[index] || {},
+      };
+      prePage.$vm.pageOptions = options;
+      uni.navigateBack();
+      // uni.redirectTo({ url: '/pages/parkingFee/parkingReceipt/parkingApplication?ids=' + this.id + '&header=' + JSON.stringify(item) });
+    },
+    // 查询全部抬头列表信息
+    getInvoiceTitle() {
+      const self = this;
+      const params = {
+        vipcode: this.globalData.member.vipcode,
+      };
+      self.$md(params);
+      uni.request({
+        url: self.$baseURL + 'api/1.0/invoiceTitle/page',
+        method: 'GET',
+        data: params,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log(res.data);
+          if (res.data.code === 0) {
+            this.list = res.data.data;
+            if (this.list.length) {
+              this.list.map((item, index) => {
+                if (item.setDefault === 1) this.current = index;
+              });
+              if (this.current == -1) this.current = 0;
+            }
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  .choose-invoice-header {
+    padding: 20rpx 30rpx;
+    .radios {
+      width: 100%;
+      .radio-label {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        border-radius: 10rpx;
+        background-color: #ffffff;
+        margin-bottom: 20rpx;
+        .invoice-header-info {
+          flex: 1;
+          display: flex;
+          justify-content: flex-start;
+          align-items: center;
+          .invoice-header-text {
+            width: 100%;
+            padding: 0 20rpx;
+            .invoice-header-name {
+              color: #333333;
+              padding: 20rpx 0;
+              border-bottom: 2rpx solid #f8f8f8;
+              display: flex;
+              justify-content: space-between;
+              align-items: center;
+              .isDefault {
+                color: #8cc63f;
+                border: 2rpx solid #8cc63f;
+                margin-left: 16rpx;
+                border-radius: 20rpx;
+                padding: 0 10rpx;
+              }
+              .invoice-header-name-icon {
+                width: 100rpx;
+                display: flex;
+                align-items: center;
+                justify-content: space-around;
+                .invoice-header-arrow {
+                  width: 30rpx;
+                }
+              }
+            }
+          }
+          .duty-paragraph {
+            color: #6f6f70;
+            padding: 20rpx 0;
+          }
+        }
+        .invoice-header-icon {
+          width: 100rpx;
+          display: flex;
+          align-items: center;
+          justify-content: space-around;
+          .invoice-header-arrow {
+            width: 30rpx;
+          }
+        }
+      }
+    }
+  }
+  .noData {
+    position: relative;
+    top: 20%;
+    transform: translateY(-50%);
+    color: #cccccc;
+    text-align: center;
+    .noDataImg {
+      width: 200rpx;
+      margin-bottom: 20rpx;
+    }
+  }
+  .footer {
+    width: 100%;
+    background-color: #ffffff;
+    position: fixed;
+    bottom: 0;
+    box-shadow: 0 0 10px 0 hsla(0, 6%, 58%, 0.6);
+    -webkit-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+    -moz-box-shadow: 0 0 20rpx 0 hsla(0, 6%, 58%, 0.6);
+    // padding-bottom: constant(safe-area-inset-bottom);
+    // padding-bottom: env(safe-area-inset-bottom);
+    padding-bottom: 20rpx;
+    .push-again-btn {
+      margin: 20rpx 60rpx;
+      color: #ffffff;
+      background-image: linear-gradient(to right, #7d4ea1, #40397c);
+      border-radius: 50rpx;
+      text-align: center;
+      padding: 20rpx 0;
+    }
+    .blue-push-again-btn {
+      .color-background-color('blue');
+    }
+    .green-push-again-btn {
+      .color-background-color('green');
+    }
+  }
+  .lines {
+    border-bottom: 2rpx solid #ececec;
+  }
+}
+</style>

+ 98 - 0
src/crmPages/parkingReceipt/parkingHeaderDetail.vue

@@ -0,0 +1,98 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="part" v-if="header.invoiceTitleType === 0">
+      <view class="part-item">
+        <text class="part-item-key">抬头类型</text>
+        <view class="part-item-value">单位</view>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">抬头名称</text>
+        <text class="part-item-value">{{ header.invoiceTitleName }}</text>
+      </view>
+
+      <view class="part-item">
+        <text class="part-item-key">公司税号</text>
+        <text class="part-item-value">{{ header.corporationTax }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">公司地址</text>
+        <text class="part-item-value">{{ header.companyAddress }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">公司电话</text>
+        <text class="part-item-value">{{ header.companyTel }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">开户银行</text>
+        <text class="part-item-value">{{ header.depositBank }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">开户账户</text>
+        <text class="part-item-value">{{ header.accountNumber }}</text>
+      </view>
+    </view>
+    <view class="part" v-else>
+      <view class="part-item">
+        <text class="part-item-key">抬头类型</text>
+        <view class="part-item-value">个人/非企业单位</view>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">抬头名称</text>
+        <text class="part-item-value">{{ header.invoiceTitleName }}</text>
+      </view>
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+export default {
+  data() {
+    return {
+      header: {},
+    };
+  },
+  onLoad(options) {
+    this.header = JSON.parse(options.header);
+    console.log('获取的发票信息', this.header);
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  padding: 20rpx;
+  box-sizing: border-box;
+  .part {
+    background-color: #ffffff;
+    padding: 0 30rpx;
+    border-radius: 20rpx;
+    .part-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20rpx 0;
+      box-sizing: border-box;
+      .part-item-key {
+        color: #4c4c4d;
+      }
+      .part-item-value {
+        color: #6f6f70;
+        text-align: right;
+        display: flex;
+        align-items: center;
+        > image {
+          width: 30rpx;
+        }
+      }
+    }
+  }
+}
+</style>

+ 251 - 0
src/crmPages/parkingReceipt/parkingInvoice.vue

@@ -0,0 +1,251 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="part top">
+      <view class="part-item lines header">
+        <text class="part-item-key">抬头</text>
+        <view class="part-item-value" @click="showHeader">
+          {{ order.invoiceTitleName }}
+          <image
+            class="invoice-header-arrow"
+            :src="arrowIcon"
+            mode="widthFix"
+          ></image>
+        </view>
+      </view>
+
+      <view class="part-item">
+        <text class="part-item-key">开票订单号</text>
+        <text class="part-item-value">{{ order.orderno }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">发票类型</text>
+        <text class="part-item-value">增值税普通发票</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">开票日期</text>
+        <text class="part-item-value">{{
+          order.paperDrewDate ? order.paperDrewDate : '-'
+        }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">发票号码</text>
+        <text class="part-item-value">{{
+          order.invoiceno ? order.invoiceno : '-'
+        }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">发票代码</text>
+        <text class="part-item-value">{{
+          order.invoiceCode ? order.invoiceCode : '-'
+        }}</text>
+      </view>
+      <view class="part-item">
+        <text class="part-item-key">备注</text>
+        <text class="part-item-value">{{ order.remark }}</text>
+      </view>
+    </view>
+    <view class="part middle">
+      <view class="part-item">
+        <text class="part-item-key">总金额</text>
+        <text class="part-item-value"
+          ><text class="purple">{{ order.invoiceAmount / 100 }}</text
+          >元</text
+        >
+      </view>
+      <view class="part-item">
+        <text class="part-item-key"
+          >共<text class="purple">{{ order.payNumber }}笔</text>缴费记录</text
+        >
+        <view class="part-item-value" @click="gotoRecordDetail">
+          <text>查看详情</text>
+          <image
+            class="invoice-header-arrow"
+            :src="arrowIcon"
+            mode="widthFix"
+          ></image>
+        </view>
+      </view>
+    </view>
+    <view class="footer">
+      <view
+        :class="{
+          btn: true,
+          'push-again-btn': true,
+          'blue-push-again-btn': custTypeId === 1,
+          'green-push-again-btn': custTypeId === 2,
+        }"
+        @click="showInvoiceDetail"
+        >查看发票</view
+      >
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import downloadBtnIcon from '../static/images/download.png';
+import arrowIcon from '../static/images/arrows.png';
+import { mapState } from 'vuex';
+export default {
+  data() {
+    return {
+      picUrl: this.$picUrl,
+      arrowIcon: arrowIcon,
+      downloadBtnIcon: downloadBtnIcon,
+      order: {},
+      webviewStyles: {
+        progress: {
+          color: '#FF3333',
+        },
+      },
+      id: '',
+    };
+  },
+  onLoad(options) {
+    this.id = options.id;
+  },
+  onShow() {
+    this.getInvoicedDetail(this.id);
+  },
+  computed: {
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  methods: {
+    // 根据发票id获取发票详情信息(含发票抬头信息),
+    getInvoicedDetail(id) {
+      const self = this;
+      const data = {
+        id: id,
+      };
+      self.$md(data);
+      uni.request({
+        url: self.$baseURL + 'api/1.0/invoice/getInvoicedDetail?id=' + id,
+        method: 'POST',
+        data: data,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log('获取发票详情信息', res.data);
+          if (res.data.code === 0) {
+            self.order = res.data.data;
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+    showHeader() {
+      uni.navigateTo({
+        url:
+          '/pages/parkingFee/parkingReceipt/parkingHeaderDetail?header=' +
+          JSON.stringify(this.order),
+      });
+    },
+    gotoRecordDetail() {
+      uni.navigateTo({
+        url:
+          '/pages/parkingFee/parkingReceipt/parkingOrderDetail?id=' +
+          this.order.id,
+      });
+    },
+    showInvoiceDetail() {
+      uni.navigateTo({
+        url:
+          '/pages/parkingFee/parkingReceipt/parkingInvoiceImage?order=' +
+          JSON.stringify(this.order),
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  padding: 20rpx;
+  box-sizing: border-box;
+  .part {
+    background-color: #ffffff;
+    padding: 0 30rpx;
+    border-radius: 20rpx;
+    .part-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20rpx 0;
+      box-sizing: border-box;
+      .part-item-key {
+        color: #4c4c4d;
+      }
+      .part-item-value {
+        color: #6f6f70;
+        text-align: right;
+        display: flex;
+        align-items: center;
+        > image {
+          width: 30rpx;
+        }
+      }
+    }
+    .tab-title {
+      color: #676767;
+      padding: 30rpx 0rpx;
+    }
+    .lines {
+      border-bottom: 2rpx solid #ececec;
+    }
+    .invoice-more {
+      padding-bottom: 8rpx;
+    }
+  }
+  .top {
+    padding-top: 20rpx;
+  }
+  .middle {
+    margin: 20rpx 0;
+    > .part-item {
+      background-color: #ffffff;
+    }
+    .purple {
+      color: #ed1c24;
+    }
+  }
+  .footer {
+    padding-top: 20rpx;
+    .btn {
+      margin: 20rpx 60rpx;
+      color: #ffffff;
+      border-radius: 50rpx;
+      text-align: center;
+      padding: 20rpx 0;
+    }
+    .push-again-btn {
+      background-image: linear-gradient(to right, #7d4ea1, #40397c);
+    }
+    .blue-push-again-btn {
+      .color-background-color('blue');
+    }
+    .green-push-again-btn {
+      .color-background-color('green');
+    }
+  }
+}
+</style>

+ 187 - 0
src/crmPages/parkingReceipt/parkingInvoiceApply.vue

@@ -0,0 +1,187 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="apply-success-box">
+      <view class="apply-success-img">
+        <image class="apply-image" mode="widthFix" :src="icon"></image>
+      </view>
+      <view class="apply-success-text">【发票申请提交成功】</view>
+    </view>
+    <view class="footer">
+      <view
+        :class="{
+          btn: true,
+          'push-again-btn': true,
+          'blue-push-again-btn': custTypeId === 1,
+          'green-push-again-btn': custTypeId === 2,
+        }"
+        @click="showInvoiceDetail"
+        >查看发票</view
+      >
+      <view class="btn back-home-btn" @click="goToHome">返回首页</view>
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import hintIcon from '../static/images/hint.png';
+import { mapState } from 'vuex';
+export default {
+  data() {
+    return {
+      picUrl: this.$picUrl,
+      globalData: app.globalData,
+      hintIcon: hintIcon,
+      id: '',
+      blueIcon:
+        'https://cnsh-kerry-crm-le.oss-cn-shanghai.aliyuncs.com/images/icon-success-blue.png',
+      greenIcon:
+        'https://cnsh-kerry-crm-le.oss-cn-shanghai.aliyuncs.com/images/icon-success-green.png',
+    };
+  },
+  onLoad(options) {
+    this.id = options.id;
+    this.getInvoicedDetail(this.id);
+  },
+  computed: {
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+    icon() {
+      return this.$store.state.custTypeId === 0
+        ? this.hintIcon
+        : this.$store.state.custTypeId === 1
+        ? this.blueIcon
+        : this.greenIcon;
+    },
+  },
+  methods: {
+    showInvoiceDetail() {
+      uni.redirectTo({
+        url: '/pages/parkingFee/parkingReceipt/parkingInvoice?id=' + this.id,
+      });
+    },
+    goToHome() {
+      uni.redirectTo({
+        url: '/pages/parkingFee/parkingReceipt/parkingReceipt',
+      });
+    },
+    // 根据发票id获取发票详情信息(含发票抬头信息),
+    getInvoicedDetail(id) {
+      const self = this;
+      const data = {
+        id: id,
+      };
+      self.$md(data);
+      uni.request({
+        url: self.$baseURL + 'api/1.0/invoice/getInvoicedDetail?id=' + id,
+        method: 'POST',
+        data: data,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log('获取发票详情信息', res.data);
+          if (res.data.code === 0) {
+            self.order = res.data.data;
+            if (self.order.invoiceUrl) {
+              self.pushEmail(self.order);
+            }
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+    // 开票成功后推送发票至邮箱
+    pushEmail(item) {
+      const self = this;
+      const data = {
+        attachments: [
+          {
+            name: '停车发票.pdf',
+            url: item.invoiceUrl,
+          },
+        ],
+        html: true,
+        sendTo: 'string',
+        sendTos: [item.mailbox],
+        subject: item.invoiceTitleName + '的电子发票',
+        text: '停车发票',
+      };
+      self.$md(data);
+      uni.request({
+        url: self.$baseURL + 'sms/email',
+        method: 'POST',
+        data: data,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log('推送', res.data);
+          if (res.data.code === 0) {
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  // background: #f2f2f2;
+  .apply-success-box {
+    padding: 100rpx 0;
+    text-align: center;
+    .apply-image {
+      width: 30vw;
+    }
+    .apply-success-text {
+      margin-top: 50rpx;
+      font-weight: bold;
+    }
+  }
+  .footer {
+    width: 100%;
+    .btn {
+      margin: 20rpx 60rpx;
+      color: #ffffff;
+      border-radius: 50rpx;
+      text-align: center;
+      padding: 20rpx 0;
+    }
+    .push-again-btn {
+      background-image: linear-gradient(to right, #7d4ea1, #40397c);
+    }
+    .blue-push-again-btn {
+      .color-background-color('blue');
+    }
+    .green-push-again-btn {
+      .color-background-color('green');
+    }
+    .back-home-btn {
+      background-color: #bdbdbd;
+    }
+  }
+}
+</style>

+ 256 - 0
src/crmPages/parkingReceipt/parkingInvoiceImage.vue

@@ -0,0 +1,256 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="part">
+      <view class="part-item lines">
+        <text class="part-item-key">电子邮箱</text>
+        <text class="part-item-value">{{ order.mailbox }}</text>
+      </view>
+      <view class="invoice-img" v-if="order.invoiceUrl">
+        <!-- <image class="img" :src="picUrl + order.invoiceImgUrl" mode="widthFix"></image>
+                <view class="img-index">1/1</view> -->
+        <!-- <view :class="{download: true, 'blue-download': custTypeId === 1, 'green-download': custTypeId === 2}" @click="downloadOrder(order.invoiceUrl)">
+                    <image mode="widthFix" :src="downloadBtnIcon"></image>
+                    <text>下载发票</text>
+                </view> -->
+      </view>
+    </view>
+    <view class="footer">
+      <view
+        :class="{
+          btn: true,
+          'push-again-btn': true,
+          'blue-push-again-btn': custTypeId === 1,
+          'green-push-again-btn': custTypeId === 2,
+        }"
+        @click="pushAgain(order.invoiceUrl)"
+        >再次推送</view
+      >
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+import downloadBtnIcon from '../static/images/download.png';
+import { mapState } from 'vuex';
+export default {
+  data() {
+    return {
+      picUrl: this.$picUrl,
+      downloadBtnIcon: downloadBtnIcon,
+      globalData: app.globalData,
+      setTime: 60,
+      timer: null,
+      order: {},
+      preUrl: '',
+    };
+  },
+  onLoad(options) {
+    this.order = JSON.parse(options.order);
+    console.log('获取的发票信息', this.order);
+    // 埋点本地化
+    this.preUrl = uni.getStorageSync('previousUrl');
+    uni.setStorageSync(
+      'previousUrl',
+      '/pages/parkingFee/parkingReceipt/parkingInvoiceImage.vue'
+    );
+  },
+  onUnload() {
+    if (this.timer) {
+      clearTimeout(this.timer);
+      this.timer = null;
+    }
+  },
+  computed: {
+    ...mapState({
+      custTypeId: (state) => state.custTypeId,
+    }),
+  },
+  methods: {
+    downloadOrder(url) {
+      uni.downloadFile({
+        url: url,
+        success: function (res) {
+          console.log('下载文档成功');
+          var filePath = res.tempFilePath;
+          uni.openDocument({
+            filePath: filePath,
+            success: function (res) {
+              console.log('打开文档成功');
+            },
+          });
+        },
+      });
+    },
+    pushAgain(url) {
+      const self = this;
+      if (self.setTime >= 0 && self.timer) {
+        uni.showToast({
+          title: '邮件已发送,请于1分钟后再试',
+          icon: 'none',
+        });
+        return false;
+      }
+      if (self.timer && self.setTime < 0) {
+        clearTimeout(self.timer);
+        self.timer = null;
+      }
+      self.timer = setTimeout(() => {
+        self.setTime--;
+      }, 1000);
+      const data = {
+        attachments: [
+          {
+            name: '嘉里停车发票.pdf',
+            invoiceId: self.order.id,
+            url: url,
+          },
+        ],
+        html: true,
+        sendTo: 'string',
+        sendTos: [self.order.mailbox],
+        subject: self.order.invoiceTitleName + '的电子发票',
+        text: '停车发票',
+      };
+      self.$md(data);
+      uni.request({
+        url: self.$baseURL + 'sms/email',
+        method: 'POST',
+        data: data,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log('推送', res.data);
+          if (res.data.code === 0) {
+            uni.showToast({
+              title: '邮件已发送邮箱,请注意查收',
+              icon: 'none',
+            });
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../../styles/common.less';
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  padding: 20rpx;
+  box-sizing: border-box;
+  .part {
+    background-color: #ffffff;
+    padding: 0 30rpx;
+    border-radius: 20rpx;
+    .part-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20rpx 0;
+      box-sizing: border-box;
+      .part-item-key {
+        color: #4c4c4d;
+      }
+      .part-item-value {
+        color: #6f6f70;
+        text-align: right;
+        display: flex;
+        align-items: center;
+        > image {
+          width: 30rpx;
+        }
+      }
+    }
+    .invoice-img {
+      width: 100%;
+      padding: 30rpx 0;
+      .img {
+        width: 100%;
+      }
+      .img-index {
+        width: 100rpx;
+        height: 60rpx;
+        line-height: 60rpx;
+        text-align: center;
+        color: #ffffff;
+        background-color: #b3b3b3;
+        border-radius: 50rpx;
+        margin: 20rpx auto;
+      }
+      .download {
+        margin-top: 20rpx;
+        margin-bottom: 20rpx;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        border: 1px solid #662d91;
+        width: 300rpx;
+        height: 70rpx;
+        border-radius: 50rpx;
+        margin: 0 auto;
+        > image {
+          width: 32rpx;
+        }
+        > text {
+          margin-left: 10rpx;
+          color: #662d91;
+        }
+      }
+      .blue-download {
+        .color-download('blue');
+      }
+      .green-download {
+        .color-download('green');
+      }
+      .color-download(@value) {
+        @color: 'color-@{value}';
+        border-color: @@color;
+        > text {
+          color: @@color;
+        }
+      }
+    }
+  }
+  .footer {
+    padding-top: 20rpx;
+    .btn {
+      margin: 20rpx 60rpx;
+      color: #ffffff;
+      border-radius: 50rpx;
+      text-align: center;
+      padding: 20rpx 0;
+    }
+    .push-again-btn {
+      background-image: linear-gradient(to right, #7d4ea1, #40397c);
+    }
+    .blue-push-again-btn {
+      .color-background-color('blue');
+    }
+    .green-push-again-btn {
+      .color-background-color('green');
+    }
+  }
+}
+.lines {
+  border-bottom: 2rpx solid #ececec;
+}
+</style>

+ 192 - 0
src/crmPages/parkingReceipt/parkingOrderDetail.vue

@@ -0,0 +1,192 @@
+<template>
+  <scroll-view class="scroll-Y" scroll-y>
+    <wx-points-commit ref="wxPointsCommit"></wx-points-commit>
+
+    <view class="order-price">
+      <view class="text">开票金额</view>
+      <view class="price">¥{{ parFee }}元</view>
+    </view>
+    <view class="tab-header"
+      >缴费订单总数 <text class="red">{{ orderList.length }}单</text></view
+    >
+    <view class="order-list">
+      <view
+        class="order-item"
+        v-for="(item, index) in orderList"
+        :key="index"
+        @click="gotoDetail(item)"
+      >
+        <!-- 0:停车缴费  1:活动报名 2:积分兑换 -->
+        <template v-if="item.invoiceCategory === 0">
+          <view class="item-header">
+            <view>{{ item.orderNo }}-{{ item.carNo }}</view>
+            <view class="red">¥{{ getOrderItemPrice(item) }}</view>
+          </view>
+          <view class="item-bottom">
+            <view>{{ item.parkName }}</view>
+            <view>入场时间: {{ item.enterTime }}</view>
+            <view>停车时长: {{ item.serviceHour }}分钟</view>
+          </view>
+        </template>
+        <template v-else-if="item.invoiceCategory === 1"></template>
+        <template v-else-if="item.invoiceCategory === 2"></template>
+      </view>
+    </view>
+  </scroll-view>
+</template>
+
+<script>
+const app = getApp();
+export default {
+  data() {
+    return {
+      picUrl: this.$picUrl,
+      order: {},
+      parFee: '',
+      id: '',
+      orderList: [],
+      optionsQuery: null,
+      useParkingOrderCache: false,
+    };
+  },
+  onLoad(options) {
+    this.optionsQuery = options;
+    this.id = options.id;
+    const useParkingOrderCache = options?.useParkingOrderCache ?? 'false';
+    // 如果是通过"发票申请"页面进入的,可以适用本地缓存直接获取数据
+    if (useParkingOrderCache == 'true') {
+      this.useParkingOrderCache = true;
+      const tempParkingOrder = this.$store.state.tempParkingOrder;
+      this.parFee = (tempParkingOrder.invoiceAmount / 100).toFixed(2);
+      const orderList = tempParkingOrder.list;
+      orderList.forEach((item) => {
+        item.invoiceCategory = 0;
+      });
+      this.orderList = orderList;
+    } else {
+      this.useParkingOrderCache = false;
+    }
+  },
+  onShow() {
+    if (!this.useParkingOrderCache) {
+      this.getInvoicedDetail(this.id);
+    }
+  },
+  methods: {
+    gotoDetail(item) {
+      uni.navigateTo({
+        url:
+          '/pages/parkingFee/parkingFeeDetailSuccess?orderNo=' + item.orderNo,
+      });
+    },
+    // 根据发票id获取支付记录详情信息
+    getInvoicedDetail(id) {
+      const self = this;
+      const data = {
+        id: id,
+      };
+      self.$md(data);
+      uni.request({
+        url:
+          self.$baseURL + 'api/1.0/invoice/myParkOrderListByInvoiceId?id=' + id,
+        method: 'POST',
+        data: data,
+        header: JSON.parse(uni.getStorageSync('handleUser')),
+        success: (res) => {
+          console.log('获取订单详情信息', res.data);
+          if (res.data.code === 0) {
+            self.order = res.data.data.list[0];
+            self.parFee = (res.data.data.invoiceAmount / 100).toFixed(2);
+            self.orderList = res.data.data.list;
+          } else {
+            uni.showToast({
+              title: res.data.msg,
+              duration: 2000,
+              icon: 'none',
+            });
+          }
+        },
+        fail: () => {
+          uni.showToast({
+            title: '服务器开小差了呢,请您稍后再试',
+            icon: 'none',
+          });
+        },
+      });
+    },
+    getOrderItemPrice(item) {
+      if (this.useParkingOrderCache) {
+        const payFee = item.serviceFee;
+        return (payFee / 100).toFixed(2);
+      } else {
+        const payFee = item.invoiceAmount;
+        return (payFee / 100).toFixed(2);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.scroll-Y {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f2f2f2;
+  padding: 20rpx;
+  box-sizing: border-box;
+  .order-price {
+    border-radius: 10rpx;
+    text-align: center;
+    background-color: #ffffff;
+    padding: 20rpx 0;
+    margin-bottom: 20rpx;
+    .text {
+      color: #4d4d4d;
+      padding: 10rpx 0;
+    }
+    .price {
+      color: #000000;
+      font-weight: 400;
+      font-size: 32rpx;
+      padding: 10rpx 0;
+    }
+  }
+  .tab-header {
+    color: #808080;
+    padding: 10rpx 20rpx 20rpx;
+  }
+  .order-list {
+    .order-item {
+      border-radius: 20rpx;
+      background-color: #ffffff;
+      padding: 20rpx;
+      margin-bottom: 20rpx;
+      .item-header {
+        padding-top: 6rpx;
+        padding-bottom: 6rpx;
+        font-size: 30rpx;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        border: 400;
+        border-bottom: 1px solid #f8f8f8;
+        padding-bottom: 20rpx;
+        padding-left: 10rpx;
+      }
+      .item-bottom {
+        color: #808080;
+        padding-top: 20rpx;
+        padding-left: 10rpx;
+        > view {
+          padding: 10rpx 0;
+        }
+      }
+    }
+  }
+  .red {
+    color: #ed1c24;
+  }
+}
+</style>

BIN
src/crmPages/static/images/arrows.png


BIN
src/crmPages/static/images/check.png


BIN
src/crmPages/static/images/delete.png


BIN
src/crmPages/static/images/dot.png


BIN
src/crmPages/static/images/download.png


BIN
src/crmPages/static/images/edit.png


BIN
src/crmPages/static/images/hint.png


BIN
src/crmPages/static/images/icon1-blue.png


BIN
src/crmPages/static/images/icon1-green.png


BIN
src/crmPages/static/images/icon1.png


BIN
src/crmPages/static/images/icon2-blue.png


BIN
src/crmPages/static/images/icon2-green.png


BIN
src/crmPages/static/images/icon2.png


BIN
src/crmPages/static/images/icon3-blue.png


BIN
src/crmPages/static/images/icon3-green.png


BIN
src/crmPages/static/images/icon3.png


BIN
src/crmPages/static/images/icon4-blue.png


BIN
src/crmPages/static/images/icon4-green.png


BIN
src/crmPages/static/images/icon4.png


BIN
src/crmPages/static/images/icon5.png


BIN
src/crmPages/static/images/money.png


BIN
src/crmPages/static/images/nodataicon.png


BIN
src/crmPages/static/images/parking-bgi.png


BIN
src/crmPages/static/images/rent.png


BIN
src/crmPages/static/images/sweep.png


BIN
src/crmPages/static/images/update.png


BIN
src/images/1v1-40.png


BIN
src/images/1v1-41.png


BIN
src/images/1v1-42.png


BIN
src/images/1v1-43.png


BIN
src/images/1v1-44.png


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 8 - 0
src/images/authorize/weixin-2.svg


BIN
src/images/calendar.png


BIN
src/images/calendar1.png


BIN
src/images/chart.png


BIN
src/images/chooseMarket/location-active.png


+ 18 - 0
src/images/chooseMarket/location-recent.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="33px" height="38px" viewBox="0 0 33 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组 4</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="LBS-离你最近的位置" transform="translate(-120.000000, -563.000000)" fill-rule="nonzero">
+            <g id="编组-6备份" transform="translate(87.000000, 385.000000)">
+                <g id="编组-9" transform="translate(33.000000, 175.000000)">
+                    <g id="编组-4" transform="translate(-0.000000, 3.000000)">
+                        <g id="dingwei-4备份" fill="#687AC2">
+                            <path d="M0,15.7482536 C0,19.9471592 1.71701164,23.96722 4.75979122,26.8924124 L16.2191842,38 L27.6785772,26.8924124 C30.7217566,23.9671768 32.4390244,19.9468427 32.4390244,15.747623 C32.4390244,11.5484034 30.7217566,7.52806932 27.6785772,4.60283364 L27.3537501,4.29639134 C20.9871376,-1.54366747 10.9722701,-1.4188206 4.75979122,4.60283364 C1.71701164,7.52928712 0,11.549348 0,15.7482536 Z" id="形状"></path>
+                        </g>
+                        <path d="M16.7723203,9.26891124 C14.4333676,9.23668048 12.2581611,10.4660337 11.0792816,12.4864243 C9.90040207,14.5068149 9.90040207,17.0053802 11.0792816,19.0257708 C12.2581611,21.0461614 14.4333676,22.2755146 16.7723203,22.2432839 C20.3202373,22.1943936 23.1707317,19.30435 23.1707317,15.7560976 C23.1707317,12.2078451 20.3202373,9.31780152 16.7723203,9.26891124 Z M16.7723203,11.7324777 C18.2266017,11.7070314 19.581436,12.4683151 20.3160217,13.7236893 C21.0506073,14.9790636 21.0506073,16.5331316 20.3160217,17.7885058 C19.581436,19.04388 18.2266017,19.8051637 16.7723203,19.7797174 C14.5775773,19.741315 12.8184861,17.9511756 12.8184861,15.7560976 C12.8184861,13.5610195 14.5775773,11.7708801 16.7723203,11.7324777 L16.7723203,11.7324777 Z" id="形状" fill="#FFFFFF"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

BIN
src/images/chooseMarket/location.png


+ 10 - 0
src/images/chooseMarket/location.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="28px" height="32px" viewBox="0 0 28 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>dingwei-4备份</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="dingwei-4备份" fill="#000000" fill-rule="nonzero">
+            <path d="M4.10845137,3.8771324 C1.48205215,6.34045231 0,9.72576674 0,13.2616872 C0,16.7976077 1.48205215,20.1829221 4.10845137,22.6462421 L13.9997169,32 L23.8909825,22.6462421 C26.5177268,20.1828857 28,16.7973412 28,13.2611562 C28,9.72497124 26.5177268,6.3394268 23.8909825,3.87607043 L23.6106053,3.61801376 C18.1152135,-1.2999305 9.47080153,-1.1947963 4.10845137,3.87607043 L4.10845137,3.8771324 Z M22.1053649,5.1663538 L22.3637517,5.4042332 L22.6056457,5.63892672 C24.699135,7.72523494 25.8486386,10.5294124 25.8012111,13.4344068 C25.7537835,16.3394012 24.513311,19.1071795 22.3527565,21.1286989 L13.9997169,29.0265075 L5.6466773,21.1286989 C3.44235212,19.0648758 2.19813877,16.2263106 2.19813877,13.2611562 C2.19813877,10.2960019 3.44235212,7.45743665 5.6466773,5.39361359 C10.0887307,1.19461735 17.2158076,1.03213722 21.8601724,4.95396148 L22.1053649,5.1663538 Z" id="形状"></path>
+            <path d="M13.5757828,8.00052438 C11.5929489,7.97320093 9.7489298,9.01537818 8.74954134,10.7281529 C7.75015289,12.4409277 7.75015289,14.5590723 8.74954134,16.2718471 C9.7489298,17.9846218 11.5929489,19.0267991 13.5757828,18.9994756 C16.5835095,18.9580292 19,16.508011 19,13.5 C19,10.491989 16.5835095,8.04197084 13.5757828,8.00052438 Z M13.5757828,10.0889989 C14.8086417,10.067427 15.9571948,10.7128009 16.5799357,11.7770374 C17.2026765,12.8412738 17.2026765,14.1587262 16.5799357,15.2229626 C15.9571948,16.2871991 14.8086417,16.932573 13.5757828,16.9110011 C11.7152018,16.8784456 10.2239421,15.360865 10.2239421,13.5 C10.2239421,11.639135 11.7152018,10.1215544 13.5757828,10.0889989 L13.5757828,10.0889989 Z" id="形状"></path>
+        </g>
+    </g>
+</svg>

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 6 - 0
src/images/chooseMarket/miaozhun.svg


+ 9 - 0
src/images/chooseMarket/search.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="46px" height="46px" viewBox="0 0 46 46" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>sousuo-4备份</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="sousuo-4备份" fill="#666666" fill-rule="nonzero">
+            <path d="M19.1920941,3.59840194 C27.1688083,3.61117943 33.8395604,9.66329717 34.6252367,17.6008448 C35.4116627,25.5383925 30.0573684,32.7817421 22.2388391,34.3583064 C14.4195602,35.9356204 6.67674964,31.3341217 4.32496841,23.7121868 C1.97318718,16.0902518 5.77562085,7.92630263 13.1233441,4.8226525 C15.0433129,4.01051269 17.1074208,3.59413089 19.1920941,3.59840194 M19.1920941,0 C8.5929603,0 0,8.59276274 0,19.1916529 C0,29.7905431 8.5929603,38.3833058 19.1920941,38.3833058 C29.791228,38.3833058 38.3841883,29.7905431 38.3841883,19.1916529 C38.3841883,8.59276274 29.791228,0 19.1920941,0 Z M44.2017918,45.9999966 C43.7242688,46.0009332 43.2661934,45.8109051 42.9295659,45.4722226 L33.8133212,36.3561875 C33.1318519,35.6499946 33.1415979,34.5277327 33.8350623,33.8335347 C34.5292763,33.1393366 35.651564,33.1295909 36.3570234,33.8117941 L45.4732681,42.9278292 C45.987536,43.4424258 46.141374,44.216036 45.8631075,44.8882266 C45.5854174,45.5609098 44.9295523,45.9998203 44.2017918,45.9999966 L44.2017918,45.9999966 Z" id="形状"></path>
+        </g>
+    </g>
+</svg>

BIN
src/images/default-shanghai.png


BIN
src/images/empty.png


BIN
src/images/home/home-location-icon.png


BIN
src/images/icon-carType.png


BIN
src/images/jingan-ticket-icon.png


BIN
src/images/limitErr.png


BIN
src/images/location.png


BIN
src/images/loggedOff/icon-blue.png


BIN
src/images/loggedOff/icon-green.png


BIN
src/images/loggedOff/icon-success-blue.png


BIN
src/images/loggedOff/icon-success-green.png


BIN
src/images/loggedOff/icon.png


BIN
src/images/member-center-activity.png


BIN
src/images/member-center-birthday.png


BIN
src/images/member-center-park.png


BIN
src/images/member-center-score.png


BIN
src/images/membershipInterests-active.png


BIN
src/images/membershipInterests.png


BIN
src/images/my/main-ac.png


BIN
src/images/my/main-qr.png


BIN
src/images/my/vvip-main-qr.png


BIN
src/images/parkingReceipt-noData.png


BIN
src/images/personInfo/address.png


BIN
src/images/personInfo/birthday.png


BIN
src/images/personInfo/gender.png


BIN
src/images/personInfo/name.png


BIN
src/images/phone.png


BIN
src/images/points-mail-search.png


BIN
src/images/pointsMail/nav-classify-actived.png


BIN
src/images/pointsMail/nav-classify.png


BIN
src/images/pointsMail/product-card.png


BIN
src/images/pointsMail/sellOut.png


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно