Parcourir la source

基础架构+散户加气3.1

chenlei il y a 1 an
Parent
commit
31f52161fc
65 fichiers modifiés avec 1077 ajouts et 277 suppressions
  1. 1 1
      src/components/container/index.vue
  2. 13 4
      src/components/fieldGroups/index.vue
  3. 39 0
      src/components/numer/index.vue
  4. 12 13
      src/components/refresh/index.vue
  5. 57 0
      src/components/sticky/index.vue
  6. 6 0
      src/enums/index.ts
  7. 12 0
      src/pages.json
  8. 2 7
      src/pages/account/index.vue
  9. 21 68
      src/pages/index/index.vue
  10. 1 1
      src/pages/list/index.vue
  11. 3 3
      src/pages/login/index.vue
  12. 2 2
      src/pages/order/createOrder.vue
  13. 19 10
      src/pages/order/index.vue
  14. 48 43
      src/pages/order/orderDetail.vue
  15. 3 4
      src/pages/order/prePay.vue
  16. 5 2
      src/pages/org/index.vue
  17. 21 3
      src/pages/personCenter/index.vue
  18. 93 0
      src/pages/personCenter/mobile.vue
  19. 130 0
      src/pages/personCenter/password.vue
  20. 274 0
      src/pages/personCenter/userIdCard.vue
  21. 2 2
      src/pages/truckInfo/detail.vue
  22. 1 1
      src/pages/truckInfo/index.vue
  23. 5 0
      src/pages/webview/login.vue
  24. 1 1
      src/pagesSubExample/login/components/upload.vue
  25. BIN
      src/static/images/controct_bg.png
  26. BIN
      src/static/images/driver_apply1.png
  27. BIN
      src/static/images/driver_apply3.png
  28. BIN
      src/static/images/icons/card.png
  29. BIN
      src/static/images/icons/firm.png
  30. BIN
      src/static/images/icons/org_icon.png
  31. BIN
      src/static/images/icons/payhistory.png
  32. BIN
      src/static/images/icons/perpay.png
  33. BIN
      src/static/images/icons/turnk_number_head.png
  34. BIN
      src/static/images/idCard/idCard0.png
  35. BIN
      src/static/images/idCard/idCard1.png
  36. BIN
      src/static/images/idCard/idCard_back.png
  37. BIN
      src/static/images/idCard/idCard_error2.png
  38. BIN
      src/static/images/idCard/idCard_error3.png
  39. BIN
      src/static/images/idCard/idCard_front.png
  40. BIN
      src/static/images/qr@3x.png
  41. BIN
      src/static/logo.png
  42. 28 2
      src/style/index.scss
  43. 3 0
      src/types/api.d.ts
  44. 4 4
      src/types/global.d.ts
  45. 2 0
      src/types/page.d.ts
  46. 2 1
      src/types/schemas/custom.d.ts
  47. 71 27
      src/types/schemas/strategy.d.ts
  48. 9 12
      src/utils/aop/index.ts
  49. 2 0
      src/utils/api/socket/stomp.ts
  50. 4 1
      src/utils/api/web/index.ts
  51. 4 4
      src/utils/api/web/request/afterReturning.ts
  52. 41 22
      src/utils/api/web/request/afterThrowing.ts
  53. 1 1
      src/utils/api/web/request/before.ts
  54. 2 1
      src/utils/api/web/request/index.ts
  55. 22 3
      src/utils/config/index.ts
  56. 1 1
      src/utils/config/interFaces/strategy.ts
  57. 15 0
      src/utils/config/interFaces/user.ts
  58. 21 0
      src/utils/config/pages.ts
  59. 43 25
      src/utils/container/index.ts
  60. 0 1
      src/utils/func/convert.ts
  61. 9 3
      src/utils/func/index.ts
  62. 12 0
      src/utils/func/validate.ts
  63. 0 2
      src/utils/store/index.ts
  64. 5 2
      src/utils/store/user.ts
  65. 5 0
      src/utils/store/webapi.ts

+ 1 - 1
src/components/container/index.vue

@@ -18,7 +18,7 @@ const props = defineProps<{ cusStyle?: AnyObject }>()
 .container {
   position: relative;
   box-sizing: border-box;
-  height: 100vh;
+  min-height: 100vh;
   padding: $p-spac;
 }
 </style>

+ 13 - 4
src/components/fieldGroups/index.vue

@@ -5,10 +5,11 @@
       <template v-for="(f, i) in fg.fields" :key="i">
         <div v-if="!f.show || f.show(props.targetData)">
           <span>{{ f.title }}</span>
-          <div class="center justify-end" :class="f.keyClass">
+          <div class="center items-end" :class="f.keyClass">
             <span class="mr-spacd4" v-if="f.preInfo">{{ f.preInfo }}</span>
-            <span v-if="f.view">
-              {{ func.convert.nullView(f.view(props.targetData[f.key])) }}
+            <!-- 小程序环境 标签内if不能为function,需要转成boolean类型 -->
+            <span v-if="!!f.view">
+              {{ methods.view(f) }}
             </span>
             <span v-else>{{ func.convert.nullView(props.targetData[f.key]) }}</span>
             <span class="ml-spacd4" v-if="f.unit">{{ f.unit }}</span>
@@ -22,6 +23,14 @@
 defineOptions({
   name: 'fieldGroups',
 })
-const props = defineProps<{ fieldGroups: IFieldGroup; targetData: AnyObject }>()
+const props = defineProps<{
+  fieldGroups: IFieldGroup<AnyObject>[]
+  targetData: AnyObject
+}>()
+const methods = {
+  view(f) {
+    return func.convert.nullView(f.view(f.key ? props.targetData[f.key] : props.targetData))
+  },
+}
 </script>
 <style lang="scss" scoped></style>

+ 39 - 0
src/components/numer/index.vue

@@ -0,0 +1,39 @@
+<template>
+  <span>
+    <template v-if="props.isSimple">
+      <span v-if="props.pre">{{ props.pre }}</span>
+      <span class="font-bold">{{ props.value }}</span>
+      <span class="unit" v-if="numer.unit">{{ numer.unit }}</span>
+    </template>
+    <template v-else>
+      <span v-if="props.pre">{{ props.pre }}</span>
+      <span class="font-bold b-fz" v-if="numer.integer">{{ numer.integer }}</span>
+      <span class="font-bold" v-if="numer.decimal">{{ numer.decimal }}</span>
+      <span class="unit" v-if="numer.unit">{{ numer.unit }}</span>
+    </template>
+  </span>
+</template>
+<script lang="ts" setup>
+type Numer = { integer?: string; decimal?: string; unit: string }
+const props = withDefaults(
+  defineProps<{ isSimple?: boolean; value?: number; pre?: string; unit?: string }>(),
+  {
+    value: 0,
+    unit: '',
+  },
+)
+const numer = computed(() => {
+  const arr = props.value.toString().split('.')
+  return {
+    integer: arr[0],
+    decimal: arr[1] ? '.' + arr[1] : '',
+    unit: props.unit,
+  } as Numer
+})
+</script>
+
+<style lang="scss" scoped>
+.unit {
+  margin-left: $p-spacd4;
+}
+</style>

+ 12 - 13
src/components/refresh/index.vue

@@ -4,7 +4,8 @@
       type="refresh"
       color=""
       size="none"
-      :class="{ rotater: props.loading }"
+      :class="[rotaterH5]"
+      :customPrefix="rotaterMp"
       :style="{ 'font-size': props.iconSize + 'rpx' }"
     ></uni-icons>
     刷新
@@ -15,22 +16,20 @@ const emits = defineEmits(['refresh'])
 const props = withDefaults(defineProps<{ loading: boolean; iconSize: number }>(), {
   iconSize: 30,
 })
+const rotaterH5 = computed(() => {
+  let rv = ''
+  if (config.common.isH5 && props.loading) rv = 'pass-com-rotater'
+  return rv
+})
+const rotaterMp = computed(() => {
+  let rv = ''
+  if (config.common.isMp && props.loading) rv = 'pass-com-rotater'
+  return rv
+})
 </script>
 
 <style lang="scss" scoped>
 .refresh {
   max-height: $p-fz;
 }
-.rotater {
-  animation: rotate 0.5s linear infinite;
-}
-
-@keyframes rotate {
-  from {
-    transform: rotate(0deg);
-  }
-  to {
-    transform: rotate(360deg);
-  }
-}
 </style>

+ 57 - 0
src/components/sticky/index.vue

@@ -0,0 +1,57 @@
+<template>
+  <div class="sticky" :class="{ stickyed: data.stickyed }">
+    <slot />
+  </div>
+</template>
+<script lang="ts" setup>
+type stickyResult = UniApp.ObserveResult & { stickyed?: boolean }
+const props = withDefaults(
+  defineProps<{ relativeTo: string; targetSelector: string; targetComponent?: any }>(),
+  {},
+)
+const emit = defineEmits<{ (e: 'stickChange', sr: stickyResult): void }>()
+const data = reactive({
+  stickyed: false,
+})
+onMounted(() => {
+  const iob = uni.createIntersectionObserver(
+    props.targetComponent || getCurrentInstance().parent.parent,
+  )
+
+  iob.relativeTo(props.relativeTo).observe(props.targetSelector, (res) => {
+    const sr: stickyResult = res
+    sr.stickyed = res.intersectionRatio > 0
+    data.stickyed = sr.stickyed
+    emit('stickChange', sr)
+  })
+})
+</script>
+
+<style lang="scss" scoped>
+.sticky {
+  top: -1rpx;
+  z-index: 1;
+}
+.stickyed {
+  background-color: $bg-color;
+  border-bottom: 1rpx solid $border-color;
+  @extend %box-shadow;
+  &::before,
+  &::after {
+    position: absolute;
+    top: 0;
+    z-index: -1;
+    width: $p-spac;
+    height: 100%;
+    content: '';
+    background-color: #fff;
+    border-bottom: 1rpx solid $border-color;
+  }
+  &::before {
+    left: -$p-spac;
+  }
+  &::after {
+    right: -$p-spac;
+  }
+}
+</style>

