jiangping
2024-08-27 3a992a2be8c1cc815719ac76cd7242dd7a2f7c2d
Merge remote-tracking branch 'origin/master'
已添加3个文件
已修改41个文件
2586 ■■■■ 文件已修改
h5/.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/driver.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/index.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/main.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/forgetPsd.vue 241 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/index.vue 616 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/login.vue 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/register.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/reserved.vue 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/reservedDetail.vue 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/reservedGuide.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/reservedRecord.vue 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/taskDetail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/driver.vue 445 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/index.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/visitorApprove.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/store/index.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformCloudController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/DriverPlatformController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/PdaPlatformController.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/ApproveDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Approve.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveTempl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformBooks.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/PlatformBooksApplyDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DriverHomeVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformGroupServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java 205 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformReasonServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitReasonServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/.gitignore
@@ -1,6 +1,7 @@
.DS_Store
coderd.json
node_modules
uni_modules
.env.development
uview-ui
h5/App.vue
@@ -122,7 +122,7 @@
}
.placeholder9 {
  color: #999999;
  color: #999999 !important;
  font-size: 28rpx;
}
@@ -197,7 +197,6 @@
  width: 64rpx;
  height: 64rpx;
  border-radius: 50%;
  overflow: hidden;
  margin-right: 20rpx;
  display: flex;
  justify-content: center;
