ll
liukangdong
2025-02-13 5d8d536b79f7cc2e0719dd93c0069b80639e3bf1
h5/pages/driver/taskDetail.vue
@@ -1,380 +1,609 @@
<template>
   <view class="main_app">
      <view class="status_wrap">
         <image class="bg" src="../../static/driver/bg_renwu@2x.png" mode=""></image>
         <view class="name">作业已完成</view>
         <view class="id_card">皖AD1212</view>
         <view class="status">作业完成</view>
      </view>
      <!--  -->
      <view class="main_content">
         <view class="line">
            <view class="label">司机姓名</view>
            <view class="value">刘某</view>
         </view>
         <view class="line">
            <view class="label">手机号</view>
            <view class="value">188</view>
         </view>
         <view class="line">
            <view class="label">运输单号</view>
            <view class="value" @click="showDetail = true">
               <text class="waybill_num">Y111</text>
               <text class="btn">运单详情</text>
            </view>
         </view>
         <view class="line">
            <view class="label">作业类型</view>
            <view class="value">入园装货</view>
         </view>
         <view class="line">
            <view class="label">车牌照</view>
            <view class="value">前:皖A21</view>
         </view>
         <!--  -->
         <view class="line">
            <view class="label">距离园区</view>
            <view class="value">
               <view class="">0 公里</view>
               <view class="btn" @click="getLocation">
                  <u-icon name="map" color="#279baa" class="mr6"></u-icon>
                  重新定位
               </view>
            </view>
         </view>
         <view class="warnning">
            <u-icon name="info-circle" color="#ED4545" class="mr12"></u-icon>
            如无法获取定位,请用微信扫描园区大屏二维
         </view>
<!--          <view class="line">
            <view class="label">签到时间</view>
            <view class="value">2022</view>
         </view>
         <view class="line">
            <view class="label">入园时间</view>
            <view class="value">2022</view>
         </view>
         <view class="line">
            <view class="label">作业完成</view>
            <view class="value">2022</view>
         </view> -->
         <view class="signIn_wrap" @click="handleSignIn">
            <image :src="param.status == '0' ? require('@/static/driver/btn_qiandao@2x.png') : require('@/static/driver/btn_qiandao_fail@2x.png')" class="img" mode="widthFix"></image>
            <view class="handle">签到</view>
            <view class="time">09:10</view>
         </view>
      </view>
      <view class="space"></view>
      <!-- 等待叫号 -->
      <view class="padding_wrap">
         <view class="btn cancel">取消签到</view>
         <view class="btn check">查看排队情况</view>
      </view>
      <!-- modal -->
      <u-popup :show="showDetail" :round="10" :safeAreaInsetBottom="true" closeOnClickOverlay :closeable="true" mode="bottom" @close="showDetail = false">
               <view class="detail_modal">
                  <view class="modal_title">运单详情</view>
                  <view class="id_card">
                     <view class="last">皖</view>
                     <view class="name">AD1111</view>
                  </view>
                  <!--  -->
                  <view class="info">
                     <view class="line">
                        <view class="label">运输单号</view>
                        <view class="value">2222</view>
                     </view>
                     <view class="line">
                        <view class="label">驾驶员</view>
                        <view class="value">2222</view>
                     </view>
                     <view class="line">
                        <view class="label">总运输量</view>
                        <view class="value">2222</view>
                     </view>
                     <view class="line">
                        <view class="label">运输公司</view>
                        <view class="value">2222</view>
                     </view>
                  </view>
                  <view class="separate"></view>
                  <view class="contract_list">
                     <view class="title">合同号:111</view>
                     <view class="address">aadd</view>
                     <view class="list">
                        <view class="line">
                           <view class="label">物料:</view>
                           <view class="value">黄山黑马</view>
                        </view>
                        <view class="line">
                           <view class="label">数量:</view>
                           <view class="value">黄山黑马</view>
                        </view>
                        <view class="line">
                           <view class="label">物料:</view>
                           <view class="value">黄山黑马</view>
                        </view>
                        <view class="line">
                           <view class="label">数量:</view>
                           <view class="value">黄山黑马</view>
                        </view>
                     </view>
                  </view>
               </view>
            </u-popup>
   </view>
