ll
liukangdong
2024-08-27 f3bd5baa8eb4eb7a896f7312a2e9a7c89a46cef5
ll
已添加3个文件
已修改16个文件
2019 ■■■■ 文件已修改
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 | 历史
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