From d39cce94b1e2ac194fbf8c76b4925c7dcb41160e Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期五, 06 九月 2024 18:20:45 +0800
Subject: [PATCH] ll

---
 admin/src/api/index.js                                 |    1 
 admin/src/assets/task/bg_shenhe@2x.png                 |    0 
 admin/src/views/platform/LogisticsRecord/waybill.vue   |   51 +
 admin/src/views/task/driverDetail.vue                  |  500 ++++++++++++++++++++
 admin/src/views/platform/config.js                     |   11 
 admin/src/views/platform/queueUp.vue                   |  206 +++++++
 admin/src/api/platform/index.js                        |   27 +
 admin/src/views/platform/platform.vue                  |    2 
 admin/src/views/index.vue                              |   21 
 admin/src/assets/task/bg_shenhe_fail@2x.png            |    0 
 admin/src/components/common/Header.vue                 |    2 
 admin/src/views/task/visReportDetail.vue               |  248 +++------
 admin/src/api/workbench/index.js                       |   22 
 admin/src/views/task/index.vue                         |   30 
 h5/pages/staff/task/driver.vue                         |    3 
 admin/src/views/platform/LogisticsRecord/subscribe.vue |  298 ++++++++----
 admin/src/api/business/approve.js                      |    4 
 admin/src/components/common/CommonHeader.vue           |   10 
 admin/src/assets/task/bg_shenhe_chexiao@2x.png         |    0 
 admin/src/assets/task/bg_shenhe_pass@2x.png            |    0 
 20 files changed, 1,114 insertions(+), 322 deletions(-)

diff --git a/admin/src/api/business/approve.js b/admin/src/api/business/approve.js
index 5baffdf..a45e4a1 100644
--- a/admin/src/api/business/approve.js
+++ b/admin/src/api/business/approve.js
@@ -47,3 +47,7 @@
     params
   })
 }
+// 鐗╂祦杞﹂绾﹁鎯�
+export function getDriverJobDetail (id) {
+  return request.get('visitsAdmin/cloudService/business/platformBooks/getDetail?id=' + id)
+}
diff --git a/admin/src/api/index.js b/admin/src/api/index.js
index bfb4e76..af847c6 100644
--- a/admin/src/api/index.js
+++ b/admin/src/api/index.js
@@ -3,3 +3,4 @@
 export * from './business/index'
 export * from './platform'
 export * from './other/other'
+export * from './workbench/index'
diff --git a/admin/src/api/platform/index.js b/admin/src/api/platform/index.js
index c0f68ec..dfcaa52 100644
--- a/admin/src/api/platform/index.js
+++ b/admin/src/api/platform/index.js
@@ -59,3 +59,30 @@
     trim: true
   })
 }
+// 杞﹁締鎺掗槦鎯呭喌
+export function platformLineUpPage (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/platformLineUpPage', data, {
+    trim: true
+  })
+}
+
+// 鍏ュ洯鍘熷洜
+export function platformReasonList () {
+  return request.get('/visitsAdmin/cloudService/business/platformBooks/platformReasonList')
+}
+// 鐗╂祦杞﹂绾�
+export function platformBooksApply (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformBooks/apply', data)
+}
+// 鑾峰彇鏈堝彴缁� 绛夊緟涓庡紓甯告寕璧锋暟鎹�
+export function getPlatformGroupWork (id) {
+  return request.get('/visitsAdmin/cloudService/business/platform/getPlatformGroupWork?platformGroupId=' + id)
+}
+// 鏈堝彴鍏ュ洯棰勭害 鍒嗛〉鍒楄〃
+export function platformBooksPage (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformBooks/page', data)
+}
+// 鏈堝彴璋冨害浣滀笟浠诲姟 鍒嗛〉鍒楄〃
+export function platformJobPage (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformJob/page', data)
+}
diff --git a/admin/src/api/workbench/index.js b/admin/src/api/workbench/index.js
new file mode 100644
index 0000000..98bb243
--- /dev/null
+++ b/admin/src/api/workbench/index.js
@@ -0,0 +1,22 @@
+import request from '@/utils/request'
+
+// 涓讳綋鏁版嵁
+export function getWorkbenchBody (data) {
+  return request.get('/visitsAdmin/cloudService/business/staging/body', data)
+}
+// 澶撮儴鏁版嵁
+export function getWorkbenchHead (data) {
+  return request.get('/visitsAdmin/cloudService/business/staging/head', data)
+}
+// 瓒呮椂棰勮浜哄憳
+export function getWorkbenchLevel(data) {
+  return request.get('/visitsAdmin/cloudService/business/staging/level', data)
+}
+// 鏍囪宸茶
+export function getWorkbenchSignRead (data) {
+  return request.get('/visitsAdmin/cloudService/business/staging/signRead', data)
+}
+// 浠诲姟涓績澶撮儴
+export function getWorkbenchTaskHead (data) {
+  return request.post('/visitsAdmin/cloudService/business/staging/taskCenterHeadPC', data)
+}
\ No newline at end of file
diff --git a/admin/src/assets/task/bg_shenhe@2x.png b/admin/src/assets/task/bg_shenhe@2x.png
new file mode 100644
index 0000000..904c7cc
--- /dev/null
+++ b/admin/src/assets/task/bg_shenhe@2x.png
Binary files differ
diff --git a/admin/src/assets/task/bg_shenhe_chexiao@2x.png b/admin/src/assets/task/bg_shenhe_chexiao@2x.png
new file mode 100644
index 0000000..474cc2f
--- /dev/null
+++ b/admin/src/assets/task/bg_shenhe_chexiao@2x.png
Binary files differ
diff --git a/admin/src/assets/task/bg_shenhe_fail@2x.png b/admin/src/assets/task/bg_shenhe_fail@2x.png
new file mode 100644
index 0000000..4ac63a2
--- /dev/null
+++ b/admin/src/assets/task/bg_shenhe_fail@2x.png
Binary files differ
diff --git a/admin/src/assets/task/bg_shenhe_pass@2x.png b/admin/src/assets/task/bg_shenhe_pass@2x.png
new file mode 100644
index 0000000..55b4d70
--- /dev/null
+++ b/admin/src/assets/task/bg_shenhe_pass@2x.png
Binary files differ
diff --git a/admin/src/components/common/CommonHeader.vue b/admin/src/components/common/CommonHeader.vue
index aa3672e..4174818 100644
--- a/admin/src/components/common/CommonHeader.vue
+++ b/admin/src/components/common/CommonHeader.vue
@@ -2,7 +2,7 @@
   <div class="common-header">
     <div class="header">
       <div class="logo">
-        <div>{{ title }}</div>
+        <div class="title">{{ title }}</div>
         <div class="list">
           <div class="item active">
             <div>鏈嶅姟涓績</div>