</template>
<script>
   export default {
      data() {
         return {
            param: {
               status: '0'
            },
            showDetail: false,
         };
      },
      methods: {
         handleSignIn() {
            const { param } = this
            this.param.status = param.status == '0' ? '1' : '0'
         },
         getLocation() {
            uni.getLocation({
               type: 'wgs84',
               success: function (res) {
                  console.log('当前位置的经度:' + res.longitude);
                  console.log('当前位置的纬度:' + res.latitude);
               }
            });
         }
      }
   }
</script>
<style lang="scss">
.main_app{
   padding: 0;
   .main_content{
      background: #FFFFFF;
      border-radius: 20rpx 20rpx 0rpx 0rpx;
      padding: 16rpx 30rpx;
      position: relative;
      bottom: 32rpx;
      .line{
         padding: 24rpx 0 28rpx;
         border-bottom: 1rpx solid #E5E5E5;
         display: flex;
         .label{
            width: 150rpx;
            font-size: 30rpx;
            color: #666666;
         }
         .value{
            flex: 1;
            display: flex;
            justify-content: space-between;
            align-items: center;
            font-size: 30rpx;
            .waybill_num{
               flex: 1;
            }
            .btn{
               font-size: 28rpx;
               color: $uni-color-primary;
               display: flex;
            }
         }
      }
      .warnning{
         display: flex;
         color: #ED4545;
         align-items: center;
         margin: 40rpx 0;
      }
      .signIn_wrap{
         margin: 80rpx auto;
         width: 260rpx;
         height: 260rpx;
         position: relative;
         color: #fff;
         z-index: 1;
         display: flex;
         flex-direction: column;
         justify-content: center;
         align-items: center;
         .handle{
            font-weight: 500;
            font-size: 40rpx;
            line-height: 56rpx;
         }
         .time{
            color: rgba(255,255,255,0.7);
         }
         .img{
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            z-index: -1;
         }
      }
   }
   .status_wrap{
      height: 200rpx;
      width: 100%;
      padding: 30rpx;
      position: relative;
      color: #fff;
      .bg{
         width: 100%;
         height: 100%;
         position: absolute;
         top: 0;
         left: 0;
         z-index: -1;
      }
      .name{
         font-weight: 500;
         font-size: 40rpx;
         line-height: 56rpx;
         margin-bottom: 12rpx;
      }
      .id_card{
         color: rgba(255,255,255,0.8);
      }
      .status{
         position: absolute;
         right: 0;
         top: 30rpx;
         height: 68rpx;
         line-height: 68rpx;
         background: #FFFFFF;
         padding: 0 24rpx;
         border-radius: 34rpx 0rpx 0rpx 34rpx;
         font-size: 26rpx;
         color: $uni-color-primary;
      }
   }
   .space{
      width: 750rpx;
      height: 200rpx;
   }
   .padding_wrap{
      position: fixed;
      padding: 0 30rpx 64rpx;
      bottom: 0;
      left: 0;
      width: 100%;
      display: flex;
      justify-content: space-between;
      .btn{
         height: 96rpx;
         line-height: 96rpx;
         text-align: center;
         width: 336rpx;
         font-size: 36rpx;
         color: #333333;
         background: #FFFFFF;
         border-radius: 48rpx;
         border: 1rpx solid #999999;
      }
      .check{
         background: $uni-color-primary;
         border: 1rpx solid $uni-color-primary;
         color: #fff;
      }
   }
}
.detail_modal{
   padding: 36rpx 30rpx;
   .modal_title{
      font-weight: 500;
      font-size: 32rpx;
      color: #222222;
      line-height: 44rpx;
      text-align: center;
      margin-bottom: 36rpx;
   }
   .contract_list{
      .list{
         background: #F7F7F7;
         border-radius: 8rpx;
         padding: 20rpx;
         .line{
            display: flex;
            margin-bottom: 20rpx;
            &:nth-of-type(3n){
               border-top: 1rpx solid #E5E5E5;
               padding-top: 20rpx;
            }
            .label{
               color: #666666;
               width: 86rpx;
            }
            .value{
               flex: 1;
               color: #222222;
            }
         }
      }
      .title{
         font-weight: 500;
         font-size: 30rpx;
         color: $uni-color-primary;
         margin-bottom: 12rpx;
      }
      .address{
         font-size: 26rpx;
         color: #666666;
         margin-bottom: 20rpx;
      }
   }
   .info{
      .line{
         display: flex;
         margin-bottom: 20rpx;
         .label{
            font-size: 30rpx;
            color: #666666;
            width: 150rpx;
         }
         .value{
            flex: 1;
            font-size: 30rpx;
            color: #222222;
         }
      }
   }
   .separate{
      width: 750rpx;
      height: 2rpx;
      margin: 30rpx -30rpx;
      border: 1rpx solid #E5E5E5;
   }
   .id_card{
      border-radius: 8rpx;
      display: flex;
      height: 60rpx;
      line-height: 60rpx;
      font-weight: 600;
      font-size: 36rpx;
      color: #111111;
      text-align: center;
      margin-bottom: 30rpx;
      .last{
         background: #E9F5F6;
         width: 60rpx;
         border-radius: 8rpx 0rpx 0rpx 8rpx;
         border: 1rpx solid #DFDEDE;
      }
      .name{
         width: 186rpx;
         border: 1rpx solid #DFDEDE;
      }
   }
}
</style>
<template>
   <view class="main_app">
      <view class="status_wrap">
         <image class="bg" src="../../static/driver/bg_renwu@2x.png" mode=""></image>
         <view class="name" v-if="param.status == 1">请与{{ param.arriveDate.slice(0,11) }}现场签到</view>
         <view class="name" v-if="param.status == 2">前方排队:{{param.lineUpNum}}辆</view>
         <view class="name" v-if="param.status == 3">入园等待</view>
         <view class="name" v-if="param.status == 4">请入园停靠{{param.platformName}}作业</view>
         <view class="name" v-if="param.status == 5">月台作业中</view>
         <view class="name" v-if="param.status == 6">作业已完成</view>
         <view class="name" v-if="param.status == 7">转移中</view>
         <view class="name red" v-if="param.status == 8">异常挂起</view>
         <view class="id_card">{{ param.carCodeFront }}</view>
         <view class="status">{{statusMap[param.status]}}</view>
      </view>
      <!--  -->
      <view class="main_content">
         <view class="line">
            <view class="label">司机姓名</view>
            <view class="value">{{param.driverName}}</view>
         </view>
         <view class="line">
            <view class="label">手机号</view>
            <view class="value">{{param.drivierPhone}}</view>
         </view>
         <template v-if="param.billCode">
            <view class="line">
               <view class="label">运输单号</view>
               <view class="value" @click="wmsDetail">
                  <text class="waybill_num">{{param.billCode}}</text>
                  <text class="btn">运单详情</text>
               </view>
            </view>
            <view class="line">
               <view class="label">作业类型</view>
               <view class="value" v-if="param.type == 0">自有车卸货</view>
               <view class="value" v-if="param.type == 1">自有车装货</view>
               <view class="value" v-if="param.type == 2">外协车卸货</view>
               <view class="value" v-if="param.type == 3">外协车装货</view>
            </view>
         </template>
         <template v-else>
            <view class="line">
               <view class="label">合同编号</view>
               <view class="value">{{param.contractNum}}</view>
            </view>
            <view class="line">
               <view class="label">入库类型</view>
               <view class="value">{{param.inType == 0 ? '整托盘' : '件烟'}}</view>
            </view>
            <view class="line">
               <view class="label">作业量</view>
               <view class="value">{{param.totalNum}}万支</view>
            </view>
         </template>
         <view class="line">
            <view class="label">车牌照</view>
            <view class="value">前:{{param.carCodeFront}} | 后:{{param.carCodeBack}}</view>
         </view>
         <!--  -->
         <view class="line" v-if="param.status == 1">
            <view class="label">距离园区</view>
            <view class="value">
               <view class="">{{param.getDistance}}公里</view>
               <view class="btn" @click="getLocation">
                  <image class="icon mr6" src="../../static/driver/position.png"></image>
                  重新定位
               </view>
            </view>
         </view>
         <view class="line" v-if="param.signDate">
            <view class="label">签到时间</view>
            <view class="value">{{param.signDate}}</view>
         </view>
         <view class="line" v-if="param.startDate">
            <view class="label">开始作业</view>
            <view class="value">{{param.startDate}}</view>
         </view>
         <view class="line" v-if="param.doneDate">
            <view class="label">作业完成</view>
            <view class="value">{{param.doneDate}}</view>
         </view>
         <view v-if="param.status == 1" class="warnning">
            <u-icon name="info-circle" color="#ED4545" class="mr12"></u-icon>
            如无法获取定位,请用微信扫描园区大屏二维
         </view>
         <!--          <view class="line">
            <view class="label">签到时间</view>
            <view class="value">2022</view>
         </view>
         <view class="line">
            <view class="label">入园时间</view>
            <view class="value">2022</view>
         </view>
         <view class="line">
            <view class="label">作业完成</view>
            <view class="value">2022</view>
         </view> -->
         <view v-if="param.status == 1" class="signIn_wrap" @click="handleSignIn">
            <image :src="
            (param.getDistance || param.getDistance == 0) && param.getDistance < signDistance
              ? require('@/static/driver/btn_qiandao@2x.png')
              : require('@/static/driver/btn_qiandao_fail@2x.png')
          " class="img" mode="widthFix"></image>
            <view class="handle">{{ !param.getDistance || param.getDistance > signDistance ? '无法签到' : '签到' }}</view>
            <view class="time">{{nowTime}}</view>
         </view>
      </view>
      <!-- 等待叫号 -->
      <view v-if="param.status == 2" class="padding_wrap">
         <view class="btn check" @click="handleQueue">查看排队情况</view>
      </view>
      <!-- modal -->
      <u-popup :show="showDetail" :round="10" :safeAreaInsetBottom="true" closeOnClickOverlay :closeable="true"
         mode="bottom" @close="showDetail = false">
         <view class="detail_modal">
            <view class="modal_title">运单详情</view>
            <view v-if="wmsInfo.plateNumber" class="id_card">
               <text>{{ wmsInfo.plateNumber.slice(0, 1) }}</text>
               <text>{{ wmsInfo.plateNumber.slice(1, 2) }}</text>
               <text>·</text>
               <text>{{ wmsInfo.plateNumber.slice(2) }}</text>
            </view>
            <!--  -->
            <view class="info">
               <view class="line">
                  <view class="label">运输单号</view>
                  <view class="value">{{ wmsInfo.carryBillCode }}</view>
               </view>
               <view class="line">
                  <view class="label">驾驶员</view>
                  <view class="value">{{ wmsInfo.driverName }} {{ wmsInfo.driverPhone }}</view>
               </view>
               <view class="line">
                  <view class="label">总运输量</view>
                  <view class="value">{{ wmsInfo.ioQty }}万支</view>
               </view>
               <view class="line">
                  <view class="label">运输公司</view>
                  <view class="value">{{ wmsInfo.carrierName }}</view>
               </view>
            </view>
            <view class="contract_wrap">
               <view class="contract_list" v-for="item in wmsInfo.wmsJobContractVOList">
                  <view class="title">合同号:{{ item.contractCode }}</view>
                  <view class="address">收货地:{{ item.address }}</view>
                  <view class="list">
                     <view class="item" v-for="line in item.platformWmsDetailList">
                        <view class="line">
                           <view class="label">物料:</view>
                           <view class="value">{{ line.materialName }}</view>
                        </view>
                        <view class="line">
                           <view class="label">数量:</view>
                           <view class="value">{{ line.ioQty }}万支</view>
                        </view>
                     </view>
                  </view>
               </view>
            </view>
         </view>
      </u-popup>
   </view>