+ 6 - 0
src/enums/index.ts

@@ -1,7 +1,13 @@
 enum FormatType {
+  /** 年月日 */
   YMD = 'YYYY-MM-DD',
+  /** 年月日 无连接符 */
+  YMDNC = 'YYYYMMDD',
+  /** 年月日 时分秒 */
   YMDHMS = 'YYYY-MM-DD HH:mm:ss',
+  /** 年月日 时分秒为0 */
   YMD000 = 'YYYY-MM-DD 00:00:00',
+  /** 年月日 时分秒今天最后一秒  */
   YMDEnd = 'YYYY-MM-DD 23:59:59',
 }
 /** 页面跳转类型 */

+ 12 - 0
src/pages.json

@@ -68,6 +68,18 @@
       "type": "page"
     },
     {
+      "path": "pages/personCenter/mobile",
+      "type": "page"
+    },
+    {
+      "path": "pages/personCenter/password",
+      "type": "page"
+    },
+    {
+      "path": "pages/personCenter/userIdCard",
+      "type": "page"
+    },
+    {
       "path": "pages/truckInfo/detail",
       "type": "page"
     },

+ 2 - 7
src/pages/account/index.vue

@@ -6,9 +6,7 @@
     <div class="chunk relative s-fz">
       <div class="yebz absolute" v-if="data.accountInfo.flag === 0">[余额不足]</div>
       <div class="flex items-baseline mb-spacd2">