@@ -208,6 +208,7 @@
   background-color: #2080f7;
 }
 .list{
+  flex: 1;
   display: flex;
   align-items: center;
   margin-left: 60px;
@@ -241,7 +242,7 @@
   .logo {
     /* background: url("../../assets/images/top_ic_chilun@2x.png") no-repeat; */
     box-sizing: border-box;
-    min-width: 280px;
+    min-width: 360px;
     height: 56px;
     padding: 10px 30px;
     // flex-shrink: 0;
@@ -251,6 +252,9 @@
     color: #fff;
     display: flex;
     align-items: center;
+    .title{
+      width: 200px;
+    }
     // display: inline;
     .title-en {
       font-size: 11px;
@@ -259,7 +263,7 @@
     }
   }
   .user {
-    width: 712px;
+    width: 212px;
     box-sizing: border-box;
     height: 56px;
     padding-right: 25px;
diff --git a/admin/src/components/common/Header.vue b/admin/src/components/common/Header.vue
index 1800c40..a286282 100644
--- a/admin/src/components/common/Header.vue
+++ b/admin/src/components/common/Header.vue
@@ -41,7 +41,7 @@
   h2 {
     flex-shrink: 0;
     line-height: 48px;
-    width: 200px;
+    width: 240px;
     font-size: 19px;
     color: #606263;
     font-weight: normal;
diff --git a/admin/src/views/index.vue b/admin/src/views/index.vue
index 38b95a9..a391765 100644
--- a/admin/src/views/index.vue
+++ b/admin/src/views/index.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="main_home">
     <div class="home_header">
-      <div class="mb10 fs17">涓嬪崍濂斤紝绯荤粺绠$悊鍛�</div>
+      <div class="mb10 fs17">涓嬪崍濂斤紝{{ userInfo.realname }}</div>
       <div class="fs13">
         浠婂ぉ鏄� {{ nowDate }} {{ nowWeek }}锛屾杩庡洖鍒版櫤鎱х墿娴佸洯鍖哄畨娑堜竴浣撳寲绯荤粺
       </div>
@@ -225,6 +225,10 @@
 import dayjs from 'dayjs'
 import * as echarts from 'echarts'
 import { weeks } from '@/utils/config'
+import {
+  getWorkbenchBody,
+  getWorkbenchHead
+} from '@/api'
 const colors = ['#52a4f7', '#7678f7', '#5fc6d5']
 export default {
   data () {
@@ -240,7 +244,13 @@
       ]
     }
   },
+  computed: {
+    userInfo(){
+      return this.$store.state.userInfo
+    }
+  },
   created () {
+
     this.updateDate()
     setInterval(() => {
       this.updateDate()
@@ -255,11 +265,20 @@
       this.nowWeek = weeks[new Date().getDay()]
     },
     initData () {
+      this.getWorkBody() //涓讳綋鏁版嵁
+      this.getWorkHead() //涓讳綋鏁版嵁
+      
       this.initEchart1()
       this.initEchart2()
       this.initEchart3()
       this.initEchart4()
     },
+    getWorkBody() {
+      getWorkbenchBody()
+    },
+    getWorkHead() {
+      getWorkbenchHead()
+    },
     initEchart1 () {
       const myChart = echarts.init(document.getElementById('echart1'))
       const option = {
diff --git a/admin/src/views/platform/LogisticsRecord/subscribe.vue b/admin/src/views/platform/LogisticsRecord/subscribe.vue
index 92cba1b..3aa5208 100644
--- a/admin/src/views/platform/LogisticsRecord/subscribe.vue
+++ b/admin/src/views/platform/LogisticsRecord/subscribe.vue
@@ -1,133 +1,160 @@
 <template>
   <div class="main_app">
-    <QueryForm
-      v-model="filters"
-      :query-form-config="queryFormConfig"
-      @handleQuery="getList(1)"
-      @clear="clear"
-    />
-    <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column
-        prop="name"
-        label="杞︾墝鍓嶇収鍙�"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="杞︾墝鍚庣収鍙�"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="椹鹃┒鍛�"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="鑱旂郴鏂瑰紡"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="鍚堝悓鍗曞彿"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="鍏ュ簱绫诲瀷"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="棰勭害鍒板満鏃堕棿"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="瀹℃壒缁撴灉"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="瀹℃壒浜�"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="鎿嶄綔鏃堕棿"
-        min-width="100"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="name"
-        label="鎿嶄綔"
-        min-width="80"
-        align="center"
-        show-overflow-tooltip
-      >
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
+    <div>
+      <el-button type="primary" @click="handleEdit" icon="el-icon-plus"
+        v-permissions="['business:platformbooks:create']">鏂板缓</el-button>
+      <el-button type="primary" @click="handleEx" v-permissions="['business:platformbooks:exportExcel']">瀵煎嚭</el-button>
+    </div>
+    <el-table class="mb20" v-loading="loading" :data="list" stripe>
+      <el-table-column prop="contractNum" label="鍚堝悓鍗曞彿" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="inReason" label="鍏ュ洯鍘熷洜" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="totalNum" label="鎬讳綔涓氶噺(涓囨敮)" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="carCodeFront" label="杞︾墝鍓嶇収鍙�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="carCodeBack" label="杞︾墝鍚庣収鍙�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="driverName" label="椹鹃┒鍛�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="driverPhone" label="鑱旂郴鏂瑰紡" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="inTypeTemp" label="鍏ュ簱绫诲瀷" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="arriveDate" label="棰勭害鍒板満鏃堕棿" min-width="150" show-overflow-tooltip />
+      <el-table-column prop="name" label="瀹℃壒缁撴灉" min-width="100" show-overflow-tooltip>
         <template v-slot="scope">
-          <el-button type="text" @click="handleEdit(scope.row)">棰勭害璇︽儏</el-button>
+          <span v-if="scope.row.status == '0'">寰呭鎵�</span>
+          <span v-if="scope.row.status == '1'">瀹℃壒涓�</span>
+          <span v-if="scope.row.status == '2'">瀹℃壒閫氳繃</span>
+          <span v-if="scope.row.status == '3'">瀹℃壒椹冲洖</span>
+          <span v-if="scope.row.status == '4'">宸插彇娑�</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="name" label="褰撳墠瀹℃壒浜�" min-width="100" show-overflow-tooltip />
+      <el-table-column prop="editDate" label="鎿嶄綔鏃堕棿" min-width="150" show-overflow-tooltip />
+      <el-table-column prop="name" label="鎿嶄綔" min-width="120" align="center" fixed="right" show-overflow-tooltip>
+        <template v-slot="scope">
+          <el-button type="text" v-permissions="['business:platformbooks:detail']"
+            @click="handleDetail(scope.row)">棰勭害璇︽儏</el-button>
         </template>
       </el-table-column>
     </el-table>
-    <pagination
-      @size-change="handleSizeChange"
-      @current-change="getList"
-      :pagination="pagination"
-    />
+    <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+    <!--  -->
+    <GlobalWindow :title="param.id ? '缂栬緫鐗╂祦杞﹂绾�' : '鏂板鐗╂祦杞﹂绾�'" center :visible.sync="isShowEdit" width="600px"
+      :confirm-working="subLoading" @confirm="onSubmit">
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
+        <div class="param_title">杩愯緭淇℃伅</div>
+        <el-form-item label="鍏ュ洯鍘熷洜" prop="inReason">
+          <el-select v-model="param.inReason" class="w300" placeholder="璇烽�夋嫨">
+            <el-option v-for="item in reasonList" :key="item.id" :label="item.reason" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍚堝悓鍙�" prop="contractNum">
+          <el-input v-model="param.contractNum" class="w300" placeholder="璇疯緭鍏ュ悎鍚屽彿"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒板満鏃堕棿" prop="arriveDate">
+          <el-date-picker v-model="param.arriveDate" value-format="yyyy-MM-dd HH:mm:ss" type="datetime" class="w300"
+            placeholder="璇烽�夋嫨">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鍏ュ簱绫诲瀷" prop="inType">
+          <div>
+            <el-radio v-model="param.inType" :label="0">鏁翠欢鐩�</el-radio>
+            <el-radio v-model="param.inType" :label="1">浠剁儫</el-radio>
+          </div>
+        </el-form-item>
+        <el-form-item label="鎬昏繍杈撻噺" prop="totalNum">
+          <el-input v-model="param.totalNum" placeholder="璇疯緭鍏�" class="w300"></el-input>
+          <span class="ml10">涓囨敮</span>
+        </el-form-item>
+        <el-form-item label="鍑嗚繍璇佺収鐗�" prop="transportImgFull">
+          <UploadFaceImg :file="{ 'imgurlfull': param.transportImgFull, 'imgurl': param.transportImg }"
+            :uploadData="{ folder: 'PLATFORM' }" @uploadSuccess="uploadSuccess" @uploadEnd="isUploading = false"
+            @uploadBegin="isUploading = true" />
+        </el-form-item>
+        <div class="param_title">鍙告満/杞﹁締淇℃伅</div>
+        <el-form-item label="鍙告満濮撳悕" prop="driverName">
+          <el-input v-model="param.driverName" placeholder="璇疯緭鍏�" class="w300"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙告満鎵嬫満鍙�" prop="driverPhone">
+          <el-input v-model="param.driverPhone" placeholder="璇疯緭鍏�" class="w300"></el-input>
+        </el-form-item>
+        <el-form-item label="杞﹀墠鐗岀収鍙�" prop="carCodeFront">
+          <el-input v-model="param.carCodeFront" placeholder="璇疯緭鍏�" class="w300"></el-input>
+        </el-form-item>
+        <el-form-item label="杞﹀悗鐗岀収鍙�" prop="carCodeBack">
+          <el-input v-model="param.carCodeBack" placeholder="璇疯緭鍏�" class="w300"></el-input>
+        </el-form-item>
+      </el-form>
+    </GlobalWindow>
+    <!--  -->
+    <DriverDetail v-if="isShowDriver" ref="DriverDetailRef" />
   </div>
 </template>
 
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
+import { platformBooksPage, platformReasonList, platformBooksApply } from '@/api'
+import DriverDetail from "@/views/task/driverDetail"
+import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadFaceImg from '@/components/common/UploadFaceImg'
 export default {
   components: {
     Pagination,
-    QueryForm
+    QueryForm,
+    DriverDetail,
+    GlobalWindow,
+    UploadFaceImg
   },
-  data () {
+  data() {
     return {
+      isShowDriver: false,
       loading: false,
       pagination: {
-        capacity: 10,
-        page: 1
+        pageSize: 10,
+        page: 1,
+        total: 0
       },
-      filters: {},
+      filters: {
+        selDate: []
+      },
       list: [],
-      total: 0,
+
       isShowEdit: false,
+      subLoading: false,
       param: {},
-      rules: {},
+      reasonList: [],
+      rules: {
+        contractNum: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+        totalNum: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+        driverName: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+        driverPhone: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+        carCodeFront: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+        carCodeBack: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }],
+
+        inReason: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+        arriveDate: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+        inType: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+        driverName: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+      },
       queryFormConfig: {
         formItems: [
           {
-            filed: 'aaaa',
+            filed: 'carCodeFront',
             type: 'input',
             label: '杞︾墝鍙�'
           },
           {
-            filed: 'bbb',
+            filed: 'driverName',
             type: 'input',
             label: '椹鹃┒鍛�'
           },
           {
-            filed: 'cc',
+            filed: 'contractNum',
             type: 'input',
             label: '鍚堝悓鍗曞彿'
           },
           {
             filed: 'selDate',
-            type: 'daterange',
+            type: 'datetimerange',
             label: '鎿嶄綔鏃堕棿'
           }
         ],
@@ -135,26 +162,93 @@
       },
     }
   },
+  created() {
+    this.getList()
+  },
   methods: {
-    handleSub () {
+    getList(page) {
+      const { pagination, filters } = this
+      this.loading = true
+      platformBooksPage({
+        model: {
+          ...filters,
+          arriveDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
+          arriveDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
+        },
+        capacity: pagination.pageSize,
+        page: page || pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.list.forEach(item => {
+          item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫'
+        })
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    handleEx() {
+
+    },
+    onSubmit() {
+      this.$refs['ruleForm'].validate((valid) => {
+        const param = this.param
+        if (valid) {
+          platformBooksApply({...param}).then(res => {
+            
+          })
+        }
+      })
+    },
+    uploadSuccess(file) {
+      this.$set(this.param, 'transportImg', file.imgurl)
+      this.$set(this.param, 'transportImgFull', file.imgurlfull)
+    },
+    handleEdit(row) {
+      this.isShowEdit = true
+      this.getplatformReason()
+    },
+    getplatformReason() {
+      platformReasonList().then(res => {
+        this.reasonList = res || []
+      })
+    },
+    handleSub() {
       this.$refs.ruleForm.validate((valid) => {
         if (valid) {
           alert('submit!')
         }
       })
     },
-    getList (page) { },
-    clear () { },
-    handleEdit (row) {
-      this.isShowEdit = true
+    clear() {
+      this.pagination.page = 1
+      this.filters = {
+        selDate: []
+      }
+      this.getList()
     },
-    handleDel () { },
-    handleSizeChange (capacity) {
-      this.pagination.capacity = capacity
+    handleDetail(row) {
+      this.isShowDriver = true
+      this.$nextTick(() => {
+        this.$refs.DriverDetailRef.id = row.id
+        this.$refs.DriverDetailRef.type = 6
+        this.$refs.DriverDetailRef.getDetail()
+        this.$refs.DriverDetailRef.isShowModal = true
+      })
+    },
+    handleDel() { },
+    handleSizeChange(capacity) {
+      this.pagination.pageSize = capacity
     }
   }
 }
 </script>
-
-<style>
-</style>
+<style lang="scss" scoped>
+.param_title {
+  font-size: 18px;
+  font-weight: 600;
+  color: #000000;
+  margin-bottom: 15px;
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/platform/LogisticsRecord/waybill.vue b/admin/src/views/platform/LogisticsRecord/waybill.vue
index 887f2ab..2f39dd4 100644
--- a/admin/src/views/platform/LogisticsRecord/waybill.vue
+++ b/admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -84,7 +84,13 @@
       width="480px"
     >
       <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
-        <el-form-item label="杩愯緭鍗曞彿" prop="name">
+        <el-form-item label="鍏ュ洯鍘熷洜" prop="name">
+          <el-input v-model="param.aaa" placeholder="璇疯緭鍏�"></el-input>
+        </el-form-item>
+        <el-form-item label="鍚堝悓鍙�" prop="name">
+          <el-input v-model="param.aaa" placeholder="璇疯緭鍏�"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒板満鏃堕棿" prop="name">
           <el-input v-model="param.aaa" placeholder="璇疯緭鍏�"></el-input>
         </el-form-item>
         <el-form-item label="杞﹀墠鐗岀収鍙�" prop="name">
@@ -115,6 +121,7 @@
 <script>
 import Pagination from '@/components/common/Pagination'
 import QueryForm from '@/components/common/QueryForm'
+import { platformJobPage } from '@/api'
 export default {
   components: {
     Pagination,
@@ -124,29 +131,29 @@
     return {
       loading: false,
       pagination: {
-        capacity: 10,
-        page: 1
+        pageSize: 10,
+        page: 1,
+        total: 0
       },
       filters: {},
       list: [],
-      total: 0,
       isShowEdit: false,
       param: {},
       rules: {},
       queryFormConfig: {
         formItems: [
           {
-            filed: 'aaaa',
+            filed: 'carCodeFront',
             type: 'input',
             label: '杞︾墝鍙�'
           },
           {
-            filed: 'bbb',
+            filed: 'driverName',
             type: 'input',
             label: '椹鹃┒鍛�'
           },
           {
-            filed: 'cc',
+            filed: 'code',
             type: 'input',
             label: '杩愯緭鍗曞彿'
           },
@@ -160,6 +167,9 @@
       },
     }
   },
+  created() {
+    this.getList()
+  },
   methods: {
     handleSub () {
       this.$refs.ruleForm.validate((valid) => {
@@ -168,18 +178,33 @@
         }
       })
     },
-    getList (page) { },
-    clear () { },
+    getList (page) {
+      const { pagination, filters } = this
+      this.loading = true
+      platformJobPage({
+        model: { ...filters, jobType: 0 },
+        capacity: pagination.pageSize,
+        page: pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    clear () {
+      this.pagination.page = 1
+      this.filters = {}
+      this.getList()
+    },
     handleEdit (row) {
       this.isShowEdit = true
     },
     handleDel () { },
     handleSizeChange (capacity) {
-      this.pagination.capacity = capacity
+      this.pagination.pageSize = capacity
     }
   }
 }
 </script>
-
-<style>
-</style>
diff --git a/admin/src/views/platform/config.js b/admin/src/views/platform/config.js
index e4a6ab5..61b54a7 100644
--- a/admin/src/views/platform/config.js
+++ b/admin/src/views/platform/config.js
@@ -12,3 +12,14 @@
   10: '宸茬鍥�',
   11: '宸茶繃鍙�'
 }
+export const queryQueueUpConfig = {
+  formItems: [
+    {
+      filed: 'carCodeFront',
+      type: 'input',
+      label: '鎼滅储杞﹁締',
+      placeholder: '璇疯緭鍏ヨ溅鐗屽彿'
+    },
+  ],
+  online: true
+}
\ No newline at end of file
diff --git a/admin/src/views/platform/platform.vue b/admin/src/views/platform/platform.vue
index a21ad90..8ae1b2c 100644
--- a/admin/src/views/platform/platform.vue
+++ b/admin/src/views/platform/platform.vue
@@ -68,7 +68,7 @@
         </el-table-column>
         <el-table-column prop="broadcastNames" label="鍏宠仈骞挎挱" min-width="100px"></el-table-column>
         <el-table-column prop="ledNames" label="鍏宠仈LED" min-width="100px"></el-table-column>
-        <el-table-column prop="hkDate" label="鍚屾鏃堕棿" min-width="140px"></el-table-column>
+        <el-table-column prop="hkDate" label="鍚屾鏃堕棿" min-width="150px"></el-table-column>
         <el-table-column
           v-if="containPermissions(['business:platform:update', 'business:platform:delete'])"
           label="鎿嶄綔"
diff --git a/admin/src/views/platform/queueUp.vue b/admin/src/views/platform/queueUp.vue
index 785983c..9b7f0b2 100644
--- a/admin/src/views/platform/queueUp.vue
+++ b/admin/src/views/platform/queueUp.vue
@@ -2,77 +2,237 @@
   <div class="main_app">
     <div class="mb20 main_header">
       <div class="platgroup_tabs">
-        <div
-          class="tab"
-          :class="{ active: activeGroup.id === item.id }"
-          @click="platgroupClick(item)"
-          v-for="(item, i) in PlatGroupList"
-          :key="i"
-        >
+        <div class="tab" :class="{ active: activeGroup.id === item.id }" @click="platgroupClick(item)"
+          v-for="(item, i) in PlatGroupList" :key="i">
           {{ item.name }}
         </div>
+      </div>
     </div>
+    <QueryForm v-model="filters" :query-form-config="queryQueueUpConfig" @handleQuery="getList(1)" @clear="clear">
+    </QueryForm>
+    <div class="main_content">
+      <div class="static_wrap">
+        <span>绛夊緟锛�<span class="num">{{ staticParam.waitNum }}</span></span>
+        <span class="mr30">{{ }}</span>
+        <span>鎸傝捣锛�<span class="red">{{ staticParam.exceptionNum }}</span></span>
+        <span></span>
+      </div>
     </div>
+    <el-table class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all>
+      <el-table-column type="index" label="搴忓彿" width="80" />
+      <el-table-column label="杞︾墝鍙�" width="160">
+        <template slot-scope="{ row }">
+          <div class="plate_id">
+            <span>{{ row.carCodeFront.slice(0, 1) }}</span>
+            <span>{{ row.carCodeFront.slice(1, 2) }}</span>
+            <span>路</span>
+            <span>{{ row.carCodeFront.slice(2) }}</span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="carrierName" label="杩愯緭鍏徃" min-width="200" />
+      <el-table-column prop="code" label="杩愬崟鍙�" min-width="200" />
+      <el-table-column prop="totalNum" label="鎬昏繍杈撻噺(涓囨敮)" min-width="130" />
+      <el-table-column prop="driverName" label="椹鹃┒鍛�" min-width="140">
+        <template slot-scope="{ row }">
+          <span class="mr10">{{ row.driverName }}</span>
+          <span>{{ row.drivierPhone }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="signDate" label="绛惧埌鏃堕棿" min-width="150" />
+      <el-table-column label="鎿嶄綔" width="100" fixed="right">
+        <template slot-scope="{ row }">
+          <el-button type="text" @click="handleDetail(row)" v-permissions="['business:company:update']">杩愬崟璇︽儏</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination" />
+
+    <!--  -->
+    <WaybillDetail
+      ref="WaybillDetailRef"
+      v-if="isShowDetail"
+      @success="getList"
+      @close="isShowDetail = false"
+    />
   </div>
 </template>
 
 <script>
+import Pagination from '@/components/common/Pagination'
+import QueryForm from '@/components/common/QueryForm'
 import {
-  getPlatformGroupList
+  getPlatformGroupList,
+  platformLineUpPage,
+  getPlatformGroupWork
 } from '@/api'
+import { queryQueueUpConfig } from './config'
+import WaybillDetail from './components/WaybillDetail.vue'
 export default {
-  data () {
+  components: {
+    Pagination,
+    QueryForm,
+    WaybillDetail
+  },
+  data() {
     return {
       filters: {},
       activeGroup: {},
       PlatGroupList: [],
-
-      isShowSet: false, // 鏈堝彴閰嶇疆
-      setParam: {},
+      staticParam: {},
+      dataList: [],
+      loading: false,
+      pagination: {
+        pageSize: 10,
+        page: 1,
+        total: 0,
+      },
+      queryQueueUpConfig,
       isShowDetail: false, // 杩愬崟璇︽儏
       detail: {}
     }
   },
-  created () {
+  created() {
     this.getPlatGroupList()
   },
   methods: {
-    getPlatGroupList () {
+    getPlatGroupList() {
       getPlatformGroupList({
         queryData: 1,
         queryType: 1
       }).then(res => {
         this.PlatGroupList = res || []
-        if (this.activeGroup && this.activeGroup.id) {
-          this.activeGroup = res.find(item => item.id === this.activeGroup.id)
-        } else {
-          this.activeGroup = res[0]
+        if (res && res.length > 0) {
+          if (this.activeGroup && this.activeGroup.id) {
+            this.activeGroup = res.find(item => item.id === this.activeGroup.id)
+          } else {
+            this.activeGroup = res[0]
+          }
+          this.getPlatformGroupWork()
+          this.getList()
         }
       })
     },
-    platgroupClick (item) {
-      this.activeGroup = { ...item }
+    getList() {
+      const { activeGroup, pagination, filters } = this
+      this.loading = true
+      platformLineUpPage({
+        model: { platformGroupId: activeGroup.id, ...filters, callType: 3 },
+        capacity: pagination.pageSize,
+        page: pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.dataList = res.records || []
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
     },
-    getList () { },
-    clear () { }
+    getPlatformGroupWork() {
+      const { activeGroup } = this
+      getPlatformGroupWork(activeGroup.id).then(res => {
+        this.staticParam = res || {}
+      })
+    },
+    handleSizeChange(e) {
+      this.pagination.pageSize = e
+      this.getList()
+    },
+    handlePageChange(e) {
+      this.pagination.page = e
+      this.getList()
+    },
+    platgroupClick(item) {
+      this.activeGroup = { ...item }
+      this.pagination.page = 1
+      this.filters = {}
+      this.getPlatformGroupWork()
+      this.getList()
+    },
+    clear() {
+      this.pagination.page = 1
+      this.filters = {}
+      this.getList()
+    },
+    handleDetail(row) {
+      this.isShowDetail = true
+      this.$nextTick(() => {
+        this.$refs.WaybillDetailRef.isShowModal = true
+      })
+    },
   }
 }
 </script>
 
 <style lang="scss" scoped>
 @import "@/assets/style/variables.scss";
+
+.main_content {
+  background-color: #fff;
+  position: relative;
+  z-index: 999;
+  top: -10;
+  margin: -20px;
+  padding: 0 20px;
+
+  .static_wrap {
+    height: 50px;
+    line-height: 50px;
+    color: #666666;
+    font-size: 15px;
+    padding: 0 20px;
+    background: #F4FAFB;
+    border-radius: 2px 2px 0px 0px;
+    margin-bottom: 36px;
+
+    .num {
+      color: #111111;
+    }
+  }
+}
+
+.plate_id {
+  display: flex;
+  width: 111px;
+  font-weight: 600;
+  height: 30px;
+  line-height: 30px;
+  font-size: 16px;
+  color: #111111;
+  border-radius: 4px;
+  border: 1px solid #dfdede;
+  span {
+    &:nth-of-type(1) {
+      background: $primary-color;
+      padding: 0 6px;
+      color: #fff
+    }
+
+    &:nth-of-type(2) {
+      padding-left: 2px;
+    }
+
+    &:nth-of-type(4) {
+      padding-right: 3px;
+    }
+  }
+}
+
+
 .main_header {
   .platgroup_tabs {
     flex: 1;
     display: flex;
     border-bottom: 1px solid #dfe2e8;
+
     .tab {
       color: #666666;
       margin-right: 40px;
       cursor: pointer;
-      padding-bottom: 18px;
+      padding-bottom: 14px;
       border-bottom: 2px solid #fff;
     }
+
     .active {
       font-weight: 500;
       font-size: 15px;
diff --git a/admin/src/views/task/driverDetail.vue b/admin/src/views/task/driverDetail.vue
new file mode 100644
index 0000000..1af3fe4
--- /dev/null
+++ b/admin/src/views/task/driverDetail.vue
@@ -0,0 +1,500 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="isShowModal" @confirm="confirm">
+    <div class="modal_wrap">
+      <div class="modal_content">
+        <div class="header">
+          <img v-if="info.status == '3' || info.status == '6'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
+          <img v-else-if="info.status == '2' || info.status == '5'" class="head_bg" src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
+          <img v-else-if="info.status == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png" alt="">
+          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
+          <div class="left">
+            <div class="h1">鐗╂祦杞﹂绾�</div>
+            <div class="time">鎻愪氦鏃堕棿锛歿{ info.createDate }}</div>
+          </div>
+          <div class="right" :class="{ scs: info.status == '2' || info.status == '5', msg: info.status == '3' || info.status == '6' }">{{ statusMap[info.status] }}</div>
+        </div>
+        <div class="info">
+          <div class="title">鍏姟杞︾敵璇蜂俊鎭�</div>
+          <div class="list">
+            <div class="item">
+              <div class="label">鐢宠浜�</div>
+              <div class="value">{{ info.driverName }} {{ info.driverPhone }}</div>
+            </div>
+            <div class="item">
+              <div class="label">杞︾墝鐓�</div>
+              <div class="value">鍓� {{ info.carCodeFront }}锛屽悗 {{ info.carCodeBack }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍚堝悓缂栧彿</div>
+              <div class="value">{{ info.contractNum }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍒板巶鏃堕棿</div>
+              <div class="value">{{ info.arriveDate }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍏ュ簱绫诲瀷</div>
+              <div class="value">{{ info.inType == 0 ? '鏁存墭鐩�' : '浠剁儫' }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鎬昏繍杈撻噺</div>
+              <div class="value">{{ info.totalNum }}涓囨敮</div>
+            </div>
+            <div class="item">
+              <div class="label">鍑嗚繍璇佺収鐗�</div>
+              <div v-if="info.transportImg" class="value">
+                <el-image  style="width: 100px" :preview-src-list="[info.prefixUrl + info.transportImg]" :src="info.prefixUrl + info.transportImg" alt="" />
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="side">
+        <div class="side_title">瀹℃壒娴佺▼</div>
+        <div class="list" v-if="info.approveDateVO != null && info.approveDateVO.approveList != null">
+          <div class="item" v-for="item, index in info.approveDateVO.approveList">
+            <div v-if="index != info.approveDateVO.approveList.length - 1" class="separate"></div>
+            <div class="info">
+              <img src="@/assets/icons/ic_tongguo.png" class="iconnew" v-if="item.status == 2" />
+              <img src="@/assets/icons/ic_dangqian.png" class="iconnew" v-if="item.status == 1" />
+              <img src="@/assets/icons/ic_jujue.png" class="iconnew" v-if="item.status == 3" />
+              <img src="@/assets/icons/ic_grey.png" class="iconnew" v-if="item.status == null || item.status == 0" />
+            </div>
+            <div class="avatar_wrap">
+              <img class="img" :src="item.faceImg
+                ? item.faceImg
+                : require('@/assets/avatar/man.png')
+                " />
+            </div>
+            <div class="content">
+              <div class="head">
+                <div class="event">{{ item.title }}</div>
+                <div class="time">{{ item.createDate }}</div>
+              </div>
+              <div class="name_wrap">
+                <span>{{ item.memberName }}<span v-if="item.statusInfo" class="status">({{ item.statusInfo
+                    }})</span></span>
+              </div>
+              <div v-if="item.checkInfo" class="remark">
+                {{ item.checkInfo }}
+              </div>
+              <div v-if="item.approveType == 1" class="carbon">
+                <div class="carbon_item" v-for="child in item.approveList" :key="child.id">
+                  <img :src="child.faceImg
+                    ? child.faceImg
+                    : require('@/assets/avatar/man.png')
+                    "></img>
+                  <div class="text">{{ child.memberName }}</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--  -->
+    <template v-slot:footer>
+      <el-button @click="handleAppr(2)" type="primary" class="status-red" v-if="
+        info.approveDateVO != null &&
+        info.approveDateVO.canBeApproved != null &&
+        info.approveDateVO.canBeApproved == 1
+      ">鍚屾剰</el-button>
+      <el-button @click="handleAppr(3)" type="danger" v-if="
+        info.approveDateVO != null &&
+        info.approveDateVO.canBeApproved != null &&
+        info.approveDateVO.canBeApproved == 1
+      ">鎷掔粷</el-button>
+      <el-button @click="isShowModal = false">杩斿洖</el-button>
+    </template>
+    <!--  鍚屾剰/鎷掔粷 -->
+    <el-dialog append-to-body :title="apprTitle" :visible.sync="isShowAppr" width="480px">
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+        <el-form-item :prop="param.status == 3 ? 'checkInfo' : ''" :label="param.status == 2 ? '鍚屾剰璇存槑' : '鎷掔粷璇存槑'">
+          <el-input type="textarea" :placeholder="param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑蹇呭~'
+            " :rows="4" v-model="param.checkInfo" />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowAppr = false">鍙栨秷</el-button>
+        <el-button :loading="subLoading" type="primary" @click="onSubAppr">纭畾</el-button>
+      </span>
+    </el-dialog>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import {
+  getDriverJobDetail,
+  approveDo
+} from '@/api'
+export default {
+  components: { GlobalWindow },
+  data() {
+    return {
+      id: '',
+      type: '',
+
+      title: '璁垮棰勭害璇︽儏',
+      isShowModal: false,
+      info: {},
+      isShowAppr: false,
+      apprTitle: '鍚屾剰',
+      subLoading: false,
+      param: {},
+
+      isShowProblem: false,
+      rules: {
+        checkInfo: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }]
+      },
+      statusMap: {
+        0: '寰呭鏍�',
+        1: '澶勭悊涓�',
+        2: '宸插悓鎰�',
+        3: '宸叉嫆缁�',
+        4: '宸插彇娑�',
+        5: '浠栦汉鎴栫',
+        6: '浠栦汉鎷掔粷'
+      },
+      cateList: {
+        0: '璁垮鐢宠',
+        1: '璁垮鎶ュ',
+        2: '鐢ㄨ溅鐢宠',
+        3: '闅愭偅闅忔墜鎷�',
+        4: '鐗╂祦杞︾敵璇�'
+      }
+    }
+  },
+  methods: {
+    onSubAppr() {
+      this.$refs.ruleForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.$dialog.actionConfirm('鎿嶄綔纭', this.param.status === 2 ? '鎮ㄧ‘璁ゅ悓鎰忚鐢宠鍚楋紵' : '鎮ㄧ‘璁ゆ嫆缁濊鐢宠鍚楋紵')
+          .then(() => {
+            this.subLoading = true
+            approveDo({
+              objId: this.id,
+              objType: 6,
+              status: this.param.status,
+              checkInfo: this.param.checkInfo
+            })
+              .then(res => {
+                this.subLoading = false
+                this.$tip.apiSuccess('澶勭悊鎴愬姛')
+                this.getDetail()
+                this.isShowAppr = false
+              })
+              .finally(() => {
+                this.subLoading = false
+              })
+          })
+      })
+    },
+    getDetail() {
+      const { id } = this
+      getDriverJobDetail(id).then(res => {
+        this.info = res
+        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 = []
+            }
+          })
+        }
+      })
+    },
+    handleAppr(val) {
+      this.$set(this.param, 'status', val)
+      this.apprTitle = val == 2 ? '鍚屾剰' : '鎷掔粷'
+      this.isShowAppr = true
+    },
+    confirm() {
+      console.log('--')
+    },
+    handleTransfer() {
+      this.isShowProblem = true
+    },
+    reject() { },
+    handleAvatarSuccess() { },
+    beforeAvatarUpload() { }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/style/variables.scss";
+
+.upload_box {
+  width: 84px;
+  height: 84px;
+  border-radius: 4px;
+  background-color: #f7f7f7;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  color: #999999;
+  border: 1px solid #e4e4e4;
+
+  .icon {
+    font-size: 24px;
+  }
+
+  .text {
+    font-size: 12px;
+  }
+}
+
+.side_title {
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
+
+.modal_wrap {
+  display: flex;
+  height: 100%;
+
+  .modal_content {
+    flex: 1;
+    padding: 0px 30px;
+    border-radius: 8px;
+    overflow: hidden;
+    height: 100%;
+
+    .title {
+      font-weight: 600;
+      font-size: 18px;
+      color: #333333;
+      margin-bottom: 20px;
+      margin-top: 30px;
+    }
+
+    .info {
+      .list {
+        display: flex;
+        flex-wrap: wrap;
+
+        .item {
+          display: flex;
+          width: 40%;
+          margin-bottom: 20px;
+
+          &:nth-of-type(2n) {
+            width: 60%;
+          }
+
+          .label {
+            color: #888888;
+            width: 100px;
+          }
+
+          .value {
+            color: #111111;
+          }
+        }
+      }
+    }
+
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20px 30px;
+      margin: 0 -30px;
+      border-radius: 8px 8px 0 0;
+      position: relative;
+      .head_bg{
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        left: 0;
+        top: 0;
+        z-index: 9;
+      }
+      .h1 {
+        font-weight: 600;
+        font-size: 22px;
+        color: #111111;
+        margin-bottom: 8px;
+      }
+
+      .time {
+        font-size: 14px;
+        color: #999999;
+      }
+
+      .right {
+        height: 40px;
+        font-size: 16px;
+        color: #ffffff;
+        line-height: 40px;
+        padding: 0 20px;
+        background: #207ff7;
+        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
+        border-radius: 16px 0px 16px 0px;
+        position: relative;
+        z-index: 99;
+      }
+      .scs{
+        background-color: #00BA67;
+      }
+      .msg{
+        background-color: #ED4545;
+      }
+    }
+
+    .table_info {
+      .name_wrap {
+        display: flex;
+        align-items: center;
+
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin-right: 12px;
+        }
+
+        .content {
+          .line {
+            display: flex;
+          }
+
+          .tag {
+            color: #b2cbf9;
+            border: 1px solid #b2cbf9;
+            padding: 0px 4px;
+            border-radius: 4px;
+            margin-left: 6px;
+          }
+        }
+      }
+    }
+  }
+
+  .side {
+    height: 100%;
+    width: 420px;
+    background: #ffffff;
+    border-left: 20px solid #f7f7f7;
+
+    .list {
+      .item {
+        padding: 8px 0;
+        display: flex;
+        margin-bottom: 24px;
+        position: relative;
+        .separate {
+          position: absolute;
+          border-left: 2px dashed #cccccc;
+          left: 31px;
+          height: calc(100% - 2px);
+          top: 42px;
+        }
+        .info{
+          padding-top: 10px;
+          margin-left: 20px;
+          margin-right: 16px;
+          .iconnew {
+            width: 24px;
+            height: 24px;
+          }
+        }
+        .avatar_wrap {
+          width: 40px;
+          height: 40px;
+          position: relative;
+          margin-right: 10px;
+
+          .img {
+            width: 40px;
+            height: 40px;
+            border-radius: 50%;
+          }
+
+          .status {
+            width: 14px;
+            height: 14px;
+            border-radius: 50%;
+            position: absolute;
+            right: 0;
+            bottom: 0;
+          }
+
+        }
+
+        .content {
+          flex: 1;
+
+          .head {
+            display: flex;
+            justify-content: space-between;
+            margin-bottom: 2px;
+
+            .event {
+              font-size: 15px;
+            }
+
+            .time {
+              font-size: 13px;
+              color: #999999;
+            }
+          }
+
+          .name_wrap {
+            font-size: 13px;
+            color: #777777;
+
+            .status {
+              color: $primary-color;
+            }
+          }
+
+          .remark {
+            margin-top: 6px;
+            background-color: #f7f7f7;
+            padding: 7px 10px;
+            border-radius: 4px;
+            font-size: 13px;
+            color: #666666;
+            line-height: 18px;
+          }
+        }
+
+        .carbon {
+          display: flex;
+          width: 100%;
+          overflow-x: auto;
+          margin-top: 12px;
+          .carbon_item {
+            text-align: center;
+            flex-shrink: 0;
+            width: 60px;
+
+            img {
+              width: 36px;
+              height: 36px;
+              margin: 0 auto;
+            }
+
+            div {
+              font-size: 13px;
+              color: #777777;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/admin/src/views/task/index.vue b/admin/src/views/task/index.vue
index 8d1c350..00740fb 100644
--- a/admin/src/views/task/index.vue
+++ b/admin/src/views/task/index.vue
@@ -59,24 +59,11 @@
       :data="dataList"
       stripe
       row-key="id"
+      class="mb20"
       default-expand-all
     >
-<!--      <el-table-column prop="name" label="浠诲姟绫诲瀷" min-width="100">
-        <template v-slot="scope">
-          <span
-            v-if="
-              (scope.row.objType || scope.row.objType == 0) &&
-              cateList[scope.row.objType].name
-            "
-            >{{ cateList[scope.row.objType].name }}</span
-          >
-        </template>
-      </el-table-column>-->
       <el-table-column label="澶勭悊浜嬮」" min-width="200">
         <template slot-scope="{ row }"> {{ row.title}}
-<!--          <span v-if="row.title">{{
-            row.title.split("-")[1]
-          }}</span>-->
         </template>
       </el-table-column>
       <el-table-column prop="createDate" label="鎻愪氦鏃堕棿" min-width="100">
@@ -100,6 +87,7 @@
     <TaskDetail v-if="isShowDetail" ref="DetailRef" />
     <VisReportDetail v-if="isShowReport" ref="VisReportDetailRef" />
     <DangetDetail v-if="isShowDanger" ref="DangetDetailRef" />
+    <DriverDetail v-if="isShowDriver" ref="DriverDetailRef" />
     <!-- 鐢ㄨ溅鐢宠 -->
     <OperaCarUseBookWindow ref="OperaDetailsWindow" @success="getList" />
     <!-- 闅愭偅 -->
@@ -115,6 +103,7 @@
 import TaskDetail from './visSubDetail.vue'
 import VisReportDetail from './visReportDetail.vue'
 import DangetDetail from './dangetDetail.vue'
+import DriverDetail from './driverDetail.vue'
 import OperaCarUseBookWindow from '@/components/business/OperaCarUseBookWindow'
 import OperaHiddenDangerWindow from '@/components/business/OperaHiddenDangerWindow'
 import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
@@ -130,6 +119,7 @@
     VisReportDetail,
     DangetDetail,
     QueryForm,
+    DriverDetail,
     Pagination,
     OperaCarUseBookWindow,
     OperaHiddenDangerWindow,
@@ -140,6 +130,7 @@
       isShowDetail: false,
       isShowReport: false,
       isShowDanger: false,
+      isShowDriver: false,
       filters: {
         queryType: '0',
         fastdate: 0
@@ -229,6 +220,17 @@
         this.$refs.OperaHiddenDangerWindow.open('闅愭偅闅忔墜鎷嶈鎯�', obj)
         return
       }
+      if (row.objType === 6) {
+        const obj = { ...row, id: row.objId }
+        this.isShowDriver = true
+        this.$nextTick(() => {
+          this.$refs.DriverDetailRef.id = row.objId
+          this.$refs.DriverDetailRef.type = row.objType
+          this.$refs.DriverDetailRef.getDetail()
+          this.$refs.DriverDetailRef.isShowModal = true
+        })
+        return
+      }
       if (row.objType === 0) {
         this.isShowDetail = true
         this.$nextTick(() => {
diff --git a/admin/src/views/task/visReportDetail.vue b/admin/src/views/task/visReportDetail.vue
index fa7d122..2ef8471 100644
--- a/admin/src/views/task/visReportDetail.vue
+++ b/admin/src/views/task/visReportDetail.vue
@@ -20,7 +20,7 @@
               <div class="label">鏉ヨ鏃堕棿</div>
               <div class="value">{{ info.starttime }}鑷硔{ info.endtime }}</div>
             </div>
-             <div class="item">
+            <div class="item">
               <div class="label">鏉ヨ鍗曚綅</div>
               <div class="value">{{ info.companyName }}</div>
             </div>
@@ -45,69 +45,24 @@
       </div>
       <div class="side">
         <div class="side_title">瀹℃壒娴佺▼</div>
-        <div
-          class="list"
-          v-if="
-            info.approveDateVO != null && info.approveDateVO.approveList != null
-          "
-        >
-          <div
-            class="item"
-            v-for="(item, index) in info.approveDateVO.approveList"
-            :key="item.id"
-          >
-            <div
-              class="separate"
-              v-if="index < info.approveDateVO.approveList.length - 1"
-            ></div>
+        <div class="list" v-if="
+          info.approveDateVO != null && info.approveDateVO.approveList != null
+        ">
+          <div class="item" v-for="(item, index) in info.approveDateVO.approveList" :key="item.id">
+            <div class="separate" v-if="index < info.approveDateVO.approveList.length - 1"></div>
             <div class="info">
-              <img
-                src="@/assets/icons/ic_tongguo.png"
-                class="iconnew"
-                v-if="item.status == 2"
-              />
-              <img
-                src="@/assets/icons/ic_dangqian.png"
-                class="iconnew"
-                v-if="item.status == 1"
-              />
-              <img
-                src="@/assets/icons/ic_jujue.png"
-                class="iconnew"
-                v-if="item.status == 3"
-              />
-              <img
-                src="@/assets/icons/ic_grey.png"
-                class="iconnew"
-                v-if="item.status == null || item.status == 0"
-              />
+              <img src="@/assets/icons/ic_tongguo.png" class="iconnew" v-if="item.status == 2" />
+              <img src="@/assets/icons/ic_dangqian.png" class="iconnew" v-if="item.status == 1" />
+              <img src="@/assets/icons/ic_jujue.png" class="iconnew" v-if="item.status == 3" />
+              <img src="@/assets/icons/ic_grey.png" class="iconnew" v-if="item.status == null || item.status == 0" />
               <div style="display: inline" v-if="item.approveType != 1">
-                <img
-                  v-if="item.faceImg != null && item.faceImg != ''"
-                  :src="item.faceImg"
-                  class="avatar"
-                  alt=""
-                />
-                <img
-                  v-if="item.faceImg == null || item.faceImg == ''"
-                  src="@/assets/avatar/man.png"
-                  class="avatar"
-                  alt=""
-                />
+                <img v-if="item.faceImg != null && item.faceImg != ''" :src="item.faceImg" class="avatar" alt="" />
+                <img v-if="item.faceImg == null || item.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
+                  alt="" />
               </div>
               <div style="display: inline" v-if="item.approveType == 1">
-                <img
-                  v-if="item.type != 1"
-                  src="@/assets/icons/ic_duoren.png"
-                  class="avatar"
-                  alt=""
-                />
-                <img
-                  v-if="item.type == 1"
-                  src="@/assets/icons/ic_chaosong.png"
-                  class="avatar"
-                  alt=""
-                />
+                <img v-if="item.type != 1" src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
+                <img v-if="item.type == 1" src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
               </div>
               <div class="content">
                 <div class="line">
@@ -117,47 +72,27 @@
                 <div class="line">
                   <div class="company">
                     {{ item.memberName }}
-                    <div
-                      style="display: inline"
-                      v-if="item.statusInfo != null && item.statusInfo != ''"
-                    >
+                    <div style="display: inline" v-if="item.statusInfo != null && item.statusInfo != ''">
                       锛�<span class="status-green">{{
                         item.statusInfo || ""
-                      }}</span
-                      >锛�
+                        }}</span>锛�
                     </div>
                   </div>
                 </div>
               </div>
             </div>
-            <div
-              v-if="
-                item.approveType != 1 &&
-                item.checkInfo != null &&
-                item.checkInfo != ''
-              "
-              class="remark"
-            >
+            <div v-if="
+              item.approveType != 1 &&
+              item.checkInfo != null &&
+              item.checkInfo != ''
+            " class="remark">
               {{ item.checkInfo || "" }}
             </div>
             <div v-if="item.approveType == 1" class="childList">
-              <div
-                class="m_content company"
-                v-for="item1 in item.approveList"
-                :key="item1.id"
-              >
-                <img
-                  v-if="item1.faceImg != null && item1.faceImg != ''"
-                  :src="item1.faceImg"
-                  class="avatar"
-                  alt=""
-                />
-                <img
-                  v-if="item1.faceImg == null || item1.faceImg == ''"
-                  src="@/assets/avatar/man.png"
-                  class="avatar"
-                  alt=""
-                />
+              <div class="m_content company" v-for="item1 in item.approveList" :key="item1.id">
+                <img v-if="item1.faceImg != null && item1.faceImg != ''" :src="item1.faceImg" class="avatar" alt="" />
+                <img v-if="item1.faceImg == null || item1.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
+                  alt="" />
                 <span> {{ item1.memberName }}</span>
               </div>
             </div>
@@ -167,46 +102,24 @@
     </div>
     <!--  -->
     <template v-slot:footer>
-      <el-button
-        @click="handleAppr(2)"
-        type="primary"
-        class="status-red"
-        v-if="
-          info.approveDateVO != null &&
-          info.approveDateVO.canBeApproved != null &&
-          info.approveDateVO.canBeApproved == 1
-        "
-        >鍚屾剰</el-button
-      >
-      <el-button
-        @click="handleAppr(3)"
-        type="danger"
-        v-if="
-          info.approveDateVO != null &&
-          info.approveDateVO.canBeApproved != null &&
-          info.approveDateVO.canBeApproved == 1
-        "
-        >鎷掔粷</el-button
-      >
+      <el-button @click="handleAppr(2)" type="primary" class="status-red" v-if="
+        info.approveDateVO != null &&
+        info.approveDateVO.canBeApproved != null &&
+        info.approveDateVO.canBeApproved == 1
+      ">鍚屾剰</el-button>
+      <el-button @click="handleAppr(3)" type="danger" v-if="
+        info.approveDateVO != null &&
+        info.approveDateVO.canBeApproved != null &&
+        info.approveDateVO.canBeApproved == 1
+      ">鎷掔粷</el-button>
       <el-button @click="isShowModal = false">杩斿洖</el-button>
     </template>
     <!--  鍚屾剰/鎷掔粷 -->
-    <el-dialog
-      append-to-body
-      :title="apprTitle"
-      :visible.sync="isShowAppr"
-      width="480px"
-    >
+    <el-dialog append-to-body :title="apprTitle" :visible.sync="isShowAppr" width="480px">
       <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
         <el-form-item :prop="param.status == 3 ? 'checkInfo' : ''" :label="param.status == 2 ? '鍚屾剰璇存槑' : '鎷掔粷璇存槑'">
-          <el-input
-            type="textarea"
-            :placeholder="
-              param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑蹇呭~'
-            "
-            :rows="4"
-            v-model="param.checkInfo"
-          />
+          <el-input type="textarea" :placeholder="param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑蹇呭~'
+            " :rows="4" v-model="param.checkInfo" />
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
@@ -215,32 +128,16 @@
       </span>
     </el-dialog>
     <!-- 闅愭偅 -->
-    <el-dialog
-      append-to-body
-      title="闅愭偅"
-      :visible.sync="isShowProblem"
-      width="480px"
-    >
+    <el-dialog append-to-body title="闅愭偅" :visible.sync="isShowProblem" width="480px">
       <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
         <el-form-item label="閫�鍥炴椂闂�">
-          <el-date-picker
-            class="w300"
-            value-format="yyyy-MM-dd"
-            type="date"
-            placeholder="閫夋嫨鏃ユ湡"
-            v-model="param.date"
-          />
+          <el-date-picker class="w300" value-format="yyyy-MM-dd" type="date" placeholder="閫夋嫨鏃ユ湡" v-model="param.date" />
         </el-form-item>
         <el-form-item label="鏁存敼鍓�">
           <div class="df_ac">
             <img src="@/assets/avatar/man.png" />
-            <el-upload
-              class="avatar-uploader"
-              action="https://jsonplaceholder.typicode.com/posts/"
-              :show-file-list="false"
-              :on-success="handleAvatarSuccess"
-              :before-upload="beforeAvatarUpload"
-            >
+            <el-upload class="avatar-uploader" action="https://jsonplaceholder.typicode.com/posts/"
+              :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
               <img v-if="param.url" :src="param.url" class="avatar" />
               <div v-else class="upload_box">
                 <el-icon class="el-icon-plus icon" />
@@ -250,19 +147,12 @@
           </div>
         </el-form-item>
         <el-form-item label="閫�鍥炶鏄�">
-          <el-input
-            type="textarea"
-            placeholder="璇峰~鍐欒鏄�"
-            :rows="4"
-            v-model="param.explain"
-          />
+          <el-input type="textarea" placeholder="璇峰~鍐欒鏄�" :rows="4" v-model="param.explain" />
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button @click="isShowProblem = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="isShowProblem = false"
-          >纭畾</el-button
-        >
+        <el-button type="primary" @click="isShowProblem = false">纭畾</el-button>
       </span>
     </el-dialog>
   </GlobalWindow>
@@ -276,7 +166,7 @@
 } from '@/api'
 export default {
   components: { GlobalWindow },
-  data () {
+  data() {
     return {
       id: '',
       type: '',
@@ -312,7 +202,7 @@
     }
   },
   methods: {
-    onSubAppr () {
+    onSubAppr() {
       this.$refs.ruleForm.validate((valid) => {
         if (!valid) {
           return
@@ -338,25 +228,26 @@
           })
       })
     },
-    getDetail () {
+    getDetail() {
       const { id } = this
       getVisitedReDetail({ id }).then(res => {
         this.info = res
       })
     },
-    handleAppr (val) {
+    handleAppr(val) {
       this.$set(this.param, 'status', val)
+      this.apprTitle = val == 2 ? '鍚屾剰' : '鎷掔粷'
       this.isShowAppr = true
     },
-    confirm () {
+    confirm() {
       console.log('--')
     },
-    handleTransfer () {
+    handleTransfer() {
       this.isShowProblem = true
     },
-    reject () { },
-    handleAvatarSuccess () { },
-    beforeAvatarUpload () { }
+    reject() { },
+    handleAvatarSuccess() { },
+    beforeAvatarUpload() { }
   }
 }
 </script>
@@ -373,13 +264,16 @@
   align-items: center;
   color: #999999;
   border: 1px solid #e4e4e4;
+
   .icon {
     font-size: 24px;
   }
+
   .text {
     font-size: 12px;
   }
 }
+
 .side_title {
   font-weight: 600;
   font-size: 18px;
@@ -388,9 +282,11 @@
   margin-left: 20px;
   margin-top: 20px;
 }
+
 .modal_wrap {
   display: flex;
   height: 100%;
+
   .modal_content {
     flex: 1;
     padding: 0px 30px;
@@ -405,6 +301,7 @@
       margin-bottom: 20px;
       margin-top: 30px;
     }
+
     .info {
       .list {
         display: flex;
@@ -414,6 +311,7 @@
           display: flex;
           width: 40%;
           margin-bottom: 20px;
+
           &:nth-of-type(2n) {
             width: 60%;
           }
@@ -462,20 +360,24 @@
         border-radius: 16px 0px 16px 0px;
       }
     }
+
     .table_info {
       .name_wrap {
         display: flex;
         align-items: center;
+
         .avatar {
           width: 40px;
           height: 40px;
           border-radius: 50%;
           margin-right: 12px;
         }
+
         .content {
           .line {
             display: flex;
           }
+
           .tag {
             color: #b2cbf9;
             border: 1px solid #b2cbf9;
@@ -493,10 +395,12 @@
     width: 420px;
     background: #ffffff;
     border-left: 20px solid #f7f7f7;
+
     .list {
       .item {
         padding: 8px 0;
         position: relative;
+
         .separate {
           position: absolute;
           border-left: 2px dashed #cccccc;
@@ -504,6 +408,7 @@
           height: calc(100% - 36px);
           top: 49px;
         }
+
         .avatar {
           width: 40px;
           height: 40px;
@@ -511,18 +416,22 @@
           margin: 0 12px 0 16px;
           //border: 1px solid;
         }
+
         .childList {
           display: flex;
           flex-wrap: wrap;
           margin-left: 100px;
         }
+
         .company {
           font-size: 13px;
           color: #888888;
+
           .status {
             color: #00ba67;
           }
         }
+
         .m_content {
           display: flex;
           flex-direction: column;
@@ -530,56 +439,67 @@
           justify-content: center;
           margin-bottom: 4px;
         }
+
         .info {
           display: flex;
           align-items: center;
           margin-left: 20px;
+
           .icon {
             position: relative;
             z-index: 11;
             color: #53b76f;
             font-size: 24px;
           }
+
           .icon1 {
             position: relative;
             z-index: 11;
             color: deepskyblue;
             font-size: 24px;
           }
+
           .icon2 {
             position: relative;
             z-index: 11;
             color: #dc362e;
             font-size: 24px;
           }
+
           .iconnew {
             width: 24px;
             height: 24px;
           }
+
           .icon3 {
             position: relative;
             z-index: 11;
             color: gray;
             font-size: 24px;
           }
+
           .content {
             flex: 1;
+
             .line {
               display: flex;
               justify-content: space-between;
               align-content: center;
               margin-bottom: 6px;
+
               .name {
                 font-weight: 600;
                 font-size: 16px;
                 color: #111111;
               }
+
               .time {
                 color: #888888;
               }
             }
           }
         }
+
         .remark {
           background: #f7f7f7;
           border-radius: 4px;
diff --git a/h5/pages/staff/task/driver.vue b/h5/pages/staff/task/driver.vue
index 3330aaf..7bc40ed 100644
--- a/h5/pages/staff/task/driver.vue
+++ b/h5/pages/staff/task/driver.vue
@@ -91,6 +91,9 @@
             <view class="name_wrap">
               <text>{{item.memberName}}<text v-if="item.statusInfo" class="status">({{item.statusInfo}})</text></text>
             </view>
+						<div v-if="item.checkInfo" class="remark">
+						    {{ item.checkInfo }}
+						</div>
 						<view v-if="item.approveType == 1" class="carbon">
 						  <view class="carbon_item" v-for="child in item.approveList"
                 :key="child.id">

--
Gitblit v1.9.3