</template>
<script>
   import {
      driverTaskJobDetail,
      driverSignInTask,
      wmsJobDetail
   } from '@/api';
   import {
      statusMap
   } from '@/utils/config.js';
   import dayjs from 'dayjs';
   export default {
      data() {
         return {
            statusMap,
            param: {
               status: '0'
            },
            jobId: '',
            lat: '',
            lnt: '',
            // lat: '31.783205',
            // lnt: '117.262635',
            nowTime: '',
            wmsInfo: {},
            signDistance: uni.getStorageSync('driverGuide').signDistance,
            showDetail: false,
         }
      },
      onLoad(option) {
         uni.setStorageSync('ywinfo',{})
         this.jobId = option.id
         if (option.status && option.status == '1') {
            // wx.config({
            //    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            //    appId: 'wx173e6caf5abc718a', // 必填,公众号的唯一标识
            //    timestamp: timeStamp, // 必填,生成签名的时间戳
            //    nonceStr: nonceStr, // 必填,生成签名的随机串
            //    signature: Sign, // 必填,签名
            //    jsApiList: [
            //       'getLocation',
            //       'openLocation'
            //    ] // 必填,需要使用的JS接口列表
            // })
            this.getLocation()
            // this.getDetail()
         } else {
            this.getDetail()
         }
         // this.getDetail()
         setInterval(() => {
            this.nowTime = dayjs().format('HH:mm:ss')
         })
      },
      methods: {
         handleSignIn() {
            const {
               param,
               signDistance,
               lat,
               lnt,
               jobId
            } = this
            if (!param.getDistance || param.getDistance > signDistance) return
            driverSignInTask({
               jobId,
               lat,
               lnt,
               signType: 0
            }).then(res => {
               if (res && res.code == 200) {
                  this.showToast('签到成功')
                  this.getDetail()
               }
            })
         },
         getDetail() {
            const {
               jobId,
               lat,
               lnt
            } = this
            driverTaskJobDetail({
               jobId: this.jobId,
               lat,
               lnt
            }).then(ress => {
               this.param = {
                  ...ress.data
               }
            })
         },
         wmsDetail() {
            const {
               param
            } = this
            wmsJobDetail({
               id: param.id
            }).then(res => {
               this.wmsInfo = res.data
               this.showDetail = true
            })
         },
         getLocation() {
            const {
               jobId
            } = this
            // wx.ready(() => {
            //    wx.getLocation({
            //       type: "gcj02", // gcj02(火星坐标),wgs84(GPS坐标)
            //       success: (res) => {
            //          this.lat = res.latitude
            //          this.lnt = res.longitude
            //          this.getDetail()
            //       },
            //       fail: (err) => {
            //          console.error("获取定位失败:", err);
            //       },
            //       cancel: () => {
            //          console.warn("用户拒绝授权获取地理位置");
            //       },
            //    });
            // });
            uni.getLocation({
               type: 'wgs84',
               success: (res) => {
                  this.lat = res.latitude
                  this.lnt = res.longitude
                  console.log('---', res);
                  this.getDetail()
               },
               fail: (err) => {
                  this.getDetail()
                  this.showToast('获取定位失败', err)
               }
            })
         },
         handleQueue() {
            uni.navigateTo({
               url: '/pages/driver/queueUp?jobId=' + this.jobId
            })
         },
      }
   }