-        <span class="font-bold b-fz">{{ data.accountInfo.showBalance.balance }}</span>
-        <span class="font-bold">{{ data.accountInfo.showBalance.suffix }}</span>
-        <span class="unit">{{ data.accountInfo.unit }}</span>
+        <ay-numer :value="data.accountInfo.totalBalance" :unit="data.accountInfo.unit" />
         <span v-if="data.accountInfo.showDet">
           (直销{{ data.accountInfo.carrierDirectBalance }} | 经销{{
             data.accountInfo.carrierBalance
@@ -40,13 +38,10 @@ ay.entrance((args) => {
   })
 })
 </script>
-<style lang="scss">
+<style lang="scss" scoped>
 .yebz {
   top: $p-spac;
   right: $p-spac;
   color: #b8741a;
 }
-.unit {
-  margin: 0 $p-spacd2;
-}
 </style>

+ 21 - 68
src/pages/index/index.vue

@@ -52,11 +52,7 @@
     <div class="flex">
       <div class="chunk flex-1 s-fz mr-spac money-bg" @click="methods.goAccount">
         <div class="mb-spacd4">可用余额</div>
-        <div class="">
-          <span class="font-bold b-fz">{{ data.accountInfo.showBalance.balance }}</span>
-          <span class="font-bold">{{ data.accountInfo.showBalance.suffix }}</span>
-          <span class="unit">{{ data.accountInfo.unit }}</span>
-        </div>
+        <ay-numer :value="data.accountInfo.totalBalance" :unit="data.accountInfo.unit" />
       </div>
 
       <div class="chunk flex-1 center justify-start s-fz cars" @click="methods.truckManage">
@@ -82,17 +78,19 @@
       </div>
     </div>
     <div class="chuck list-app">
-      <div
-        class="center justify-between sticky"
-        id="stationTop"
-        :class="{ stickyed: data.station.stickyed }"
-      >
-        <div class="title">附近加气站</div>
-        <div v-if="data.userLocation" @click="methods.drawerOpen">
-          {{ data.station.curCity }}
-          <uni-icons type="down" size="12" />
+      <ay-sticky relativeTo="#stations" targetSelector="#stationTop">
+        <div
+          class="center justify-between sticky"
+          id="stationTop"
+          :class="{ stickyed: data.station.stickyed }"
+        >
+          <div class="title">附近加气站</div>
+          <div v-if="data.userLocation" @click="methods.drawerOpen">
+            {{ data.station.curCity }}
+            <uni-icons type="down" size="12" />
+          </div>
         </div>
-      </div>
+      </ay-sticky>
       <div v-show="data.userLocation" id="stations">
         <ayb-station
           v-for="(la, i) in data.station.listApp"
@@ -177,7 +175,7 @@ const staticData = {
 }
 const data = reactive({
   firstUnload: true,
-  // 存在未支付完成订单
+  /** 存在未支付完成订单 */
   hasnopayfordriver: true,
   invite: {} as 预添加司机详情,
   truckInfo: [] as PersonDriver对象[],
@@ -187,7 +185,7 @@ const data = reactive({
   /** 二维码相关 */
   qrcode: {
     /** 有效时长 m */
-    seconds: 300, // 10,
+    seconds: 300,
     /** 二维码 */
     img: null,
     /** 已过期 */
@@ -271,6 +269,7 @@ const methods = ay.initMethods(
         2() {
           ay.goPage(config.pages.org_index)
         },
+        3() {},
       }
       maps[menu.id]()
     },
@@ -461,9 +460,7 @@ const methods = ay.initMethods(
     agree() {
       webapi.user.agree({ id: data.invite.driverWhiteList.id }).then((res) => {
         if (res) {
-          func.native.showToast('加入成功,请重新登录').then(() => {
-            store.user.clearUserInfo()
-          })
+          func.native.showToast('加入成功,请重新登录').then(() => {})
           inputDialog.value.close()
         }
       })
@@ -602,37 +599,15 @@ ay.entrance(
         init()
       }
     }
+    if (args.loadType === enums.LoadType.onShow) {
+      init()
+    }
   },
   {
-    // addLoadTypes: [enums.LoadType.onShow],
+    addLoadTypes: [enums.LoadType.onShow],
   },
 )
 
-onMounted(() => {
-  // #ifdef MP
-  const iob = uni.createIntersectionObserver(getCurrentInstance())
-
-  iob.relativeTo('#stations').observe('#stationTop', (res) => {
-    data.station.stickyed = res.intersectionRatio > 0
-  })
-  // #endif
-  // uni
-  // .createSelectorQuery()
-  // .select('#stationTop')
-  // // .boundingClientRect()
-  // .fields(
-  //   {
-  //     scrollOffset: true,
-  //     rect:true,
-  //   },
-  //   (res) => {
-  //     console.log(res)
-  //   },
-  // )
-  // .exec((res) => {
-  //   console.log(res)
-  // })
-})
 onPageScroll((res) => {
   staticData.scrollTop = res.scrollTop
 })
@@ -672,29 +647,7 @@ onPageScroll((res) => {
   height: 116rpx;
 }
 #stationTop {
-  top: -1px;
-  z-index: 1;
   padding: $p-spac 0;
-  background: #fff;
-  &.stickyed {
-    border-bottom: 1rpx solid $border-color;
-    @extend %box-shadow;
-    &::before,
-    &::after {
-      position: absolute;
-      width: $p-spac;
-      height: 100%;
-      content: '';
-      background-color: #fff;
-      border-bottom: 1rpx solid $border-color;
-    }
-    &::before {
-      left: -$p-spac;
-    }
-    &::after {
-      right: -$p-spac;
-    }
-  }
 }
 .unit {
   margin: 0 $p-spacd2;

+ 1 - 1
src/pages/list/index.vue

@@ -52,7 +52,7 @@ ay.entrance(
 )
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .item {
   width: 100%;
   text-wrap: wrap;

+ 3 - 3
src/pages/login/index.vue

@@ -10,7 +10,7 @@
         <button
           type="green"
           :loading="store.webapi.user.token.ing"
-          :disabled="store.webapi.user.token.ing"
+          :disabled="store.webapi.user.token.ios"
           :open-type="data.check ? 'getPhoneNumber' : ''"
           :phone-number-no-quota-toast="false"
           @getphonenumber="methods.getphonenumber"
@@ -51,7 +51,7 @@ const methods = {
     data.shake = false
   },
   async getphonenumber(e) {
-    if (e.detail.errno) {
+    if (!e.detail.code) {
       // func.native.showToast(e.detail.errMsg)
       return
     }
@@ -102,7 +102,7 @@ ay.entrance(({ exts }) => {
   height: 44px;
 }
 .login-con {
-  height: 100%;
+  height: calc(100vh - 54px - $p-spac);
 }
 .login-phone {
   box-sizing: border-box;

+ 2 - 2
src/pages/order/createOrder.vue

@@ -26,7 +26,7 @@
         type="primary"
         @click="methods.confirm"
         :loading="store.webapi.pay.add.ing"
-        :disabled="store.webapi.pay.add.ing"
+        :disabled="store.webapi.pay.add.ios"
       >
         确定
       </button>
@@ -87,7 +87,7 @@ ay.entrance(async (args) => {
 })
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .personal {
   width: 100rpx;
   height: 100rpx;

+ 19 - 10
src/pages/order/index.vue

@@ -1,7 +1,7 @@
 <template>
-  <ay-container>
-    <div>
-      <div class="center mb-spac">
+  <ay-container :cusStyle="{ 'padding-top': 0 }">
+    <ay-sticky relativeTo="#orderList" targetSelector="#top">
+      <div class="center pt-spac pb-spac" id="top">
         <uni-datetime-picker
           v-model="data.range"
           type="daterange"
@@ -18,6 +18,8 @@
           />
         </uni-badge>
       </div>
+    </ay-sticky>
+    <div id="orderList">
       <div
         class="chunk childs-fcjb-mbd2"
         v-for="(o, i) in data.orderList"
@@ -133,7 +135,7 @@ const data = reactive({
     {
       label: '支付方式',
       value: 'payType',
-      items: func.convert.getCheckItem(config.common.payType),
+      items: func.convert.getCheckItem(config.common.payTypes),
     },
     {
       label: '交易模式',
@@ -180,6 +182,9 @@ const checkCount = computed(() =>
     .reduce((a, b) => a + b, 0),
 )
 const methods = {
+  stickChange(e) {
+    console.log(e)
+  },
   goDetail(od) {
     ay.goPage(config.pages.order_orderDetail, { params: od })
   },
@@ -192,9 +197,13 @@ const methods = {
     const filterCheckeds: any = methods.getStoreFilterCheckeds()
     if (Object.keys(filterCheckeds).length) {
       data.filters.forEach((f) => {
-        f.items.forEach((ff) => {
-          ff.checked = filterCheckeds[f.value]?.includes(ff.value)
-        })
+        if (filterCheckeds[f.value]) {
+          f.items.forEach((ff) => {
+            ff.checked = filterCheckeds[f.value]?.includes(ff.value)
+          })
+        } else {
+          f.items[0].checked = true
+        }
       })
     }
   },
@@ -261,8 +270,8 @@ const methods = {
           page: cras.page,
           size: cras.size,
           param: {
-            startTime: func.getDate(data.range[0]).format(enums.FormatType.YMD000),
-            endTime: func.getDate(data.range[1]).format(enums.FormatType.YMDEnd),
+            startCreateDate: func.getDate(data.range[0]).format(enums.FormatType.YMD000),
+            endCreateDate: func.getDate(data.range[1]).format(enums.FormatType.YMDEnd),
             ...paramFilters,
           },
         },
@@ -299,7 +308,7 @@ ay.entrance((args) => {
 })
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .abs-right {
   position: absolute;
   right: $p-spac;

+ 48 - 43
src/pages/order/orderDetail.vue

@@ -11,22 +11,28 @@
       </div>
       <div class="chunk2">
         <div>
-          <div>加气量{{ data.orderDetail.gasQty }}公斤</div>
           <div>
-            <div>结算金额¥{{ data.orderDetail.amount }}元</div>
+            加气量
+            <ay-numer :value="data.orderDetail.gasQty" unit="公斤" :isSimple="true" />
+          </div>
+          <div>
+            <div>
+              结算金额
+              <ay-numer :value="data.orderDetail.amount" pre="¥" unit="元" :isSimple="true" />
+            </div>
           </div>
         </div>
-        <div v-if="data.orderDetail.carrierRebateHand">
+        <div v-if="data.orderDetail.carrierRebate">
           <div></div>
           <div @click="data.switchPriceDet = !data.switchPriceDet">
-            优惠金额¥{{ data.orderDetail.carrierRebateHand }}元
+            优惠金额¥{{ data.orderDetail.carrierRebate }}元
             <uni-icons :type="data.switchPriceDet ? 'up' : 'down'" color="" class="p-color p-fz" />
           </div>
         </div>
         <div v-if="data.switchPriceDet">
           <div></div>
           <div class="chunk childs-fcjb-mbd2 rebate-detail money-bg">
-            <div v-for="(rd, i) in data.orderDetail.rebateDetailHand" :key="i">
+            <div v-for="(rd, i) in data.orderDetail.rebateDetail" :key="i">
               <div>{{ config.common.interestType[rd.interestType] }}</div>
               <div>¥{{ rd.rebateAmount }}元</div>
             </div>
@@ -88,15 +94,8 @@ const data = reactive({
       roles: ['carrier', 'driver'],
       fields: [
         {
-          title: '结算状态',
-          key: 'settleStatus',
-          view(data) {
-            return config.common.settleStatus[data]
-          },
-        },
-        {
           title: '平台价',
-          key: 'platformPriceHand',
+          key: 'platformPrice',
           unit: '元/公斤',
           preInfo: '¥',
         },
@@ -185,20 +184,20 @@ const data = reactive({
         },
         {
           title: '订单总金额',
-          key: 'allAmountHand',
+          key: 'allAmount',
           unit: '元',
           preInfo: '¥',
         },
         {
           title: '优惠金额',
           cls: 'red',
-          key: 'carrierRebateHand',
+          key: 'carrierRebate',
           // view: 'currency',
           unit: '元',
         },
         {
           title: '平台价',
-          key: 'platformPriceHand',
+          key: 'platformPrice',
           unit: '元/公斤',
           preInfo: '¥',
         },
@@ -242,41 +241,49 @@ const data = reactive({
           title: '物流公司',
           key: 'carrierOrgName',
         },
-        {
-          roles: ['cashier', 'filler'],
-          title: '物流联系电话',
-          key: 'carrierMobile',
-          // view: 'mobile',
-        },
+        // {
+        //   roles: ['cashier', 'filler'],
+        //   title: '物流联系电话',
+        //   key: 'carrierMobile',
+        //   view(data) {
+        //     return func.convert.mobileDes(data)
+        //   },
+        // },
         {
           title: '车牌号',
           key: 'carNumber',
         },
         {
           title: '驾驶员',
-          key: 'driverName',
+          view(data) {
+            let rv = data.driverName
+            if (data.driverMobile) {
+              rv = `${data.driverName}(${func.convert.mobileDes(data.driverMobile)})`
+            }
+            return rv
+          },
         },
       ],
     },
     {
+      roles: ['cashier', 'filler'],
       fields: [
+        // {
+        //   title: '加气站',
+        //   key: 'nickName',
+        // },
+        // {
+        //   title: '站联系电话',
+        //   key: 'stationMobile',
+        //   view(data) {
+        //     return func.convert.mobileDes(data)
+        //   },
+        // },
+        // {
+        //   title: '收银员',
+        //   key: 'cashierName',
+        // },
         {
-          title: '加气站',
-          key: 'nickName',
-        },
-        {
-          title: '站联系电话',
-          key: 'stationMobile',
-          view(data) {
-            return func.convert.mobileDes(data)
-          },
-        },
-        {
-          title: '收银员',
-          key: 'cashierName',
-        },
-        {
-          roles: ['cashier', 'filler'],
           title: '站清分方式',
           key: 'splitType',
           view(data) {
@@ -284,14 +291,12 @@ const data = reactive({
           },
         },
         {
-          roles: ['cashier', 'filler'],
           title: '站清分额',
           key: 'serviceFee',
           unit: '元',
           preInfo: '¥',
         },
         {
-          roles: ['cashier', 'filler'],
           title: '站清分单价',
           key: 'gasstationFee',
           unit: '元/公斤',
@@ -344,7 +349,7 @@ const data = reactive({
         },
       ],
     },
-  ] as IFieldGroup[],
+  ] as IFieldGroup<订单详情>[],
 })
 const curFieldGroups = computed(() =>
   data.fieldGroups.filter((f) => !f.roles || f?.roles?.includes('driver')),
@@ -362,7 +367,7 @@ ay.entrance((args) => {
 })
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rebate-detail {
   width: 50%;
   padding: $p-spacd2;

+ 3 - 4
src/pages/order/prePay.vue

@@ -7,8 +7,7 @@
       <div class="chunk1">
         <div>
           <span class="mr-spacd4">加气量</span>
-          <span class="font-bold b-fz mr-spacd4">{{ data.orderDetail.gasQty }}</span>
-          <span>公斤</span>
+          <ay-numer :value="data.orderDetail.gasQty" unit="公斤" />
         </div>
       </div>
       <div class="section s-fz">选择支付方式</div>
@@ -161,7 +160,7 @@ const data = reactive({
   ],
 })
 
-const canPay = computed(() => curPay.value?.buttonEnable && !store.webapi.pay.order_pay.ing)
+const canPay = computed(() => curPay.value?.buttonEnable && !store.webapi.pay.order_pay.ios)
 const pageParams = computed(() => store.curPage.pageConfig.params)
 const personPay = computed(() => data.paysel?.personPay)
 const carrierPay = computed(() => data.paysel?.carrierPay)
@@ -289,7 +288,7 @@ onUnload(() => {
 })
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .rebate-detail {
   width: 50%;
   padding: $p-spacd2;

+ 5 - 2
src/pages/org/index.vue

@@ -3,7 +3,10 @@
     <ay-skeletons :rowList="data.rowList" :loading="data.firstLoad">
       <div class="center items-start top">
         <div v-if="data.orgDetail.driverApply">
-          <div>加入申请{{ config.common.auditStatus[data.orgDetail.driverApply.auditStatus] }}</div>
+          <div>
+            {{ config.common.orgDetailType[data.orgDetail.type]
+            }}{{ config.common.auditStatus[data.orgDetail.driverApply.auditStatus] }}
+          </div>
           <div v-if="data.orgDetail.driverApply.auditStatus === 3" class="b-fz mt-spac">
             {{ data.orgDetail.driverApply.resMsg }}
           </div>
@@ -210,7 +213,7 @@ const methods = {
         if (res) {
           // 退出成功 服务端身份失效
           func.native.showToast('退出成功').then(() => {
-            store.user.clearUserInfo()
+            ay.navigateBack()
           })
         } else {
           func.native.showToast('退出失败')

+ 21 - 3
src/pages/personCenter/index.vue

@@ -31,9 +31,27 @@
           note=""
           showArrow
           :rightText="func.convert.mobileDes(data.userInfo.mobile)"
+          :clickable="true"
+          @click="ay.goPage(config.pages.personCenter_mobile)"
         ></uni-list-item>
-        <uni-list-item title="实名认证" note="" showArrow>
-          <input type="nickname" v-model="data.userInfo.userName" />
+        <uni-list-item
+          title="修改密码"
+          note=""
+          showArrow
+          :clickable="true"
+          @click="ay.goPage(config.pages.personCenter_password)"
+        ></uni-list-item>
+        <uni-list-item
+          title="实名认证"
+          note=""
+          :showArrow="!data.userInfo.authStatus"
+          :clickable="!data.userInfo.authStatus"
+          @click="ay.goPage(config.pages.personCenter_userIdCard)"
+        >
+          <template v-slot:footer>
+            <div class="green-color p-fz" v-if="data.userInfo.authStatus === 1">已认证</div>
+            <div class="gray-color p-fz" v-else>去认证</div>
+          </template>
         </uni-list-item>
       </uni-list>
     </div>
@@ -85,7 +103,7 @@ const methods = ay.initMethods(
           if (res.confirm) {
             webapi.user
               .logout({ client_id: store.user.service, user_id: store.user.userInfo.user_id })
-              .then((res) => {
+              .then(() => {
                 store.user.clearUserInfo()
               })
           }

+ 93 - 0
src/pages/personCenter/mobile.vue

@@ -0,0 +1,93 @@
+<template>
+  <ay-container>
+    <uni-forms ref="form" :modelValue="data" :rules="rules" validateTrigger="blur">
+      <uni-forms-item required name="mobile">
+        <template #label>
+          <uni-icons type="phone" color="" size="32" class="mr-spac" />
+        </template>
+        <uni-easyinput v-model="data.mobile" placeholder="请输入手机号" />
+      </uni-forms-item>
+      <uni-forms-item required name="code">
+        <template #label>
+          <uni-icons type="locked" color="" size="32" class="mr-spac" />
+        </template>
+
+        <div class="center justify-between">
+          <uni-easyinput
+            v-model="data.code"
+            placeholder="请输入短信验证码"
+            class="flex-1 mr-spac"
+          />
+          <button
+            type="primary"
+            size="mini"
+            @click="methods.sendMessage"
+            :disabled="notSendMessage"
+          >
+            <ay-countdown :seconds="59" @ender="data.waiting = false" v-if="data.waiting" />
+            <span v-else>获取验证码</span>
+          </button>
+        </div>
+      </uni-forms-item>
+      <button type="primary" @click="methods.bind" :disabled="notBind">确认绑定</button>
+    </uni-forms>
+  </ay-container>
+</template>
+
+<script lang="ts" setup>
+const form = ref()
+const rules = {
+  mobile: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '请输入正确手机号码',
+        validateFunction(rule, value) {
+          return func.validate.isValidateMobile(value)
+        },
+      },
+    ],
+  },
+}
+const data = reactive({
+  mobile: '',
+  code: '',
+  waiting: false,
+})
+const notSendMessage = computed(() => data.waiting || !func.validate.isValidateMobile(data.mobile))
+const notBind = computed(() => data.code.length < 4)
+const methods = {
+  sendMessage() {
+    webapi.message
+      .send_1({
+        type: 4,
+        mobile: data.mobile,
+      })
+      .then((res) => {
+        if (res) {
+          data.waiting = true
+          func.native.showToast('验证码发送成功!')
+        }
+      })
+  },
+  bind() {
+    form.value.validate().then(() => {
+      webapi.user
+        .edit_mobile({
+          userId: store.user.userInfo.user_id,
+          newMobile: data.mobile,
+          verifyCode: data.code,
+        })
+        .then(() => {
+          func.native.showToast('修改手机号成功,请重新登录!').then(() => {
+            store.user.clearUserInfo()
+          })
+        })
+    })
+  },
+}
+
+ay.entrance((args) => {})
+</script>
+
+<style lang="scss" scoped></style>

+ 130 - 0
src/pages/personCenter/password.vue

@@ -0,0 +1,130 @@
+<template>
+  <ay-container>
+    <uni-forms ref="codeForm" :modelValue="data" validateTrigger="blur" v-if="data.step === 0">
+      <uni-forms-item name="code">
+        <div class="font-bold bs-fz mb-spacd2">为了确认您的身份,需验证手机号</div>
+        <div>验证码将发送至{{ store.user.userInfo.mobileDes }}</div>
+        <div class="center justify-between mt-spac">
+          <uni-easyinput
+            v-model="data.code"
+            placeholder="请输入短信验证码"
+            class="flex-1 mr-spac"
+          />
+          <button
+            type="primary"
+            size="mini"
+            @click="methods.sendMessage"
+            :disabled="notSendMessage"
+          >
+            <ay-countdown :seconds="59" @ender="data.waiting = false" v-if="data.waiting" />
+            <span v-else>获取验证码</span>
+          </button>
+        </div>
+      </uni-forms-item>
+      <button type="primary" @click="methods.next" :disabled="data.code.length !== 6">
+        下一步
+      </button>
+    </uni-forms>
+    <uni-forms
+      ref="changeForm"
+      :modelValue="data"
+      :rules="changeFormRules"
+      validateTrigger="blur"
+      v-else
+    >
+      <uni-forms-item label="新密码" name="newPassword">
+        <uni-easyinput v-model="data.newPassword" type="password" placeholder="请输入新密码" />
+      </uni-forms-item>
+      <uni-forms-item label="确认密码" name="rePassword">
+        <uni-easyinput v-model="data.rePassword" type="password" placeholder="请再次输入新密码" />
+      </uni-forms-item>
+      <button type="primary" @click="methods.change">确认修改</button>
+    </uni-forms>
+  </ay-container>
+</template>
+
+<script lang="ts" setup>
+const codeForm = ref()
+const changeForm = ref()
+const changeFormRules = {
+  newPassword: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '密码长度为:6-12',
+        validateFunction(rule, value) {
+          return value.length >= 6 && value.length <= 12
+        },
+      },
+    ],
+  },
+  rePassword: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '密码长度为:6-12',
+        validateFunction(rule, value) {
+          return value.length >= 6 && value.length <= 12
+        },
+      },
+      {
+        required: true,
+        errorMessage: '两次输入密码不一致',
+        validateFunction(rule, value) {
+          return value === data.newPassword
+        },
+      },
+    ],
+  },
+}
+const data = reactive({
+  step: 0,
+  newPassword: '',
+  rePassword: '',
+  code: '',
+  waiting: false,
+})
+const notSendMessage = computed(() => data.waiting)
+const methods = {
+  sendMessage() {
+    webapi.message
+      .send_1({
+        type: 3,
+        mobile: store.user.userInfo.mobile,
+      })
+      .then((res) => {
+        if (res) {
+          data.waiting = true
+          func.native.showToast('验证码发送成功!')
+        }
+      })
+  },
+  next() {
+    webapi.message
+      .code({
+        verifyCode: data.code,
+        userId: store.user.userInfo.user_id,
+        mobile: store.user.userInfo.mobile,
+      })
+      .then(() => {
+        data.step++
+      })
+  },
+  change() {
+    changeForm.value.validate().then(() => {
+      webapi.user
+        .set_password({
+          userId: store.user.userInfo.user_id,
+          newPassword: data.newPassword,
+        })
+        .then(() => {
+          func.native.showToast('修改密码成功,请重新登录!').then(() => {
+            store.user.clearUserInfo(1)
+          })
+        })
+    })
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 274 - 0
src/pages/personCenter/userIdCard.vue

@@ -0,0 +1,274 @@
+<template>
+  <ay-container>
+    <div class="form">
+      <uni-forms ref="form" :modelValue="data" :rules="rules" validateTrigger="blur">
+        <div class="font-bold bs-fz mb-spacd2">上传并提交您的证件照片</div>
+        <div class="s-fz gray-color mb-spac">为配合国家监管要求,请上传身份证正反面照片</div>
+        <!-- <div class="p-fz mt-spac mb-spac">身份证照片</div> -->
+        <div class="center flex-col">
+          <uni-forms-item name="idCardFront">
+            <div class="chunk id-card id-card-front" @click="methods.upload(0)">
+              <image
+                class="image"
+                v-show="data.idCardFront"
+                :src="ay.getResourceUrl(data.idCardFront)"
+                mode="scaleToFill"
+              />
+              <div class="desc">点击上传身份证人像面</div>
+            </div>
+          </uni-forms-item>
+          <uni-forms-item name="idCardBack">
+            <div class="chunk id-card id-card-back" @click="methods.upload(1)">
+              <image
+                class="image"
+                v-show="data.idCardBack"
+                :src="ay.getResourceUrl(data.idCardBack)"
+                mode="scaleToFill"
+              />
+              <div class="desc">点击上传身份证国徽面</div>
+            </div>
+          </uni-forms-item>
+        </div>
+        <uni-forms-item>
+          <div class="p-fz mb-spac">拍摄要求</div>
+          <div class="center justify-between">
+            <image class="error-img" src="@img/idCard/idCard0.png" />
+            <image class="error-img" src="@img/idCard/idCard1.png" />
+            <image class="error-img" src="@img/idCard/idCard_error2.png" />
+            <image class="error-img" src="@img/idCard/idCard_error3.png" />
+          </div>
+        </uni-forms-item>
+        <uni-forms-item label="姓名" name="realname">
+          <template #label>
+            <uni-icons type="person" color="" size="32" class="mr-spac" />
+          </template>
+          <uni-easyinput v-model="data.realname" placeholder="请输入姓名" />
+        </uni-forms-item>
+        <uni-forms-item label="身份证号" name="idcardNo">
+          <template #label>
+            <uni-icons type="auth" color="" size="32" class="mr-spac" />
+          </template>
+          <uni-easyinput v-model="data.idcardNo" placeholder="请输入身份证号" />
+        </uni-forms-item>
+        <uni-forms-item name="idcardValidity">
+          <div class="s-fz mb-spac">身份证有效期</div>
+          <div class="center justify-start">
+            <uni-datetime-picker
+              v-model="data.idcardValidityStart"
+              type="date"
+              :clearIcon="false"
+              placeholder="开始日期"
+              :end="safeDate"
+              class="flex-auto"
+            />
+            <div class="ml-spacd2 mr-spacd2">--</div>
+            <checkbox-group @change="methods.checkChange" class="mr-spacd4">
+              <label class="center">
+                <checkbox value="check" :checked="data.idcardValidityLong" class="checkbox" />
+                <span>长期</span>
+              </label>
+            </checkbox-group>
+            <uni-datetime-picker
+              v-model="data.idcardValidityEnd"
+              type="date"
+              :clearIcon="false"
+              placeholder="结束时间"
+              :start="safeDate"
+              :style="{ visibility: data.idcardValidityLong ? 'hidden' : '' }"
+            />
+          </div>
+          <!-- <uni-easyinput v-model="data.idcardValidity" placeholder="请输入身份证有效期" /> -->
+        </uni-forms-item>
+      </uni-forms>
+    </div>
+    <div class="btns">
+      <button
+        type="primary"
+        @click="methods.auth"
+        :disabled="store.webapi.user.idcard_auth.ios"
+        :loading="store.webapi.user.idcard_auth.ing"
+      >
+        开始认证
+      </button>
+    </div>
+  </ay-container>
+</template>
+
+<script lang="ts" setup>
+import { Loading } from 'vant'
+
+const form = ref()
+const rules = {
+  idCardFront: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '请上传身份证正面照片',
+        validateFunction() {
+          return !!data.idCardFront
+        },
+      },
+    ],
+  },
+  idCardBack: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '请上传身份证反面照片',
+        validateFunction() {
+          return !!data.idCardBack
+        },
+      },
+    ],
+  },
+  realname: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '请输入姓名',
+      },
+    ],
+  },
+  idcardNo: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '请输入身份证号',
+      },
+    ],
+  },
+  idcardValidity: {
+    rules: [
+      {
+        required: true,
+        errorMessage: '请选择有效期限',
+        validateFunction() {
+          return !!(data.idcardValidityStart && (data.idcardValidityEnd || data.idcardValidityLong))
+        },
+      },
+    ],
+  },
+}
+const data = reactive({
+  idCardFront: '',
+  idCardBack: '',
+  realname: '',
+  idcardNo: '',
+  idcardValidityStart: '',
+  idcardValidityEnd: '',
+  idcardValidityLong: false,
+  // 定义这个属性默认值:-, 是为了激活验证,否则idCard对应的validateFunction验证不生效
+  idcardValidity: '-',
+})
+const safeDate = computed(() => {
+  const rv: any = Date.now()
+  // if (data.idcardValidityEnd) {
+  //   rv = data.idcardValidityEnd
+  // }
+  return rv
+})
+const methods = {
+  upload(type) {
+    if (store.webapi.message.file.ing) {
+      return
+    }
+    webapi.message
+      .file(
+        {},
+        {
+          showLoading: true,
+          loadingText: '上传中...',
+        },
+      )
+      .then((res) => {
+        if (type === 0) {
+          data.idCardFront = res
+        }
+        if (type === 1) {
+          data.idCardBack = res
+        }
+        console.log(res)
+      })
+  },
+  checkChange(e) {
+    data.idcardValidityLong = !!e.detail.value.length
+  },
+  auth() {
+    form.value
+      .validate()
+      .then(() => {
+        const startDate = func.getDate(data.idcardValidityStart).format(enums.FormatType.YMDNC)
+        let endDate = '长期'
+        if (!data.idcardValidityLong) {
+          endDate = func.getDate(data.idcardValidityEnd).format(enums.FormatType.YMDNC)
+        }
+        const param = {
+          idcardFaceUrl: data.idCardFront,
+          idcardBackUrl: data.idCardBack,
+          realname: data.realname,
+          idcardNo: data.idcardNo,
+          idcardValidity: `${startDate}~${endDate}`,
+        }
+        webapi.user.idcard_auth(param).then((res) => {
+          if (res) {
+            func.native.showToast('实名认证成功!').then(() => {
+              ay.navigateBack({ aceas: {} })
+            })
+          }
+        })
+      })
+      .catch((err) => {
+        if (['realname', 'idcardNo', 'idcardValidity'].includes(err[0].key)) {
+          uni.pageScrollTo({
+            scrollTop: config.common.SystemInfo.screenHeight + 100,
+          })
+        }
+      })
+  },
+}
+ay.entrance(() => {})
+</script>
+
+<style lang="scss" scoped>
+.form {
+  padding-bottom: 200rpx;
+}
+.id-card {
+  width: 668rpx;
+  height: 434rpx;
+  padding: 0;
+  background-repeat: no-repeat;
+  background-position: center 50px;
+  background-size: contain;
+  background-size: 50%;
+  & .image {
+    position: relative;
+    z-index: 1;
+    width: 100%;
+    height: 100%;
+  }
+  & .desc {
+    position: absolute;
+    bottom: $p-spac * 3;
+    width: 100%;
+    font-size: $p-fz;
+    color: $gray-color;
+    text-align: center;
+  }
+}
+.id-card-front {
+  background-image: url('@img/idCard/idCard_front.png');
+}
+.id-card-back {
+  background-image: url('@img/idCard/idCard_back.png');
+}
+.error-img {
+  position: relative;
+  width: 160rpx;
+  height: 100rpx;
+}
+.chunk {
+  margin: 0;
+  overflow: unset;
+}
+</style>

+ 2 - 2
src/pages/truckInfo/detail.vue

@@ -128,7 +128,7 @@ const data = reactive({
         },
       ],
     },
-  ] as IFieldGroup[],
+  ] as IFieldGroup<Truck对象>[],
   truckInfo: {} as Truck对象,
 })
 const methods = {}
@@ -141,4 +141,4 @@ ay.entrance((args) => {
 })
 </script>
 
-<style lang="scss"></style>
+<style lang="scss" scoped></style>

+ 1 - 1
src/pages/truckInfo/index.vue

@@ -103,4 +103,4 @@ ay.entrance((args) => {
 })
 </script>
 
-<style lang="scss"></style>
+<style lang="scss" scoped></style>

+ 5 - 0
src/pages/webview/login.vue

@@ -7,6 +7,11 @@ const data = reactive({
   // url: `http://localhost:8118/#/login?reLaunchPage=${config.pages.index_index._url}`,
   url: ay.getResourceUrl(`#/login?reLaunchPage=${config.pages.index_index._url}`),
 })
+ay.entrance(() => {
+  // #ifdef MP
+  uni.hideHomeButton()
+  // #endif
+})
 const methods = {
   bindmessage(e) {
     store.user.initUserInfo(e.detail.data[0])

+ 1 - 1
src/pagesSubExample/login/components/upload.vue

@@ -16,7 +16,7 @@ const data = reactive({
 })
 const methods = {
   run() {
-    webapi.message.uploadFile().then((res) => {
+    webapi.message.file().then((res) => {
       data.imgUrl = res
       console.log(res)
     })

BIN
src/static/images/controct_bg.png


BIN
src/static/images/driver_apply1.png


BIN
src/static/images/driver_apply3.png


BIN
src/static/images/icons/card.png


BIN
src/static/images/icons/firm.png


BIN
src/static/images/icons/org_icon.png


BIN
src/static/images/icons/payhistory.png


BIN
src/static/images/icons/perpay.png


BIN
src/static/images/icons/turnk_number_head.png


BIN
src/static/images/idCard/idCard0.png


BIN
src/static/images/idCard/idCard1.png


BIN
src/static/images/idCard/idCard_back.png


BIN
src/static/images/idCard/idCard_error2.png


BIN
src/static/images/idCard/idCard_error3.png


BIN
src/static/images/idCard/idCard_front.png


BIN
src/static/images/qr@3x.png


BIN
src/static/logo.png


+ 28 - 2
src/style/index.scss

@@ -90,8 +90,8 @@
     >view:first-child,
     >span:first-child,
     >label:first-child {
-      margin-right: $p-spac;
-      white-space: nowrap;
+      // margin-right: $p-spac;
+      // white-space: nowrap;
     }
 
     // >div:nth-child(2),
@@ -222,9 +222,11 @@ $spac-map: (
   position: fixed;
   bottom: 0;
   left: 0;
+  z-index: 10;
   box-sizing: border-box;
   width: 100%;
   padding: $p-spac;
+  background-color: $bg-color;
 
   button {
     margin-right: $p-spac;
@@ -249,6 +251,7 @@ button[type=primary],
 button[type=primary]:active,
 button[type=primary]:hover,
 button[type=primary]:focus {
+  // margin: 0;
   background-color: $p-color !important;
 }
 
@@ -347,6 +350,10 @@ image {
   color: $gray-color;
 }
 
+.green-color {
+  color: $green-color;
+}
+
 .bline {
   border: solid $border-color 1rpx;
 }
@@ -380,6 +387,25 @@ image {
   }
 }
 
+
+// #region 穿透到组件内样式,以pass-com 开头
+.pass-com-rotater {
+  display: inline-block;
+  animation: pass-com-rotater 0.5s linear infinite;
+}
+
+@keyframes pass-com-rotater {
+  from {
+    transform: rotate(0deg);
+  }
+
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+// #endregion **
+
 :root,
 page {
   font-size: $p-fz;

+ 3 - 0
src/types/api.d.ts

@@ -1,3 +1,6 @@
+// 获取函数的返回类型
+type GetReturnType<T> = T extends (...args: any[]) => infer RT ? RT : never
+
 type IFCommon = {
   /** 是上传文件接口 */ isUpload?: boolean
 }

+ 4 - 4
src/types/global.d.ts

@@ -15,7 +15,7 @@ declare const __UNI_PLATFORM__:
 
 declare const __VITE_APP_PROXY__: 'true' | 'false'
 /** 字段分组映射 */
-type IFieldGroup = {
+type IFieldGroup<T> = {
   /** 分组标题 */
   title?: stirng
   /** 分组样式表 */
@@ -27,7 +27,7 @@ type IFieldGroup = {
     /** 字段显示标题 */
     title: string
     /** 字段对应的key */
-    key: string
+    key?: string
     /** 字段 样式 */
     keyClass
     /** 前缀内容 */
@@ -35,8 +35,8 @@ type IFieldGroup = {
     /** 单位 */
     unit: string
     /** 显示条件 */
-    show: (args) => boolean
+    show: (args: T) => boolean
     /** 呈现内容 */
-    view: (args) => boolean
+    view: (args: T & string) => string
   }[]
 }

+ 2 - 0
src/types/page.d.ts

@@ -20,6 +20,8 @@ interface ayPage {
   params?
   /** 之前页面配置信息 */
   prePage?: ayPage
+  /** 当前生命周期内,enums.LoadType.onShow 已触发过 */
+  onShowed?: boolean
   // /** 通知页面加载数据 */
   // loadData?: AyEntranceCallBack
   /** 有值时,返回页面时执行AyEntranceCallBack-只执行一次,值为AyEntranceCallBack的参数 */

+ 2 - 1
src/types/schemas/custom.d.ts

@@ -97,7 +97,8 @@ const userinfo = {
   createrName: '徐红梅长',
   updaterName: '王伟宇',
   lastLoginDate: '2024-09-23 14:40:13',
-  authStatus: null,
+  /** 实名认证 0:未认证 1:已认证 */
+  authStatus: 0,
   ids: null,
   keyWord: null,
   loginType: 0,

+ 71 - 27
src/types/schemas/strategy.d.ts

@@ -945,6 +945,8 @@ interface GasOrderVo {
   /** undefined */
   standardPrice?: number
   /** undefined */
+  tradeStruct?: number
+  /** undefined */
   tradeType?: number
   /** undefined */
   truckId?: number
@@ -1043,6 +1045,8 @@ interface GasOrder对象 {
   /** 订单结算状态数组,用于前端同时查询多个状态订单时使用(旗舰站) */
   settleStatusList?: array
   /** 中石化零售价 */
+  snpCostPrice?: number
+  /** 中石化零售价 */
   snpPrice?: number
   /** 站服务费清分方式(1线上实时,2 线下月度) */
   splitType?: number
@@ -4181,6 +4185,8 @@ interface 大象线上订单数据表实体类 {
   /** 订单结算状态数组,用于前端同时查询多个状态订单时使用(旗舰站) */
   settleStatusList?: array
   /** 中石化零售价 */
+  snpCostPrice?: number
+  /** 中石化零售价 */
   snpPrice?: number
   /** 站服务费清分方式(1线上实时,2 线下月度) */
   splitType?: number
@@ -4899,21 +4905,51 @@ interface 装卸数据表实体类 {
   /** 更新人姓名 */
   updaterName?: string
 }
+interface 订单中石化查询参数实体类 {
+  /** 物流公司 */
+  carrierOrgName?: string
+  /** 查询结束时间,格式:yyyy-MM-dd HH:mm:ss */
+  endTime?: string
+  /** 加气站id */
+  gasstationId?: number
+  /** 加气站名称 */
+  gasstationName?: string
+  /** 经营模式: 0-一体化 1-新营销 */
+  marketType?: number
+  /** 销售方式,null(不传参).全部  1.大象线上,2.线下-优惠,3.线下-标准,4.团液线上 */
+  orderType?: number
+  /** 支付方式,null(不传参).全部  0:大象余额 1:微信 2:微信+大象余额 10:其他  */
+  payType?: number
+  /** 查询字符串,类型依赖selType */
+  selStr?: string
+  /** 查询类型:默认1车牌号,2订单编号,3驾驶员姓名,4收银员姓名 */
+  selType?: number
+  /** 结算状态,null(不传参).全部  1.待支付 2.已支付 3.已取消 4.支付中 5.退款中 6.已退款 10.其他,多个结算状态查询,逗号间隔 */
+  settleStatus?: string
+  /** 站清分方式,null(不传参).全部 1 线上实时,2 线下月度 */
+  splitType?: number
+  /** 查询开始时间,格式:yyyy-MM-dd HH:mm:ss */
+  startTime?: string
+  /** 查询时间类型:默认1支付时间,2创建时间 */
+  timeType?: number
+  /** 交易模式,null(不传参)全部  1大象经销 2大象直销 10.其他 */
+  tradeType?: number
+}
 interface 订单列表返回实体类 {
   /** 总返利积分 */
   allPoint?: number
   /** 加气总优惠(元) */
-  allPrefer?: string
+  allPrefer?: number
   /** 加气总量(公斤) */
-  allQty?: string
+  allQty?: number
   /** 加气总量(吨) */
-  allQtyTon?: string
+  allQtyTon?: number
   /** 站实时清分总额(元) */
-  allSplit?: string
+  allSplit?: number
   /** 加气总额(元) */
-  allValue?: string
+  allValue?: number
   /** 加气总额(万元) */
-  allValueWan?: string
+  allValueWan?: number
   /** 分页信息 */
   page?: IPage<订单详情>
 }
@@ -4924,34 +4960,40 @@ interface 订单导出参数 {
   pageParam?: IPageParams<订单查询参数实体类>
 }
 interface 订单查询参数实体类 {
+  /** 车牌号 */
+  carNumber?: string
   /** 物流公司 */
   carrierOrgName?: string
-  /** 查询结束时间,格式:yyyy-MM-dd HH:mm:ss */
-  endTime?: string
+  /** 收银员姓名 */
+  cashierName?: string
+  /** 驾驶员姓名 */
+  driverName?: string
+  /** 创建时间查询结束时间,格式:yyyy-MM-dd HH:mm:ss */
+  endCreateDate?: string
+  /** 支付时间查询结束时间,格式:yyyy-MM-dd HH:mm:ss */
+  endUpdateDate?: string
   /** 加气站id */
   gasstationId?: number
   /** 加气站名称 */
   gasstationName?: string
   /** 经营模式: 0-一体化 1-新营销 */
   marketType?: number
-  /** 销售方式,null(不传参).全部  1.大象线上,2.线下-优惠,3.线下-标准,4.团液线上 */
-  orderType?: number
-  /** 支付方式,null(不传参).全部  0:大象余额 1:微信 2:微信+大象余额 10:其他  */
-  payType?: number
-  /** 查询字符串,类型依赖selType */
-  selStr?: string
-  /** 查询类型:默认1车牌号,2订单编号,3驾驶员姓名,4收银员姓名 */
-  selType?: number
-  /** 结算状态,null(不传参).全部  1.待支付 2.已支付 3.已取消 4.支付中 5.退款中 6.已退款 10.其他,多个结算状态查询,逗号间隔 */
+  /** 订单编号 */
+  orderId?: number
+  /** 销售方式,null(不传参).全部  1.大象线上,2.加注机线下-优惠,3.加注机线下-标准,4.三方线上-团液,5.三方线上-万金油,6.试机,7.CNG,8.三方线上-车旺,9.三方线上-解放,10.三方线上-成丰,多个状态查询,逗号间隔 */
+  orderTypes?: string
+  /** 支付方式,null(不传参).全部  0.所属物流-大象余额 1.所属物流-微信 2.所属物流-大象余额+微信 3.个人支付-微信 10:其他,多个状态查询,逗号间隔 */
+  payType?: string
+  /** 结算状态,null(不传参).全部  1.待支付 2.已支付 3.已取消 4.支付中 5.退款中 6.已退款 7.支付异常 10.其他,多个结算状态查询,逗号间隔 */
   settleStatus?: string
   /** 站清分方式,null(不传参).全部 1 线上实时,2 线下月度 */
   splitType?: number
-  /** 查询开始时间,格式:yyyy-MM-dd HH:mm:ss */
-  startTime?: string
-  /** 查询时间类型:默认1支付时间,2创建时间 */
-  timeType?: number
-  /** 交易模式,null(不传参)全部  1大象经销 2大象直销 10.其他 */
-  tradeType?: number
+  /** 创建时间查询开始时间,格式:yyyy-MM-dd HH:mm:ss */
+  startCreateDate?: string
+  /** 支付时间查询开始时间,格式:yyyy-MM-dd HH:mm:ss */
+  startUpdateDate?: string
+  /** 交易模式,null(不传参)全部  1大象经销 2大象直销 10.其他,多个状态查询,逗号间隔 */
+  tradeTypes?: string
 }
 interface 订单详情 {
   /** 实际气价(结算价)=platform_price-rebate */
@@ -4998,6 +5040,8 @@ interface 订单详情 {
   diffPriceHand?: number
   /** 司机id(user.user.user_id) */
   driverId?: string
+  /** 司机联系方式 */
+  driverMobile?: string
   /** 司机名称(user.user.user_name) */
   driverName?: string
   /** 加气量 */
@@ -5022,13 +5066,13 @@ interface 订单详情 {
   orderId?: string
   /** 订单状态(1 待支付 2 已支付 3 取消) */
   orderStatus?: number
-  /** 销售方式(用于查询订单详情,需要传递回后台的参数),1.大象线上,2.线下-优惠,3.线下-标准,4.团液线上,5万金油线上,6试机,7CNG */
+  /** 销售方式(用于查询订单详情,需要传递回后台的参数),1.大象线上,2.线下-优惠,3.线下-标准,4.团液线上,5万金油线上,6试机,7CNG,8.车旺,9.解放,10.成丰 */
   orderType?: number
-  /** 销售方式,1.大象线上,2.线下-优惠,3.线下-标准,4.团液线上,5万金油线上,6试机,7CNG */
+  /** 销售方式,1.大象线上,2.线下-优惠,3.线下-标准,4.团液线上,5万金油线上,6试机,7CNG,8.车旺线上,9.解放线上,10.成丰线上 */
   orderTypeStr?: string
   /** 支付渠道 */
   payChannelId?: string
-  /** 支付方式(0:余额 1:微信 2:微信+余额 11:组合支付 ) */
+  /** 支付方式(0.所属物流-大象余额 1.所属物流-微信 2.所属物流-大象余额+微信 3.个人支付-微信 11:组合支付 ) */
   payType?: number
   /** 平台挂牌价 */
   platformPrice?: number
@@ -5070,7 +5114,7 @@ interface 订单详情 {
 interface 订单详情查询参数 {
   /** 订单id */
   orderId?: number
-  /** 销售方式,1.大象线上,2.线下-优惠,3.线下-标准,4.团液线上 */
+  /** 销售方式, 1.大象线上,2.加注机线下-优惠,3.加注机线下-标准,4.三方线上-团液,5.三方线上-万金油,6.试机,7.CNG,8.三方线上-车旺,9.三方线上-解放,10.三方线上-成丰 */
   orderType?: number
 }
 interface 设备监控数据实体类 {

+ 9 - 12
src/utils/aop/index.ts

@@ -20,16 +20,13 @@ export default {
       },
       getAccountInfo(res: 司机账户余额信息): IAccountInfo {
         const accountInfo: IAccountInfo = {
+          ...res,
           showBalance: { balance: '', suffix: '' },
           unit: '暂无余额',
           showDet: false,
         }
-        if (!res.orgName) {
-          accountInfo.orgName = '--'
-        }
-        if (!res.carNumber) {
-          accountInfo.carNumber = '--'
-        }
+        accountInfo.orgName = func.convert.nullView(accountInfo.orgName)
+        accountInfo.carNumber = func.convert.nullView(accountInfo.carNumber)
 
         if (res.orgId) {
           accountInfo.unit = '元'
@@ -37,13 +34,13 @@ export default {
             accountInfo.showBalance.balance = `> ${res.limitAmount}`
           } else {
             accountInfo.showDet = true
-            accountInfo.showBalance.balance = res.totalBalance.toString()
-          }
-          if (accountInfo.showBalance.balance.includes('.')) {
-            const balanceArr = accountInfo.showBalance.balance.split('.')
-            accountInfo.showBalance.balance = balanceArr[0]
-            accountInfo.showBalance.suffix = '.' + balanceArr[1]
+            // accountInfo.showBalance.balance = res.totalBalance.toString()
           }
+          // if (accountInfo.showBalance.balance.includes('.')) {
+          //   const balanceArr = accountInfo.showBalance.balance.split('.')
+          //   accountInfo.showBalance.balance = balanceArr[0]
+          //   accountInfo.showBalance.suffix = '.' + balanceArr[1]
+          // }
         }
         return accountInfo
       },

+ 2 - 0
src/utils/api/socket/stomp.ts

@@ -68,6 +68,8 @@ export default {
       }
 
       const client = (this.client = Stomp.over(ws))
+      // 关掉烦人的console
+      client.debug = () => {}
       // 关闭连接
       client.close = () => {
         uni.closeSocket()

+ 4 - 1
src/utils/api/web/index.ts

@@ -35,7 +35,10 @@ declare type getIServiceApi<T> = IServiceApi<GetKT<T, QK>, GetKT<T, SK>>
 type getIServiceApiUnionReq<T, RT extends post | get> = getIServiceApi<T> &
   getReq<getIServiceApi<T>, RT>
 
-const common = {} as IIAPI<typeof webapi>
+const common = {} as IIAPI<typeof webapi> & {
+  /** 等待放行器 */
+  _releaser: GetReturnType<typeof func.releaser>
+}
 for (const [gk, gv] of Object.entries(webapi)) {
   for (const [ik, iv] of Object.entries(gv)) {
     if (!common[gk]) {

+ 4 - 4
src/utils/api/web/request/afterReturning.ts

@@ -9,11 +9,11 @@ export default {
     await com.complete.main(args)
     // 设置接口请求状态
     store.webapi[args.options.urlObj.group][args.options.urlObj.name].set(enums.ReqState.success)
-    if (args.options.urlObj.isUpload && typeof args.res.data === 'string') {
-      args.res.data = ay.getResourceUrl(args.res.data)
-    }
+    // if (args.options.urlObj.isUpload && typeof args.res.data === 'string') {
+    //   args.res.data = ay.getResourceUrl(args.res.data)
+    // }
     // 分页接口自动通知容器,数据加载完毕
-    if (store.curPage.pageConfig.isPager) {
+    if (store.curPage?.pageConfig?.isPager) {
       let pages = config.common.defAyContainerRefreshArgs.pages
       if (func.hasProps(args.res.data, config.common.IPageProps)) {
         pages = args.res.data.pages

+ 41 - 22
src/utils/api/web/request/afterThrowing.ts

@@ -1,13 +1,14 @@
 import com from './com'
+import request from './index'
 export default {
   /**
    *  异常通知 未成功拿到返回结果
    */
   async main(args: { options: IRequestOption } & TPromiseCatchReason) {
+    let rv: Promise<any>
+    let tokenErr = false
     await com.complete.main(args)
     // console.log('貌似网络不太稳定,请稍后重试', args.err)
-    // 设置接口请求状态
-    store.webapi[args.options.urlObj.group][args.options.urlObj.name].set(enums.ReqState.fail)
     if (args.errType === enums.ErrorType.business) {
       switch (args.res.code) {
         case 2800: // 请求头中参数不存在或错误
@@ -16,34 +17,52 @@ export default {
         case 2812: // 您的Identifier与TOKEN不匹配
         case 2813: // 您提供角色不在授权范围内
         case 2814: // 登录已超时,请重新登录
+          tokenErr = true
           store.user.clearUserInfo()
-          ay.goLogin()
+          break
+        case 3000: // 用户信息已更新,拦截正在发送的请求,获取更新后的身份信息,重新发送本次请求,放行拦截的请求
+          tokenErr = true
+          if (!webapi._releaser) {
+            webapi._releaser = func.releaser()
+            await webapi.user.token_update({ userid: store.user.userInfo.user_id }).then((res) => {
+              store.user.initUserInfo(res)
+              webapi._releaser.s()
+              webapi._releaser = null
+              // 进行重试
+              rv = request.http(args.options)
+            })
+          } else {
+            // 等待更新的身份写入,使用新身份
+            await webapi._releaser.p
+            // 进行重试
+            rv = request.http(args.options)
+          }
           break
         default:
           // 公共错误提示
           func.native.showToast(args.res.message)
       }
     }
-    if (args.errType === enums.ErrorType.net) {
-      // 公共错误提示
-      func.native.showToast({
-        title: '网络错误',
-        icon: 'error',
-      })
-    }
-    const pcr: TPromiseCatchReason = {
-      errType: args.errType,
-      errInfo: args.errInfo,
-      options: args.options,
-      res: args.res,
-    }
-    // 分页页面- 接口异常自动通知容器
-    if (store.curPage.pageConfig.isPager) {
-      ay.containerLoaded({
-        reqState: enums.ReqState.fail,
-      })
+    // 设置接口请求状态
+    store.webapi[args.options.urlObj.group][args.options.urlObj.name].set(enums.ReqState.fail)
+    // 非身份类异常 业务接口返回异常 请求失败
+    if (!tokenErr) {
+      if (args.errType === enums.ErrorType.net) {
+        // 公共错误提示
+        func.native.showToast({
+          title: '网络错误',
+          icon: 'error',
+        })
+      }
+      const pcr: TPromiseCatchReason = {
+        errType: args.errType,
+        errInfo: args.errInfo,
+        options: args.options,
+        res: args.res,
+      }
+      rv = Promise.reject(pcr)
     }
 
-    return Promise.reject(pcr)
+    return rv
   },
 }

+ 1 - 1
src/utils/api/web/request/before.ts

@@ -6,7 +6,7 @@ export default {
   /**
    * 前置通知 发送请求之前
    */
-  main(options: IRequestOption) {
+  async main(options: IRequestOption) {
     if (options.ext.showLoading) {
       com.loading.show(options)
     }

+ 2 - 1
src/utils/api/web/request/index.ts

@@ -28,9 +28,9 @@ const http = async <T>(options: IRequestOption) => {
   if (options.urlObj.isUpload) {
     options.ext.choosFiles = await func.native.choose({ count: options.ext.fileCount })
   }
+  await before.main(options)
   // 1. 返回 Promise 对象
   return new Promise<any>((resolve, reject) => {
-    before.main(options)
     setRequestResult({ options, resolve, reject })
     if (options.urlObj.isUpload) {
       uni.uploadFile(options.uur as UniApp.UploadFileOption)
@@ -69,6 +69,7 @@ const httpPost = <T>(options: IRequestOption) => {
 }
 
 export default {
+  http,
   get: httpGet,
   post: httpPost,
 }

+ 22 - 3
src/utils/config/index.ts

@@ -2,6 +2,15 @@ import pages from './pages'
 import subPages from './subPages'
 import webapi from './webapi'
 const common = {
+  isH5: __UNI_PLATFORM__ === 'h5',
+  isApp: __UNI_PLATFORM__ === 'app',
+  isMp: __UNI_PLATFORM__.startsWith('mp-'),
+  /** 驾驶员申请状态
+   * 1.无任何信息 2.显示物流公司信息 3.显示退出申请 4.显示加入申请 5.显示预添加信息
+   */
+  get orgDetailType() {
+    return { 3: '申请退出', 4: '申请加入' }
+  },
   /** 驾驶员申请加入物流公司 审核状态 */
   get auditStatus() {
     return { 1: '待审核', 2: '已审核', 3: '已驳回' }
@@ -41,11 +50,11 @@ const common = {
       3: '已取消',
       6: '已退款',
       5: '退款中',
-      // 待定
       10: '其他',
     }
   },
-  /** 支付方式 */ get payType() {
+  /** 支付方式-用于筛选条件 */
+  get payTypes() {
     return {
       // 所属物流
       0: '大象余额',
@@ -53,7 +62,16 @@ const common = {
       2: '大象余额+微信',
       // 个人支付
       3: '微信',
-      // 待定
+
+      10: '其他',
+    }
+  } /** 支付方式 */,
+  get payType() {
+    return {
+      0: '所属物流-大象余额',
+      1: '所属物流-微信',
+      2: '所属物流-大象余额+微信',
+      3: '个人支付-微信',
       10: '其他',
     }
   },
@@ -89,6 +107,7 @@ const common = {
       title: '',
       identity: true,
       isPager: false,
+      onShowed: false,
       pagerInfo: {
         // #ifdef H5
         /** loaded方法得到了通知 */

+ 1 - 1
src/utils/config/interFaces/strategy.ts

@@ -491,7 +491,7 @@ export default {
   /** 查询加气订单列表信息 */
   get_order_list_snp: {
     realUrl: '/strategy/flag_order/get_order_list_snp' as const,
-    reqType: {} as IPageParams<订单查询参数实体类>,
+    reqType: {} as IPageParams<订单中石化查询参数实体类>,
     resType: {} as 订单列表返回实体类,
   },
   /** 查询站端充值订单列表 */

+ 15 - 0
src/utils/config/interFaces/user.ts

@@ -838,6 +838,15 @@ export default {
     },
     resType: {} as Token认证返回实体,
   },
+  /** 登录更新用户信息 */
+  token_update: {
+    realUrl: '/user/oauth/token_update' as const,
+    reqType: {} as {
+      /** userid */
+      userid: string
+    },
+    resType: {} as Token认证返回实体,
+  },
   /** 获取端列表-不分页 */
   client_list: {
     realUrl: '/user/oauth_client_details/client_list' as const,
@@ -1495,6 +1504,12 @@ export default {
 
     resType: {} as boolean,
   },
+  /** 手机小程序端-司机用户自己修改手机号 */
+  edit_mobile_driver: {
+    realUrl: '/user/user/edit_mobile_driver' as const,
+
+    resType: {} as boolean,
+  },
   /** 修改用户密码 */
   edit_password: {
     realUrl: '/user/user/edit_password' as const,

+ 21 - 0
src/utils/config/pages.ts

@@ -105,5 +105,26 @@ export default {
     title: '所属物流',
     identity: true,
     isPager: false
+  } as ayPage,
+  personCenter_mobile: {
+    _url: '/pages/personCenter/mobile',
+    _type: 'page',
+    title: '绑定手机号',
+    identity: true,
+    isPager: false
+  } as ayPage,
+  personCenter_password: {
+    _url: '/pages/personCenter/password',
+    _type: 'page',
+    title: '修改密码',
+    identity: true,
+    isPager: false
+  } as ayPage,
+  personCenter_userIdCard: {
+    _url: '/pages/personCenter/userIdCard',
+    _type: 'page',
+    title: '实名认证',
+    identity: true,
+    isPager: false
   } as ayPage
 }

+ 43 - 25
src/utils/container/index.ts

@@ -5,7 +5,14 @@ const loadTypeMaps = new Map()
 loadTypeMaps.set(enums.LoadType.onLoad, onLoad)
 loadTypeMaps.set(enums.LoadType.onShow, onShow)
 loadTypeMaps.set(enums.LoadType.onReady, onReady)
-const staticData = {}
+type goPageExt = {
+  /** 默认navigateTo */
+  goPageType?: GoPageTypeKeys
+  params?: AnyObject
+}
+const staticData = {
+  goPageExt: {} as goPageExt,
+}
 type ExtType<T> = Record<keyof T, { showLoading?: boolean }>
 export default {
   /** 初始化对象内的方法,自动为对象内所有方法增加防重提功能(同步方法、异步方法执行中再次触发不执行) */
@@ -49,32 +56,36 @@ export default {
   goHome() {
     ay.goPage(config.pages.index_index, { goPageType: enums.GoPageType.reLaunch })
   },
-  goLogin() {
-    ay.goPage(config.pages.login_index, { goPageType: enums.GoPageType.reLaunch }) // { params: { backPage: curPage } })
+  /** 跳登录
+   * @params type 0:手机号快捷 1:账号、密码
+   */
+  goLogin(type = 0) {
+    if (type === 0) ay.goPage(config.pages.login_index, { goPageType: enums.GoPageType.reLaunch }) // { params: { backPage: curPage } })
     // func.face.showToast({
     //   title: '请登录',
     //   icon: 'error',
     // })
+    if (type === 1) {
+      ay.goPage(config.pages.webview_login, { goPageType: enums.GoPageType.reLaunch })
+    }
   },
   /** 关闭当前页面,返回上一页面或多级页面 */
   async navigateBack({
     args,
     aceas,
-  }: { args?: UniApp.NavigateBackOptions; aceas?: AyContainerEntryArgs } = {}) {
+  }: {
+    /** uni.navigateBack透传参数 */
+    args?: UniApp.NavigateBackOptions
+    /** 有值时,返回页面时执行AyEntranceCallBack-只执行一次 */
+    aceas?: AyContainerEntryArgs
+  } = {}) {
     store.curPage.pageConfig.prePage.onceBackReloadArgs = aceas
     await uni.navigateBack(args)
   },
   /** 页面跳转
    *
    */
-  async goPage(
-    page?: ayPage,
-    ext?: {
-      /** 默认navigateTo */
-      goPageType?: GoPageTypeKeys
-      params?: AnyObject
-    },
-  ) {
+  async goPage(page?: ayPage, ext?: goPageExt) {
     let goPageFunc = uni.navigateTo
     if (page._type === enums.PageType.tabPage) {
       goPageFunc = uni.switchTab
@@ -82,13 +93,15 @@ export default {
     if (ext?.goPageType) {
       goPageFunc = uni[ext.goPageType]
     }
-    if (ext?.params) {
-      store.curPage.initPageInfo({ page, params: ext.params })
-    }
+    staticData.goPageExt = ext
+
     // 防止重复跳转
     func.antiShake({
-      func: () => {
-        goPageFunc({ url: page._url })
+      func: async () => {
+        await goPageFunc({ url: page._url })
+        // if (ext?.params) {
+        //   store.curPage.initPageInfo({ page, params: ext.params })
+        // }
       },
       immediately: true,
       mark: page._url,
@@ -96,7 +109,7 @@ export default {
     // await goPageFunc({ url: page._url })
   },
   /**
-  页面生命周期入口,默认拦截enums.LoadType.onLoad、enums.LoadType.refresh, 可配置ext扩展参数
+  页面生命周期入口,初始化页面,默认拦截enums.LoadType.onLoad、enums.LoadType.refresh, 可配置ext扩展参数
  */
   entrance(
     /** 页面生命周期入口的回调函数 */
@@ -113,7 +126,7 @@ export default {
       cras: config.common.defAyContainerRefreshArgs,
     }
     const init = () => {
-      store.curPage.initPageInfo()
+      store.curPage.initPageInfo({ params: staticData.goPageExt?.params })
       let isLogined = true
 
       const curPage = store.curPage.pageConfig
@@ -131,14 +144,13 @@ export default {
     }
 
     onUnload(() => {
-      // redirectTo跳转时会清理跳转的页面
-      // store.curPage.removeCurPagerInfo()
+      store.curPage.removeCurPagerInfo()
     })
     onLoad((options) => {
       if (!func.antiShake({ func: init, immediately: true, mark: tempid })) {
         return
       }
-      if (store.curPage.pageConfig.isPager) {
+      if (store.curPage?.pageConfig?.isPager) {
         store.curPage.pageConfig.curCallBack = (cras: AyContainerRefreshArgs) => {
           args.cras = {
             ...args.cras,
@@ -182,9 +194,15 @@ export default {
       ext.addLoadTypes.forEach((f) => {
         const curLt = loadTypeMaps.get(f)
         if (curLt) {
-          args.loadType = f
           curLt(() => {
-            callBack(args)
+            if (f === enums.LoadType.onShow && !store.curPage.pageConfig.onShowed) {
+              store.curPage.pageConfig.onShowed = true
+              return
+            }
+            callBack({
+              ...args,
+              loadType: f,
+            })
           })
         }
       })
@@ -201,7 +219,7 @@ export default {
    * 通知容器数据加载完毕
    */
   containerLoaded(args?: AyContainerMethodsLoadedArgs) {
-    if (store.curPage.pageConfig.isPager) {
+    if (store.curPage?.pageConfig?.isPager) {
       store.curPage.pagerMethods.loaded({
         ...store.curPage.pageConfig.pagerInfo,
         ...args,

+ 0 - 1
src/utils/func/convert.ts

@@ -10,7 +10,6 @@ export default {
     const map = config.common.settleStatus
     return map[settleStatus]
   },
-  // groupRule={个人支付:[3],所属物流:[0,1,2]}
   getCheckItem(obj, filterFunc = (f?) => true) {
     const arr = Object.keys(obj)
 

+ 9 - 3
src/utils/func/index.ts

@@ -1,10 +1,12 @@
 import native from './native'
 import convert from './convert'
+import validate from './validate'
 import dayjs from 'dayjs'
 
 export default {
   native,
   convert,
+  validate,
   getDate(date) {
     const day = dayjs(date)
     return day
@@ -81,12 +83,16 @@ export default {
   /** 等待放行时使用
    */
   releaser() {
-    const rt: { p: Promise<any>; s: (args?) => void; e: (args?) => void } = {
+    const rt: {
       /** 等待的Promise对象 */
-      p: null,
+      p: Promise<any>
       /** 放行p的等待 */
-      s: () => {},
+      s: (args?) => void
       /** p的reject,执行后抛出异常 */
+      e: (args?) => void
+    } = {
+      p: null,
+      s: () => {},
       e: () => {},
     }
     rt.p = new Promise((resolve, reject) => {

+ 12 - 0
src/utils/func/validate.ts

@@ -0,0 +1,12 @@
+export default {
+  /** 验证手机号码 */
+  isValidateMobile(value) {
+    const reg = /^((\+86)|(86))?[1][0-9]{10}$/
+    return reg.test(value)
+  },
+  // 验证身份证号码
+  isIdCard(value) {
+    const reg = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/
+    return reg.test(value)
+  },
+}

+ 0 - 2
src/utils/store/index.ts

@@ -25,8 +25,6 @@ const stores = {
 type StoreReturnType<T> = {
   [P in keyof T]: GetReturnType<T[P]>
 }
-// 获取函数的返回类型
-type GetReturnType<T> = T extends (...args: any[]) => infer RT ? RT : never
 // 缓存对象 减少重复执行
 const _store = {}
 /** 由于 defineStore 需要pinia安装后才能使用,使用代理在使用时再获取对应的defineStore。

+ 5 - 2
src/utils/store/user.ts

@@ -49,9 +49,9 @@ const useUserStore = defineStore(
         userInfo.value.head_url = ui.headUrl
       }
     }
-    const clearUserInfo = () => {
+    const clearUserInfo = (type = 0) => {
       userInfo.value = { ...initState }
-      ay.goLogin()
+      ay.goLogin(type)
     }
 
     const Authorization = computed(() => {
@@ -65,6 +65,9 @@ const useUserStore = defineStore(
       userInfo,
       initUserInfo,
       setUserInfo,
+      /** 清理身份信息-跳登录页面
+       * @parmas type 0:手机号快捷 1:账号、密码
+       */
       clearUserInfo,
       /** 已登录 */
       isLogined,

+ 5 - 0
src/utils/store/webapi.ts

@@ -14,6 +14,8 @@ interface webapistate {
   fail: boolean
   /** 请求结束 */
   finally: boolean
+  /** 请求中|| 请求成功 */
+  ios: boolean
 }
 type ISAPI<T> = {
   [P in keyof T]: {
@@ -45,6 +47,9 @@ for (const [gk, gv] of Object.entries(webapiImp)) {
       get finally() {
         return this.success || this.fail
       },
+      get ios() {
+        return this.ing || this.success
+      },
     }
   }
 }