h5/api/driver.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
import { http } from '@/utils/service.js'
// å¸æœºæ³¨å†Œ
export const driverRegister = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/member/registerDriver',
    method: 'post',
    data
  })
}
// å¸æœºç™»å½•
export const driverLogin = (data) => {
  return http({
    url: 'loginDriver',
    method: 'post',
    data
  })
}
// å¸æœºé¦–页
export const driverHomeData = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/driverHome',
    method: 'get',
    data
  })
}
// ç‰©æµè½¦ å…¥å›­åŽŸå› 
export const driverReasonList = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/platformReasonList',
    method: 'get',
    data
  })
}
// æŸ¥è¯¢å¯é¢„约量
export const checkSurplusNum = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/checkSurplusNum',
    method: 'post',
    data
  })
}
// ç‰©æµè½¦é¢„约
export const driverCarApply = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/apply',
    method: 'post',
    data
  })
}
// ç‰©æµè½¦æ’¤é”€
export const driverCarRevoke= (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/revoke',
    method: 'post',
    data
  })
}
// é¢„约     è®°å½•
export const driverApplyRecord = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/page',
    method: 'post',
    data
  })
}
// é¢„约     è¯¦æƒ…
export const driverApplyDetail = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/getDetail',
    method: 'get',
    data
  })
}
h5/api/index.js
@@ -3,6 +3,7 @@
export * from './visitor'
export * from './staff'
export * from './meeting'
export * from './driver'
h5/main.js
@@ -17,6 +17,13 @@
Vue.prototype.$store = store
Vue.prototype.$jump = (url) => {uni.navigateTo({url})}
Vue.prototype.$goBack = () => { uni.navigateBack() }
Vue.prototype.showToast = (str) => {
    uni.showToast({
      title: str,
      icon: 'none',
      duration: 2000
    })
}
Vue.prototype.$eventBus = new Vue()
Vue.prototype.$onWait = new Promise((resolve) => {
  Vue.prototype.$reslove = resolve
h5/pages.json
@@ -423,6 +423,24 @@
            }
            
        }
        ,{
            "path" : "pages/driver/forgetPsd",
            "style" :
            {
                "navigationBarTitleText": "找回密码",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/staff/task/driver",
            "style" :
            {
                "navigationBarTitleText": "入园审批",
                "enablePullDownRefresh": false
            }
        }
    ],
    "subPackages": [
        {
h5/pages/driver/forgetPsd.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,241 @@
<template>
  <view class="login">
    <image class="login_bg" src="@/static/login_bg@2x.png" />
    <image class="login_logo" src="@/static/logo@2x.png" mode="widthFix" />
    <view class="login_title">安泰物流智慧园区</view>
    <view class="login_title">物流车司机</view>
    <view class="login_list">
      <view class="login_list_item">
        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
        <input v-model="form.phone" maxlength="18" placeholder="请输入手机号" />
      </view>
      <view class="login_list_item">
        <image src="@/static/ic_captcha.png" mode="widthFix"></image>
        <input
          v-model="form.validCode"
          placeholder="请输入验证码"
          type="text"
        />
        <text class="captcha" v-if="countDown == 0" @click="initCaptcha"
          >获取验证码</text
        >
        <text class="placeholder9" v-else>{{ countDown }}</text>
      </view>
      <view class="login_list_item">
        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
        <input
          v-model="form.password"
          type="password"
          placeholder="请输入新密码"
        />
      </view>
      <view class="login_list_item">
        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
        <input
          v-model="form.newPassword"
          type="password"
          placeholder="请再次输入新密码"
        />
      </view>
    </view>
    <view class="login_btn">
      <view class="login_btn_n" @click="onLogin">确认修改</view>
    </view>
  </view>
</template>
<script>
import { resetPassword, sendSms } from '@/api'
export default {
  data() {
    return {
      form: {
      },
      countDown: 0
    }
  },
  onLoad() {
  },
  methods: {
    dealChange(e) {
      console.log(e)
    },
    initCaptcha() {
      if (!this.form.phone) return uni.showToast({
        title: '手机号不能为空',
        icon: 'none'
      })
      sendSms({ phone: this.form.phone }).then(res => {
        this.countDown = 60
        setInterval(() => {
          if (this.countDown == 0) return
          this.countDown--
        }, 1000)
      })
    },
    onLogin() {
      const { form } = this
      if (!form.phone) return uni.showToast({
        title: '手机号不能为空',
        icon: 'none'
      })
      if (!form.validCode) return uni.showToast({
        title: '验证码不能为空',
        icon: 'none'
      })
      if (!form.password) return uni.showToast({
        title: '新密码不能为空',
        icon: 'none'
      })
      if (!form.newPassword) return uni.showToast({
        title: '确认密码不能为空',
        icon: 'none'
      })
      if (form.password != form.newPassword) return uni.showToast({
        title: '两次输入密码不一致',
        icon: 'none'
      })
      resetPassword({
        ...form
      }).then(res => {
        if (res && res.code == 200) {
          setTimeout(() => {
            uni.showToast({
              title: '密码修改成功,请重新登录',
              icon: 'success',
              duration: 2000
            })
          })
          uni.redirectTo({
            url: "/pages/staffLogin/login"
          })
        }
      })
    }
  }
}
</script>
<style lang="scss" scoped>
.login {
  width: 100%;
  display: flex;
  padding-top: 100rpx;
  box-sizing: border-box;
  align-items: center;
  flex-direction: column;
  background: linear-gradient(
    180deg,
    rgba(39, 155, 170, 0.2) 0%,
    rgba(39, 155, 170, 0) 100%
  );
  .login_logo {
    width: 180rpx;
    height: 180rpx;
        margin-bottom: 40rpx;
  }
  .login_bg {
    position: absolute;
    top: 0;
    width: 750rpx;
  }
  .login_title {
    font-size: 44rpx;
    font-weight: 600;
    color: #333333;
  }
  .login_list {
        margin-top: 60rpx;
    width: 100%;
    padding: 0 60rpx;
    box-sizing: border-box;
    .login_list_item {
      width: 100%;
      border-radius: 50rpx;
      height: 98rpx;
      padding: 0 40rpx;
      box-sizing: border-box;
      background: #ffffff;
      margin-bottom: 40rpx;
      display: flex;
      align-items: center;
      justify-content: space-between;
      &:last-child {
        margin-bottom: 0 !important;
      }
      image {
        flex-shrink: 0;
        width: 40rpx;
        height: 40rpx;
      }
      .captcha {
        color: $uni-color-primary;
      }
      input {
        flex: 1;
        height: 100%;
        color: #666666;
        margin-left: 24rpx;
        border: none;
      }
    }
  }
  .login_btn {
    width: 100%;
    padding: 0 60rpx;
    box-sizing: border-box;
    margin-top: 80rpx;
    .for_psd {
      color: $uni-color-primary;
      margin-top: 40rpx;
      width: 140rpx;
      text-align: center;
      margin: 40rpx auto;
    }
    .login_btn_n {
      width: 100%;
      height: 98rpx;
      background: $uni-color-primary;
      box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: 600;
      font-size: 32rpx;
      color: #ffffff;
      border-radius: 50rpx;
    }
  }
  .deal_wrap {
    position: absolute;
    width: 100%;
    left: 0;
    text-align: center;
    bottom: 108rpx;
    .deal {
      color: $uni-color-primary;
    }
  }
    .btns{
        display: flex;
        align-items: center;
        justify-content: center;
        position: fixed;
        bottom: 60rpx;
        left: 0;
        width: 100%;
        .btn{
            font-size: 30rpx;
            color: $uni-color-primary;
        }
        .separate{ margin: 0 8rpx; }
    }
}
.modal {
  padding: 32rpx;
}
</style>
h5/pages/driver/index.vue
@@ -1,312 +1,346 @@
<template>
  <view class="main_app">
    <view class="title_wrap">
      <view class="name">某某某,欢迎登录~</view>
      <view class="btn" @click="loginOut">退出登录</view>
    </view>
    <!--  -->
    <view class="banner_wrap">
      <view class="h1">安泰物流智慧园区</view>
      <view class="h2">物流车专区</view>
      <image
        class="banner"
        src="../../static/driver/wuliuche_banner@2x.png"
        mode="widthFix"
      ></image>
    </view>
    <!--  -->
    <view class="task_list">
      <view class="item">
        <view class="head">
          <view class="name">运输单222</view>
          <view class="status">
            <view class="text">请确认任务</view>
            <view class="time">预计等待:12小时</view>
          </view>
        </view>
        <view class="content">
          <view class="info">
            <view class="plate">
              <image
                src="@/static/driver/wuliu_ic_car@2x.png"
                class="icon"
                mode=""
              ></image>
              <text>皖AD</text>
            </view>
            <view class="plate">
              <image
                src="@/static/driver/wuliu_ic_huowu@2x.png"
                class="icon"
                mode=""
              ></image>
              <text>3000万</text>
            </view>
          </view>
          <view class="sub">
            <view class="time">02-01 08:11:11</view>
            <view class="sub_btn" @click="handleTask()">确认任务</view>
          </view>
        </view>
      </view>
    </view>
    <!--  -->
    <view class="title_wrap"><view class="name">业务办理</view></view>
    <view class="container1">
      <view class="left">
        <view class="img_wrap img1" @click="$jump('/pages/driver/reserved')">
          <image
            src="@/static/driver/wuliu_ic_ruyuanyuyue@2x.png"
            class="img"
          ></image>
          <view class="h1">入园须知</view>
          <view class="h2">RESERVATION</view>
        </view>
        <view
          class="img_wrap img2"
          @click="$jump('/pages/driver/reservedGuide')"
        >
          <image
            src="@/static/driver/wuliu_ic_zhinan@2x.png"
            class="img"
          ></image>
          <view class="h1">预约指南</view>
          <view class="h2">APPOINTMENT GUIDE</view>
        </view>
      </view>
      <view class="right">
        <view
          class="img_wrap img2"
          @click="$jump('/pages/driver/reservedRecord')"
        >
          <image
            src="@/static/driver/wuliu_ic_yuyuejilu@2x.png"
            class="img"
          ></image>
          <view class="h1">预约记录</view>
          <view class="h2">APPOINTMENT RECORD</view>
        </view>
        <view class="img_wrap img2" @click="$jump('/pages/driver/queueUp')">
          <image
            src="@/static/driver/wuliu_ic_paidui@2x.png"
            class="img"
          ></image>
          <view class="h1">月台排队情况</view>
          <view class="h2">HIDDEN DANGER</view>
        </view>
        <view class="img_wrap img2">
          <image
            src="@/static/driver/wuliu_ic_daolan@2x.png"
            class="img"
          ></image>
          <view class="h1">园区导览图</view>
          <view class="h2">GUIDE MAP</view>
        </view>
      </view>
    </view>
    <!--  -->
    <view class="copyright">
      <image src="@/static/logo_s@2x.png" class="mr6" mode="widthFix" />
      <text>安徽安泰物流有限责任公司版权所有</text>
    </view>
  </view>
    <view class="main_app">
        <view class="title_wrap">
            <view class="name">{{ driverInfo.realname }},欢迎登录~</view>
            <view class="btn" @click="loginOut">退出登录</view>
        </view>
        <!--  -->
        <view class="banner_wrap">
            <view class="h1">安泰物流智慧园区</view>
            <view class="h2">物流车专区</view>
            <image class="banner" src="../../static/driver/wuliuche_banner@2x.png" mode="widthFix"></image>
        </view>
        <!--  -->
        <view class="task_list">
            <swiper circular class="task_swiper">
                <swiper-item>
                    <view class="item">
                        <view class="head">
                            <view class="name">运输单222</view>
                            <view class="status">
                                <view class="text">请确认任务</view>
                                <view class="time">预计等待:12小时</view>
                            </view>
                        </view>
                        <view class="content">
                            <view class="info">
                                <view class="plate">
                                    <image src="@/static/driver/wuliu_ic_car@2x.png" class="icon" mode=""></image>
                                    <text>皖AD</text>
                                </view>
                                <view class="plate">
                                    <image src="@/static/driver/wuliu_ic_huowu@2x.png" class="icon" mode=""></image>
                                    <text>3000万</text>
                                </view>
                            </view>
                            <view class="sub">
                                <view class="time">02-01 08:11:11</view>
                                <view class="sub_btn" @click="handleTask()">确认任务</view>
                            </view>
                        </view>
                    </view>
                </swiper-item>
                <swiper-item>
                    <view class="item">
                        <view class="head">
                            <view class="name">运输单222</view>
                            <view class="status"><view class="text">请与现场签到</view></view>
                        </view>
                        <view class="content">
                            <view class="info">
                                <view class="plate">
                                    <image src="@/static/driver/wuliu_ic_car@2x.png" class="icon" mode=""></image>
                                    <text>皖AD</text>
                                </view>
                                <view class="plate">
                                    <image src="@/static/driver/wuliu_ic_huowu@2x.png" class="icon" mode=""></image>
                                    <text>3000万</text>
                                </view>
                            </view>
                            <view class="sub">
                                <view class="time">02-01 08:11:11</view>
                                <view class="sub_btn" @click="handleTask(1)">立即签到</view>
                            </view>
                        </view>
                    </view>
                </swiper-item>
            </swiper>
        </view>
        <!--  -->
        <view class="title_wrap"><view class="name">业务办理</view></view>
        <view class="container1">
            <view class="left">
                <view class="img_wrap img1" @click="$jump('/pages/driver/reserved')">
                    <image src="@/static/driver/wuliu_ic_ruyuanyuyue@2x.png" class="img"></image>
                    <view class="h1">入园须知</view>
                    <view class="h2">RESERVATION</view>
                </view>
                <view class="img_wrap img2" @click="$jump('/pages/driver/reservedGuide?str=bookingTips')">
                    <image src="@/static/driver/wuliu_ic_zhinan@2x.png" class="img"></image>
                    <view class="h1">预约指南</view>
                    <view class="h2">APPOINTMENT GUIDE</view>
                </view>
            </view>
            <view class="right">
                <view class="img_wrap img2" @click="$jump('/pages/driver/reservedRecord')">
                    <image src="@/static/driver/wuliu_ic_yuyuejilu@2x.png" class="img"></image>
                    <view class="h1">预约记录</view>
                    <view class="h2">APPOINTMENT RECORD</view>
                </view>
                <view class="img_wrap img2" @click="$jump('/pages/driver/queueUp')">
                    <image src="@/static/driver/wuliu_ic_paidui@2x.png" class="img"></image>
                    <view class="h1">月台排队情况</view>
                    <view class="h2">HIDDEN DANGER</view>
                </view>
                <view class="img_wrap img2" @click="$jump('/pages/driver/reservedGuide?str=reservationMap')">
                    <image src="@/static/driver/wuliu_ic_daolan@2x.png" class="img"></image>
                    <view class="h1">园区导览图</view>
                    <view class="h2">GUIDE MAP</view>
                </view>
            </view>
        </view>
        <!--  -->
        <view class="copyright">
            <image src="@/static/logo_s@2x.png" class="mr6" mode="widthFix" />
            <text>安徽安泰物流有限责任公司版权所有</text>
        </view>
    </view>
</template>
<script>
import { logoutPost, driverHomeData } from '@/api';
export default {
  data() {
    return {
    }
  },
  methods: {
    handleTask() {
      uni.navigateTo({
        url: '/pages/driver/taskConfirm'
      })
    }
  }
}
    data() {
        return {
            driverInfo: uni.getStorageSync('driverInfo')
        };
    },
    created() {
        this.initData();
    },
    methods: {
        initData() {
            driverHomeData().then(res => {
                if (res.code == 200) {
                    uni.setStorageSync('driverGuide', {
                        bookingTips: res.data.bookingTips,
                        reservationMap: res.data.reservationMap
                    });
                }
            });
        },
        loginOut() {
            this.$store.commit('empty');
            logoutPost();
            uni.redirectTo({
                url: '/pages/driver/login'
            });
        },
        handleTask(status) {
            if (status == 1) {
                return uni.navigateTo({
                    url: '/pages/driver/taskDetail'
                });
            }
            uni.navigateTo({
                url: '/pages/driver/taskConfirm'
            });
        }
    }
};
</script>
<style lang="scss">
.title_wrap {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 24rpx;
  .name {
    font-weight: 600;
    font-size: 34rpx;
    color: #222222;
  }
  .btn {
    width: 144rpx;
    height: 56rpx;
    border-radius: 36rpx;
    border: 1rpx solid $uni-color-primary;
    font-size: 26rpx;
    color: $uni-color-primary;
    display: flex;
    justify-content: center;
    align-items: center;
  }
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 24rpx;
    .name {
        font-weight: 600;
        font-size: 34rpx;
        color: #222222;
    }
    .btn {
        width: 144rpx;
        height: 56rpx;
        border-radius: 36rpx;
        border: 1rpx solid $uni-color-primary;
        font-size: 26rpx;
        color: $uni-color-primary;
        display: flex;
        justify-content: center;
        align-items: center;
    }
}
.main_app {
  padding-top: 12rpx;
    padding-top: 12rpx;
}
.banner_wrap {
  padding: 54rpx 44rpx;
  color: #fff;
  position: relative;
  width: 688rpx;
  height: 270rpx;
  margin-bottom: 40rpx;
  .h1 {
    font-weight: bold;
    line-height: 66rpx;
    font-size: 44rpx;
    margin-bottom: 14rpx;
  }
  .h2 {
    font-weight: 600;
    font-size: 28rpx;
    width: 192rpx;
    color: $uni-color-primary;
    height: 48rpx;
    line-height: 48rpx;
    text-align: center;
    background: #ffffff;
    box-shadow: 0rpx 4rpx 8rpx 0rpx rgba(39, 155, 170, 0.31);
    border-radius: 24rpx;
  }
  .banner {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    z-index: -1;
  }
    padding: 54rpx 44rpx;
    color: #fff;
    position: relative;
    width: 688rpx;
    height: 270rpx;
    margin-bottom: 40rpx;
    .h1 {
        font-weight: bold;
        line-height: 66rpx;
        font-size: 44rpx;
        margin-bottom: 14rpx;
    }
    .h2 {
        font-weight: 600;
        font-size: 28rpx;
        width: 192rpx;
        color: $uni-color-primary;
        height: 48rpx;
        line-height: 48rpx;
        text-align: center;
        background: #ffffff;
        box-shadow: 0rpx 4rpx 8rpx 0rpx rgba(39, 155, 170, 0.31);
        border-radius: 24rpx;
    }
    .banner {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        z-index: -1;
    }
}
.container1 {
  display: flex;
  flex-wrap: wrap;
  view {
    width: 336rpx;
  }
  .left {
    margin-right: 18rpx;
  }
  .img_wrap {
    position: relative;
    padding: 24rpx 0rpx 0 28rpx;
    border-radius: 8rpx;
    overflow: hidden;
    .h1 {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
      line-height: 48rpx;
      margin-bottom: 4rpx;
    }
    .h2 {
      font-size: 22rpx;
      color: #7b9da1;
      line-height: 34rpx;
    }
    .img {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      z-index: -1;
    }
  }
  .img1 {
    width: 336rpx;
    height: 296rpx;
    margin-bottom: 16rpx;
  }
  .img2 {
    width: 336rpx;
    height: 140rpx;
    margin-bottom: 16rpx;
  }
    display: flex;
    flex-wrap: wrap;
    view {
        width: 336rpx;
    }
    .left {
        margin-right: 18rpx;
    }
    .img_wrap {
        position: relative;
        padding: 24rpx 0rpx 0 28rpx;
        border-radius: 8rpx;
        overflow: hidden;
        .h1 {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            line-height: 48rpx;
            margin-bottom: 4rpx;
        }
        .h2 {
            font-size: 22rpx;
            color: #7b9da1;
            line-height: 34rpx;
        }
        .img {
            width: 100%;
            height: 100%;
            position: absolute;
            top: 0;
            left: 0;
            z-index: -1;
        }
    }
    .img1 {
        width: 336rpx;
        height: 296rpx;
        margin-bottom: 16rpx;
    }
    .img2 {
        width: 336rpx;
        height: 140rpx;
        margin-bottom: 16rpx;
    }
}
.task_list {
  margin-bottom: 48rpx;
  .item {
    background: #ffffff;
    box-shadow: 0rpx 4rpx 32rpx 0rpx rgba(39, 155, 170, 0.18);
    border-radius: 16rpx;
    .head {
      display: flex;
      justify-content: space-between;
      align-items: center;
      background: linear-gradient(270deg, #fefeff 0%, #e1f7fe 100%);
      padding: 20rpx 30rpx;
      .name {
        font-weight: 600;
        font-size: 36rpx;
        color: #222222;
      }
      .status {
        color: $uni-color-primary;
        font-weight: 600;
        .time {
          font-size: 24rpx;
          font-weight: 360;
        }
      }
    }
    .content {
      .info {
        display: flex;
        padding: 24rpx 30rpx;
        .plate {
          flex: 1;
          display: flex;
          align-items: center;
          .icon {
            width: 26rpx;
            height: 26rpx;
            margin-right: 10rpx;
          }
        }
      }
      .sub {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 0 30rpx 24rpx;
        .time {
          font-size: 26rpx;
          color: #999999;
        }
        .sub_btn {
          height: 68rpx;
          line-height: 68rpx;
          padding: 0 34rpx;
          color: #ffffff;
          background: $uni-color-primary;
          box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(39, 155, 170, 0.4);
          border-radius: 40rpx;
        }
      }
    }
  }
    margin-bottom: 48rpx;
    .task_swiper {
        padding: 16rpx 10rpx;
        height: 320rpx;
        width: 730rpx;
        margin-left: -20rpx;
        box-sizing: border-box;
    }
    .item {
        background: #ffffff;
        box-shadow: 0rpx 0rpx 12rpx 0rpx rgba(39, 155, 170, 0.32);
        border-radius: 16rpx;
        height: 280rpx;
        width: 98%;
        margin-left: 1%;
        .head {
            display: flex;
            justify-content: space-between;
            align-items: center;
            background: linear-gradient(270deg, #fefeff 0%, #e1f7fe 100%);
            padding: 0rpx 30rpx;
            height: 92rpx;
            .name {
                font-weight: 600;
                font-size: 36rpx;
                color: #222222;
            }
            .status {
                color: $uni-color-primary;
                font-weight: 600;
                text-align: right;
                .time {
                    font-size: 24rpx;
                    font-weight: 360;
                }
            }
        }
        .content {
            height: 180rpx;
            .info {
                display: flex;
                padding: 24rpx 30rpx;
                .plate {
                    flex: 1;
                    display: flex;
                    align-items: center;
                    .icon {
                        width: 26rpx;
                        height: 26rpx;
                        margin-right: 10rpx;
                    }
                }
            }
            .sub {
                display: flex;
                justify-content: space-between;
                align-items: center;
                padding: 0 30rpx 24rpx;
                .time {
                    font-size: 26rpx;
                    color: #999999;
                }
                .sub_btn {
                    height: 68rpx;
                    line-height: 68rpx;
                    padding: 0 34rpx;
                    color: #ffffff;
                    background: $uni-color-primary;
                    box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(39, 155, 170, 0.4);
                    border-radius: 40rpx;
                }
            }
        }
    }
}
.copyright {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-top: 44rpx;
  font-size: 24rpx;
  color: #666666;
  image {
    width: 40rpx;
    height: 40rpx;
  }
    display: flex;
    align-items: center;
    justify-content: center;
    margin-top: 44rpx;
    font-size: 24rpx;
    color: #666666;
    image {
        width: 40rpx;
        height: 40rpx;
    }
}
</style>
h5/pages/driver/login.vue
@@ -7,7 +7,7 @@
    <view class="login_list">
      <view class="login_list_item">
        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
        <input v-model="form.phone" maxlength="18" placeholder="手机号" />
        <input v-model="form.username" maxlength="18" placeholder="手机号" />
      </view>
      <view class="login_list_item">
        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
@@ -25,52 +25,53 @@
        <view class="btns">
            <view class="btn" @click="handleRegister">立即注册</view>
            <view class="btn separate"> | </view>
            <view class="btn">忘记密码</view>
            <view class="btn" @click="handleSetPsd">忘记密码</view>
        </view>
  </view>
</template>
<script>
import { resetPassword, sendSms } from '@/api'
import { driverLogin, loginCaptcha, getUserInfo } from '@/api'
import { mapState, mapMutations } from 'vuex'
export default {
  data() {
    return {
      form: {
                username: '13996529050',
                password: '1'
      },
      isShowProtocol: false,
      countDown: 0
    }
  },
  onLoad() {
        this.initCaptcha()
  },
  methods: {
        ...mapMutations(["setToken", "setDriverInfo"]),
        handleRegister() {
            uni.navigateTo({
                url: "/pages/driver/register"
            })
        },
        handleSetPsd() {
            uni.navigateTo({
                url: "/pages/driver/forgetPsd"
            })
        },
    dealChange(e) {
      console.log(e)
    },
    initCaptcha() {
      if (!this.form.phone) return uni.showToast({
        title: '手机号不能为空',
        icon: 'none'
      })
      sendSms({ phone: this.form.phone }).then(res => {
        this.countDown = 60
        setInterval(() => {
          if (this.countDown == 0) return
          this.countDown--
        }, 1000)
      loginCaptcha().then(res => {
        this.captcha = res.data
      })
    },
    onLogin() {
      const { form } = this
      if (!form.phone) return uni.showToast({
      if (!form.username) return uni.showToast({
        title: '手机号不能为空',
        icon: 'none'
      })
@@ -78,19 +79,21 @@
        title: '密码不能为空',
        icon: 'none'
      })
      resetPassword({
        ...form
      driverLogin({
        ...form,
                uuid: this.captcha.uuid,
                code: '1'
      }).then(res => {
        if (res && res.code == 200) {
          setTimeout(() => {
            uni.showToast({
              title: '密码修改成功,请重新登录',
              icon: 'success',
              duration: 2000
        if (res.code === 200) {
          this.setToken(res.data)
          getUserInfo().then(ress => {
                        setTimeout(() => {
                            this.showToast('登录成功')
                        })
            this.setDriverInfo(ress.data)
            uni.redirectTo({
              url: "/pages/driver/index"
            })
          })
          uni.redirectTo({
            url: "/pages/staffLogin/login"
          })
        }
      })
h5/pages/driver/register.vue
@@ -49,12 +49,11 @@
</template>
<script>
import { resetPassword, sendSms } from '@/api'
import { driverRegister, sendSms } from '@/api'
export default {
  data() {
    return {
      form: {
      },
      form: {},
      isShowProtocol: false,
      countDown: 0
    }
@@ -84,7 +83,7 @@
    onLogin() {
      const { form } = this
            if (!form.name) return uni.showToast({
              title: '手机号姓名',
              title: '姓名不能为空',
              icon: 'none'
            })
      if (!form.phone) return uni.showToast({
@@ -99,14 +98,14 @@
        title: '密码不能为空',
        icon: 'none'
      })
      resetPassword({
      driverRegister({
        ...form
      }).then(res => {
        if (res && res.code == 200) {
          setTimeout(() => {
            uni.showToast({
              title: '注册成功,请前往登录',
              icon: 'success',
              icon: 'none',
              duration: 2000
            })
          })
h5/pages/driver/reserved.vue
@@ -5,9 +5,19 @@
            <view class="line">
                <view class="label">
                    <text>*</text>
                    <text>入园原因</text>
                </view>
                <view class="value" @click="showReason = true">
                    <text class="mr6" :style="{ color: param.inReason ? '#000000' : '#999999' }">{{ param.inReason ? param.inReason : '请选择' }}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16"></u-icon>
                </view>
            </view>
            <view class="line">
                <view class="label">
                    <text>*</text>
                    <text>合同号</text>
                </view>
                <view class="value"><input type="text" placeholder="请输入您的合同号" v-model="param.receptMemberName" placeholder-style="color: #999999;" /></view>
                <view class="value"><input type="text" placeholder="请输入您的合同号" v-model="param.contractNum" placeholder-style="color: #999999;" /></view>
            </view>
            <!--  -->
            <view class="line">
@@ -16,7 +26,7 @@
                    <text>到场时间</text>
                </view>
                <view class="value" @click="showDatetime = true">
                    <text class="mr6" :style="{ color: param.area ? '#000000' : '#999999' }">{{ param.area ? param.area : '请选择' }}</text>
                    <text class="mr6" :style="{ color: param.arriveDate ? '#000000' : '#999999' }">{{ param.arriveDate ? param.arriveDate : '请选择' }}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16"></u-icon>
                </view>
            </view>
@@ -27,8 +37,8 @@
                </view>
                <view class="value">
                    <view class="btns">
                        <view class="btn active">整托盘</view>
                        <view class="btn">件烟</view>
                        <view @click="inTypeClick(0)" :class="{ active: param.inType == 0 }" class="btn">整托盘</view>
                        <view @click="inTypeClick(1)" :class="{ active: param.inType == 1 }" class="btn">件烟</view>
                    </view>
                </view>
            </view>
@@ -38,7 +48,7 @@
                    <text>总运输量</text>
                </view>
                <view class="value">
                    <input type="text" placeholder="请输入总运输量" v-model="param.receptMemberName" placeholder-style="color: #999999;" />
                    <input type="number" placeholder="请输入总运输量" v-model="param.totalNum" placeholder-style="color: #999999;" />
                    <text class="unit">万支</text>
                </view>
            </view>
@@ -47,8 +57,9 @@
                    <text>*</text>
                    <text>准运证照片</text>
                </view>
                <view class="value">
                    <view class="upload_wrap"><u-icon name="plus" size="20" color="#999999"></u-icon></view>
                <view class="value" @click="handleUpload">
                    <image v-if="param.transportImgFull" class="upload_wrap" :src="param.transportImgFull" alt="">
                    <view v-else class="upload_wrap"><u-icon name="plus" size="20" color="#999999"></u-icon></view>
                </view>
            </view>
            <view class="empty"></view>
@@ -58,14 +69,14 @@
                    <text>*</text>
                    <text>司机姓名</text>
                </view>
                <view class="value"><input type="text" placeholder="请输入您的真实姓名" v-model="param.receptMemberName" placeholder-style="color: #999999;" /></view>
                <view class="value"><input type="text" placeholder="请输入您的真实姓名" v-model="param.driverName" placeholder-style="color: #999999;" /></view>
            </view>
            <view class="line">
                <view class="label">
                    <text>*</text>
                    <text>手机号</text>
                </view>
                <view class="value"><input type="text" placeholder="请输入您的手机号" v-model="param.receptMemberName" placeholder-style="color: #999999;" /></view>
                <view class="value"><input type="number" placeholder="请输入您的手机号" v-model="param.driverPhone" placeholder-style="color: #999999;" /></view>
            </view>
            <!--  -->
            <view class="line">
@@ -74,7 +85,7 @@
                    <text>车前牌照号</text>
                </view>
                <view class="value" @click="openInput(1)">
                    <text :style="{ color: param.carNos ? '#000000' : '' }">{{ param.carNos ? param.carNos : '请输入车牌号码' }}</text>
                    <text :style="{ color: param.carCodeFront ? '#000000' : '#999999' }">{{ param.carCodeFront ? param.carCodeFront : '请输入车牌号码' }}</text>
                </view>
            </view>
            <view class="line">
@@ -82,18 +93,19 @@
                    <text>*</text>
                    <text>车后牌照号</text>
                </view>
                <view class="value" @click="openInput(1)">
                    <text :style="{ color: param.carNos ? '#000000' : '' }">{{ param.carNos ? param.carNos : '请输入车牌号码' }}</text>
                <view class="value" @click="openInput(2)">
                    <text :style="{ color: param.carCodeBack     ? '#000000' : '#999999' }">{{ param.carCodeBack     ? param.carCodeBack     : '请输入车牌号码' }}</text>
                </view>
            </view>
            <view class="copy" @click="copy">复制车前牌照号</view>
            <view class="perch"></view>
            <view class="handle_sub">
            <view class="handle_sub" @click="onSubmit">
                æäº¤
            </view>
            <!--  -->
        </view>
        <!--  -->
        <u-picker :show="showReason" keyName="reason" :columns="reasonList" @confirm="reasonConfirm"></u-picker>
        <u-datetime-picker
            :show="showDatetime"
            closeOnClickOverlay
@@ -109,74 +121,130 @@
<script>
import keyboardInput from '@/components/keyboard-input/keyboard-input.vue';
import { uploadUrl } from '@/api';
import { uploadUrl, driverCarApply, driverReasonList } from '@/api';
import dayjs from 'dayjs'
export default {
    components: {
        keyboardInput
    },
    data() {
        return {
            param: {},
            param: {
                inType: 0,
                driverName: uni.getStorageSync('driverInfo').realname,
                driverPhone: uni.getStorageSync('driverInfo').username,
            },
            reasonIndex: -1,
            reasonList: [],
            showDatetime: false,
            showReason: false,
            inputType: ''
        };
    },
    created() {
        this.initData()
    },
    methods: {
        copy(){
            this.param.carNos = this.param.carNos
            uni.showToast({
                title: '复制成功',
                duration: 1000
            });
        },
        handleUpload() {
            uni.chooseImage({
                success: chooseImageRes => {
                    uni.showLoading({ title: '上传中', mask: true });
                    for (let i = 0; i < chooseImageRes.tempFilePaths.length; i++) {
                        uni.uploadFile({
                            url: `${uploadUrl}visitsAdmin/cloudService/web/public/uploadFtp.do`,
                            filePath: chooseImageRes.tempFilePaths[i],
                            name: 'file',
                            formData: {
                                folderCode: 'MEMBER_IMG'
                            },
                            success: uploadFileRes => {
                                console.log('uploadFileRes', uploadFileRes);
                                let res = JSON.parse(uploadFileRes.data);
                                if (type === 'faceImg') {
                                    this.param.faceImg = res.data.halfPath;
                                    this.param.faceImgUrl = res.data.prefixPath + res.data.folder + res.data.halfPath;
                                } else {
                                    this.param.imgurl = res.data.halfPath;
                                    this.param.imgurlUrl = res.data.prefixPath + res.data.folder + res.data.halfPath;
                                }
                            },
                            complete() {
                                if (i === chooseImageRes.tempFilePaths.length - 1) {
                                    uni.hideLoading();
                                }
                            }
                        });
                    }
        onSubmit() {
            const param = { ...this.param }
            if (!param.arriveDate) return this.showToast('请选择到场时间')
            if (!param.inType && param.inType != 0) return this.showToast('请选择入库类型')
            if (!param.contractNum) return this.showToast('请输入合同号')
            if (!param.totalNum) return this.showToast('请输入总运输量')
            if (!param.driverName) return this.showToast('请输入司机姓名')
            if (!param.driverPhone) return this.showToast('请输入手机号')
            if (!param.carCodeFront) return this.showToast('请输入车前牌号')
            if (!param.carCodeBack) return this.showToast('请输入车后牌号')
            if (!param.transportImgFull) return this.showToast('请上传准运证照片')
            param.arriveDate = param.arriveDate + ':00'
            driverCarApply({...param}).then(res => {
                if(res && res.code === 200){
                    uni.navigateBack()
                }
            });
            })
        },
        setinDate(e) {},
        initData(){
            driverReasonList().then(res => {
                this.reasonList = [res.data]
            })
        },
        reasonConfirm(e) {
            const reasonList = this.reasonList[0]
            const index = e.indexs[0]
            this.$set(this.param, 'inReason', reasonList[index].reason)
            this.$set(this.param, 'reasonId', reasonList[index].id)
            this.showReason = false
        },
        setinDate(e) {
            this.$set(this.param, 'arriveDate', dayjs(e.value).format('YYYY-MM-DD HH:mm'))
            this.showDatetime = false
        },
        inTypeClick(e) {
            this.param.inType = e
        },
        openInput(type) {
            this.inputType = type;
            this.$refs.keyboard.open();
        },
        setPlate(e) {
            if (this.inputType === 1) {
                this.param.carNos = e;
                this.$set(this.param, 'carCodeFront', e)
            } else if (this.inputType === 2) {
                this.param.carNos = e;
                this.$set(this.param, 'carCodeBack', e)
            }
            this.$forceUpdate();
            this.closeInput();
        },
        copy(){
            if(this.param.carCodeFront){
                this.$set(this.param, 'carCodeBack', this.param.carCodeFront)
                this.showToast('复制成功');
            }
        },
        handleUpload() {
            let token = uni.getStorageSync('token') || ''
            uni.chooseImage({
              count: 1,
              success: (chooseImageRes) => {
                uni.showLoading({ title: '上传中', mask: true })
                const tempFilePaths = chooseImageRes.tempFilePaths
                let imgs = tempFilePaths.map((value, index) => {
                  return {
                    name: 'file',
                    uri: value
                  }
                })
                uni.uploadFile({
                  url: `${uploadUrl}`,
                  files: imgs,
                  name: 'file',
                  formData: {
                    folder: 'PLATFORM'
                  },
                  header: {
                    Dm_user_token: token
                  },
                  success: (uploadFileRes) => {
                    let res = JSON.parse(uploadFileRes.data)
                    console.log('res', res.data)
                    if (res.data && res.data.length > 0) {
                                this.$set(this.param, 'transportImg', res.data[0].imgaddr)
                                this.$set(this.param, 'transportImgFull', res.data[0].url)
                    }
                  },
                  fail(err) {
                    console.log('err', err)
                  },
                  complete() {
                    uni.hideLoading()
                  }
                })
                // }
              }
            })
        },
        closeInput() {
            this.$refs.keyboard.close();
        }
h5/pages/driver/reservedDetail.vue
@@ -1,142 +1,171 @@
<template>
  <view class="main_app">
    <view class="status_wrap">
      <view class="name">丁恩凯的访客申请</view>
      <view class="desc">等待我处理</view>
      <view class="status">审批中</view>
      <view class="name">{{info.driverName}}的入园预约</view>
      <view class="desc">{{info.carCodeFront}}</view>
      <view class="status">{{ statusMap[info.status] }}</view>
    </view>
    <!--  -->
    <view class="emyty"></view>
    <view class="module_list">
      <view class="item">
        <view class="label">拜访人</view>
        <view class="value">廖成瑶</view>
        <view class="label">入园原因</view>
        <view class="value">{{info.inReason}}</view>
      </view>
      <view class="item">
        <view class="label">预计入/离园时间</view>
        <view class="value">05/01 8:00 - 05/01 18:00</view>
        <view class="label">合同编号</view>
        <view class="value">{{info.contractNum}}</view>
      </view>
            <view class="item">
              <view class="label">到场时间</view>
              <view class="value" v-if="info.arriveDate">{{info.arriveDate.slice(0,16)}}</view>
            </view>
            <view class="item">
              <view class="label">准运证照片</view>
              <view class="value">
                    <image
                        v-if="info.transportImg"
                      class="avatar_wrap"
                      :src="info.prefixUrl + info.transportImg"
                    ></image>
                </view>
            </view>
            <view class="item">
              <view class="label">入库类型</view>
              <view class="value">{{info.inType == 0 ? '整托盘' : '件烟'}}</view>
            </view>
            <view class="item">
              <view class="label">总运数量</view>
              <view class="value">{{info.totalNum}}万支</view>
            </view>
      <view class="emyty"></view>
      <view class="item">
        <view class="label">访客信息</view>
        <view class="value">
          <image
            class="avatar"
            src="@/static/logo@2x.png"
            mode="widthFix"
          ></image>
          <view class="info">
            <text class="name">孙志 18177665678</text>
            <text>身份证号:3309****2910</text>
            <text>入园车辆:皖A88789</text>
          </view>
        <view class="label">司机姓名</view>
        <view class="value">{{info.driverName}}
        </view>
      </view>
      <view class="item">
        <view class="label">公司名称</view>
        <view class="value">中国移动</view>
        <view class="label">手机号</view>
        <view class="value">{{info.driverPhone}}</view>
      </view>
      <view class="item">
        <view class="label">施工人员</view>
        <view class="value">否</view>
      </view>
      <view class="item">
        <view class="label">来访事由</view>
        <view class="value">业务洽谈</view>
      </view>
            <view class="item">
              <view class="label">车牌照</view>
              <view class="value">前 {{info.carCodeFront}},后 {{info.carCodeBack}}</view>
            </view>
    </view>
    <!-- æµç¨‹ -->
    <view class="flow_wrap">
      <view class="flow_title">流程</view>
      <view class="list">
        <view class="item">
          <view class="avatar">
            <image class="img" src="@/static/logo@2x.png" mode="widthFix" />
      <view class="list" v-if="info.approveDateVO != null && info.approveDateVO.approveList != null">
        <view class="item" v-for="item,index in info.approveDateVO.approveList">
                <view v-if="index != info.approveDateVO.approveList.length - 1" class="separate"></view>
          <view class="avatar_wrap">
            <image
              class="img"
              :src="
                item.faceImg
                  ? item.faceImg
                  : require('@/static/meeting/common/default_user@2x.png')
              "
            />
            <image
                        v-if="item.status == 2"
              class="status"
              src="@/static/staff/liucheng_success@2x.png"
              mode="widthFix"
            />
            <view class="separate"></view>
                    <image
                        v-if="item.status == 3"
                      class="status"
                      src="@/static/staff/liucheng_fail@2x.png"
                      mode="widthFix"
                    />
          </view>
          <view class="content">
            <view class="head">
              <view class="event">某某提交的拜访申请</view>
              <view class="time">time</view>
              <view class="event">{{ item.title }}</view>
              <view class="time">{{item.createDate}}</view>
            </view>
            <view class="name_wrap">
              <text>李东(<text class="status">处理中</text>)</text>
              <text>{{item.memberName}}<text v-if="item.statusInfo" class="status">({{item.statusInfo}})</text></text>
            </view>
            <view class="remark">同意放行</view>
          </view>
        </view>
        <view class="item">
          <view class="avatar">
            <image class="img" src="@/static/logo@2x.png" mode="widthFix" />
            <image
              class="status"
              src="@/static/staff/liucheng_success@2x.png"
              mode="widthFix"
            />
          </view>
          <view class="content">
            <view class="head">
              <view class="event">某某提交的拜访申请</view>
              <view class="time">time</view>
            </view>
            <view class="name_wrap">
              <text>李东(<text class="status">处理中</text>)</text>
            </view>
            <view class="carbon">
              <view class="carbon_item" v-for="i in 12">
                <image src="@/static/logo@2x.png" mode="widthFix"></image>
                <view class="text">name</view>
              </view>
            </view>
                    <view v-if="item.approveType == 1" class="carbon">
                      <view class="carbon_item" v-for="child in item.approveList"
                :key="child.id">
                        <image :src="
                    child.faceImg
                      ? child.faceImg
                      : require('@/static/meeting/common/default_user@2x.png')
                  "></image>
                        <view class="text">{{ child.memberName }}</view>
                      </view>
                    </view>
          </view>
        </view>
      </view>
    </view>
    <view class="emyty"></view>
    <view class="main_footer">
      <view class="btn" @click="handleSub('0')">拒绝</view>
      <view class="btn agree" @click="handleSub('1')">同意</view>
      <view v-if="info.status == 0 || info.status == 1" class="btn" @click="handleCancel">撤回申请</view>
       <view v-if="info.status == 0 || info.status == 1" class="btn agree" @click="handleEdit">修改</view>
       <view v-if="info.status == 3" class="btn agree aga" @click="handleAga">再次申请</view>
    </view>
    <!--  -->
    <u-popup
      :show="showApprModal"
      :round="10"
      :safeAreaInsetBottom="true"
      mode="bottom"
      @close="showApprModal = false"
    >
      <view class="appr_modal">
        <view class="title">同意</view>
        <textarea
          placeholder="同意说明,非必填"
          placeholder-class="placeholder9"
        />
        <view class="main_footer">
          <view class="btn" @click="showApprModal = false">取消</view>
          <view class="btn agree">提交</view>
        </view>
      </view>
    </u-popup>
  </view>
</template>
<script>
    import { driverApplyDetail, driverCarRevoke } from '@/api'
export default {
  data() {
    return {
      showApprModal: false,
      param: {}
      info: {},
            statusMap: {
                0: '待审批',
                1: '审批中',
                2: '审批通过',
                3: '审批不通过',
                4: '已取消',
            },
    }
  },
    onLoad(option) {
        this.getDetail(option.id)
    },
  methods: {
        handleCancel(){
            uni.showModal({
                title: '提示',
                content: '这是一个模态弹窗',
                success: function (res) {
                    if (res.confirm) {
                        console.log('用户点击确定');
                    } else if (res.cancel) {
                        console.log('用户点击取消');
                    }
                }
            });
            // driverCarRevoke
        },
        handleEdit(){},
        handleAga(){},
        getDetail(id) {
            driverApplyDetail({id}).then(res => {
                this.info = res.data
                if(this.info.approveDateVO && this.info.approveDateVO.approveList.length > 0 ){
                    this.info.approveDateVO.approveList.forEach(item => {
                        if(item.approveList && item.approveList.length == 1 && item.type !== 1){
                            item.title = item.approveList[0].title
                            item.faceImg = item.approveList[0].faceImg
                            item.memberName = item.approveList[0].memberName
                            item.statusInfo = item.approveList[0].statusInfo
                            item.approveList = []
                        }
                    })
                }
            })
        },
    handleSub(flag) {
      // this.param.flag =
      if (flag === '1') {
      } else {
@@ -172,7 +201,7 @@
        display: flex;
        margin-bottom: 48rpx;
        .avatar {
        .avatar_wrap {
          width: 80rpx;
          height: 80rpx;
          position: relative;
@@ -281,7 +310,7 @@
        display: flex;
        align-items: center;
        .avatar {
        .avatar_wrap {
          margin-right: 20rpx;
          width: 120rpx;
          height: 120rpx;
@@ -319,7 +348,7 @@
    .desc {
      font-size: 26rpx;
      color: #ed4545;
      color: #999999;
    }
    .status {
@@ -339,7 +368,7 @@
    padding-bottom: 64rpx;
    display: flex;
    justify-content: space-between;
    .btn {
      width: 336rpx;
      height: 88rpx;
@@ -357,6 +386,9 @@
      color: #fff;
      border: 1rpx solid $uni-color-primary;
    }
        .aga{
            width: 100%;
        }
  }
  .appr_modal {
h5/pages/driver/reservedGuide.vue
@@ -1,6 +1,6 @@
<template>
    <view>
        <mp-html :content="content" />
    </view>
</template>
@@ -8,8 +8,14 @@
    export default {
        data() {
            return {
                content: ''
            };
        },
        onLoad(option) {
            this.content = uni.getStorageSync('driverGuide')[option.str]
        },
        methods: {
        }
    }
</script>
h5/pages/driver/reservedRecord.vue
@@ -4,74 +4,77 @@
    <view class="box_list">
      <view
        class="box_list_item"
        v-for="(item, index) in 3"
        v-for="(item, index) in datalist"
        :key="index"
        @click="handleDetail()"
        @click="handleDetail(item.id)"
      >
        <view class="box_list_item_head">
          <text>丁恩凯的劳务入园申请</text>
          <text class="loading">待审核</text>
          <text>{{item.driverName}}的入园预约</text>
          <text class="loading">{{ statusMap[item.status] }}</text>
        </view>
        <view class="box_list_item_nr">
          <view class="box_list_item_nr_item">
            <text>被访问人:</text>
            <text>人事部-王亚蓝</text>
            <text>合同编号:</text>
            <text>{{item.contractNum}}</text>
          </view>
          <view class="box_list_item_nr_item">
            <text>进厂时间:</text>
            <text>12-12 09:00</text>
            <text>到场时间:</text>
            <text>{{item.arriveDate.slice(5,16)}}</text>
          </view>
          <view class="box_list_item_nr_item">
            <text>离园时间:</text>
            <text>12-12 12:00</text>
            <text>司机姓名:</text>
            <text>{{item.driverName}}</text>
          </view>
          <view class="box_list_item_nr_item">
            <text>来访事由:</text>
            <text>业务来往</text>
            <text>车辆信息:</text>
            <text>{{item.carCodeFront}}</text>
          </view>
          <view class="box_list_item_nr_item">
            <text>随行车辆:</text>
            <text>皖A88888</text>
            <text class="placeholder9">{{item.createDate.slice(0,16)}}提交</text>
          </view>
        </view>
      </view>
    </view>
    <!-- é€‰æ‹©è½¦è¾† -->
    <u-picker
      keyName="name"
      closeOnClickOverlay
      @close="isShowCar = false"
      :show="isShowCar"
      :columns="carList"
      @confirm="seletedCar"
      @cancel="isShowCar = false"
    ></u-picker>
    <!-- æ—¥æœŸ -->
    <u-datetime-picker
      :show="isShowDate"
      :minDate="minDate"
      @confirm="confirmDate"
      @cancel="isShowDate = false"
      mode="date"
    ></u-datetime-picker>
  </view>
</template>
<script>
    import { driverApplyRecord } from "@/api"
export default {
  data() {
    return {
      isShowCar: false,
      isShowDate: false,
      param: {},
      carList: [[{ name: 'aa', value: '11' }]],
      timeList: [{ time: '08:30-09:00' }, { time: '08:30-09:00' }, { time: '08:30-09:00' }, { time: '08:30-09:00' }]
            page: 1,
            capacity: 10,
            total: 0,
            datalist: [],
            statusMap: {
                0: '待审批',
                1: '审批中',
                2: '审批通过',
                3: '审批不通过',
                4: '已取消',
            }
    }
  },
    created() {
        this.getList()
    },
  methods: {
    handleDetail() {
        getList() {
            const { page, capacity } = this
            driverApplyRecord({
                page, capacity,model: {}
            }).then(res => {
                this.datalist = res.data.records
                this.total = res.data.total
            })
        },
    handleDetail(id) {
      uni.navigateTo({
        url: "/pages/driver/reservedDetail"
        url: `/pages/driver/reservedDetail?id=${id}`
      })
    },
    confirmDate(e) {
@@ -89,6 +92,9 @@
</script>
<style lang="scss">
    page{
        background: #f7f7f7;
    }
.main_app {
  background: #f7f7f7;
  padding: 0;
@@ -151,7 +157,7 @@
      }
    }
    .box_list_item_nr {
      padding: 30rpx;
      padding: 30rpx 30rpx 10rpx;
      width: 100%;
      box-sizing: border-box;
      background-color: #ffffff;
@@ -159,18 +165,11 @@
        width: 100%;
        display: flex;
        align-items: center;
        margin-bottom: 20rpx;
        margin-bottom: 16rpx;
        text {
          &:nth-child(1) {
            font-size: 26rpx;
            font-weight: 400;
            color: #666666;
          }
          &:nth-child(2) {
            font-size: 26rpx;
            font-weight: 400;
            color: #333333;
          }
          font-size: 26rpx;
          font-weight: 400;
          color: #666666;
        }
      }
    }
h5/pages/driver/taskDetail.vue
@@ -164,7 +164,9 @@
    getLocation() {
      uni.getLocation({
        type: 'wgs84',
        success: function (res) {
                    console.log(res);
          console.log('当前位置的经度:' + res.longitude)
          console.log('当前位置的纬度:' + res.latitude)
        }
h5/pages/staff/task/driver.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,445 @@
<template>
  <view class="main_app">
    <view class="status_wrap">
      <view class="name">{{info.driverName}}的入园预约</view>
      <view class="desc">{{info.carCodeFront}}</view>
      <view class="status">{{ statusMap[info.status] }}</view>
    </view>
    <!--  -->
    <view class="emyty"></view>
    <view class="module_list">
      <view class="item">
        <view class="label">入园原因</view>
        <view class="value">{{info.inReason}}</view>
      </view>
      <view class="item">
        <view class="label">合同编号</view>
        <view class="value">{{info.contractNum}}</view>
      </view>
            <view class="item">
              <view class="label">到场时间</view>
              <view v-if="info.arriveDate" class="value">{{info.arriveDate.slice(0,16)}}</view>
            </view>
            <view class="item">
              <view class="label">准运证照片</view>
              <view class="value">
                    <image
                        v-if="info.transportImg"
                      class="avatar_wrap"
                      :src="info.prefixUrl + info.transportImg"
                    ></image>
                </view>
            </view>
            <view class="item">
              <view class="label">入库类型</view>
              <view class="value">{{info.inType == 0 ? '整托盘' : '件烟'}}</view>
            </view>
            <view class="item">
              <view class="label">总运数量</view>
              <view class="value">{{info.totalNum}}万支</view>
            </view>
      <view class="emyty"></view>
      <view class="item">
        <view class="label">司机姓名</view>
        <view class="value">{{info.driverName}}
        </view>
      </view>
      <view class="item">
        <view class="label">手机号</view>
        <view class="value">{{info.driverPhone}}</view>
      </view>
            <view class="item">
              <view class="label">车牌照</view>
              <view class="value">前 {{info.carCodeFront}},后 {{info.carCodeBack}}</view>
            </view>
    </view>
    <!-- æµç¨‹ -->
    <view class="flow_wrap">
      <view class="flow_title">流程</view>
      <view class="list" v-if="info.approveDateVO != null && info.approveDateVO.approveList != null">
        <view class="item" v-for="item,index in info.approveDateVO.approveList">
                    <view v-if="index != info.approveDateVO.approveList.length - 1" class="separate"></view>
          <view class="avatar_wrap">
            <image
              class="img"
              :src="
                item.faceImg
                  ? item.faceImg
                  : require('@/static/meeting/common/default_user@2x.png')
              "
            />
            <image
                            v-if="item.status == 2"
              class="status"
              src="@/static/staff/liucheng_success@2x.png"
              mode="widthFix"
            />
                        <image
                            v-if="item.status == 3"
                          class="status"
                          src="@/static/staff/liucheng_fail@2x.png"
                          mode="widthFix"
                        />
          </view>
          <view class="content">
            <view class="head">
              <view class="event">{{ item.title }}</view>
              <view class="time">{{item.createDate}}</view>
            </view>
            <view class="name_wrap">
              <text>{{item.memberName}}<text v-if="item.statusInfo" class="status">({{item.statusInfo}})</text></text>
            </view>
                        <view v-if="item.approveType == 1" class="carbon">
                          <view class="carbon_item" v-for="child in item.approveList"
                :key="child.id">
                            <image :src="
                    child.faceImg
                      ? child.faceImg
                      : require('@/static/meeting/common/default_user@2x.png')
                  "></image>
                            <view class="text">{{ child.memberName }}</view>
                          </view>
                        </view>
          </view>
        </view>
      </view>
    </view>
    <view class="emyty"></view>
    <view class="main_footer">
      <view class="btn" @click="handleSub('0')">拒绝</view>
      <view class="btn agree" @click="handleSub('1')">同意</view>
    </view>
    <!--  -->
    <u-popup
      :show="showApprModal"
      :round="10"
      :safeAreaInsetBottom="true"
      mode="bottom"
      @close="showApprModal = false"
    >
      <view class="appr_modal">
        <view class="title">{{ this.flag == '0' ? '拒绝' : '同意' }}</view>
        <textarea
          :placeholder="this.flag == '0' ? '拒绝说明,必填' : '同意说明,非必填'"
          placeholder-class="placeholder9"
        />
        <view class="main_footer">
          <view class="btn" @click="showApprModal = false">取消</view>
          <view class="btn agree" @click="handleAppy">提交</view>
        </view>
      </view>
    </u-popup>
  </view>
</template>
<script>
    import { driverApplyDetail, carUseBookAppr } from '@/api'
export default {
  data() {
    return {
      showApprModal: false,
            checkInfo: '',
            flag: '1',
      info: {},
            type: 0,
            statusMap: {
                0: '待审批',
                1: '审批中',
                2: '审批通过',
                3: '审批不通过',
                4: '已取消',
            },
    }
  },
    onLoad(option) {
        this.type = option.objType
        this.getDetail(option.id)
    },
  methods: {
        getDetail(id) {
            driverApplyDetail({id}).then(res => {
                this.info = res.data
                if(this.info.approveDateVO && this.info.approveDateVO.approveList.length > 0 ){
                    this.info.approveDateVO.approveList.forEach(item => {
                        if(item.approveList && item.approveList.length == 1 && item.type !== 1){
                            item.title = item.approveList[0].title
                            item.faceImg = item.approveList[0].faceImg
                            item.memberName = item.approveList[0].memberName
                            item.statusInfo = item.approveList[0].statusInfo
                            item.approveList = []
                        }
                    })
                }
                console.log('this.info.approveDateVO', this.info.approveDateVO.approveList);
            })
        },
        handleAppy() {
            const {flag,checkInfo, type,info } = this
            if(flag == 0 && !checkInfo) return this.showToast('拒绝说明必填')
            carUseBookAppr({
                checkInfo,objId: info.id,objType: 6,status: flag == 0 ? 3 : 2
            }).then(res => {
                if(res.code == 200){
                    setTimeout(() => {
                        this.showToast('操作成功')
                    })
                    this.showApprModal = false
                    uni.navigateBack()
                }
            })
        },
    handleSub(flag) {
            this.flag = flag
            this.checkInfo = ''
      if (flag === '1') {
      } else {
      }
      this.showApprModal = true
    }
  },
}
</script>
<style>
page {
  background-color: #f7f7f7;
}
</style>
<style lang="scss">
.main_app {
  background-color: #fff;
  padding-bottom: 0;
  .flow_wrap {
    padding: 30rpx 0;
    .flow_title {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
      margin-bottom: 24rpx;
    }
    .list {
      .item {
        display: flex;
        margin-bottom: 48rpx;
                position: relative;
                .separate {
                  position: absolute;
                  width: 4rpx;
                  height: calc( 100% - 52rpx );
                  background-color: #eeeeee;
                  left: 40rpx;
                  top: 90rpx;
                }
        .avatar_wrap {
          width: 80rpx;
          height: 80rpx;
          position: relative;
          margin-right: 20rpx;
          .img {
            width: 80rpx;
            height: 80rpx;
            border-radius: 50%;
          }
          .status {
            width: 28rpx;
            height: 28rpx;
            border-radius: 50%;
            position: absolute;
            right: 0;
            bottom: 0;
          }
        }
        .content {
          flex: 1;
          .head {
            display: flex;
            justify-content: space-between;
            margin-bottom: 4rpx;
            .event {
              font-size: 30rpx;
            }
            .time {
              font-size: 26rpx;
              color: #999999;
            }
          }
          .name_wrap {
            font-size: 26rpx;
            color: #777777;
            .status {
              color: $uni-color-primary;
            }
          }
          .remark {
            margin-top: 12rpx;
            background-color: #f7f7f7;
            padding: 14rpx 20rpx;
            border-radius: 8rpx;
            font-size: 26rpx;
            color: #666666;
            line-height: 36rpx;
          }
        }
        .carbon {
          display: flex;
          width: 590rpx;
          overflow-x: auto;
          margin-top: 12rpx;
          .carbon_item {
            text-align: center;
            flex-shrink: 0;
            width: 100rpx;
            image {
              width: 60rpx;
              height: 60rpx;
              margin: 0 auto;
            }
            view {
              font-size: 26rpx;
              color: #777777;
            }
          }
        }
      }
    }
  }
  .module_list {
    .item {
      padding: 30rpx 0;
      border-bottom: 1rpx solid #e5e5e5;
      .label {
        font-size: 26rpx;
        color: #666666;
        margin-bottom: 20rpx;
      }
      .value {
        font-size: 30rpx;
        display: flex;
        align-items: center;
        .avatar_wrap {
          margin-right: 20rpx;
          width: 120rpx;
          height: 120rpx;
          border-radius: 8rpx;
          border: 2rpx solid #e5e5e5;
        }
        .info {
          flex: 1;
          display: flex;
          flex-direction: column;
          justify-content: space-between;
          font-size: 26rpx;
          color: #666666;
          .name {
            font-size: 30rpx;
            color: #333333;
          }
        }
      }
    }
  }
  .status_wrap {
    position: relative;
    padding: 30rpx 0;
    .name {
      font-weight: 600;
      font-size: 32rpx;
      margin-bottom: 20rpx;
      color: #222222;
    }
    .desc {
      font-size: 26rpx;
      color: #999999;
    }
    .status {
      position: absolute;
      right: -30rpx;
      top: 0;
      height: 60rpx;
      line-height: 60rpx;
      padding: 0 32rpx;
      border-radius: 0rpx 0rpx 0rpx 30rpx;
      background-color: #e9edff;
      color: $uni-color-primary;
    }
  }
  .main_footer {
    padding-bottom: 64rpx;
    display: flex;
    justify-content: space-between;
    .btn {
      width: 336rpx;
      height: 88rpx;
      line-height: 88rpx;
      background: #ffffff;
      border-radius: 44rpx;
      border: 1rpx solid #999999;
      font-size: 32rpx;
      text-align: center;
      margin: 16rpx 0;
    }
    .agree {
      background: $uni-color-primary;
      color: #fff;
      border: 1rpx solid $uni-color-primary;
    }
  }
  .appr_modal {
    padding: 36rpx 30rpx 0;
    .title {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
      margin-bottom: 40rpx;
      text-align: center;
    }
    textarea {
      box-sizing: border-box;
      width: 690rpx;
      background-color: #f7f7f7;
      font-size: 28rpx;
      color: #333333;
      padding: 24rpx;
      border-radius: 8rpx;
      margin-bottom: 30rpx;
    }
  }
  .emyty {
    width: 750rpx;
    height: 20rpx;
    background-color: #f7f7f7;
    margin: 0 -30rpx;
  }
}
</style>
h5/pages/staff/task/index.vue
@@ -76,6 +76,23 @@
          <view class="info loading">{{ item.info }}</view>
        </view>
        <view class="box_list_item_nr">
                    <view v-if="item.param1.arriveDate" class="box_list_item_nr_item">
                      <text></text>
                      <text>{{ item.param1.arriveDate }}</text>
                    </view>
                    <view v-if="item.param1.inType" class="box_list_item_nr_item">
                      <text></text>
                      <text>{{ item.param1.inType }}</text>
                    </view>
                    <view v-if="item.param1.totalNum" class="box_list_item_nr_item">
                      <text></text>
                      <text>{{ item.param1.totalNum }}</text>
                    </view>
                    <view v-if="item.param1.carNum" class="box_list_item_nr_item">
                      <text></text>
                      <text>{{ item.param1.carNum }}</text>
                    </view>
          <view v-if="item.param1.name" class="box_list_item_nr_item">
            <text></text>
            <text>{{ item.param1.name }}</text>
@@ -342,7 +359,11 @@
        uni.navigateTo({
          url: `/pages/staff/task/vDangetAppr?id=${objId}&objType=${objType}`
        })
      } else {
      } else if (objType === 6 || objType === 5) {
        uni.navigateTo({
          url: `/pages/staff/task/driver?id=${objId}&objType=${objType}`
        })
      }else {
        uni.navigateTo({
          url: `/pages/staff/task/visitorApprove?id=${objId}&objType=${objType}`
        })
h5/pages/staff/task/visitorApprove.vue
@@ -94,10 +94,17 @@
              "
            />
            <image
                v-if="item.status == 2"
              class="status"
              src="@/static/staff/liucheng_success@2x.png"
              mode="widthFix"
            />
            <image
                v-if="item.status == 3"
              class="status"
              src="@/static/staff/liucheng_fail@2x.png"
              mode="widthFix"
            />
          </view>
          <view class="content">
            <view class="head">
h5/store/index.js
@@ -13,6 +13,7 @@
const token = uni.getStorageSync('token')
const time = uni.getStorageSync('time')
const userInfo = uni.getStorageSync('userInfo')
const driverInfo = uni.getStorageSync('driverInfo')
const sessionKey = uni.getStorageSync('sessionKey')
const store = new Vuex.Store({
@@ -26,6 +27,7 @@
        token: token || null,
        time: time || null,
        userInfo: userInfo || {},
        driverInfo: driverInfo || {},
        height: height || '0',
        sessionKey: sessionKey || '',
        primaryColor: '#279baa'
@@ -66,6 +68,11 @@
            state.userInfo = obj
            uni.setStorageSync('userInfo', obj)
        },
        // è®¾ç½®å¸æœºä¿¡æ¯
        setDriverInfo(state, obj) {
            state.driverInfo = obj
            uni.setStorageSync('driverInfo', obj)
        },
        // è®¾ç½®SessionKey
        setSessionKey(state, val) {
            state.sessionKey = val
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
@@ -59,6 +59,7 @@
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            dto.setCheckCode(true);
            LoginUserInfo user = systemLoginService.loginByPasswordNew(dto,request);
            String token = jwtTokenUtil.generateToken(user);
            return ApiResponse.success(token);
@@ -90,6 +91,24 @@
        }
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("司机登录")
    @PostMapping("/loginDriver")
    @LoginNoRequired
    public ApiResponse<String> loginDriver (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            dto.setCheckCode(false);
            LoginUserInfo user = systemLoginService.driverLogin(dto,request);
            String token = jwtTokenUtil.generateToken(user);
            return ApiResponse.success(token);
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
        }
    }
    /**
     * åˆ·æ–°JWT令牌,用旧的令牌换新的令牌
server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java
@@ -4,6 +4,7 @@
import com.doumee.dao.system.model.SystemPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.model.SystemUser;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.beans.BeanUtils;
@@ -59,15 +60,19 @@
        loginUserInfo.setCompany(company);
        // è®¾ç½®è§’色信息
        List<String> rs = new ArrayList<>();
        for (SystemRole role : roles) {
            rs.add(role.getCode());
        if(CollectionUtils.isNotEmpty(roles)){
            for (SystemRole role : roles) {
                rs.add(role.getCode());
            }
        }
        loginUserInfo.setSessionId(sessionId);
        loginUserInfo.setRoles(rs);
        // è®¾ç½®æƒé™ä¿¡æ¯
        List<String> pms = new ArrayList<>();
        for (SystemPermission permission : permissions) {
            pms.add(permission.getCode());
        if(CollectionUtils.isNotEmpty(permissions)){
            for (SystemPermission permission : permissions) {
                pms.add(permission.getCode());
            }
        }
        loginUserInfo.setPermissions(pms);
        return loginUserInfo;
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -1,14 +1,16 @@
package com.doumee.core.utils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.core.model.LoginUserInfo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import io.swagger.models.auth.In;
import org.apache.batik.util.Platform;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.math.BigDecimal;
@@ -152,6 +154,11 @@
    // è¶…时预警配置
    public static final String TIMEOUT_WARNING = "TIMEOUT_WARNING";
    // FTP文件服务器资源访问地址
    //月台预约指南
    public static final String PLATFORM_BOOKING_TIPS = "PLATFORM_BOOKING_TIPS";
    //月台导览图
    public static final String PLATFORM_GUIDEMAP = "PLATFORM_GUIDEMAP";
    public static String getRandom6Num( ) {
        Random random = new Random();
@@ -453,6 +460,7 @@
    int cityUseCar = 3;//市内用车
    int unCityUseCar = 4;//市外用车
    int logisticsCarUse = 5;//物流车预约
    int reason = 6;//入园原因
}
@@ -466,6 +474,10 @@
    }else if(Constants.equalsInteger(approveType,Constants.approveObjectType.cityUseCar)
            ||Constants.equalsInteger(approveType,Constants.approveObjectType.unCityUseCar)){
        return Constants.noticesObjectType.useCar;
    }else if(Constants.equalsInteger(approveType,Constants.approveObjectType.logisticsCarUse)){
        return Constants.noticesObjectType.logisticsCarUse;
    }else if(Constants.equalsInteger(approveType, approveObjectType.reason)){
        return noticesObjectType.reason;
    }else {
        return Constants.noticesObjectType.system;
    }
@@ -481,6 +493,7 @@
    int dangerDeal = 3;//隐患处理
    int logisticsCarUse = 4;//物流车审批
    int system = 5;//系统消息
    int reason = 6;//入园原因
}
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -1823,14 +1823,6 @@
    // StringUtil.getNotNullStr(request.getParameter(strParamName));
    // return getDateByString(strStr);
    // }
    /**
     * å¾—到当前日期,格式yyyy-MM-dd。
     *
     * @return String æ ¼å¼åŒ–的日期字符串
     */
    public static String getCurrDate() {
        return getFormattedDate(getDateByString(""));
    }
    /**
     * å¾—到当前日期,格式yyyy-MM-dd。
@@ -1897,6 +1889,17 @@
    }
    /**
     * å¾—到当前日期时间,格式为yyyy-MM-dd.
     *
     * @return String
     */
    public static String getCurrDate() {
        Timestamp date = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        return formatter.format(date);
    }
    /**
     * å¾—到指定的日期,如一年三个月零九天后(以yyyy/MM/dd格式显示)参数为("yyyy/MM/dd",1,3,9)
     *
     * @param strFormat
server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java
@@ -23,6 +23,7 @@
    LoginUserInfo loginByPasswordNew (LoginDTO dto, ServerHttpRequest request);
    LoginUserInfo driverLogin(LoginDTO dto, ServerHttpRequest request);
    /**
     * æ ¹æ® openId登录
     * @param userId
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -125,7 +125,7 @@
            loginLog.setOsInfo(Utils.User_Client.getOS(request));
        }
        loginLog.setServerIp(Utils.Server.getIP());
        if(isDebug == null  || !isDebug){
        if(isDebug == null  || !isDebug  && dto.getCheckCode()){
            // æ ¡éªŒéªŒè¯ç 
            try {
                captchaService.check(dto.getUuid(), dto.getCode());
@@ -171,6 +171,43 @@
    }
    @Override
    public LoginUserInfo driverLogin(LoginDTO dto, ServerHttpRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getUsername());
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
            loginLog.setIp(Utils.User_Client.getIP(request));
            loginLog.setPlatform(Utils.User_Client.getPlatform(request));
            loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
            loginLog.setOsInfo(Utils.User_Client.getOS(request));
        }
        loginLog.setServerIp(Utils.Server.getIP());
        // æ ¹æ®ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·å¯¹è±¡
        SystemUser queryDto = new SystemUser();
        queryDto.setUsername(dto.getUsername());
        queryDto.setDeleted(Boolean.FALSE);
        SystemUser user = systemUserService.findOne(queryDto);
        if (user == null) {
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        String pwd = Utils.Secure.encryptPassword(new String(dto.getPassword()), user.getSalt());
        // æ¯”较密码
        if( !StringUtils.equals(pwd, user.getPassword())){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        Company company = new Company();
        if(Objects.nonNull(user.getCompanyId())){
            company = companyMapper.selectById(user.getCompanyId());
        }
        LoginUserInfo userInfo = LoginUserInfo.from(user, null, null,company,null);
        return  userInfo;
    }
    /**
     * å†…部人员 ä¸Ž å¸æœº æ ¹æ®code查询openId后进行登录接口
     * @return
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformCloudController.java
@@ -9,6 +9,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Platform;
import com.doumee.service.business.PlatformJobService;
import com.doumee.service.business.PlatformService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -16,6 +17,7 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
@@ -28,6 +30,9 @@
    @Autowired
    private PlatformService platformService;
    @Autowired
    private PlatformJobService platformJobService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -77,6 +82,14 @@
        return ApiResponse.success(platformService.findPage(pageWrap));
    }
    @ApiOperation("根据月台组获取月台列表信息")
    @GetMapping("/listByGroupId")
    @CloudRequiredPermission("business:platform:query")
    public ApiResponse<List<Platform>> listByGroupId (@RequestParam Integer groupId, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        return ApiResponse.success(platformJobService.getPlatformList(groupId,this.getLoginUser(token)));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:platform:exportExcel")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/DriverPlatformController.java
@@ -1,17 +1,17 @@
package com.doumee.cloud.web;
import cn.hutool.http.useragent.Platform;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.PlatformBooks;
import com.doumee.dao.business.model.PlatformJob;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.reqeust.*;
import com.doumee.dao.web.response.DriverHomeVO;
import com.doumee.dao.web.response.LineUpVO;
@@ -27,6 +27,7 @@
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
@@ -52,13 +53,24 @@
    @Autowired
    private PlatformBooksService platformBooksService;
    @Autowired
    private PlatformReasonService platformReasonService;
    @ApiOperation("入园原因")
    @GetMapping("/platformReasonList")
    public ApiResponse<List<PlatformReason>> platformReasonList (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        List<PlatformReason> platformReasons = platformReasonService.findList(null);
        return ApiResponse.success(platformReasons);
    }
    @ApiOperation("司机首页信息")
    @GetMapping("/driverHome")
    public ApiResponse<DriverHomeVO> driverHome (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        DriverHomeVO driverHomeVO = platformJobService.getDriverHome(getLoginUser(token).getMemberId());
        DriverHomeVO driverHomeVO = platformJobService.getDriverHome(getLoginUser(token));
        return ApiResponse.success(driverHomeVO);
    }
    @ApiOperation("查询可预约量")
    @PostMapping("/checkSurplusNum")
@@ -69,14 +81,18 @@
    @ApiOperation("物流车预约")
    @PostMapping("/apply")
    public ApiResponse<Integer> apply (@RequestBody PlatformBooksApplyDTO platformBooksApplyDTO , @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        platformBooksApplyDTO.setUserId(getLoginUser(token).getMemberId());
        LoginUserInfo loginUserInfo = getLoginUser(token);
        platformBooksApplyDTO.setUserId(loginUserInfo.getMemberId());
        platformBooksApplyDTO.setDriverId(loginUserInfo.getMemberId());
        return ApiResponse.success(platformBooksService.apply(platformBooksApplyDTO));
    }
    @ApiOperation("物流车预约记录")
    @PostMapping("/page")
    public ApiResponse<PageData<PlatformBooks>> findPage (@RequestBody PageWrap<PlatformBooks> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        LoginUserInfo loginUserInfo = this.getLoginUser(token);
        pageWrap.getModel().setQueryDate(DateUtil.getBeforDay(new Date(),30));
        pageWrap.getModel().setDriverPhone(loginUserInfo.getMobile());
        return ApiResponse.success(platformBooksService.findPage(pageWrap));
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/PdaPlatformController.java
@@ -8,10 +8,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.PlatformBooks;
import com.doumee.dao.business.model.PlatformGroup;
import com.doumee.dao.business.model.PlatformJob;
import com.doumee.dao.business.model.PlatformShowParam;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.reqeust.*;
import com.doumee.dao.web.response.DriverHomeVO;
import com.doumee.dao.web.response.LineUpVO;
@@ -54,10 +51,8 @@
    @Autowired
    private PlatformShowParamService platformShowParamService;
    @Autowired
    private PlatformService platformService;
    @ApiOperation("获取月台组信息")
    @ApiImplicitParams({
@@ -69,9 +64,16 @@
    }
    @ApiOperation("更新月台配置信息")
    @GetMapping("/updUserPlatformConfig")
    @PostMapping("/updUserPlatformConfig")
    public ApiResponse  updUserPlatformConfig (@RequestBody List<Integer> ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        platformShowParamService.updUserConfig(ids,getLoginUser(token));
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("修改禁启用状态")
    @PostMapping("/updPlatformStatus")
    public ApiResponse  updPlatformStatus (@RequestBody Platform platform, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        platformService.updateStatusById(platform);
        return ApiResponse.success("操作成功");
    }
@@ -131,9 +133,6 @@
        platformJobService.platformInPark(jobOperateDTO);
        return ApiResponse.success("操作成功");
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/ApproveDTO.java
@@ -18,7 +18,7 @@
    @ApiModelProperty(value = "关联业务主键")
    private Integer objId;
    @ApiModelProperty(value = "关联业务类型:0非施工人员访客申请 1非施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约")
    @ApiModelProperty(value = "关联业务类型:0非施工人员访客申请 1非施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约 6入园预约")
    private Integer objType;
    @ApiModelProperty(value = "2审批通过 3审批未通过")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Approve.java
@@ -117,8 +117,8 @@
    @ExcelColumn(name="是否修改目的地 0否 1是")
    private Integer addrParam;
    @ApiModelProperty(value = "关联业务类型:0非施工人员访客申请 1非施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约", example = "1")
    @ExcelColumn(name="关联业务类型:0非施工人员访客申请 1非施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约")
    @ApiModelProperty(value = "关联业务类型:0非施工人员访客申请 1非施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约  6入园原因", example = "1")
    @ExcelColumn(name="关联业务类型:0非施工人员访客申请 1非施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约  6入园原因")
    private Integer objType;
    @ApiModelProperty(value = "类型 0审批 1抄送", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveTempl.java
@@ -52,8 +52,8 @@
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "名称 0非施工人员访客申请 1施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约", example = "1")
    @ExcelColumn(name="名称 0非施工人员访客申请 1施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约")
    @ApiModelProperty(value = "名称 0非施工人员访客申请 1施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约 6入园原因", example = "1")
    @ExcelColumn(name="名称 0非施工人员访客申请 1施工人员访客申请 2访客报备 3公车市内用车 4公车室外用车 5市公司物流车预约 6入园原因")
    private Integer type;
    @ApiModelProperty(value = "名称")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformBooks.java
@@ -136,6 +136,10 @@
    @TableField(exist = false)
    private String queryDate;
    @ApiModelProperty(value = "图片前缀")
    @TableField(exist = false)
    private String prefixUrl;
    @ApiModelProperty(value = "审批信息数据")
    @TableField(exist = false)
    private ApproveDataVO approveDateVO;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java
@@ -264,7 +264,15 @@
    @ApiModelProperty(value = "前方排队数量", example = "1")
    @TableField(exist = false)
    private Long lineUpNum;
    private Integer lineUpNum;
    @ApiModelProperty(value = "预计等待时间", example = "1")
    @TableField(exist = false)
    private String waitTime;
    @ApiModelProperty(value = "预计完成时间", example = "1")
    @TableField(exist = false)
    private String finishTimeStr;
    @ApiModelProperty(value = "关联月台组编码(关联platform_group表)", example = "1")
    @TableField(exist = false)
@@ -278,6 +286,9 @@
    @TableField(exist = false)
    private BigDecimal getDistance;
    @ApiModelProperty(value = "月台作业效率(万支/小时)", hidden = true)
    @TableField(exist = false)
    private BigDecimal workRate;
    @ApiModelProperty(value = "业务触发时间  æ—¶é—´")
    @TableField(exist = false)
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/PlatformBooksApplyDTO.java
@@ -19,6 +19,8 @@
@Api(tags = "入园预约申请信息" )
public class PlatformBooksApplyDTO {
    @ApiModelProperty(value = "主键 - ä¿®æ”¹ä½¿ç”¨")
    private Integer id;
    @ApiModelProperty(value = "合同号")
    private String contractNum;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DriverHomeVO.java
@@ -19,4 +19,11 @@
    @ApiModelProperty(value = "月台任务列表")
    private List<PlatformJob> platformJobList;
    @ApiModelProperty(value = "预约指南")
    private String bookingTips;
    @ApiModelProperty(value = "园区导览图")
    private String reservationMap;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java
@@ -112,6 +112,8 @@
    void createApproveFlow(Integer tempType,Integer businessId,Integer createMemberId);
    void createApproveForPlatfrom(Integer tempId,Integer businessId,Integer createMemberId);
    ApproveDataVO arrangeApprovedData(Integer businessId, Integer businessType, Integer memberId);
    void approved(ApproveDTO approveDTO);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java
@@ -1,7 +1,9 @@
package com.doumee.service.business;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Platform;
import com.doumee.dao.business.model.PlatformJob;
import com.doumee.dao.web.reqeust.JobDetailDTO;
import com.doumee.dao.web.reqeust.JobOperateDTO;
@@ -102,7 +104,7 @@
     */
    long count(PlatformJob platformJob);
    DriverHomeVO getDriverHome(Integer memberId);
    DriverHomeVO getDriverHome(LoginUserInfo loginUserInfo);
    /**
     * è·ç¦»ç­¾åˆ°
@@ -172,4 +174,12 @@
     */
    void finishWork(JobOperateDTO jobOperateDTO);
    /**
     * èŽ·å–æœˆå°ä¸‹çš„ä»»åŠ¡ä¿¡æ¯
     * @param groupId
     * @param loginUserInfo
     * @return
     */
    List<Platform> getPlatformList(Integer groupId, LoginUserInfo loginUserInfo);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -31,6 +31,7 @@
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import javafx.application.Platform;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.xpath.operations.Bool;
@@ -388,6 +389,52 @@
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void createApproveForPlatfrom(Integer tempId,Integer businessId,Integer createMemberId){
        //查询处理模板
        ApproveTempl approveTempl = approveTemplMapper.selectById(tempId);
        if(Objects.isNull(approveTempl)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到审批流配置模板");
        }
        //查询配置流程
        List<ApproveParam> approveParamAllList = approveParamMapper.selectList(new QueryWrapper<ApproveParam>()
                .lambda().eq(ApproveParam::getIsdeleted,Constants.ZERO)
                .eq(ApproveParam::getTemplId,approveTempl.getId())
                .orderByAsc(ApproveParam::getType)
                .orderByAsc(ApproveParam::getLevel)
        );
        if(Objects.isNull(approveParamAllList)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未配置审批流程");
        }
        //审批配置
        List<ApproveParam> approveParamList = approveParamAllList.stream().filter(i->i.getType().equals(Constants.ZERO)).collect(Collectors.toList());
        if(Objects.isNull(approveParamList)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未配置审批流程");
        }
        List<ApproveParam> approveCopyList = approveParamAllList.stream().filter(i->i.getType().equals(Constants.ONE)).collect(Collectors.toList());
        Member createMember = memberMapper.selectById(createMemberId);
        if(Objects.isNull(createMember)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"申请人组织信息异常");
        }
        List<Approve> approveList = new ArrayList<>();
        this.organizeApproveData(approveTempl,approveParamList,createMember,businessId,approveList);
        if(CollectionUtils.isEmpty(approveList)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"审批流配置错误");
        }
        //处理抄送数据
        if(CollectionUtils.isNotEmpty(approveCopyList)){
            this.organizeApproveCopyData(approveTempl,approveCopyList,businessId,approveList);
        }
        approveJoinMapper.insert(approveList);
    }
    /**
     * ç»„织审批流数据
     * @param approveTempl
@@ -555,8 +602,17 @@
            jsonMap.put("eTime", "结束时间:" + DateUtil.DateToStr(carUseBook.getEndTime() , "yyyy-MM-dd HH:mm"));
            jsonMap.put("usrNum", StringUtils.isBlank(carUseBook.getMemberIds())?"乘车人数: 0人": "乘车人数: " +carUseBook.getMemberIds().split(",").length +"人");
            jsonMap.put("mdd", StringUtils.isBlank(carUseBook.getAddr())?"目的地: - ": "目的地:" +carUseBook.getAddr());
        }else {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED);
        }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.reason)){
            //物流车预约
            PlatformBooks platformBooks = platformBooksMapper.selectById(businessId);
            if(Objects.isNull(platformBooks)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未查询到业务数据信息");
            }
            title = "【物流车入园预约】申请人 - " + platformBooks.getDriverName();
            jsonMap.put("inType", "入库类型:"+(Constants.equalsInteger(platformBooks.getInType(),Constants.ZERO)?"整托盘":"件烟"));
            jsonMap.put("totalNum", "总运输量:"+platformBooks.getTotalNum()+"万支");
            jsonMap.put("arriveDate", "到场时间:" + DateUtil.DateToStr(platformBooks.getArriveDate() , "yyyy-MM-dd HH:mm"));
            jsonMap.put("carNum", "车牌照:"+platformBooks.getCarCodeFront());
        }
        return title;
    }
@@ -1345,7 +1401,7 @@
        }else if(approveDTO.getObjType().equals(Constants.approveObjectType.cityUseCar)||approveDTO.getObjType().equals(
                Constants.approveObjectType.unCityUseCar)){
            this.updDriver(approveDTO,approve,true);
        }else if(approveDTO.getObjType().equals(Constants.approveObjectType.logisticsCarUse)){
        }else if(approveDTO.getObjType().equals(Constants.approveObjectType.reason)){
            //物流车预约
            PlatformBooks platformBooks = platformBooksMapper.selectById(approveDTO.getObjId());
            if(Objects.isNull(platformBooks)){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -2002,6 +2002,7 @@
        systemUser.setUsername(registerDriverDTO.getPhone());
        systemUser.setRealname(registerDriverDTO.getName());
        systemUser.setMemberId(member.getId());
        systemUser.setMobile(registerDriverDTO.getPhone());
        systemUser.setSalt(salt);
        systemUser.setPassword(member.getPassward());
        systemUser.setStatus(Constants.ZERO);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java
@@ -186,7 +186,7 @@
        }
        //查询每日配置的总预约量
        PlatformReason platformReason = platformReasonMapper.selectById(platformBooksCheckNumDTO.getReasonId());
        if(Objects.isNull(platformReason)|| Constants.equalsInteger(platformReason.getIsdeleted(),Constants.ZERO)){
        if(Objects.isNull(platformReason)|| !Constants.equalsInteger(platformReason.getIsdeleted(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"入园原因信息异常,请刷新重试");
        }
        List<PlatformBooks> platformBooksList = platformBooksMapper.selectList(new QueryWrapper<PlatformBooks>().lambda()
@@ -225,23 +225,15 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        PlatformReason platformReason = platformReasonMapper.selectById(platformBooksApplyDTO.getReasonId());
        if(Objects.isNull(platformReason)|| Constants.equalsInteger(platformReason.getIsdeleted(),Constants.ZERO)){
        if(Objects.isNull(platformReason)|| !Constants.equalsInteger(platformReason.getIsdeleted(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"入园原因信息异常,请刷新重试");
        }
        ApproveTempl approveTempl = approveTemplMapper.selectOne(new QueryWrapper<ApproveTempl>().lambda()
                .eq(ApproveTempl::getIsdeleted,Constants.ZERO)
                .eq(ApproveTempl::getObjId,platformReason.getId())
                .last(" limit 1")
        );
        ApproveTempl approveTempl = approveTemplMapper.selectById(platformReason.getId());
        if(Objects.isNull(approveTempl)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未配置审批流,请联系管理员");
        }
        if(Constants.equalsInteger(platformBooksApplyDTO.getUserId(),platformBooksApplyDTO.getDriverId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"人员信息匹配错误");
        }
        if(Objects.nonNull(platformReason.getLimitNum())&&platformReason.getLimitNum().compareTo(platformBooksApplyDTO.getTotalNum())>0){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"超出入园申请线质量");
        if(!Constants.equalsInteger(approveTempl.getIsdeleted(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"审批流已停用,请联系管理员");
        }
        PlatformBooks platformBooks = new PlatformBooks();
        BeanUtils.copyProperties(platformBooksApplyDTO,platformBooks);
@@ -252,9 +244,45 @@
        platformBooksMapper.insert(platformBooks);
        //创建审批流信息
        approveService.createApproveFlow(5,platformBooks.getId(),platformBooks.getDriverId());
        approveService.createApproveForPlatfrom(platformReason.getApproveTemplId(),platformBooks.getId(),platformBooks.getDriverId());
        return platformBooks.getId();
    }
//    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer edit(PlatformBooksApplyDTO platformBooksApplyDTO){
        if(Objects.isNull(platformBooksApplyDTO)
                || Objects.isNull(platformBooksApplyDTO.getId())
                || StringUtils.isBlank(platformBooksApplyDTO.getContractNum())
                || Objects.isNull(platformBooksApplyDTO.getArriveDate())
                || Objects.isNull(platformBooksApplyDTO.getInType())
                || Objects.isNull(platformBooksApplyDTO.getTotalNum())
                || StringUtils.isBlank(platformBooksApplyDTO.getCarCodeFront())
                || StringUtils.isBlank(platformBooksApplyDTO.getCarCodeBack())
                || Objects.isNull(platformBooksApplyDTO.getDriverId())
                || StringUtils.isBlank(platformBooksApplyDTO.getDriverPhone())
                || StringUtils.isBlank(platformBooksApplyDTO.getDriverName())
                || StringUtils.isBlank(platformBooksApplyDTO.getTransportImg())
                || Objects.isNull(platformBooksApplyDTO.getReasonId())
                || StringUtils.isBlank(platformBooksApplyDTO.getInReason())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        PlatformBooks platformBooks = platformBooksMapper.selectById(platformBooksApplyDTO.getId());
        if(Objects.isNull(platformBooks)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(platformBooks.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"业务状态已流转");
        }
        BeanUtils.copyProperties(platformBooksApplyDTO,platformBooks);
        platformBooks.setEditDate(new Date());
        platformBooksMapper.insert(platformBooks);
        return platformBooks.getId();
    }
    @Override
@@ -263,8 +291,12 @@
        if(Objects.isNull(model)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到预约记录");
        }
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                systemDictDataBiz.queryByCode(Constants.FTP,Constants.PLATFORM).getCode();
        model.setPrefixUrl(prefixUrl);
        ApproveDataVO approveDataVO = approveService.arrangeApprovedData(id,
               5,
               6,
                memberId);
        model.setApproveDateVO(approveDataVO);
        List<Approve> approveList = approveDataVO.getApproveList();
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformGroupServiceImpl.java
@@ -6,19 +6,24 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.PlatformGroupMapper;
import com.doumee.dao.business.PlatformShowParamMapper;
import com.doumee.dao.business.join.PlatformJobJoinMapper;
import com.doumee.dao.business.join.PlatformJoinMapper;
import com.doumee.dao.business.model.Platform;
import com.doumee.dao.business.model.PlatformGroup;
import com.doumee.dao.business.model.PlatformJob;
import com.doumee.dao.business.model.PlatformShowParam;
import com.doumee.service.business.PlatformGroupService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.service.business.PlatformJobService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -44,6 +49,9 @@
    @Autowired
    private PlatformShowParamMapper platformShowParamMapper;
    @Autowired
    private PlatformJobJoinMapper platformJobJoinMapper;
    @Override
    public Integer create(PlatformGroup platformGroup) {
@@ -206,7 +214,6 @@
                        .selectAll(Platform.class)
                        .select(" ( select count(1) from platform_job pj where t.id = pj.PLATFORM_ID and pj.STATUS = "+Constants.PlatformJobStatus.WORKING.getKey()+" ) as workStatus ")
                        .eq(Platform::getIsdeleted, Constants.ZERO)
                        .eq(Platform::getStatus, Constants.ZERO)
                        .eq(Objects.nonNull(queryType)&&!Constants.equalsInteger(queryType,Constants.ZERO),Platform::getStatus,Constants.ZERO)
        );
        //处理我的月台信息 æ˜¯å¦é…ç½®éšè—
@@ -240,4 +247,7 @@
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -4,6 +4,7 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
@@ -12,6 +13,7 @@
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.PlatformJobJoinMapper;
import com.doumee.dao.business.join.PlatformJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.reqeust.JobDetailDTO;
import com.doumee.dao.web.reqeust.JobOperateDTO;
@@ -33,6 +35,7 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -58,8 +61,9 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private PlatformMapper platformMapper;
    private PlatformJoinMapper platformJoinMapper;
    @Autowired
    private PlatformLogMapper platformLogMapper;
@@ -69,6 +73,12 @@
    @Autowired
    private PlatformWmsDetailMapper platformWmsDetailMapper;
    @Autowired
    private PlatformGroupMapper platformGroupMapper;
    @Autowired
    private PlatformShowParamMapper platformShowParamMapper;
    @Override
@@ -131,9 +141,13 @@
    @Override
    public PageData<PlatformJob> findPage(PageWrap<PlatformJob> pageWrap) {
        IPage<PlatformJob> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<PlatformJob> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<PlatformJob> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.lambda()
        queryWrapper
                .selectAll(PlatformJob.class)
                .selectAs(Platform::getName,PlatformJob::getPlatformName)
                .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                .eq(pageWrap.getModel().getId() != null, PlatformJob::getId, pageWrap.getModel().getId())
                .eq(pageWrap.getModel().getCreator() != null, PlatformJob::getCreator, pageWrap.getModel().getCreator())
                .ge(pageWrap.getModel().getCreateDate() != null, PlatformJob::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
@@ -216,13 +230,18 @@
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        PageData<PlatformJob> pageData = PageData.from(platformJobMapper.selectPage(page, queryWrapper));
        pageData.getRecords().forEach(i->{
       IPage<PlatformJob> platformJobIPage = platformJobJoinMapper.selectJoinPage(page,PlatformJob.class,queryWrapper);
        platformJobIPage.getRecords().forEach(i->{
            i.dealTime();
            this.getWmsJobData(i);
        });
        return pageData;
        return PageData.from(platformJobIPage);
//        PageData<PlatformJob> pageData = PageData.from(platformJobMapper.selectPage(page, queryWrapper));
//        pageData.getRecords().forEach(i->{
//            i.dealTime();
//            this.getWmsJobData(i);
//        });
//        return pageData;
    }
@@ -250,12 +269,60 @@
                platformWmsJob.setPlatformWmsDetailList(platformWmsDetailList);
                platformJob.setPlatformWmsJob(platformWmsJob);
            }
        }
        }
    }
    public void queryWaitNum(PlatformJob platformJob){
        if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WAIT_CALL.getKey())){
            //查询前方排队数量
            List<PlatformJob> lineUpNum =  platformJobMapper.selectList(new QueryWrapper<PlatformJob>().lambda()
                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                    .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()
                            ,Constants.PlatformJobStatus.IN_WAIT.getKey()
                            ,Constants.PlatformJobStatus.TRANSFERING.getKey())
                    .gt(PlatformJob::getSignDate,platformJob.getSignDate())
                    .eq(PlatformJob::getPlatformGroupId,platformJob.getPlatformGroupId())
                    .like(PlatformJob::getArriveDate,DateUtil.getDate(platformJob.getArriveDate(),"yyyy-MM-dd")));
            platformJob.setLineUpNum(lineUpNum.size());
            BigDecimal sumWorkRate = platformJob.getTotalNum();
            for (PlatformJob linePlatformJob:lineUpNum) {
                this.getWmsJobData(linePlatformJob);
                sumWorkRate = sumWorkRate.add(linePlatformJob.getTotalNum());
            }
            //计算预计等待时间
            List<Platform> platformList = platformJoinMapper.selectList(new QueryWrapper<Platform>().lambda().eq(Platform::getIsdeleted,Constants.ZERO).eq(Platform::getGroupId,platformJob.getPlatformGroupId()));
            BigDecimal workRate = platformList.stream().map(m->m.getWorkRate()).reduce(BigDecimal.ZERO,BigDecimal::add);
            if(sumWorkRate.compareTo(BigDecimal.ZERO) == Constants.ZERO|| workRate.compareTo(BigDecimal.ZERO)  == Constants.ZERO ){
                BigDecimal sumMinute = sumWorkRate.divide(workRate,1, RoundingMode.HALF_DOWN).multiply(BigDecimal.valueOf(60L));
                Integer sumMinuteInteger = sumMinute.intValue();
                Integer hours = sumMinuteInteger/60;
                Integer minus = sumMinuteInteger%60;
                String  waitTime = "预计等待:";
                if(!Constants.equalsInteger(hours,Constants.ZERO)){
                    waitTime = waitTime + hours + "小时";
                }
                if(!Constants.equalsInteger(hours,Constants.ZERO)){
                    waitTime = waitTime + minus + "分钟";
                }
                platformJob.setWaitTime(waitTime);
            }
        }else if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
            //查询最后开始任务的月台记录  æ—¥å¿—表  å› ä¸ºå­˜åœ¨å¼‚常挂起 è½¬ç§» ç­‰é—®é¢˜
            PlatformLog platformLog = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
                    .eq(PlatformLog::getJobId,platformJob.getId())
                    .eq(PlatformLog::getObjType,Constants.PlatformJobStatus.WORKING.getKey())
                    .orderByDesc(PlatformLog::getCreateDate)
                    .last(" limit 1")
            );
            if(Objects.nonNull(platformLog)){
                BigDecimal sumMinute = platformJob.getTotalNum().divide(platformJob.getWorkRate(),1, RoundingMode.HALF_DOWN).multiply(BigDecimal.valueOf(60L));
                platformJob.setFinishTimeStr(DateUtil.DateToStr(DateUtil.afterMinutesDate(platformLog.getCreateDate(),sumMinute.intValue()),"HH:mm"));
            }
        }
    }
    @Override
    public long count(PlatformJob platformJob) {
        QueryWrapper<PlatformJob> wrapper = new QueryWrapper<>(platformJob);
@@ -264,17 +331,34 @@
    //TODO
    @Override
    public DriverHomeVO getDriverHome(Integer memberId){
    public DriverHomeVO getDriverHome(LoginUserInfo loginUserInfo){
        DriverHomeVO driverHomeVO = new DriverHomeVO();
        //TODO è½®æ’­å›¾
        List<PlatformJob> platformJobList =  platformJobMapper.selectList(new QueryWrapper<PlatformJob>()
                .lambda()
                .eq(PlatformJob::getDriverId,memberId)
//                        .like(PlatformJob::get)
                .orderByDesc(PlatformJob::getId));
        List<PlatformJob> platformJobList =  platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
                .selectAll(PlatformJob.class)
                .selectAs(Platform::getName,PlatformJob::getPlatformName)
                .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                .eq(PlatformJob::getDrivierPhone,loginUserInfo.getMobile())
                .like(PlatformJob::getArriveDate,DateUtil.getCurrDate())
                .orderByDesc(PlatformJob::getId)
        );
        for (PlatformJob platformJob:platformJobList) {
            //处理WSM数量
            this.getWmsJobData(platformJob);
            //查询前方排队数量
            this.queryWaitNum(platformJob);
        }
        driverHomeVO.setPlatformJobList(platformJobList);
        // å›­åŒºå¯¼è§ˆå›¾  å›¾ç‰‡
        driverHomeVO.setReservationMap(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.PLATFORM_GUIDEMAP).getCode());
        // é¢„约指南 æ–‡æœ¬
        driverHomeVO.setBookingTips(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.PLATFORM_BOOKING_TIPS).getCode());
        return driverHomeVO;
    }
@@ -369,18 +453,12 @@
            }
        }else if( Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WAIT_CALL.getKey())
                || Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.IN_WAIT.getKey())
        ){//查询排队情况
            Long lineUpNum =  platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                    .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()
                            ,Constants.PlatformJobStatus.IN_WAIT.getKey()
                            ,Constants.PlatformJobStatus.TRANSFERING.getKey())
                    .gt(PlatformJob::getSignDate,platformJob.getSignDate())
                    .like(PlatformJob::getArriveDate,DateUtil.getDate(platformJob.getArriveDate(),"yyyy-MM-dd")));
            platformJob.setLineUpNum(lineUpNum);
        ){
            //查询前方排队数量
            this.queryWaitNum(platformJob);
        }else if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
            //作业月台信息
            Platform platform = platformMapper.selectById(platformJob.getPlatformId());
            Platform platform = platformJoinMapper.selectById(platformJob.getPlatformId());
            if(Objects.nonNull(platform)){
                platformJob.setPlatformName(platform.getName());
            }
@@ -417,7 +495,7 @@
        );
        //获取所有月台组
        List<Integer> platformIdList = platformJobList.stream().map(m->m.getPlatformGroupId()).collect(Collectors.toList());
        List<Platform> platformList = platformMapper.selectList(new QueryWrapper<Platform>().lambda()
        List<Platform> platformList = platformJoinMapper.selectList(new QueryWrapper<Platform>().lambda()
                .eq(Platform::getIsdeleted,Constants.ZERO)
                .in(Platform::getId,platformIdList));
@@ -841,8 +919,79 @@
    }
    @Override
    public  List<Platform> getPlatformList(Integer groupId, LoginUserInfo loginUserInfo){
        //查询月台组下所有月台
        List<Platform> allPlatformList = platformJoinMapper.selectJoinList(Platform.class,
                new MPJLambdaWrapper<Platform>()
                        .selectAll(Platform.class)
                        .select(" ( select count(1) from platform_job pj where t.id = pj.PLATFORM_ID and pj.STATUS = "+Constants.PlatformJobStatus.WORKING.getKey()+" ) as workStatus ")
                        .eq(Platform::getIsdeleted, Constants.ZERO)
                        .eq(Platform::getStatus,Constants.ZERO)
                        .eq(Platform::getGroupId,groupId)
        );
        this.getPlatformShow(allPlatformList,loginUserInfo);
        for (Platform platform:allPlatformList) {
            this.getJobByPlatform(platform,loginUserInfo);
        }
        return allPlatformList;
    }
    /**
     * æŸ¥è¯¢æœˆå°çš„开启情况
     * @param allPlatformList
     * @param loginUserInfo
     */
    public void getPlatformShow(List<Platform> allPlatformList , LoginUserInfo loginUserInfo){
        //处理我的月台信息 æ˜¯å¦é…ç½®éšè—
        List<PlatformShowParam> platformShowParamList = platformShowParamMapper.selectList(new QueryWrapper<PlatformShowParam>()
                .lambda()
                .eq(PlatformShowParam::getIsdeleted, Constants.ZERO)
                .eq(PlatformShowParam::getMemberId,loginUserInfo.getMemberId())
        );
        //如果未配置该数据 åˆ™å…¨éƒ¨æ˜¾ç¤º
        if(CollectionUtils.isEmpty(platformShowParamList)){
            for (Platform platform:allPlatformList) {
                platform.setShowConfig(true);
            }
        }else{
            //根据配置显示数据
            for (PlatformShowParam platformShowParam:platformShowParamList) {
                for (Platform platform:allPlatformList) {
                    if(Constants.equalsInteger(platform.getId(),platformShowParam.getPlatformId())){
                        platform.setShowConfig(true);
                        break;
                    }
                }
            }
        }
    }
    /**
     * èŽ·å–æœˆå°ä¸‹çš„ä»»åŠ¡åˆ—è¡¨
     * @param platform
     * @param loginUserInfo
     */
    public void getJobByPlatform(Platform platform,LoginUserInfo loginUserInfo){
        List<PlatformJob> platformJobList =  platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
                .selectAll(PlatformJob.class)
                .selectAs(Platform::getName,PlatformJob::getPlatformName)
                .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                .eq(PlatformJob::getPlatformId,platform.getId())
                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                .eq(PlatformJob::getDrivierPhone,loginUserInfo.getMobile())
                .like(PlatformJob::getArriveDate, DateUtil.getCurrDate())
                .orderByDesc(PlatformJob::getId)
        );
        for (PlatformJob platformJob:platformJobList) {
            //处理WSM数量
            this.getWmsJobData(platformJob);
            //查询前方排队数量
            this.queryWaitNum(platformJob);
        }
        platform.setWorkJobList(platformJobList);
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformReasonServiceImpl.java
@@ -106,6 +106,7 @@
    @Override
    public List<PlatformReason> findList(PlatformReason platformReason) {
        QueryWrapper<PlatformReason> wrapper = new QueryWrapper<>(platformReason);
        wrapper.eq("isdeleted",Constants.ZERO);
        return platformReasonMapper.selectList(wrapper);
    }
  
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitReasonServiceImpl.java
@@ -139,4 +139,8 @@
        QueryWrapper<VisitReason> wrapper = new QueryWrapper<>(visitReason);
        return visitReasonMapper.selectCount(wrapper);
    }
}