</script>
<style lang="scss">
   .main_app {
      padding: 0;
      .main_content {
         background: #ffffff;
         border-radius: 20rpx 20rpx 0rpx 0rpx;
         padding: 16rpx 30rpx;
         position: relative;
         bottom: 32rpx;
         z-index: 999;
         .line {
            padding: 24rpx 0 28rpx;
            border-bottom: 1rpx solid #e5e5e5;
            display: flex;
            .label {
               width: 154rpx;
               font-size: 30rpx;
               color: #666666;
            }
            .value {
               flex: 1;
               display: flex;
               justify-content: space-between;
               align-items: center;
               font-size: 30rpx;
               .waybill_num {
                  flex: 1;
               }
               .btn {
                  font-size: 28rpx;
                  color: $uni-color-primary;
                  display: flex;
                  align-items: center;
                  .icon {
                     width: 30rpx;
                     height: 30rpx;
                  }
               }
            }
         }
         .warnning {
            display: flex;
            color: #ed4545;
            align-items: center;
            margin: 40rpx 0;
         }
         .signIn_wrap {
            margin: 80rpx auto;
            width: 260rpx;
            height: 260rpx;
            position: relative;
            color: #fff;
            z-index: 1;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            .handle {
               font-weight: 600;
               font-size: 40rpx;
               line-height: 56rpx;
            }
            .time {
               color: rgba(255, 255, 255, 0.7);
            }
            .img {
               position: absolute;
               top: 0;
               left: 0;
               width: 100%;
               z-index: -1;
            }
         }
      }
      .status_wrap {
         height: 200rpx;
         width: 100%;
         padding: 30rpx;
         position: relative;
         color: #fff;
         .bg {
            width: 100%;
            height: 100%;
            position: absolute;
            top: 0;
            left: 0;
            z-index: -1;
         }
         .name {
            font-weight: 600;
            font-size: 40rpx;
            line-height: 56rpx;
            margin-bottom: 12rpx;
         }
         .id_card {
            color: rgba(255, 255, 255, 0.8);
         }
         .status {
            position: absolute;
            right: 0;
            top: 30rpx;
            height: 68rpx;
            line-height: 68rpx;
            background: #ffffff;
            padding: 0 24rpx;
            border-radius: 34rpx 0rpx 0rpx 34rpx;
            font-size: 26rpx;
            color: $uni-color-primary;
         }
      }
      .space {
         width: 750rpx;
         height: 200rpx;
      }
      .padding_wrap {
         position: fixed;
         z-index: 999;
         padding: 0 30rpx 64rpx;
         bottom: 0;
         left: 0;
         width: 100%;
         display: flex;
         justify-content: space-between;
         .btn {
            height: 96rpx;
            line-height: 96rpx;
            text-align: center;
            width: 100%;
            font-size: 36rpx;
            color: #333333;
            background: #ffffff;
            border-radius: 48rpx;
            border: 1rpx solid #999999;
         }
         .check {
            background: $uni-color-primary;
            border: 1rpx solid $uni-color-primary;
            color: #fff;
         }
      }
   }
   .detail_modal {
      height: calc(100vh - 88rpx);
      padding: 36rpx 30rpx;
      border-radius: 12rpx;
      box-shadow: 0 0 6rpx rgba(0, 0, 0, 0.5);
      .modal_title {
         font-weight: 600;
         font-size: 32rpx;
         color: #222222;
         line-height: 44rpx;
         text-align: center;
         margin-bottom: 36rpx;
      }
      .contract_wrap {
         height: calc(100% - 400rpx);
         overflow-y: auto;
      }
      .contract_list {
         border-top: 1rpx solid #E5E5E5;
         margin-bottom: 30rpx;
         padding-top: 30rpx;
         &:nth-last-child(1) {
            margin-bottom: 0;
         }
         .list {
            background: #f7f7f7;
            border-radius: 8rpx;
            padding: 20rpx;
            .item {
               border-bottom: 1rpx solid #e5e5e5;
               padding-bottom: 20rpx;
               margin-bottom: 20rpx;
               &:nth-last-child(1) {
                  border: none;
                  padding-bottom: 0;
                  margin-bottom: 0;
               }
            }
            .line {
               display: flex;
               margin-bottom: 20rpx;
               &:nth-last-child(1) {
                  margin-bottom: 0rpx;
               }
               .label {
                  color: #666666;
                  width: 92rpx;
               }
               .value {
                  flex: 1;
                  color: #222222;
               }
            }
         }
         .title {
            font-weight: 600;
            font-size: 30rpx;
            color: $uni-color-primary;
            margin-bottom: 12rpx;
         }
         .address {
            font-size: 26rpx;
            color: #666666;
            margin-bottom: 20rpx;
         }
      }
      .info {
         .line {
            display: flex;
            margin-bottom: 20rpx;
            .label {
               font-size: 30rpx;
               color: #666666;
               width: 150rpx;
            }
            .value {
               flex: 1;
               font-size: 30rpx;
               color: #222222;
            }
         }
      }
      .separate {
         width: 750rpx;
         height: 2rpx;
         margin: 30rpx -30rpx;
         border: 1rpx solid #e5e5e5;
      }
      .id_card {
         display: flex;
         font-weight: 600;
         height: 60rpx;
         line-height: 60rpx;
         font-size: 32rpx;
         color: #111111;
         border-radius: 8rpx;
         border: 1rpx solid #dfdede;
         width: 220rpx;
         margin-bottom: 15rpx;
         text {
            &:nth-of-type(1) {
               background: #e9f5f6;
               padding: 0 12rpx;
            }
            &:nth-of-type(2) {
               padding-left: 10rpx;
            }
            &:nth-of-type(4) {
               padding-right: 6rpx;
            }
         }
      }
   }
</style>