From 843d0abd014ec20424844546fc57a9f976f366ba Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期一, 02 九月 2024 10:52:59 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 pda/utils/service.js                                                                                            |    3 
 h5/main.js                                                                                                      |   12 
 admin/src/views/platform/components/PlatformQueuing.vue                                                         |  124 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/LineUpVO.java                           |    3 
 h5/pages/driver/forgetPsd.vue                                                                                   |   21 
 admin/src/assets/style/style.scss                                                                               |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/CarNumByStatusResponse.java         |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java        |  606 +++++-
 pda/utils/config.js                                                                                             |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java      |   18 
 admin/src/components/common/CommonHeader.vue                                                                    |   29 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/GasByMonthRequest.java               |    3 
 pda/pages/index/center.vue                                                                                      |  534 ++++-
 h5/manifest.json                                                                                                |    2 
 admin/.env.development                                                                                          |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformLogService.java                 |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java                      |   24 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java                 |    4 
 h5/utils/config.js                                                                                              |   15 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/PdaPlatformController.java                       |   52 
 h5/utils/service.js                                                                                             |    3 
 h5/pages/driver/reservedDetail.vue                                                                              |   18 
 pda/pages/index/login.vue                                                                                       |   73 
 pda/App.vue                                                                                                     |  327 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformService.java                    |    6 
 admin/src/components/common/GlobalWindow.vue                                                                    |    6 
 h5/pages/driver/taskDetail.vue                                                                                  |  161 +
 h5/pages/staff/task/index.vue                                                                                   |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformOrderNumByDateResponse.java |    5 
 pda/pages/index/set.vue                                                                                         |  105 
 admin/src/views/platform/index.vue                                                                              |  564 +++++-
 h5/pages/driver/reservedRecord.vue                                                                              |    6 
 h5/pages/driver/login.vue                                                                                       |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/WaterByMonthRequest.java             |    2 
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                        |   25 
 admin/src/assets/icons/shengyin.png                                                                             |    0 
 pda/api/index.js                                                                                                |  124 +
 admin/src/views/platform/config.js                                                                              |   14 
 h5/api/driver.js                                                                                                |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/PlatformWorkVO.java                     |   31 
 admin/src/layouts/TableLayout1.vue                                                                              |    1 
 admin/src/assets/images/default_nodata.png                                                                      |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/WaterByMonthResponse.java           |    4 
 h5/pages/driver/reserved.vue                                                                                    |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataListResponse.java       |    2 
 pda/pages.json                                                                                                  |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java            |   10 
 pda/static/default_nodata@2x.png                                                                                |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java            |    9 
 pda/pages/index/queueup.vue                                                                                     |  122 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformGroupServiceImpl.java      |   62 
 h5/pages/staff/task/driver.vue                                                                                  |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataInfoResponse.java       |    1 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/openapi/HkOpenApiController.java                     |   62 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformGroupService.java               |    8 
 pda/package-lock.json                                                                                           |   11 
 pda/pages/index/control.vue                                                                                     |   47 
 admin/src/components/common/Pagination.vue                                                                      |    2 
 h5/pages/driver/register.vue                                                                                    |   14 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java   |   95 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DriverHomeVO.java                       |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java                         |    7 
 admin/src/layouts/TableLayout.vue                                                                               |    4 
 admin/src/components/common/QueryForm/queryForm.vue                                                             |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java                 |   33 
 admin/src/views/platform/queueUp.vue                                                                            |  232 --
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformBooksService.java               |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformServiceImpl.java           |   37 
 h5/pages/driver/index.vue                                                                                       |   61 
 admin/src/api/platform/index.js                                                                                 |   45 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformGroup.java                    |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/PlatformOrderNumByDateRequest.java   |    3 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformCloudController.java                   |  113 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformLog.java                      |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ConfirmTaskDTO.java                      |   29 
 h5/pages/driver/queueUp.vue                                                                                     |   76 
 h5/static/driver/ic_truck_mine@2x.png                                                                           |    0 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/DriverPlatformController.java                    |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformNumByStatusResponse.java    |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/PlatformDataDTO.java                     |   25 
 h5/pages/driver/queueUpRecord.vue                                                                               |  314 ++-
 pda/main.js                                                                                                     |   11 
 h5/App.vue                                                                                                      |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/GasByMonthResponse.java             |    4 
 h5/pages/driver/taskConfirm.vue                                                                                 |  809 ++++----
 pda/manifest.json                                                                                               |   24 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java        |   32 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformGroupCloudController.java              |   13 
 88 files changed, 3,912 insertions(+), 1,471 deletions(-)

diff --git a/admin/.env.development b/admin/.env.development
index cf6b164..5ae3033 100644
--- a/admin/.env.development
+++ b/admin/.env.development
@@ -2,4 +2,4 @@
 NODE_ENV = 'development'
 
 VUE_APP_API_URL  = 'http://localhost:10010'
-#VUE_APP_API_URL  = 'http://192.168.0.173/admin_interface'
+VUE_APP_API_URL  = 'http://192.168.0.139:10010'
diff --git a/admin/src/api/platform/index.js b/admin/src/api/platform/index.js
index c399bb2..c0f68ec 100644
--- a/admin/src/api/platform/index.js
+++ b/admin/src/api/platform/index.js
@@ -1,10 +1,45 @@
 import request from '@/utils/request'
 
-// 鏈堝彴鍒楄〃
-export function getPlatform (data) {
-  return request.post('/visitsAdmin/cloudService/business/platform/page', data, {
-    trim: true
-  })
+// 鑾峰彇鏈堝彴缁勪俊鎭�
+export function getPlatformGroupList (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/getPlatformGroupList', data)
+}
+// 鍙彿鍒楄〃
+export function platformCallList (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/platformCallList', data)
+}
+// 鍙彿
+export function platformCallNumber (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/platformCallNumber', data)
+}
+// 寮�濮嬩綔涓�
+export function platformBeginWork (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/beginWork', data)
+}
+// 瀹屾垚浣滀笟
+export function platformFinishWork (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/finishWork', data)
+}
+// 杩囧彿
+export function platformOverNumber (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/platformOverNumber', data)
+}
+// 寮傚父鎸傝捣
+export function platformErr (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/platformErr', data)
+}
+// 寮傚父鎸傝捣
+export function platformMove (data) {
+  return request.post('/visitsAdmin/cloudService/business/platform/platformMove', data)
+}
+// 鏈堝彴閰嶇疆
+export function updUserPlatformConfig (data) {
+  return request.get('/visitsAdmin/cloudService/business/platform/updUserPlatformConfig?ids=' + data)
+}
+
+// 鏍规嵁鏈堝彴缁勮幏鍙栨湀鍙板垪琛ㄤ俊鎭�
+export function listByGroupId (id) {
+  return request.get('/visitsAdmin/cloudService/business/platform/listByGroupId?groupId=' + id)
 }
 // 鏈堝彴鍒楄〃 缂栬緫
 export function PlatformEdit (data) {
diff --git a/admin/src/assets/icons/shengyin.png b/admin/src/assets/icons/shengyin.png
new file mode 100644
index 0000000..6ef8cce
--- /dev/null
+++ b/admin/src/assets/icons/shengyin.png
Binary files differ
diff --git a/admin/src/assets/images/default_nodata.png b/admin/src/assets/images/default_nodata.png
new file mode 100644
index 0000000..0b58506
--- /dev/null
+++ b/admin/src/assets/images/default_nodata.png
Binary files differ
diff --git a/admin/src/assets/style/style.scss b/admin/src/assets/style/style.scss
index 754466b..91b6a3e 100644
--- a/admin/src/assets/style/style.scss
+++ b/admin/src/assets/style/style.scss
@@ -138,8 +138,9 @@
 
 .main_app {
   background-color: #fff;
-  padding: 30px;
-  margin: 0 16px;
+  margin-top: 10px;
+  margin-left: 16px;
+  padding: 20px;
 }
 .fs12{
   font-size: 12px;
diff --git a/admin/src/components/common/CommonHeader.vue b/admin/src/components/common/CommonHeader.vue
index 5afc768..aa3672e 100644
--- a/admin/src/components/common/CommonHeader.vue
+++ b/admin/src/components/common/CommonHeader.vue
@@ -4,7 +4,10 @@
       <div class="logo">
         <div>{{ title }}</div>
         <div class="list">
-          <div class="item">鏈嶅姟涓績</div>
+          <div class="item active">
+            <div>鏈嶅姟涓績</div>
+            <div class="linellae"></div>
+          </div>
           <div class="item">瀹夐槻涓績</div>
           <div class="item">娑堥槻涓績</div>
           <div class="item">鑳界涓績</div>
@@ -204,6 +207,30 @@
 .common-header {
   background-color: #2080f7;
 }
+.list{
+  display: flex;
+  align-items: center;
+  margin-left: 60px;
+  .item{
+    margin-right: 40px;
+    font-size: 16px;
+    font-weight: 400;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: flex-start;
+    height: 40px;
+    cursor: pointer;
+    .linellae{
+      width: 64px;
+      height: 2px;
+      background: #FFFFFF;
+    }
+  }
+  .active{
+    font-weight: 500;
+  }
+}
 .header {
   overflow: hidden;
   // background: #fff;
diff --git a/admin/src/components/common/GlobalWindow.vue b/admin/src/components/common/GlobalWindow.vue
index 64bcabe..4ae9ce1 100644
--- a/admin/src/components/common/GlobalWindow.vue
+++ b/admin/src/components/common/GlobalWindow.vue
@@ -20,7 +20,7 @@
     </div>
     <div v-if="withFooter" class="window__footer">
       <slot name="footer">
-        <el-button @click="confirm" :loading="confirmWorking" type="primary">{{text}}</el-button>
+        <el-button v-if="showConfirm" @click="confirm" :loading="confirmWorking" type="primary">{{text}}</el-button>
         <slot name="btns" />
         <el-button @click="close">{{ backText }}</el-button>
       </slot>
@@ -55,6 +55,10 @@
       type: Boolean,
       default: false
     },
+    showConfirm: {
+      type: Boolean,
+      default: true
+    },
     // 鏍囬
     title: {
       type: String,
diff --git a/admin/src/components/common/Pagination.vue b/admin/src/components/common/Pagination.vue
index 86ea4d2..61d5103 100644
--- a/admin/src/components/common/Pagination.vue
+++ b/admin/src/components/common/Pagination.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="table-pagination">
     <el-pagination
-      :current-page="pagination.pageIndex"
+      :current-page="pagination.pageIndex || pagination.page"
       :page-sizes="pagination.pageSizes||[10, 20, 30, 40]"
       :page-size="pagination.pageSize"
       layout="total, sizes, prev, pager, next, jumper"
diff --git a/admin/src/components/common/QueryForm/queryForm.vue b/admin/src/components/common/QueryForm/queryForm.vue
index 4755b31..9eedeab 100644
--- a/admin/src/components/common/QueryForm/queryForm.vue
+++ b/admin/src/components/common/QueryForm/queryForm.vue
@@ -191,8 +191,8 @@
   align-items: center;
   background-color: #fff;
   border-bottom: 10px solid #f7f8f9;
-  margin: 0 -30px;
-  padding: 0 0 0 30px;
+  margin: 0 -20px;
+  padding: 0 0 0 20px;
 
   .el-input,
   .el-select {
diff --git a/admin/src/layouts/TableLayout.vue b/admin/src/layouts/TableLayout.vue
index 28ab4c7..c33073b 100644
--- a/admin/src/layouts/TableLayout.vue
+++ b/admin/src/layouts/TableLayout.vue
@@ -6,7 +6,7 @@
         <el-breadcrumb-item v-for="path in paths" :key="path">{{path}}</el-breadcrumb-item>
       </el-breadcrumb>
     </div>-->
-    <div style="height:10px;"></div>
+    <!-- <div style="height:10px;"></div> -->
     <Profile :roles="roles" :permissions="permissions">
       <!-- 鎼滅储琛ㄥ崟閮ㄥ垎 -->
       <div class="table-search-form">
@@ -60,6 +60,7 @@
   height: 100%;
   display: flex;
   flex-direction: column;
+  margin-top: 10px;
   .not-allow-wrap {
     padding-top: 0;
   }
@@ -104,7 +105,6 @@
 }
 // 鍒楄〃鍜屽垎椤�
 .table-content {
-  margin-top: 10px;
   padding: 0 16px;
   .table-wrap {
     padding: 16px 16px 0 16px;
diff --git a/admin/src/layouts/TableLayout1.vue b/admin/src/layouts/TableLayout1.vue
index c5070e9..dd2e38d 100644
--- a/admin/src/layouts/TableLayout1.vue
+++ b/admin/src/layouts/TableLayout1.vue
@@ -110,7 +110,6 @@
     }
     // 鍒楄〃鍜屽垎椤�
     .table-content {
-        margin-top: 10px;
         /*padding: 0 16px;*/
         .table-wrap {
             padding: 16px 16px 0 16px;
diff --git a/admin/src/views/platform/components/PlatformQueuing.vue b/admin/src/views/platform/components/PlatformQueuing.vue
index 592bbda..4cbc85b 100644
--- a/admin/src/views/platform/components/PlatformQueuing.vue
+++ b/admin/src/views/platform/components/PlatformQueuing.vue
@@ -2,75 +2,135 @@
   <GlobalWindow
     title="鏈堝彴鍙彿-xx鍙锋湀鍙�"
     :visible.sync="isShowModal"
+    :showConfirm="false"
     width="800px"
-    :confirm-working="subLoading"
-    @confirm="handleSub"
   >
     <div class="queuing_modal">
       <div class="df_ac mb20">
         <span>鎼滅储杞﹁締锛�</span>
         <el-input
           class="flex1 mr20"
-          v-model="param.aa"
+          v-model="carCodeFront"
           placeholder="璇疯緭鍏ヨ溅鐗屽彿"
         ></el-input>
-        <el-button type="primary">鏌ユ壘</el-button>
-        <el-button>閲嶇疆</el-button>
+        <el-button type="primary" @click="getList">鏌ユ壘</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
       </div>
       <div class="list">
-        <div class="item">
+        <div class="item" v-for="item in dataList" :key="item.id">
           <div class="head df_sb">
-            <div class="plate">鐨朅12122</div>
-            <div class="status">宸茬鍒�</div>
+            <div v-if="item.carCodeFront" class="code">
+              <span>{{ item.carCodeFront.slice(0, 1) }}</span>
+              <span>{{ item.carCodeFront.slice(1, 2) }}</span>
+              <span>路</span>
+              <span>{{ item.carCodeFront.slice(2) }}</span>
+            </div>
+            <div class="status">{{ statusMap[item.status] }}</div>
           </div>
           <div class="info">
-            <div class="ite">
+            <div v-if="item.type == 4" class="ite">
+              <span>鍚堝悓鍗曞彿锛�</span>
+              <span>{{ item.contractNum }}</span>
+            </div>
+            <div v-else class="ite">
               <span>杩愯緭鍗曞彿锛�</span>
-              <span>12312</span>
+              <span>{{ item.code }}</span>
             </div>
             <div class="ite">
               <span>椹鹃┒鍛橈細</span>
-              <span>12312</span>
+              <span>{{ item.driverName }}</span>
             </div>
             <div class="ite">
               <span>鎵嬫満鍙凤細</span>
-              <span>12312</span>
+              <span>{{ item.drivierPhone }}</span>
             </div>
             <div class="ite">
               <span>鎬昏繍杈撻噺锛�</span>
-              <span>12312</span>
+              <span>{{ item.totalNum }}涓囨敮</span>
             </div>
-            <div class="ite" style="width: 66%">
+            <div v-if="item.type != 4" class="ite" style="width: 66%">
               <span>杩愯緭鍏徃锛�</span>
-              <span>12312</span>
+              <span>{{ item.carrierName }}</span>
             </div>
           </div>
           <div class="footer df_sb">
-            <div class="detail">杩愬崟璇︽儏</div>
-            <el-button type="primary">鍙彿</el-button>
+            <div v-if="item.type != 4" class="detail">杩愬崟璇︽儏</div>
+            <div v-else></div>
+            <el-button type="primary" @click="handleCall(item)">鍙彿</el-button>
           </div>
         </div>
       </div>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="pagination"
+      >
+      </pagination>
     </div>
   </GlobalWindow>
 </template>
 
 <script>
 import GlobalWindow from '@/components/common/GlobalWindow'
-import { getPlatform, PlatformEdit, PlatformDel } from '@/api'
+import Pagination from '@/components/common/Pagination'
+import { platformCallList, platformCallNumber } from '@/api'
+import { statusMap } from '../config'
+import { Message } from 'element-ui'
 export default {
   components: {
-    GlobalWindow
+    GlobalWindow,
+    Pagination
   },
   data () {
     return {
+      statusMap,
       isShowModal: false,
       subLoading: false,
-      param: {}
+      pagination: {
+        total: 0,
+        pageSize: 10,
+        page: 1
+      },
+      carCodeFront: '',
+      activePlat: {},
+      dataList: []
 
     }
   },
   methods: {
+    handleCall (item) {
+      const activePlatform = this.activePlat
+      platformCallNumber({ platformId: activePlatform.id, jobId: item.id }).then(res => {
+        Message.success('鍙彿鎴愬姛')
+        this.$emit('success')
+        this.getList()
+      })
+    },
+    getList () {
+      const { activePlat, pagination, carCodeFront } = this
+      platformCallList({
+        model: { callType: '2', platformId: activePlat.id, carCodeFront },
+        page: pagination.page,
+        capacity: pagination.pageSize
+      }).then(res => {
+        this.dataList = res.records
+        this.pagination.total = res.total
+      })
+    },
+    reset () {
+      this.carCodeFront = ''
+      this.pagination.page = 1
+      this.pagination.pageSize = 10
+      this.getList()
+    },
+    handleSizeChange (e) {
+      this.pagination.pageSize = e
+      this.getList()
+    },
+    handlePageChange (e) {
+      this.pagination.page = e
+      this.getList()
+    },
     handleSub () {
       const { param } = this
       this.subLoading = true
@@ -84,7 +144,7 @@
       }, () => {
         this.subLoading = false
       })
-    },
+    }
   }
 
 }
@@ -116,6 +176,28 @@
         .status {
           color: $primaryColor;
         }
+        .code {
+          display: flex;
+          font-weight: 600;
+          height: 30px;
+          line-height: 30px;
+          font-size: 15px;
+          color: #111111;
+          background-color: #fff;
+          border-radius: 4px;
+          border: 1px solid $primaryColor;
+          padding-right: 4px;
+          span {
+            &:nth-of-type(1) {
+              background: $primaryColor;
+              padding: 0 8px;
+              color: #fff;
+            }
+            &:nth-of-type(2) {
+              padding-left: 4px;
+            }
+          }
+        }
       }
       .info {
         display: flex;
diff --git a/admin/src/views/platform/config.js b/admin/src/views/platform/config.js
new file mode 100644
index 0000000..e4a6ab5
--- /dev/null
+++ b/admin/src/views/platform/config.js
@@ -0,0 +1,14 @@
+export const statusMap = {
+  0: '寰呯‘璁�',
+  1: '寰呯鍒�',
+  2: '绛夊緟鍙彿',
+  3: '鍏ュ洯绛夊緟',
+  4: '鏈堝彴绛夊緟', // 宸插彨鍙�
+  5: '浣滀笟涓�',
+  6: '浣滀笟瀹屾垚',
+  7: '杞Щ涓�',
+  8: '寮傚父鎸傝捣',
+  9: '宸叉巿鏉冪鍥�',
+  10: '宸茬鍥�',
+  11: '宸茶繃鍙�'
+}
diff --git a/admin/src/views/platform/index.vue b/admin/src/views/platform/index.vue
index 7bc61bf..7e712e4 100644
--- a/admin/src/views/platform/index.vue
+++ b/admin/src/views/platform/index.vue
@@ -1,155 +1,394 @@
 <template>
   <div class="main_app">
-    <div class="mb20">
-      <el-select v-model="platformId" @change="getList()">
-        <el-option v-for="item in PlatformList" :key="item.id" :value="item.id" :label="item.name" />
-      </el-select>
+    <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"
+        >
+          {{ item.name }}
+        </div>
+        <!-- <el-tabs v-model="activeGroup.id" @tab-click="platgroupClick">
+          <el-tab-pane
+            v-for="item,i in PlatGroupList"
+            :key="i"
+            :label="item.name"
+            :name="String(item.id)"
+          />
+        </el-tabs> -->
+      </div>
       <el-button type="primary" class="ml20" @click="handleSet"
         >閰嶇疆鏈堝彴</el-button
       >
     </div>
     <!--  -->
-    <div class="platform_list">
-      <div class="item" v-for="i in 2">
+    <div v-if="activeGroup.platformList" class="platform_list">
+      <div class="item" :class="{ emyty: item.workStatus == 0 }" v-for="(item, i) in activeGroup.platformList" :key="i">
         <div class="head">
           <div class="left">
-            <div class="status mr10">浣滀笟涓�</div>
-            <div class="name">6鍙锋湀鍙�</div>
+            <div class="status mr10">
+              {{ item.workStatus == "0" ? "绌洪棽" : "浣滀笟涓�" }}
+            </div>
+            <div class="name">{{ item.name }}</div>
             <div class="ite">
-              <span class="placeholder9">浣滀笟锛�</span><span>1</span>
+              <span class="placeholder9">浣滀笟锛�</span
+              ><span>{{ item.platformWorkVO.workNum }}</span>
             </div>
             <div class="ite">
-              <span class="placeholder9">浣滀笟锛�</span><span>1</span>
+              <span class="placeholder9">宸插彨锛�</span
+              ><span>{{ item.platformWorkVO.callNum }}</span>
             </div>
             <div class="ite">
-              <span class="placeholder9">浣滀笟锛�</span><span class="red">1</span>
+              <span class="placeholder9">绛夊緟锛�</span
+              ><span>{{ item.platformWorkVO.waitNum }}</span>
+            </div>
+            <div class="ite">
+              <span class="placeholder9">寮傚父锛�</span
+              ><span class="red">{{ item.platformWorkVO.exceptionNum }}</span>
             </div>
           </div>
-          <el-button type="primary" @click="handleQueuing()">鍙彿</el-button>
+          <el-button type="primary" @click="handleQueuing(item)">
+            <div class="df_ac">
+              <img class="shengyin" src="@/assets/icons/shengyin.png" alt="">
+              <span>鍙彿</span>
+            </div>
+          </el-button>
         </div>
-        <div class="list">
-          <div class="info" v-for="j in 3">
+        <div
+          class="list"
+          v-if="item.platformWorkVO && item.platformWorkVO.platformJobList"
+        >
+          <div
+            class="info"
+            v-for="task in item.platformWorkVO.platformJobList"
+            :key="task.id"
+          >
             <div class="line">
               <div class="left">
-                <span class="plate">鐨朅12122</span>
+                <div v-if="task.carCodeFront" class="code">
+                  <span>{{ task.carCodeFront.slice(0, 1) }}</span>
+                  <span>{{ task.carCodeFront.slice(1, 2) }}</span>
+                  <span>路</span>
+                  <span>{{ task.carCodeFront.slice(2) }}</span>
+                </div>
               </div>
               <div class="right">
-                <span class="green">浣滀笟涓�</span>
-                <span class="green ml20">23鍒嗛挓26绉�</span>
+                <div
+                  class="status"
+                  v-if="task.status != 4 && task.status != 5"
+                  :class="{ red: task.status == 8 }"
+                >
+                  <span class="lab">{{ statusMap[task.status] }}</span>
+                </div>
+                <div class="status" v-if="task.status == 4">
+                  <span class="lab">鍙彿涓�</span> {{ task.callDateTemp }}
+                </div>
+                <div class="status scs" v-if="task.status == 5">
+                  <span class="lab">宸蹭綔涓�</span> {{ task.startDateTemp }}
+                </div>
               </div>
             </div>
             <div class="line">
-              <div class="ite">
+              <div v-if="task.type == 4" class="ite">
+                <span>鍚堝悓鍗曞彿锛�</span>
+                <span>{{ task.contractNum }}</span>
+              </div>
+              <div v-else class="ite">
                 <span>杩愯緭鍗曞彿锛�</span>
-                <span>202020</span>
+                <span>{{ task.code }}</span>
               </div>
               <div class="ite">
                 <span>椹鹃┒鍛橈細</span>
-                <span>202020</span>
+                <span>{{ task.driverName }}</span>
               </div>
               <div class="ite">
                 <span>鎵嬫満鍙凤細</span>
-                <span>202020</span>
+                <span>{{ task.drivierPhone }}</span>
               </div>
               <div class="ite">
                 <span>鎬昏繍杈撻噺锛�</span>
-                <span>202020</span>
+                <span>{{ task.totalNum }}涓囨敮</span>
               </div>
-              <div class="ite" style="width: 66.6%">
+              <div v-if="task.type != 4" class="ite" style="width: 66.6%">
                 <span>杩愯緭鍏徃锛�</span>
-                <span>20202dasd鐜╁効鐜╁効鐜╁効棰濆 棰濆0</span>
+                <span>{{ task.carrierName }}</span>
               </div>
               <div class="ite"></div>
             </div>
             <div class="line">
-              <div class="left">
+              <div v-if="task.type != 4" class="left">
                 <span class="primaryColor pointer" @click="handleDetail"
                   >杩愬崟璇︽儏</span
                 >
               </div>
+              <div v-else></div>
               <div class="right">
-                <el-button type="primary" @click="handleFinish()"
+                <el-button
+                  v-if="task.status == 5"
+                  plain
+                  @click="handleErr(task)"
+                  >寮傚父鎸傝捣</el-button
+                >
+                <el-button
+                  v-if="task.status == 5 || task.status == 8"
+                  plain
+                  @click="handleTransform(item, task)"
+                  >杞Щ鏈堝彴</el-button
+                >
+                <el-button
+                  v-if="task.status == 4"
+                  plain
+                  @click="handlePass(task)"
+                  >杩囧彿</el-button
+                >
+                <el-button
+                  v-if="task.status == 5 || task.status == 8"
+                  type="primary"
+                  @click="handleFinish(task)"
                   >浣滀笟瀹屾垚</el-button
                 >
-                <el-button plain>杞Щ鏈堝彴</el-button>
-                <el-button plain>寮傚父鎸傝捣</el-button>
+                <el-button
+                  v-if="task.status == 4"
+                  type="primary"
+                  @click="handleWork(task)"
+                  >寮�濮嬩綔涓�</el-button
+                >
               </div>
             </div>
           </div>
         </div>
+        <div v-if="!item.platformWorkVO.platformJobList || item.platformWorkVO.platformJobList.length == 0" class="empty_plat">
+          <img src="@/assets/images/default_nodata.png" alt="">
+          <div>鏆傛棤杞﹁締</div>
+        </div>
       </div>
     </div>
     <!-- 閰嶇疆鏄剧ず鏈堝彴 -->
-    <el-dialog
+    <GlobalWindow
       title="閰嶇疆鏄剧ず鏈堝彴"
       :visible.sync="isShowSet"
-      center
-      width="420px"
+      :confirm-working="setLoading"
+      @confirm="handleSetSub"
+      width="560px"
     >
       <div class="set_modal">
-        <div class="mb20">
-          <div class="title">鍏ュ簱鏈堝彴缁�</div>
+        <div class="mb10" v-for="group in PlatGroupList" :key="group.id">
+          <div class="title">{{group.name}}</div>
           <div class="list">
-            <div class="item active">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-          </div>
-        </div>
-        <div>
-          <div class="title">鍏ュ簱鏈堝彴缁�</div>
-          <div class="list">
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
+            <div class="item" @click="platformSetClick(item.id)" :class="{ active: item.showConfig }" v-for="item in group.platformList" :key="item.id">
+              <div>{{item.name}}</div>
+              <div v-if="item.showConfig" class="bg"></div>
+              <i v-if="item.showConfig" class="el-icon-check scs"></i>
+            </div>
           </div>
         </div>
       </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="setReset">閲嶇疆</el-button>
-        <el-button type="primary" @click="setSub">纭畾</el-button>
-      </span>
-    </el-dialog>
+    </GlobalWindow>
     <!-- 杩愬崟璇︽儏 -->
     <!--  -->
     <!-- 鍙彿 -->
-    <PlatformQueuing ref="PlatformQueuingRef" v-if="isShowQueuing" @success="getList" @close="isShowQueuing = false" />
-    <WaybillDetail ref="WaybillDetailRef" v-if="isShowDetail" @success="getList" @close="isShowDetail = false" />
+    <PlatformQueuing
+      ref="PlatformQueuingRef"
+      v-if="isShowQueuing"
+      @success="getPlatGroupList"
+      @close="isShowQueuing = false"
+    />
+    <WaybillDetail
+      ref="WaybillDetailRef"
+      v-if="isShowDetail"
+      @success="getList"
+      @close="isShowDetail = false"
+    />
+    <el-dialog
+      title="杞Щ鏈堝彴"
+      :visible.sync="isShowTransform"
+      width="500px"
+      style="margin-top: 12vh"
+    >
+      <div class="df_ac">
+        <span>閫夋嫨杞Щ鍒扮殑鏈堝彴锛�</span>
+        <el-select v-model="activePlatId">
+          <el-option
+            v-for="item in activeGroup.platformList"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowTransform = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="transformSub">纭畾</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { getPlatform, getPlatformJob } from '@/api'
+import {
+  getPlatformGroupList,
+  platformBeginWork,
+  platformFinishWork,
+  platformOverNumber,
+  platformErr,
+  platformMove,
+  updUserPlatformConfig,
+
+  listByGroupId
+} from '@/api'
 import PlatformQueuing from './components/PlatformQueuing.vue'
 import WaybillDetail from './components/WaybillDetail.vue'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+import { Message } from 'element-ui'
+import { statusMap } from './config'
+dayjs.extend(duration)
 export default {
   components: {
     PlatformQueuing,
-    WaybillDetail
+    WaybillDetail,
+    GlobalWindow
   },
   data () {
     return {
-      platformId: '',
-      PlatformList: [],
-      dataList: [],
+      statusMap,
+      activeGroup: {},
+      PlatGroupList: [],
+      platList: [],
+      platCallList: [],
+      isShowTransform: false,
+      activePlatId: '', // 杞Щ鏈堝彴
+      activetaskId: '',
 
       isShowSet: false, // 鏈堝彴閰嶇疆
+      setLoading: false,
+
       setParam: {},
       isShowDetail: false, // 杩愬崟璇︽儏
       detail: {},
-      isShowQueuing: false
+      isShowQueuing: false,
+      timer: null
     }
   },
   created () {
-    this.getPlatList()
-    this.getList()
+    this.getPlatGroupList()
+    // this.getList()
   },
   methods: {
-    handleQueuing (row) {
+    handleWork (item) {
+      platformBeginWork({ jobId: item.id }).then(res => {
+        Message.success('宸插紑濮嬩綔涓�')
+        this.getPlatGroupList()
+      })
+    },
+    handleFinish (item) {
+      platformFinishWork({ jobId: item.id }).then(res => {
+        Message.success('瀹屾垚浣滀笟')
+        this.getPlatGroupList()
+      })
+    },
+    handleTransform (item, task) {
+      this.activePlatId = item.id
+      this.activetaskId = task.id
+      this.isShowTransform = true
+    },
+    transformSub () {
+      const { activePlatId, activetaskId } = this
+      platformMove({ platformId: activePlatId, jobId: activetaskId }).then(res => {
+        Message.success('杞Щ鏈堝彴鎴愬姛')
+        this.isShowTransform = false
+        this.getPlatGroupList()
+      })
+    },
+    handlePass (item) {
+      this.$confirm('鎮ㄧ‘璁よ瀵硅浠诲姟杩涜杩囧彿鍚�', '娓╅Θ鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        platformOverNumber({ jobId: item.id }).then(ress => {
+          Message.success('杩囧彿鎴愬姛')
+          this.getPlatGroupList()
+        })
+      })
+    },
+    handleErr (item) {
+      this.$confirm('鎮ㄧ‘璁よ瀵硅浠诲姟杩涜寮傚父鎸傝捣鍚�', '娓╅Θ鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        platformErr({ jobId: item.id }).then(ress => {
+          Message.success('寮傚父鎸傝捣鎴愬姛')
+          this.getPlatGroupList()
+        })
+      })
+    },
+    platgroupClick (item) {
+      this.activeGroup = { ...item }
+      this.circulInitTaskList()
+      this.timer = setInterval(() => {
+        this.circulInitTaskList()
+      }, 1000)
+    },
+    getPlatGroupList () {
+      getPlatformGroupList({
+        queryData: 1,
+        queryType: 1
+      }).then(res => {
+        this.PlatGroupList = res || []
+        if (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.circulInitTaskList()
+          this.timer = setInterval(() => {
+            this.circulInitTaskList()
+          }, 1000)
+        }
+      })
+    },
+    circulInitTaskList () {
+      if (this.activeGroup && this.activeGroup.platformList && this.activeGroup.platformList.length > 0) {
+        const time = new Date()
+        this.activeGroup.platformList.forEach(plat => {
+          if (plat.platformWorkVO.platformJobList && plat.platformWorkVO.platformJobList.length > 0) {
+            plat.platformWorkVO.platformJobList.forEach(item => {
+              if (item.callDate) {
+                const timeNum = time.getTime() - new Date(item.callDate).getTime()
+                if (timeNum > 3600000) {
+                  item.callDateTemp = dayjs.duration(timeNum).format('H灏忔椂m鍒唖绉�')
+                } else {
+                  item.callDateTemp = dayjs.duration(timeNum).format('m鍒唖绉�')
+                }
+              }
+              if (item.startDate) {
+                const timeNum = time.getTime() - new Date(item.startDate).getTime()
+                if (timeNum > 3600000) {
+                  item.startDateTemp = dayjs.duration(timeNum).format('H灏忔椂m鍒唖s绉�')
+                } else {
+                  item.startDateTemp = dayjs.duration(timeNum).format('m鍒唖绉�')
+                }
+              }
+            })
+          }
+        })
+        this.$forceUpdate()
+      }
+    },
+    handleQueuing (item) {
       this.isShowQueuing = true
       this.$nextTick(() => {
         this.$refs.PlatformQueuingRef.isShowModal = true
+        this.$refs.PlatformQueuingRef.activePlat = { ...item }
+        this.$refs.PlatformQueuingRef.getList()
       })
     },
     handleDetail () {
@@ -159,32 +398,44 @@
       })
     },
     getList () {
-      const { platformId } = this
-      getPlatformJob({
-        model: { platformId }
-      }).then(res => {
-        this.dataList = res.records
-      })
-    },
-    handleFinish (item) {
-      this.$confirm('楂樻灦搴�6鍙锋湀鍙� 鐨朅12345 浣滀笟缁撴潫', '娓╅Θ鎻愮ず', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      })
-    },
-    getPlatList () {
-      getPlatform({
-        model: {}
-      }).then(res => {
-        this.PlatformList = res.records
+      const { groupId } = this
+      listByGroupId(groupId).then(res => {
+        this.platList = res
       })
     },
     handleSet () {
       this.isShowSet = true
     },
-    setReset () { },
-    setSub () { }
+    handleSetSub () {
+      const { PlatGroupList } = this
+      const ids = []
+      PlatGroupList.forEach(item => {
+        item.platformList.forEach(platform => {
+          if (platform.showConfig) {
+            ids.push(platform.id)
+          }
+        })
+      })
+      this.setLoading = true
+      updUserPlatformConfig(ids).then(res => {
+        this.setLoading = false
+        Message.success('鏇存柊鎴愬姛')
+        this.isShowSet = false
+        this.getPlatGroupList()
+      }, () => {
+        this.setLoading = false
+      })
+    },
+    platformSetClick (id) {
+      const { PlatGroupList } = this
+      PlatGroupList.forEach(item => {
+        item.platformList.forEach(platform => {
+          if (platform.id === id) {
+            platform.showConfig = !platform.showConfig
+          }
+        })
+      })
+    }
   }
 }
 </script>
@@ -192,20 +443,27 @@
 <style lang="scss" scoped>
 @import "@/assets/style/variables.scss";
 .platform_list {
+  width: 100%;
   .item {
     /* padding: 16px 24px; */
     background: #ffffff;
     border-radius: 2px;
     border: 1px solid #dfe2e8;
     margin-bottom: 12px;
+    width: 100%;
     .head {
       display: flex;
       justify-content: space-between;
       align-items: center;
       height: 50px;
-      background: linear-gradient(270deg, #ffffff 0%, #ebf6f7 100%);
+      background: linear-gradient( 270deg, #FFFFFF 0%, #EBF6F7 100%);
       border-radius: 2px 2px 0px 0px;
-      padding: 0 28px;
+      padding: 0 20px;
+      .shengyin{
+        width: 12px;
+        height: 12px;
+        margin-right: 3px;
+      }
       .left {
         flex: 1;
         display: flex;
@@ -217,10 +475,10 @@
         .status {
           line-height: 25px;
           height: 25px;
-          padding: 0 4px;
           background: #00ba67;
           border-radius: 2px;
           color: #ffffff;
+          padding: 0 6px;
         }
         .ite {
           margin-right: 30px;
@@ -233,37 +491,53 @@
       justify-content: space-between;
       margin-top: 10px;
       padding: 16px;
+      width: calc( 100% - 48px );
       .info {
-        background: #effbf5;
+        background: #f4fafb;
         border-radius: 2px;
         border: 1px solid #dfe2e8;
         padding: 16px;
         border-radius: 2px;
         margin-bottom: 10px;
-        width: 30%;
+        width: calc( 31.6% - 16px );
+        .status {
+          .lab {
+            font-weight: 500;
+          }
+          color: #00ba67;
+        }
         .line {
           display: flex;
           align-items: center;
           justify-content: space-between;
           flex-wrap: wrap;
           margin-bottom: 6px;
-          span {
-            &:nth-child(1) {
-              color: #999999;
-            }
-          }
           .ite {
             width: 33.3%;
             margin-top: 8px;
           }
           .left {
-            .plate {
+            .code {
+              display: flex;
+              font-weight: 600;
+              height: 30px;
+              line-height: 30px;
               font-size: 15px;
               color: #111111;
-              padding: 4px 5px;
-              font-weight: 700;
-              border: 1px solid #279baa;
               background-color: #fff;
+              border-radius: 4px;
+              border: 1px solid $primaryColor;
+              padding-right: 4px;
+              span {
+                &:nth-of-type(1) {
+                  background: $primaryColor;
+                  padding: 0 8px;
+                  color: #fff;
+                }
+                &:nth-of-type(2) {
+                  padding-left: 4px;
+                }
+              }
             }
           }
           .right {
@@ -272,16 +546,69 @@
           }
         }
       }
+      .jobing {
+        background: #effbf5;
+        .status {
+          color: #00ba67;
+        }
+      }
+      .err {
+        background: #fef6f6;
+        .status {
+          color: #ed4545;
+        }
+      }
+    }
+    .empty_plat{
+      width: 100%;
+      height: 170px;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      font-size: 12px;
+      color: #B2B2B2;
+      img{
+        width: 110px;
+      }
+    }
+  }
+  .emyty{
+    .head{
+      background: linear-gradient( 270deg, #FFFFFF 0%, #F7F7F7 100%) !important;
+    }
+    .status{
+      background: #CCCCCC !important;
     }
   }
 }
-
-.main_head {
+.main_header {
   display: flex;
-  justify-content: space-between;
-  align-items: center;
-  .tabs {
+  position: relative;
+  .platgroup_tabs {
     flex: 1;
+    display: flex;
+    border-bottom: 1px solid #dfe2e8;
+    .tab {
+      color: #666666;
+      margin-right: 40px;
+      cursor: pointer;
+      padding-bottom: 18px;
+      border-bottom: 2px solid #fff;
+    }
+    .active {
+      font-weight: 500;
+      font-size: 15px;
+      color: #222222;
+      border-bottom: 2px solid $primary-color;
+    }
+  }
+  .ml20 {
+    position: absolute;
+    width: 120px;
+    height: 36px;
+    right: 0;
+    top: -4px;
   }
 }
 /*  */
@@ -293,23 +620,42 @@
   }
   .list {
     display: flex;
-    justify-content: space-between;
     flex-wrap: wrap;
     .item {
       cursor: pointer;
-      width: 30%;
-      height: 32px;
+      padding: 0 36px;
+      height: 36px;
       border: 1px solid #dfe2e8;
       display: flex;
       justify-content: center;
       align-items: center;
       border-radius: 2px;
-      margin-bottom: 12px;
+      margin-bottom: 10px;
+      margin-right: 13px;
+      position: relative;
+      overflow: hidden;
+      .bg{
+        position: absolute;
+        right: -12px;
+        bottom: -12px;
+        width: 24px;
+        height: 24px;
+        background: $primaryColor;
+        transform: rotate(45deg);
+      }
+      .scs{
+        position: absolute;
+        right: -1px;
+        bottom: -1px;
+        color: #fff;
+        z-index: 99999;
+        transform:scale(.8)
+      }
     }
     .active {
-      background: rgba(39, 155, 170, 0.06);
-      border: 1px solid #279baa;
-      color: #279baa;
+      background: rgba(39,155,170,0.06);
+      border: 1px solid $primaryColor;
+      color: $primaryColor;
     }
   }
 }
diff --git a/admin/src/views/platform/queueUp.vue b/admin/src/views/platform/queueUp.vue
index 9ad3106..785983c 100644
--- a/admin/src/views/platform/queueUp.vue
+++ b/admin/src/views/platform/queueUp.vue
@@ -1,129 +1,31 @@
 <template>
   <div class="main_app">
-    <div class="df_ac mb20">
-      <el-select v-model="filters.currentPlatform" class="w300">
-        <el-option v-for="item in platformList" :key="item.id"></el-option>
-      </el-select>
-      <el-input v-model="filters.id" placeholder="杞︾墝鍙�" class="ml20 w200" />
-      <el-button type="primary" class="ml20" @click="getList()">鏌ヨ</el-button>
-      <el-button class="ml20" @click="clear">閲嶇疆</el-button>
+    <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"
+        >
+          {{ item.name }}
+        </div>
     </div>
-    <!--  -->
-    <div class="platform_list">
-      <div class="item" v-for="i in 2">
-        <div class="head">
-          <div class="name">6鍙锋湀鍙�</div>
-          <div class="status">
-            <span class="green">浣滀笟涓�</span>
-            <span class="">浣滀笟锛�1</span>
-            <span>鍙彿锛�1</span>
-            <span>绛夊緟锛�1</span>
-            <span class="red">寮傚父锛�1</span>
-          </div>
-          <!-- <el-button type="primary">鍙彿</el-button> -->
-        </div>
-        <div class="info" v-for="j in 3">
-          <div class="line">
-            <div class="left">
-              <span class="plate mr20">鐨朅12122</span>
-              <span class="placeholder9">椹鹃┒鍛�</span>
-              <span>鐜嬫煇鏌�</span>
-              <span>18888888888</span>
-            </div>
-            <div class="right">
-              <span class="green">浣滀笟涓�</span>
-              <span class="placeholder9 ml20">浣滀笟鏃堕暱锛�23鍒嗛挓26绉�</span>
-            </div>
-          </div>
-          <div class="line">
-            <div class="left">
-              <div>
-                <span>杩愯緭鍗曞彿</span
-                ><span class="ml10 placeholder9">1231231</span>
-              </div>
-              <div>
-                <span>鎬昏繍杈撻噺</span
-                ><span class="ml10 placeholder9">3000涓囨敮</span
-                ><span class="primaryColor ml10 pointer">杩愬崟璇︽儏</span>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
     </div>
-    <!-- 閰嶇疆鏄剧ず鏈堝彴 -->
-    <el-dialog
-      title="閰嶇疆鏄剧ず鏈堝彴"
-      :visible.sync="isShowSet"
-      center
-      width="420px"
-    >
-      <div class="set_modal">
-        <div class="mb20">
-          <div class="title">鍏ュ簱鏈堝彴缁�</div>
-          <div class="list">
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-          </div>
-        </div>
-        <div>
-          <div class="title">鍏ュ簱鏈堝彴缁�</div>
-          <div class="list">
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-          </div>
-        </div>
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="setReset">閲嶇疆</el-button>
-        <el-button type="primary" @click="setSub">纭畾</el-button>
-      </span>
-    </el-dialog>
-    <!-- 杩愬崟璇︽儏 -->
-    <el-dialog
-      title="閰嶇疆鏄剧ず鏈堝彴"
-      :visible.sync="isShowSet"
-      center
-      width="420px"
-    >
-      <div class="set_modal">
-        <div class="mb20">
-          <div class="title">鍏ュ簱鏈堝彴缁�</div>
-          <div class="list">
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-          </div>
-        </div>
-        <div>
-          <div class="title">鍏ュ簱鏈堝彴缁�</div>
-          <div class="list">
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-            <div class="item">1鍙锋湀鍙�</div>
-            <div class="item">2鍙锋湀鍙�</div>
-          </div>
-        </div>
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="setReset">閲嶇疆</el-button>
-        <el-button type="primary" @click="setSub">纭畾</el-button>
-      </span>
-    </el-dialog>
   </div>
 </template>
 
 <script>
+import {
+  getPlatformGroupList
+} from '@/api'
 export default {
   data () {
     return {
       filters: {},
-      platformList: [],
+      activeGroup: {},
+      PlatGroupList: [],
 
       isShowSet: false, // 鏈堝彴閰嶇疆
       setParam: {},
@@ -131,7 +33,26 @@
       detail: {}
     }
   },
+  created () {
+    this.getPlatGroupList()
+  },
   methods: {
+    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]
+        }
+      })
+    },
+    platgroupClick (item) {
+      this.activeGroup = { ...item }
+    },
     getList () { },
     clear () { }
   }
@@ -139,75 +60,24 @@
 </script>
 
 <style lang="scss" scoped>
-.platform_list {
-  .item {
-    padding: 16px 24px;
-    border-radius: 2px;
-    border: 2px solid #cccccc;
-    margin-bottom: 12px;
-    .head {
-      display: flex;
-      justify-content: space-between;
-      .name {
-        font-size: 16px;
-      }
-      .status {
-        flex: 1;
-        margin-left: 50px;
-        span {
-          margin-right: 30px;
-        }
-      }
-    }
-    .info {
-      margin-top: 10px;
-      border: 1px solid #999999;
-      padding: 6px 8px;
-      border-radius: 2px;
-      margin-bottom: 10px;
-      .line {
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        margin-bottom: 6px;
-        .left {
-          .plate {
-            border: 1px solid #4969f6;
-            border-radius: 2px;
-            padding: 0 5px;
-          }
-        }
-        .right {
-          display: flex;
-          align-items: center;
-        }
-      }
-    }
-  }
-}
-
-/*  */
-.set_modal {
-  .title {
-    font-size: 16px;
-    font-weight: 600;
-    margin-bottom: 16px;
-  }
-  .list {
+@import "@/assets/style/variables.scss";
+.main_header {
+  .platgroup_tabs {
+    flex: 1;
     display: flex;
-    justify-content: space-between;
-    flex-wrap: wrap;
-    .item {
+    border-bottom: 1px solid #dfe2e8;
+    .tab {
+      color: #666666;
+      margin-right: 40px;
       cursor: pointer;
-      width: 30%;
-      height: 32px;
-      background-color: #d9d9d9;
-      border: 1px solid #4d99a7;
-      display: flex;
-      justify-content: center;
-      align-items: center;
-      border-radius: 6px;
-      margin-bottom: 12px;
+      padding-bottom: 18px;
+      border-bottom: 2px solid #fff;
+    }
+    .active {
+      font-weight: 500;
+      font-size: 15px;
+      color: #222222;
+      border-bottom: 2px solid $primary-color;
     }
   }
 }
diff --git a/h5/App.vue b/h5/App.vue
index fbec5c3..137957d 100644
--- a/h5/App.vue
+++ b/h5/App.vue
@@ -125,6 +125,9 @@
   color: #999999 !important;
   font-size: 28rpx;
 }
+.red{
+	color: red !important;
+}
 
 //璁剧疆鍦嗚
 checkbox .uni-checkbox-input {
@@ -225,6 +228,9 @@
 .ml12 {
   margin-left: 12rpx;
 }
+.ml6 {
+  margin-left: 6rpx;
+}
 .mt6 {
   margin-top: 6rpx;
 }
diff --git a/h5/api/driver.js b/h5/api/driver.js
index 99bc2ca..22aaa04 100644
--- a/h5/api/driver.js
+++ b/h5/api/driver.js
@@ -96,4 +96,20 @@
     method: 'post',
     data
   })
+}
+// 浠诲姟纭
+export const driverConfirmTask = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/driverPlatform/confirmTask',
+    method: 'post',
+    data
+  })
+}
+// 浠诲姟绛惧埌
+export const driverSignInTask = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/driverPlatform/signIn',
+    method: 'post',
+    data
+  })
 }
\ No newline at end of file
diff --git a/h5/main.js b/h5/main.js
index 41c035c..8a3b147 100644
--- a/h5/main.js
+++ b/h5/main.js
@@ -16,12 +16,14 @@
 Vue.component('navigation', navigation)
 Vue.prototype.$store = store
 Vue.prototype.$jump = (url) => {uni.navigateTo({url})}
-Vue.prototype.$goBack = () => { uni.navigateBack() }
+Vue.prototype.$goBack = () => { setTimeout(() => {uni.navigateBack()},300) }
 Vue.prototype.showToast = (str) => {
-	uni.showToast({
-	  title: str,
-	  icon: 'none',
-	  duration: 2000
+	setTimeout(() => {
+		uni.showToast({
+		  title: str,
+		  icon: 'none',
+		  duration: 2000
+		})
 	})
 }
 Vue.prototype.$eventBus = new Vue()
diff --git a/h5/manifest.json b/h5/manifest.json
index 22a90b7..ad55f2c 100644
--- a/h5/manifest.json
+++ b/h5/manifest.json
@@ -92,7 +92,7 @@
                 "/admin_interface" : {
                     // 杩欎釜瀛楁鍚嶉渶涓庝綘閰嶇疆鐨刡asePrefixUrl涓�鑷达紝绯荤粺璇嗗埆鍒板甫鏈�/dev-api璇锋眰鐨勫湴鍧�鏃讹紝浼氬湪鍓嶉潰鎷兼帴涓婁唬鐞嗘湇鍔″櫒鍦板潃
                     // "target" : "http://192.168.0.173/admin_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
-                    "target" : "http://192.168.0.135:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    "target" : "http://192.168.0.139:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
                     "changeOrigin" : true, // 鍏佽璺ㄥ煙 
                     "pathRewrite" : {
                         "^/admin_interface" : "" // 閲嶅啓鍦板潃锛屽鏋滃疄闄呮帴鍙d腑鏄笉甯�/dev-api锛岄渶瑕佸皢杩欎釜鍓嶇紑缃┖锛屽洜涓鸿繖涓墠缂�鍙槸涓轰簡璇嗗埆鐢紝璇嗗埆瀹屼箣鍚庡氨娌$敤浜�
diff --git a/h5/pages/driver/forgetPsd.vue b/h5/pages/driver/forgetPsd.vue
index 7512424..2330ee2 100644
--- a/h5/pages/driver/forgetPsd.vue
+++ b/h5/pages/driver/forgetPsd.vue
@@ -7,7 +7,7 @@
     <view class="login_list">
       <view class="login_list_item">
         <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
-        <input v-model="form.phone" maxlength="18" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
+        <input v-model="form.phone" :maxlength="11" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
       </view>
       <view class="login_list_item">
         <image src="@/static/ic_captcha.png" mode="widthFix"></image>
@@ -55,7 +55,10 @@
     }
   },
 
-  onLoad() {
+  onLoad(option) {
+		if(option.phone){
+			this.$set(this.form, 'phone', option.phone)
+		}
   },
 
   methods: {
@@ -102,16 +105,12 @@
         ...form
       }).then(res => {
         if (res && res.code == 200) {
+					this.showToast('瀵嗙爜淇敼鎴愬姛,璇烽噸鏂扮櫥褰�')
           setTimeout(() => {
-            uni.showToast({
-              title: '瀵嗙爜淇敼鎴愬姛,璇烽噸鏂扮櫥褰�',
-              icon: 'success',
-              duration: 2000
-            })
-          })
-          uni.redirectTo({
-            url: "/pages/staffLogin/login"
-          })
+						uni.redirectTo({
+						  url: "/pages/driver/login"
+						})
+					}, 500)
         }
       })
     }
diff --git a/h5/pages/driver/index.vue b/h5/pages/driver/index.vue
index 43cd875..f8350f4 100644
--- a/h5/pages/driver/index.vue
+++ b/h5/pages/driver/index.vue
@@ -11,9 +11,9 @@
 			<image class="banner" src="../../static/driver/wuliuche_banner@2x.png" mode="widthFix"></image>
 		</view>
 		<!--  -->
-		<view class="task_list">
+		<view v-if="taskList && taskList.length > 0" class="task_list">
 			<swiper circular class="task_swiper">
-				<swiper-item v-for="item in taskList" :key="item.id">
+				<swiper-item v-for="item in taskList" :key="item.id" @click="taskClick(item)">
 					<view class="item">
 						<view class="head">
 							<view class="name">杩愯緭鍗晎{ item.contractNum }}</view>
@@ -41,9 +41,9 @@
 							</view>
 							<view class="sub">
 								<view class="time" v-if="item.arriveDate">{{ item.arriveDate.slice(5) }}</view>
-								<view v-if="item.status == 0" class="sub_btn" @click="handleTask(item)">纭浠诲姟</view>
-								<view v-if="item.status == 1" class="sub_btn" @click="handleSign(item)">绔嬪嵆绛惧埌</view>
-								<view v-if="item.status == 2" class="sub_btn" @click="handleQueup(item)">鏌ョ湅鎺掗槦</view>
+								<view v-if="item.status == 0" class="sub_btn">纭浠诲姟</view>
+								<view v-if="item.status == 1" class="sub_btn">绔嬪嵆绛惧埌</view>
+								<view v-if="item.status == 2" class="sub_btn">鏌ョ湅鎺掗槦</view>
 							</view>
 						</view>
 					</view>
@@ -101,22 +101,17 @@
 			
 		};
 	},
-	created() {
+	onShow() {
 		this.initData();
 	},
 	methods: {
-		handleSign(item) {
-			uni.navigateTo({
-				url: '/pages/driver/taskDetail?id=' + item.id
-			});
-		},
-		handleQueup(item) {},
 		initData() {
 			driverHomeData().then(res => {
 				if (res.code == 200) {
 					uni.setStorageSync('driverGuide', {
 						bookingTips: res.data.bookingTips,
-						reservationMap: res.data.reservationMap
+						reservationMap: res.data.reservationMap,
+						signDistance: res.data.signDistance
 					});
 					this.taskList = res.data.platformJobList || []
 				}
@@ -129,16 +124,32 @@
 				url: '/pages/driver/login'
 			});
 		},
-		handleTask(status) {
-			if (status == 1) {
-				return uni.navigateTo({
-					url: '/pages/driver/taskDetail'
-				});
+		taskClick(item) {
+			const status = item.status
+			console.log(item);
+			if(status == 0){
+				uni.navigateTo({url: '/pages/driver/taskConfirm?id=' + item.id});
+			}else if(status == 2){
+				uni.navigateTo({url:'/pages/driver/queueUp?jobId=' + item.id})
+			}else{
+				uni.navigateTo({url: `/pages/driver/taskDetail?id=${item.id}&status=${item.status}`});
 			}
+		},
+		handleTask(item) {
 			uni.navigateTo({
-				url: '/pages/driver/taskConfirm'
+				url: '/pages/driver/taskConfirm?id=' + item.id
 			});
-		}
+		},
+		handleSign(item) {
+			uni.navigateTo({
+				url: `/pages/driver/taskDetail?id=${item.id}&status=${item.status}`
+			});
+		},
+		handleQueue(item) {
+			uni.navigateTo({
+				url:'/pages/driver/queueUp?jobId=' + item.id	
+			})
+		},
 	}
 };
 </script>
@@ -175,7 +186,7 @@
 	position: relative;
 	width: 688rpx;
 	height: 270rpx;
-	margin-bottom: 40rpx;
+	margin-bottom: 28rpx;
 	.h1 {
 		font-weight: bold;
 		line-height: 66rpx;
@@ -249,17 +260,17 @@
 	}
 }
 .task_list {
-	margin-bottom: 48rpx;
+	margin-bottom: 0rpx;
 	.task_swiper {
-		padding: 16rpx 10rpx;
-		height: 320rpx;
+		padding: 12rpx 10rpx;
+		height: 340rpx;
 		width: 730rpx;
 		margin-left: -20rpx;
 		box-sizing: border-box;
 	}
 	.item {
 		background: #ffffff;
-		box-shadow: 0rpx 0rpx 12rpx 0rpx rgba(39, 155, 170, 0.32);
+		box-shadow: 0rpx 6rpx 24rpx 0rpx rgba(39, 155, 170, 0.32);
 		border-radius: 16rpx;
 		height: 280rpx;
 		width: 98%;
diff --git a/h5/pages/driver/login.vue b/h5/pages/driver/login.vue
index 1372f80..2ea23f3 100644
--- a/h5/pages/driver/login.vue
+++ b/h5/pages/driver/login.vue
@@ -57,7 +57,7 @@
 		},
 		handleSetPsd() {
 			uni.navigateTo({
-				url: "/pages/driver/forgetPsd"
+				url: "/pages/driver/forgetPsd?phone=" + this.form.username
 			})
 		},
     dealChange(e) {
diff --git a/h5/pages/driver/queueUp.vue b/h5/pages/driver/queueUp.vue
index 2b13d91..eed4c69 100644
--- a/h5/pages/driver/queueUp.vue
+++ b/h5/pages/driver/queueUp.vue
@@ -1,15 +1,19 @@
 <template>
   <view class="main_app">
     <view class="main_name">
-      <text class="mr12">鐗╂祦鍏ュ簱鏈堝彴</text>
+      <text class="mr12" @click="showPlat = true">{{
+        activePlatform.name
+      }}</text>
       <u-icon name="arrow-down" color="#777777"></u-icon>
     </view>
     <!--  -->
     <view class="main_list">
-      <view class="item" @click="handleCheck()">
+      <view class="item" @click="handleCheck(1)">
         <view class="h1">浣滀笟涓溅杈�</view>
         <view class="h2">
-          <text>4</text>
+          <text v-if="activePlatform.signJobList">{{
+            activePlatform.workJobList.length
+          }}</text>
           <text class="unit">杈�</text>
         </view>
         <image
@@ -18,10 +22,12 @@
           mode=""
         ></image>
       </view>
-      <view class="item cyan">
-        <view class="h1">浣滀笟涓溅杈�</view>
+      <view class="item cyan" @click="handleCheck(0)">
+        <view class="h1">宸茬鍒拌溅杈�</view>
         <view class="h2">
-          <text>4</text>
+          <text v-if="activePlatform.workJobList">{{
+            activePlatform.signJobList.length
+          }}</text>
           <text class="unit">杈�</text>
         </view>
         <image
@@ -31,31 +37,61 @@
         ></image>
       </view>
     </view>
+
+    <u-picker
+      :show="showPlat"
+      keyName="name"
+      :columns="[platformGroupList]"
+      @cancel="showPlat = false"
+      @confirm="platConfirm"
+    ></u-picker>
   </view>
 </template>
 
 <script>
-	import { driverLineUpDetail } from '@/api'
+import { driverLineUpDetail } from '@/api'
 export default {
   data() {
     return {
-
+      activePlatform: {},
+      platformGroupList: [],
+      showPlat: false,
+			jobId: ''
     }
   },
-	onLoad() {
-		this.getData()
-	},
+  onLoad(option) {
+		this.jobId = option.jobId
+    this.getData(option.jobId || '')
+  },
   methods: {
-		getData() {
-			driverLineUpDetail({
-				  mobile: uni.getStorageSync('driverInfo').mobile,
-				  queryType: 0
-			})
-		},
-    handleCheck() {
-      uni.navigateTo({
-        url: "/pages/driver/queueUpRecord"
+    getData(jobId) {
+      driverLineUpDetail({
+        mobile: jobId ? '' : uni.getStorageSync('driverInfo').mobile,
+        queryType: jobId ? 1 : 0,
+        jobId: jobId
+      }).then(res => {
+        this.platformGroupList = res.data.platformGroupList
+        if (res.data && res.data.platformGroupList && res.data.platformGroupList.length > 0) {
+          this.activePlatform = res.data.platformGroupList[0]
+        }
       })
+    },
+    platConfirm(e) {
+      const index = e.indexs[0]
+      this.activePlatform = this.platformGroupList[index]
+      this.showPlat = false
+    },
+    handleCheck(type) {
+			if(this.jobId){
+				uni.navigateTo({
+				  url: `/pages/driver/queueUpRecord?type=${type}&platformId=${this.activePlatform.id}&jobId=${this.jobId}`
+				})
+			}else{
+				uni.navigateTo({
+				  url: `/pages/driver/queueUpRecord?type=${type}&platformId=${this.activePlatform.id}`
+				})
+			}
+      
     }
   }
 }
diff --git a/h5/pages/driver/queueUpRecord.vue b/h5/pages/driver/queueUpRecord.vue
index 000730d..de92b96 100644
--- a/h5/pages/driver/queueUpRecord.vue
+++ b/h5/pages/driver/queueUpRecord.vue
@@ -1,147 +1,193 @@
 <template>
-  <view class="main_app">
-    <view class="main_name">
-      <text class="mr12">鐗╂祦鍏ュ簱鏈堝彴</text>
-      <u-icon name="arrow-down" color="#777777"></u-icon>
-    </view>
-    <!--  -->
-    <view class="main_list">
-      <view class="item">
-        <view class="status">浣滀笟涓�</view>
-        <image
-          class="avatar"
-          src="@/static/driver/ic_truck@2x.png"
-          mode=""
-        ></image>
-        <view class="content">
-          <view class="id_card">鐨朅</view>
-          <view class="line">
-            <view class="address">4鍙锋湀鍙�</view>
-            <view class="time">
-              <u-icon class="mr6" name="clock" color="#4d98a8"></u-icon>
-              <text>01:02:02</text>
-            </view>
-          </view>
-        </view>
-      </view>
-      <view class="item active">
-        <view class="status padding">浣滀笟涓�</view>
-        <view class="me">鎴�</view>
-        <image
-          class="avatar"
-          src="@/static/driver/ic_truck@2x.png"
-          mode=""
-        ></image>
-        <view class="content">
-          <view class="id_card">鐨朅</view>
-          <view class="line">
-            <view class="address">4鍙锋湀鍙�</view>
-            <view class="time">
-              <u-icon class="mr6" name="clock" color="#4d98a8"></u-icon>
-              <text>01:02:02</text>
-            </view>
-          </view>
-        </view>
-      </view>
-    </view>
-  </view>
+	<view class="main_app">
+		<view class="main_name">
+			<text class="mr12">{{ platformObj.name }}</text>
+			<!-- <u-icon name="arrow-down" color="#777777"></u-icon> -->
+		</view>
+		<!--  -->
+		<view class="main_list">
+			<view class="item" :class="{ active: item.driverId == driverInfo.memberId }" v-for="item in dataList" :key="item.id">
+				<view class="status padding" v-if="item.status == 2">鎺掗槦涓�</view>
+				<view class="status" v-else :class="{ padding: item.status != 5 }">{{ statusMap[item.status] }}</view>
+				<view v-if="item.driverId == driverInfo.memberId" class="me">鎴�</view>
+				<image v-if="item.driverId == driverInfo.memberId" class="avatar" src="@/static/driver/ic_truck_mine@2x.png" mode=""></image>
+				<image v-else class="avatar" src="@/static/driver/ic_truck@2x.png" mode=""></image>
+				<view class="content">
+					<view class="id_card" v-if="item.carCodeFront">{{ item.carCodeFront.slice(0, 4) }}**{{ item.carCodeFront.slice(6) }}</view>
+					<view class="line">
+						<view class="address">{{ item.platformName || '绛夊緟鍒嗛厤鏈堝彴' }}</view>
+						<view class="time" v-if="item.status == 5">
+							<u-icon class="mr6" name="clock" color="#4d98a8"></u-icon>
+							<text>{{item.callDateTemp}}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
 </template>
 
 <script>
+import { driverLineUpDetail } from '@/api';
+import { statusMap } from '@/utils/config.js';
+import dayjs from 'dayjs';
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
 export default {
-  data() {
-    return {
-
-    }
-  }
-}
+	data() {
+		return {
+			statusMap,
+			platformId: '',
+			type: '',
+			dataList: [],
+			platformObj: {},
+			driverInfo: uni.getStorageSync('driverInfo')
+		};
+	},
+	onLoad(option) {
+		this.type = option.type;
+		this.platformId = option.platformId;
+		this.getData(option.jobId || '');
+	},
+	methods: {
+		getData(jobId) {
+			const { platformId, type } = this;
+			driverLineUpDetail({
+				mobile: jobId ? '' : uni.getStorageSync('driverInfo').mobile,
+				queryType: jobId ? 1 : 0,
+				jobId: jobId
+			}).then(res => {
+				this.platformGroupList = res.data.platformGroupList;
+				if (res.data && res.data.platformGroupList && res.data.platformGroupList.length > 0) {
+					res.data.platformGroupList.forEach(item => {
+						if (item.id == platformId) {
+							this.platformObj = { ...item };
+							if (type == 0) {
+								this.dataList = item.signJobList;
+							} else {
+								this.dataList = item.workJobList;
+							}
+							this.circulInitTaskList()
+							setInterval(() => {
+								this.circulInitTaskList()
+							}, 1000)
+						}
+					});
+				}
+			});
+		},
+		circulInitTaskList() {
+				let time = new Date();
+				this.dataList.forEach(item => {
+					if (item.callDate) {
+						let timeNum = time.getTime() - new Date(item.callDate).getTime();
+						if (timeNum > 3600000) {
+							item.callDateTemp = dayjs.duration(timeNum).format('HH:mm:ss');
+						} else {
+							item.callDateTemp = dayjs.duration(timeNum).format('mm:ss');
+						}
+					}
+					if (item.startDate) {
+						let timeNum = time.getTime() - new Date(item.startDate).getTime();
+						if (timeNum > 3600000) {
+							item.startDateTemp = dayjs.duration(timeNum).format('HH:mm:ss');
+						} else {
+							item.startDateTemp = dayjs.duration(timeNum).format('mm:ss');
+						}
+					}
+				});
+				this.$forceUpdate();
+		}
+	}
+};
 </script>
 
 <style lang="scss">
 page {
-  background-color: #f7f7f7;
+	background-color: #f7f7f7;
 }
 .main_app {
-  .main_name {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    height: 104rpx;
-    font-weight: 600;
-    font-size: 32rpx;
-    color: #111111;
-    background-color: #fff;
-    margin: 0 -30rpx 20rpx;
-  }
-  .main_list {
-    .item {
-      display: flex;
-      align-items: center;
-      position: relative;
-      padding: 30rpx;
-      background-color: #fff;
-      margin-bottom: 20rpx;
-      border-radius: 8rpx;
-      .status {
-        position: absolute;
-        top: 0;
-        right: 0;
-        height: 50rpx;
-        line-height: 50rpx;
-        padding: 0 20rpx;
-        background: $uni-color-primary;
-        color: #fff;
-        font-size: 26rpx;
-        border-radius: 0rpx 8rpx 0rpx 25rpx;
-      }
-      .me {
-        position: absolute;
-        top: 0;
-        left: 0;
-        background: #00ba67;
-        border-radius: 8rpx 0rpx 8rpx 0rpx;
-        height: 42rpx;
-        line-height: 42rpx;
-        width: 64rpx;
-        text-align: center;
-        color: #fff;
-        font-size: 24rpx;
-        z-index: 11;
-      }
-      .padding {
-        background: #e9f5f6;
-        color: $uni-color-primary;
-      }
-      .avatar {
-        width: 84rpx;
-        height: 84rpx;
-        margin-right: 20rpx;
-      }
-      .content {
-        flex: 1;
-        .id_card {
-          font-weight: 600;
-          font-size: 30rpx;
-          color: #111111;
-        }
-        .line {
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
-          font-size: 26rpx;
-          color: #999999;
-          margin-top: 6rpx;
-          .time {
-            display: flex;
-            align-items: center;
-            color: $uni-color-primary;
-          }
-        }
-      }
-    }
-    .active {
-      background: linear-gradient(270deg, #ffffff 0%, #e1f7fe 100%);
-    }
-  }
+	.main_name {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		height: 104rpx;
+		font-weight: 600;
+		font-size: 32rpx;
+		color: #111111;
+		background-color: #fff;
+		margin: 0 -30rpx 20rpx;
+	}
+	.main_list {
+		.item {
+			display: flex;
+			align-items: center;
+			position: relative;
+			padding: 30rpx;
+			background-color: #fff;
+			margin-bottom: 20rpx;
+			border-radius: 8rpx;
+			.status {
+				position: absolute;
+				top: 0;
+				right: 0;
+				height: 50rpx;
+				line-height: 50rpx;
+				padding: 0 20rpx;
+				background: $uni-color-primary;
+				color: #fff;
+				font-size: 26rpx;
+				border-radius: 0rpx 8rpx 0rpx 25rpx;
+			}
+			.me {
+				position: absolute;
+				top: 0;
+				left: 0;
+				background: #00ba67;
+				border-radius: 8rpx 0rpx 8rpx 0rpx;
+				height: 42rpx;
+				line-height: 42rpx;
+				width: 64rpx;
+				text-align: center;
+				color: #fff;
+				font-size: 24rpx;
+				z-index: 11;
+			}
+			.padding {
+				background: #e9f5f6;
+				color: $uni-color-primary;
+			}
+			.avatar {
+				width: 84rpx;
+				height: 84rpx;
+				margin-right: 20rpx;
+				background-color: #fff;
+			}
+			.content {
+				flex: 1;
+				.id_card {
+					font-weight: 500;
+					font-size: 30rpx;
+					color: #111111;
+				}
+				.line {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					font-size: 26rpx;
+					color: #999999;
+					margin-top: 6rpx;
+					.time {
+						display: flex;
+						align-items: center;
+						color: $uni-color-primary;
+					}
+				}
+			}
+		}
+		.active {
+			background: linear-gradient(270deg, #ffffff 0%, #e1f7fe 100%);
+		}
+	}
 }
 </style>
diff --git a/h5/pages/driver/register.vue b/h5/pages/driver/register.vue
index 89fe60a..3221f3a 100644
--- a/h5/pages/driver/register.vue
+++ b/h5/pages/driver/register.vue
@@ -102,16 +102,12 @@
         ...form
       }).then(res => {
         if (res && res.code == 200) {
+					this.showToast('娉ㄥ唽鎴愬姛,璇峰墠寰�鐧诲綍')
           setTimeout(() => {
-            uni.showToast({
-              title: '娉ㄥ唽鎴愬姛,璇峰墠寰�鐧诲綍',
-              icon: 'none',
-              duration: 2000
-            })
-          })
-          uni.redirectTo({
-            url: "/pages/driver/login"
-          })
+						uni.redirectTo({
+						  url: "/pages/driver/login"
+						})
+					}, 500)
         }
       })
     }
diff --git a/h5/pages/driver/reserved.vue b/h5/pages/driver/reserved.vue
index 3477489..0683f0f 100644
--- a/h5/pages/driver/reserved.vue
+++ b/h5/pages/driver/reserved.vue
@@ -211,12 +211,14 @@
 			this.$forceUpdate();
 			this.closeInput();
 		},
+		closeInput() {
+			this.$refs.keyboard.close();
+		},
 		copy(){
 			if(this.param.carCodeFront){
 				this.$set(this.param, 'carCodeBack', this.param.carCodeFront)
 				this.showToast('澶嶅埗鎴愬姛');
 			}
-			
 		},
 		handleUpload() {
 			let token = uni.getStorageSync('token') || ''
@@ -260,9 +262,6 @@
 			  }
 			})
 		},
-		closeInput() {
-			this.$refs.keyboard.close();
-		}
 	}
 };
 </script>
diff --git a/h5/pages/driver/reservedDetail.vue b/h5/pages/driver/reservedDetail.vue
index bf1c851..2b90caa 100644
--- a/h5/pages/driver/reservedDetail.vue
+++ b/h5/pages/driver/reservedDetail.vue
@@ -3,7 +3,9 @@
     <view class="status_wrap">
       <view class="name">{{info.driverName}}鐨勫叆鍥绾�</view>
       <view class="desc">{{info.carCodeFront}}</view>
-      <view class="status">{{ statusMap[info.status] }}</view>
+      <view class="status" v-if="info.status != 2 && info.status != 3">{{ statusMap[info.status] }}</view>
+			<image v-if="info.status == 2" class="icon" src="../../static/ic_passed@2x.png" mode=""></image>
+			<image v-if="info.status == 3" class="icon" src="../../static/ic_refused@2x.png" mode=""></image>
     </view>
     <!--  -->
     <view class="emyty"></view>
@@ -123,8 +125,8 @@
 			statusMap: {
 				0: '寰呭鎵�',
 				1: '瀹℃壒涓�',
-				2: '瀹℃壒閫氳繃',
-				3: '瀹℃壒涓嶉�氳繃',
+				2: '宸查�氳繃',
+				3: '宸叉嫆缁�',
 				4: '宸插彇娑�',
 			},
     }
@@ -348,7 +350,6 @@
   .status_wrap {
     position: relative;
     padding: 30rpx 0;
-
     .name {
       font-weight: 600;
       font-size: 32rpx;
@@ -372,6 +373,15 @@
       background-color: #e9edff;
       color: $uni-color-primary;
     }
+		.icon{
+			width: 120rpx;
+			height: 120rpx;
+			border-radius: 50%;
+			position: absolute;
+			right: 0rpx;
+			top: 20rpx;
+			
+		}
   }
 
   .main_footer {
diff --git a/h5/pages/driver/reservedRecord.vue b/h5/pages/driver/reservedRecord.vue
index 0d19bd6..fd44113 100644
--- a/h5/pages/driver/reservedRecord.vue
+++ b/h5/pages/driver/reservedRecord.vue
@@ -10,7 +10,7 @@
       >
         <view class="box_list_item_head">
           <text>{{item.driverName}}鐨勫叆鍥绾�</text>
-          <text class="loading">{{ statusMap[item.status] }}</text>
+          <text class="loading" :class="{red: item.status == 3}">{{ statusMap[item.status] }}</text>
         </view>
         <view class="box_list_item_nr">
           <view class="box_list_item_nr_item">
@@ -53,8 +53,8 @@
 			statusMap: {
 				0: '寰呭鎵�',
 				1: '瀹℃壒涓�',
-				2: '瀹℃壒閫氳繃',
-				3: '瀹℃壒涓嶉�氳繃',
+				2: '宸查�氳繃',
+				3: '宸叉嫆缁�',
 				4: '宸插彇娑�',
 			}
     }
diff --git a/h5/pages/driver/taskConfirm.vue b/h5/pages/driver/taskConfirm.vue
index 592c807..dd156a3 100644
--- a/h5/pages/driver/taskConfirm.vue
+++ b/h5/pages/driver/taskConfirm.vue
@@ -1,448 +1,461 @@
 <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">鐨朅D1212</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="empty"></view>
-      <!--  -->
-      <view class="line">
-        <view class="label">杞﹀墠鐗岀収鍙�</view>
-        <view class="value" @click="openInput(1)">
-          <text :style="{ color: param.carNos ? '#000000' : '#999999' }">{{
-            param.carNos ? param.carNos : "璇疯緭鍏ヨ溅鍓嶇墝鐓у彿"
-          }}</text>
-        </view>
-      </view>
-      <view class="line">
-        <view class="label">杞﹀悗鐗岀収鍙�</view>
-        <view class="value">
-          <text
-            @click="openInput(1)"
-            :style="{ color: param.carNos ? '#000000' : '#999999' }"
-            >{{ param.carNos ? param.carNos : "璇疯緭鍏ヨ溅鍚庣墝鐓у彿" }}</text
-          >
-          <text class="copy">澶嶅埗杞﹀墠鐗岀収鍙�</text>
-        </view>
-      </view>
-      <!--  -->
-    </view>
-    <view class="space"></view>
-    <!-- 绛夊緟鍙彿 -->
-    <view class="sub_wrap">
-      <view class="btn check">纭浠诲姟</view>
-    </view>
+	<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">{{ param.carCodeFront }}</view>
+			<view class="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>
+			<view class="line">
+				<view class="label">杩愯緭鍗曞彿</view>
+				<view class="value" @click="showDetail = true">
+					<text class="waybill_num">{{ param.contractNum }}</text>
+					<text class="btn">杩愬崟璇︽儏</text>
+				</view>
+			</view>
+			<view class="line">
+				<view class="label">浣滀笟绫诲瀷</view>
+				<view class="value">{{ param.inType == 0 ? '鏁存墭鐩�' : '浠剁儫' }}</view>
+			</view>
+			<view class="empty"></view>
+			<!--  -->
+			<view class="line">
+				<view class="label">鍒板満鏃ユ湡<text class="red ml6">*</text></view>
+				<view class="value" @click="showDate = true">
+					<view :class="param.date ? '' : 'placeholder9'">{{ param.date ? param.date : '璇烽�夋嫨' }}</view>
+					<u-icon color="#999999" name="arrow-right"></u-icon>
+				</view>
+			</view>
+			<view class="line">
+				<view class="label">杞﹀墠鐗岀収鍙�</view>
+				<view class="value" @click="openInput(1)">
+					<text :style="{ color: param.carCodeFront ? '#000000' : '#999999' }">{{ param.carCodeFront ? param.carCodeFront : '璇疯緭鍏ヨ溅鍓嶇墝鐓у彿' }}</text>
+				</view>
+			</view>
+			<view class="line">
+				<view class="label">杞﹀悗鐗岀収鍙�<text class="red ml6">*</text></view>
+				<view class="value">
+					<text @click="openInput(2)" :style="{ color: param.carCodeBack ? '#000000' : '#999999' }">{{ param.carCodeBack ? param.carCodeBack : '璇疯緭鍏ヨ溅鍚庣墝鐓у彿' }}</text>
+					<text class="copy" @click="copy">澶嶅埗杞﹀墠鐗岀収鍙�</text>
+				</view>
+			</view>
+			<!--  -->
+		</view>
+		<view class="space"></view>
+		<!-- 绛夊緟鍙彿 -->
+		<view class="sub_wrap"><view class="btn check" @click="onSubmit">纭浠诲姟</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>
-    <keyboardInput ref="keyboard" @export="setPlate" @close="closeInput" />
-  </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>
+		<u-datetime-picker :show="showDate" v-model="param.date" :minDate="minDate" @confirm="dateEnter" @cancel="showDate = false" mode="datetime"></u-datetime-picker>
+		<keyboardInput ref="keyboard" @export="setPlate" @close="closeInput" />
+	</view>
+	<!--  -->
 </template>
 
 <script>
-import keyboardInput from '@/components/keyboard-input/keyboard-input.vue'
+import keyboardInput from '@/components/keyboard-input/keyboard-input.vue';
+import { driverTaskJobDetail, driverConfirmTask } from '@/api';
+import dayjs from 'dayjs'
 export default {
-  components: {
-    keyboardInput
-  },
-  data() {
-    return {
-      param: {
-        status: '0'
-      },
-      showDetail: false,
+	components: {
+		keyboardInput
+	},
+	data() {
+		return {
+			param: {},
+			showDate: false,
+			showDetail: false,
+			minDate: '',
 
-      inputType: ''
-    }
-  },
-  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)
-        }
-      })
-    },
-    openInput(type) {
-      this.inputType = type
-      this.$refs.keyboard.open()
-    },
-    setPlate(e) {
-      if (this.inputType === 1) {
-        this.param.carNos = e
-      } else if (this.inputType === 2) {
-        this.param.carNos = e
-      }
-      this.$forceUpdate()
-      this.closeInput()
-    },
-    closeInput() {
-      this.$refs.keyboard.close()
-    }
-  }
-}
+			inputType: ''
+		};
+	},
+	onLoad(option) {
+		this.getDetail(option.id);
+		this.minDate = new Date().getTime()
+	},
+	methods: {
+		onSubmit(){
+			const { param } = this
+			if(!param.date) return this.showToast('璇烽�夋嫨鍒板満鏃ユ湡')
+			if(!param.carCodeBack) return this.showToast('璇疯緭鍏ヨ溅鍚庣墝鐓у彿')
+			driverConfirmTask({
+				id: param.id,
+				carCodeBack: param.carCodeBack,
+				arriveDate: param.date + ':59'
+			}).then(res =>{
+				this.showToast('纭鎴愬姛')
+				this.$goBack()
+			})
+		},
+		getDetail(jobId) {
+			driverTaskJobDetail({
+				jobId
+			}).then(ress => {
+				this.param = { ...ress.data, carCodeBack: '' };
+			});
+		},
+		dateEnter(e) {
+			setTimeout(() => {
+				this.$set(this.param, 'date', dayjs(e.value).format('YYYY-MM-DD HH:mm'))
+			})
+			this.showDate = false
+		},
+		openInput(type) {
+			this.inputType = type;
+			this.$refs.keyboard.open();
+		},
+		copy() {
+			if (this.param.carCodeFront) {
+				this.$set(this.param, 'carCodeBack', this.param.carCodeFront);
+				this.showToast('澶嶅埗鎴愬姛');
+			}
+		},
+		setPlate(e) {
+			if (this.inputType === 1) {
+				this.$set(this.param, 'carCodeFront', e);
+			} else if (this.inputType === 2) {
+				this.$set(this.param, 'carCodeBack', e);
+			}
+			this.$forceUpdate();
+			this.closeInput();
+		},
+		closeInput() {
+			this.$refs.keyboard.close();
+		}
+	}
+};
 </script>
 
 <style lang="scss">
 page {
-  background-color: #f7f7f7;
+	background-color: #f7f7f7;
 }
 
 .main_app {
-  padding: 0;
+	padding: 0;
 
-  .main_content {
-    background: #ffffff;
-    border-radius: 20rpx 20rpx 0rpx 0rpx;
-    padding: 16rpx 30rpx;
-    position: relative;
-    bottom: 32rpx;
+	.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;
 
-    .line {
-      padding: 24rpx 0 28rpx;
-      border-bottom: 1rpx solid #e5e5e5;
+			.label {
+				font-size: 26rpx;
+				color: #666666;
+				margin-bottom: 20rpx;
+			}
 
-      .label {
-        font-size: 26rpx;
-        color: #666666;
-        margin-bottom: 20rpx;
-      }
+			.value {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				font-size: 30rpx;
 
-      .value {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        font-size: 30rpx;
+				.waybill_num {
+					flex: 1;
+				}
 
-        .waybill_num {
-          flex: 1;
-        }
+				.copy {
+					font-size: 26rpx;
+					color: $uni-color-primary;
+				}
 
-        .copy {
-          font-size: 26rpx;
-          color: $uni-color-primary;
-        }
+				.btn {
+					font-size: 28rpx;
+					color: $uni-color-primary;
+					display: flex;
+				}
+			}
+		}
+		.empty {
+			width: 750rpx;
+			height: 20rpx;
+			background-color: #f7f7f7;
+			margin: 0 -30rpx;
+		}
+		.warnning {
+			display: flex;
+			color: #ed4545;
+			align-items: center;
+			margin: 40rpx 0;
+		}
 
-        .btn {
-          font-size: 28rpx;
-          color: $uni-color-primary;
-          display: flex;
-        }
-      }
-    }
-    .empty {
-      width: 750rpx;
-      height: 20rpx;
-      background-color: #f7f7f7;
-      margin: 0 -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;
 
-    .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;
+			}
 
-      .handle {
-        font-weight: 600;
-        font-size: 40rpx;
-        line-height: 56rpx;
-      }
+			.time {
+				color: rgba(255, 255, 255, 0.7);
+			}
 
-      .time {
-        color: rgba(255, 255, 255, 0.7);
-      }
+			.img {
+				position: absolute;
+				top: 0;
+				left: 0;
+				width: 100%;
+				z-index: -1;
+			}
+		}
+	}
 
-      .img {
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 100%;
-        z-index: -1;
-      }
-    }
-  }
+	.status_wrap {
+		height: 200rpx;
+		width: 100%;
+		padding: 30rpx;
+		position: relative;
+		z-index: 99;
+		color: #fff;
+		.bg {
+			width: 100%;
+			height: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: -1;
+		}
 
-  .status_wrap {
-    height: 200rpx;
-    width: 100%;
-    padding: 30rpx;
-    position: relative;
-    z-index: 99;
-    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;
+		}
 
-    .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;
+		}
+	}
 
-    .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;
+	}
 
-  .space {
-    width: 750rpx;
-    height: 200rpx;
-  }
+	.sub_wrap {
+		position: fixed;
+		padding: 16rpx 30rpx 64rpx;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		display: flex;
+		z-index: 1;
+		justify-content: space-between;
+		background-color: #fff;
+		.btn {
+			height: 96rpx;
+			line-height: 96rpx;
+			text-align: center;
+			width: 690rpx;
+			font-size: 36rpx;
+			color: #333333;
+			background: #ffffff;
+			border-radius: 48rpx;
+			border: 1rpx solid #999999;
+		}
 
-  .sub_wrap {
-    position: fixed;
-    padding: 16rpx 30rpx 64rpx;
-    bottom: 0;
-    left: 0;
-    width: 100%;
-    display: flex;
-    z-index: 1;
-    justify-content: space-between;
-    background-color: #fff;
-    .btn {
-      height: 96rpx;
-      line-height: 96rpx;
-      text-align: center;
-      width: 690rpx;
-      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;
-    }
-  }
+		.check {
+			background: $uni-color-primary;
+			border: 1rpx solid $uni-color-primary;
+			color: #fff;
+		}
+	}
 }
 
 .detail_modal {
-  padding: 36rpx 30rpx;
+	padding: 36rpx 30rpx;
 
-  .modal_title {
-    font-weight: 600;
-    font-size: 32rpx;
-    color: #222222;
-    line-height: 44rpx;
-    text-align: center;
-    margin-bottom: 36rpx;
-  }
+	.modal_title {
+		font-weight: 600;
+		font-size: 32rpx;
+		color: #222222;
+		line-height: 44rpx;
+		text-align: center;
+		margin-bottom: 36rpx;
+	}
 
-  .contract_list {
-    .list {
-      background: #f7f7f7;
-      border-radius: 8rpx;
-      padding: 20rpx;
+	.contract_list {
+		.list {
+			background: #f7f7f7;
+			border-radius: 8rpx;
+			padding: 20rpx;
 
-      .line {
-        display: flex;
-        margin-bottom: 20rpx;
+			.line {
+				display: flex;
+				margin-bottom: 20rpx;
 
-        &:nth-of-type(3n) {
-          border-top: 1rpx solid #e5e5e5;
-          padding-top: 20rpx;
-        }
+				&:nth-of-type(3n) {
+					border-top: 1rpx solid #e5e5e5;
+					padding-top: 20rpx;
+				}
 
-        .label {
-          color: #666666;
-          width: 86rpx;
-        }
+				.label {
+					color: #666666;
+					width: 86rpx;
+				}
 
-        .value {
-          flex: 1;
-          color: #222222;
-        }
-      }
-    }
+				.value {
+					flex: 1;
+					color: #222222;
+				}
+			}
+		}
 
-    .title {
-      font-weight: 600;
-      font-size: 30rpx;
-      color: $uni-color-primary;
-      margin-bottom: 12rpx;
-    }
+		.title {
+			font-weight: 600;
+			font-size: 30rpx;
+			color: $uni-color-primary;
+			margin-bottom: 12rpx;
+		}
 
-    .address {
-      font-size: 26rpx;
-      color: #666666;
-      margin-bottom: 20rpx;
-    }
-  }
+		.address {
+			font-size: 26rpx;
+			color: #666666;
+			margin-bottom: 20rpx;
+		}
+	}
 
-  .info {
-    .line {
-      display: flex;
-      margin-bottom: 20rpx;
+	.info {
+		.line {
+			display: flex;
+			margin-bottom: 20rpx;
 
-      .label {
-        font-size: 30rpx;
-        color: #666666;
-        width: 150rpx;
-      }
+			.label {
+				font-size: 30rpx;
+				color: #666666;
+				width: 150rpx;
+			}
 
-      .value {
-        flex: 1;
-        font-size: 30rpx;
-        color: #222222;
-      }
-    }
-  }
+			.value {
+				flex: 1;
+				font-size: 30rpx;
+				color: #222222;
+			}
+		}
+	}
 
-  .separate {
-    width: 750rpx;
-    height: 2rpx;
-    margin: 30rpx -30rpx;
-    border: 1rpx solid #e5e5e5;
-  }
+	.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;
+	.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;
-    }
+		.last {
+			background: #e9f5f6;
+			width: 60rpx;
+			border-radius: 8rpx 0rpx 0rpx 8rpx;
+			border: 1rpx solid #dfdede;
+		}
 
-    .name {
-      width: 186rpx;
-      border: 1rpx solid #dfdede;
-    }
-  }
+		.name {
+			width: 186rpx;
+			border: 1rpx solid #dfdede;
+		}
+	}
 }
 </style>
diff --git a/h5/pages/driver/taskDetail.vue b/h5/pages/driver/taskDetail.vue
index 0365e8f..42af4cd 100644
--- a/h5/pages/driver/taskDetail.vue
+++ b/h5/pages/driver/taskDetail.vue
@@ -11,48 +11,73 @@
       <view class="name" v-if="param.status == 5">鏈堝彴浣滀笟涓�</view>
       <view class="name" v-if="param.status == 6">浣滀笟宸插畬鎴�</view>
       <view class="id_card">{{ param.carCodeFront }}</view>
-      <view class="status" v-if="param.status == 1">绛夊緟绛惧埌</view>
-      <view class="status" v-if="param.status == 2">绛夊緟鍙彿</view>
-      <view class="status" v-if="param.status == 5">浣滀笟涓�</view>
-      <view class="status" v-if="param.status == 6">浣滀笟瀹屾垚</view>
+      <view class="status">{{statusMap[param.status]}}</view>
     </view>
     <!--  -->
     <view class="main_content">
       <view class="line">
         <view class="label">鍙告満濮撳悕</view>
-        <view class="value">{{param.lineUpNum}}</view>
+        <view class="value">{{param.driverName}}</view>
       </view>
       <view class="line">
         <view class="label">鎵嬫満鍙�</view>
-        <view class="value">{{param.lineUpNum}}</view>
+        <view class="value">{{param.drivierPhone}}</view>
       </view>
-      <view class="line">
-        <view class="label">杩愯緭鍗曞彿</view>
-        <view class="value" @click="showDetail = true">
-          <text class="waybill_num">{{param.lineUpNum}}</text>
-          <text class="btn">杩愬崟璇︽儏</text>
-        </view>
-      </view>
-      <view class="line">
-        <view class="label">浣滀笟绫诲瀷</view>
-        <view class="value">{{param.lineUpNum}}</view>
-      </view>
+			<template v-if="param.type != 4">
+				<view class="line">
+				  <view class="label">杩愯緭鍗曞彿</view>
+				  <view class="value" @click="showDetail = true">
+				    <text class="waybill_num">{{param.code}}</text>
+				    <text class="btn">杩愬崟璇︽儏</text>
+				  </view>
+				</view>
+				<view class="line">
+				  <view class="label">浣滀笟绫诲瀷</view>
+				  <view class="value">甯傚叕鍙稿鍗忚溅鍗歌揣</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.lineUpNum}}</view>
+        <view class="value">鍓嶏細{{param.carCodeFront}} | 鍚庯細{{param.carCodeBack}}</view>
       </view>
       <!--  -->
-      <view class="line">
+      <view class="line" v-if="param.status == 1">
         <view class="label">璺濈鍥尯</view>
         <view class="value">
-          <view class="">0 鍏噷</view>
+          <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="warnning">
+			<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>
@@ -68,25 +93,24 @@
 				<view class="label">浣滀笟瀹屾垚</view>
 				<view class="value">2022</view>
 			</view> -->
-      <view class="signIn_wrap" @click="handleSignIn">
+      <view v-if="param.status == 1" class="signIn_wrap" @click="handleSignIn">
         <image
           :src="
-            param.status == '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">绛惧埌</view>
-        <view class="time">09:10</view>
+        <view class="handle">{{ param.getDistance > signDistance ? '鏃犳硶绛惧埌' : '绛惧埌' }}</view>
+        <view class="time">{{nowTime}}</view>
       </view>
     </view>
     <view class="space"></view>
     <!-- 绛夊緟鍙彿 -->
-    <view class="padding_wrap">
-      <view class="btn cancel">鍙栨秷绛惧埌</view>
-      <view class="btn check">鏌ョ湅鎺掗槦鎯呭喌</view>
+    <view v-if="param.status == 2" class="padding_wrap">
+      <view class="btn check" @click="handleQueue">鏌ョ湅鎺掗槦鎯呭喌</view>
     </view>
 
     <!-- modal -->
@@ -153,42 +177,81 @@
 </template>
 
 <script>
-	import { driverTaskJobDetail } from '@/api'
+	import { driverTaskJobDetail, driverSignInTask } from '@/api';
+	import { statusMap } from '@/utils/config.js';
+	import dayjs from 'dayjs';
 export default {
   data() {
     return {
+			statusMap,
       param: {
         status: '0'
       },
+			jobId: '',
+			lat: '',
+			lnt: '',
+			nowTime: '',
+			signDistance: uni.getStorageSync('driverGuide').signDistance,
       showDetail: false,
     }
   },
 	onLoad(option) {
-		this.getLocation(option.id)
+		this.jobId = option.id
+		if(option.status && option.status == '1'){
+			this.getLocation()
+		}else{
+			this.getDetail()
+		}
+		
+		// this.getDetail({
+		// 	jobId: option.id,
+		// 	lat: 31.769137,
+		// 	lnt: 117.232241,
+		// })
+		setInterval(() => {
+			this.nowTime = dayjs().format('HH:mm:ss')
+		})
 	},
   methods: {
     handleSignIn() {
-      const { param } = this
-      this.param.status = param.status == '0' ? '1' : '0'
+			const { param, signDistance, lat, lnt, jobId } = this
+			if(param.getDistance > signDistance) return
+			driverSignInTask({
+				jobId, lat, lnt,signType: 0
+			}).then(res => {
+				this.showToast('绛惧埌鎴愬姛')
+				this.getDetail()
+			})
     },
-    getLocation(jobId) {
+		getDetail() {
+			const { jobId, lat, lnt } = this
+			driverTaskJobDetail({
+				jobId: this.jobId,
+				lat,
+				lnt
+			}).then(ress => {
+				this.param = { ...ress.data }
+			})
+		},
+    getLocation() {
+			const { jobId } = this
       uni.getLocation({
         type: 'wgs84',
-				
-        success: function (res) {
-					driverTaskJobDetail({
-						jobId,
-						lat: res.latitude,
-						lnt: res.longitude,
-					}).then(ress => {
-						this.param = { ...ress.data }
-					})
-					console.log(res);
-          console.log('褰撳墠浣嶇疆鐨勭粡搴︼細' + res.longitude)
-          console.log('褰撳墠浣嶇疆鐨勭含搴︼細' + res.latitude)
-        }
+        success: (res) => {
+					this.lat = res.latitude
+					this.lnt = res.longitude
+					this.getDetail()
+        },
+				fail:(err) => {
+					console.log('err', err);
+				}
       })
-    }
+    },
+		handleQueue() {
+			uni.navigateTo({
+				url:'/pages/driver/queueUp?jobId=' + this.jobId
+			})
+		},
   }
 }
 </script>
@@ -202,6 +265,7 @@
     padding: 16rpx 30rpx;
     position: relative;
     bottom: 32rpx;
+		z-index: 999;
     .line {
       padding: 24rpx 0 28rpx;
       border-bottom: 1rpx solid #e5e5e5;
@@ -308,6 +372,7 @@
   }
   .padding_wrap {
     position: fixed;
+		z-index: 999;
     padding: 0 30rpx 64rpx;
     bottom: 0;
     left: 0;
@@ -318,7 +383,7 @@
       height: 96rpx;
       line-height: 96rpx;
       text-align: center;
-      width: 336rpx;
+      width: 100%;
       font-size: 36rpx;
       color: #333333;
       background: #ffffff;
diff --git a/h5/pages/staff/task/driver.vue b/h5/pages/staff/task/driver.vue
index 20d2264..3330aaf 100644
--- a/h5/pages/staff/task/driver.vue
+++ b/h5/pages/staff/task/driver.vue
@@ -3,7 +3,9 @@
     <view class="status_wrap">
       <view class="name">{{info.driverName}}鐨勫叆鍥绾�</view>
       <view class="desc">{{info.carCodeFront}}</view>
-      <view class="status">{{ statusMap[info.status] }}</view>
+      <view class="status" v-if="info.status != 2 && info.status != 3">{{ statusMap[info.status] }}</view>
+			<image v-if="info.status == 2" class="icon" src="@/static/ic_passed@2x.png" mode=""></image>
+			<image v-if="info.status == 3" class="icon" src="@/static/ic_refused@2x.png" mode=""></image>
     </view>
     <!--  -->
     <view class="emyty"></view>
@@ -147,8 +149,8 @@
 			statusMap: {
 				0: '寰呭鎵�',
 				1: '瀹℃壒涓�',
-				2: '瀹℃壒閫氳繃',
-				3: '瀹℃壒涓嶉�氳繃',
+				2: '宸查�氳繃',
+				3: '宸叉嫆缁�',
 				4: '宸插彇娑�',
 			},
     }
@@ -387,6 +389,15 @@
       background-color: #e9edff;
       color: $uni-color-primary;
     }
+		.icon{
+			width: 120rpx;
+			height: 120rpx;
+			border-radius: 50%;
+			position: absolute;
+			right: 0rpx;
+			top: 20rpx;
+			
+		}
   }
 
   .main_footer {
diff --git a/h5/pages/staff/task/index.vue b/h5/pages/staff/task/index.vue
index 854541f..31d5d3c 100644
--- a/h5/pages/staff/task/index.vue
+++ b/h5/pages/staff/task/index.vue
@@ -542,6 +542,7 @@
         .info {
           font-size: 26rpx;
           font-weight: 400;
+					width: 110rpx;
         }
       }
       .box_list_item_nr {
diff --git a/h5/static/driver/ic_truck_mine@2x.png b/h5/static/driver/ic_truck_mine@2x.png
new file mode 100644
index 0000000..f5a2449
--- /dev/null
+++ b/h5/static/driver/ic_truck_mine@2x.png
Binary files differ
diff --git a/h5/utils/config.js b/h5/utils/config.js
index 03c8927..d4d7d3a 100644
--- a/h5/utils/config.js
+++ b/h5/utils/config.js
@@ -2,3 +2,18 @@
 export const baseUrl = 'admin_interface/'
 export const uploadAvatar = `${baseUrl}visitsAdmin/cloudService/web/public/uploadFtp.do`
 export const uploadUrl = `${baseUrl}visitsAdmin/cloudService/public/uploadBatch`
+
+export const statusMap = {
+	0: '寰呯‘璁�',
+	1: '绛夊緟绛惧埌',
+	2: '绛夊緟鍙彿', // 绛夊緟鍙彿
+	3: '鍏ュ洯绛夊緟',
+	4: '鏈堝彴绛夊緟', //宸插彨鍙�
+	5: '浣滀笟涓�',
+	6: '浣滀笟瀹屾垚',
+	7: '杞Щ涓�',
+	8: '寮傚父鎸傝捣',
+	9: '宸叉巿鏉冪鍥�',
+	10: '宸茬鍥�',
+	11: '宸茶繃鍙�',
+}
\ No newline at end of file
diff --git a/h5/utils/service.js b/h5/utils/service.js
index fee9e39..de45fb8 100644
--- a/h5/utils/service.js
+++ b/h5/utils/service.js
@@ -34,10 +34,11 @@
 								duration: 2000
 							})
 						})
+						return
 					}
 					if (data.code === 5112) {
 						uni.clearStorageSync()
-						uni.navigateTo({
+						return uni.navigateTo({
 							url: '/pages/login/login'
 						})
 					}
diff --git a/pda/App.vue b/pda/App.vue
index b9da85e..aba1fdb 100644
--- a/pda/App.vue
+++ b/pda/App.vue
@@ -1,77 +1,250 @@
-<script>
-export default {
-  onLaunch: function () {
-    console.log('App Launch')
-  },
-  onShow: function () {
-    console.log('App Show')
-  },
-  onHide: function () {
-    console.log('App Hide')
-  }
-}
-</script>
-
-<style lang="scss">
-@import "uview-ui/index.scss";
-/*姣忎釜椤甸潰鍏叡css */
-view {
-  box-sizing: border-box;
-}
-
-image {
-  box-sizing: border-box;
-  margin: 0;
-  display: flex;
-}
-input {
-  font-size: 30rpx;
-}
-textarea {
-  box-sizing: border-box;
-  // background-color: #f7f7f7;
-  font-size: 30rpx !important;
-  padding: 0;
-  border-radius: 8rpx;
-  color: #333333 !important;
-}
-.u-textarea {
-  padding: 0 !important;
-  color: #333333 !important;
-}
-
-.df_ac {
-  display: flex;
-  align-items: center;
-}
-
-.main_app {
-  padding: 0 30rpx 30rpx;
-  font-size: 28rpx;
-  color: #333333;
-}
-.primaryColor{
-  color: $uni-color-primary;
-}
-.placeholder9 {
-  color: #999999;
-  font-size: 28rpx;
-}
-.fs24 {
-  font-size: 24rpx;
-}
-.mr24 {
-  margin-right: 24rpx;
-}
-
-.mr12 {
-  margin-right: 12rpx;
-}
-.ml12 {
-  margin-left: 12rpx;
-}
-
-.mr6 {
-  margin-right: 6rpx;
-}
-</style>
+<script>
+export default {
+  onLaunch: function () {
+    console.log('App Launch')
+  },
+  onShow: function () {
+    console.log('App Show')
+  },
+  onHide: function () {
+    console.log('App Hide')
+  }
+}
+</script>
+
+<style lang="scss">
+/*姣忎釜椤甸潰鍏叡css */
+@import "uview-ui/index.scss";
+
+.flex-cb {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.empty_wrap{
+  padding-top: 280rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  color: #999999;
+  image{
+    width: 220rpx;
+    height: 238rpx;
+  }
+}
+.container {
+  height: 100%;
+  width: 100%;
+  max-width: 800rpx;
+  overflow-y: auto;
+}
+
+.doumee-container .ivu-tabs-nav {
+  width: 100%;
+}
+
+.doumee-container .ivu-tabs-nav .ivu-tabs-tab {
+  width: calc(100% / 3);
+}
+
+.doumee-container .ivu-tabs-nav .ivu-tabs-tab {
+  margin-right: 0;
+  text-align: center;
+}
+
+.cell {
+  background-color: #fff;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  min-height: 100rpx;
+  padding: 24rpx 30rpx;
+  box-sizing: border-box;
+  border-bottom: 1rpx solid #eee;
+  font-size: 15rpx;
+  position: relative;
+}
+
+.cell .title {
+  flex-shrink: 0;
+  color: #222;
+  line-height: 20rpx;
+  height: 20rpx;
+  width: 28%;
+  margin-right: 5%;
+}
+
+.cell .content {
+  flex: 1;
+  font-size: 28rpx;
+  font-weight: 400;
+  color: #999999;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+
+.cell .content .input {
+  width: 100%;
+  height: 100%;
+  font-size: 28rpx;
+  font-weight: 400;
+  color: #333333;
+  text-align: right;
+}
+
+.cell.is-link::after {
+  content: "";
+  display: block;
+  width: 8rpx;
+  height: 8rpx;
+  transform: rotate(-45deg);
+  border-right: 1rpx solid #999999;
+  border-bottom: 1rpx solid #999999;
+  margin-left: 5rpx;
+}
+
+.card {
+  background-color: #fff;
+  padding: 16rpx;
+  position: relative;
+}
+
+.card::after {
+  content: "";
+  display: block;
+  position: absolute;
+  width: calc(100% - 32rpx);
+  height: 0;
+  bottom: 0;
+  left: 16rpx;
+  border-bottom: 1rpx solid #f7f7f7;
+}
+
+.card .title {
+  color: #777777;
+  margin-bottom: 12rpx;
+}
+
+.card .content {
+  color: #222;
+}
+
+.placeholder9 {
+  color: #999999 !important;
+  font-size: 28rpx;
+}
+.red{
+	color: red !important ;
+}
+
+//璁剧疆鍦嗚
+checkbox .uni-checkbox-input {
+  border-radius: 50%;
+}
+
+checkbox .uni-checkbox-input.uni-checkbox-input-checked {
+  color: #fff !important;
+  border: 1px solid #4d99a8 !important;
+  background-color: #4d99a8 !important;
+}
+
+checkbox .uni-checkbox-input.uni-checkbox-input-checked:before {
+  /* color: #4d99a8 !important;  */
+  /* border: 1px solid #4d99a8 !important; */
+  /* font-size: 58rpx; */
+  /* border-radius: 50%; */
+}
+
+//
+
+view {
+  box-sizing: border-box;
+}
+
+image {
+  box-sizing: border-box;
+  margin: 0;
+  display: flex;
+}
+input {
+  font-size: 30rpx;
+}
+textarea {
+  box-sizing: border-box;
+  // background-color: #f7f7f7;
+  font-size: 30rpx !important;
+  padding: 0;
+  border-radius: 8rpx;
+  color: #333333 !important;
+}
+.u-textarea {
+  padding: 0 !important;
+  color: #333333 !important;
+}
+
+.df_ac {
+  display: flex;
+  align-items: center;
+}
+
+.main_app {
+  padding: 0 30rpx 30rpx;
+  font-size: 28rpx;
+  color: #333333;
+}
+.popupShow {
+  overflow: hidden;
+  position: fixed;
+  width: 100%;
+}
+.placeholder6 {
+  color: #666666;
+  font-size: 28rpx;
+}
+.primaryColor {
+  color: $uni-color-primary;
+}
+.avatar {
+  width: 64rpx;
+  height: 64rpx;
+  border-radius: 50%;
+  margin-right: 20rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: $uni-color-primary;
+  color: #fff;
+  font-size: 30rpx;
+}
+.placeholder9 {
+  color: #999999;
+  font-size: 28rpx;
+}
+.fs24 {
+  font-size: 24rpx;
+}
+.mr24 {
+  margin-right: 24rpx;
+}
+.mt24 {
+  margin-top: 24rpx;
+}
+
+.mr12 {
+  margin-right: 12rpx;
+}
+.ml12 {
+  margin-left: 12rpx;
+}
+.ml6 {
+  margin-left: 6rpx;
+}
+.mt6 {
+  margin-top: 6rpx;
+}
+.mr6 {
+  margin-right: 6rpx;
+}
+</style>
diff --git a/pda/api/index.js b/pda/api/index.js
index 159ac65..a8ee63f 100644
--- a/pda/api/index.js
+++ b/pda/api/index.js
@@ -18,6 +18,18 @@
     data
   })
 }
+export const getUserInfo = () => {
+  return http({
+    url: 'getUserInfo',
+    method: 'get'
+  })
+}
+export const loginCaptcha = () => {
+  return http({
+    url: 'captcha',
+    method: 'get'
+  })
+}
 //  鍙戦�佺煭淇¢獙璇佺爜
 export const sendSms = (data) => {
   return http({
@@ -25,4 +37,116 @@
     method: 'post',
     data
   })
+}
+//  鐧诲綍
+export const loginPost = (data) => {
+  return http({
+    url: 'loginH5',
+    method: 'post',
+    data
+  })
+}
+//  鑾峰彇鏈堝彴缁勪俊鎭�
+export const getPlatformGroupList = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/getPlatformGroupList',
+    method: 'post',
+    data
+  })
+}
+//  鑾峰彇鏈堝彴 浠诲姟淇℃伅
+export const getPlatformWorkData = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/getPlatformWorkData',
+    method: 'get',
+    data
+  })
+}
+//  杞﹁締鎺掗槦鎯呭喌
+export const platformLineUpPage = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/platformLineUpPage',
+    method: 'post',
+    data
+  })
+}
+//  鍙彿鍒楄〃
+export const platformCallList = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/platformCallList',
+    method: 'post',
+    data
+  })
+}
+//  鍏ュ洯鍙彿
+export const platformInPark = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/platformInPark',
+    method: 'post',
+    data
+  })
+}
+//  鏈堝彴鍙彿
+export const platformCallNumber = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/platformCallNumber',
+    method: 'post',
+    data
+  })
+}
+//  寮傚父鎸傝捣
+export const platformErr = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/platformErr',
+    method: 'post',
+    data
+  })
+}
+//  杞Щ鏈堝彴
+export const platformMove = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/platformMove',
+    method: 'post',
+    data
+  })
+}
+//  鏈堝彴杩囧彿
+export const platformOverNumber = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/platformOverNumber',
+    method: 'post',
+    data
+  })
+}
+//  瀹屾垚浣滀笟
+export const finishWork = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/finishWork',
+    method: 'post',
+    data
+  })
+}
+//  鎵嬪姩寮�濮嬩綔涓�
+export const beginWork = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/beginWork',
+    method: 'post',
+    data
+  })
+}
+//  鏇存柊鏈堝彴閰嶇疆淇℃伅
+export const updUserPlatformConfig = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/updUserPlatformConfig',
+    method: 'get',
+    data
+  })
+}
+//  淇敼绂佸惎鐢ㄧ姸鎬�
+export const updPlatformStatus = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/pdaPlatform/updPlatformStatus',
+    method: 'post',
+    data
+  })
 }
\ No newline at end of file
diff --git a/pda/main.js b/pda/main.js
index 67dd82e..a53fc06 100644
--- a/pda/main.js
+++ b/pda/main.js
@@ -8,6 +8,17 @@
 Vue.use(uView)
 Vue.config.productionTip = false
 Vue.prototype.$store = store
+Vue.prototype.$jump = (url) => {uni.navigateTo({url})}
+Vue.prototype.$goBack = () => { uni.navigateBack() }
+Vue.prototype.showToast = (str) => {
+	setTimeout(() => {
+		uni.showToast({
+		  title: str,
+		  icon: 'none',
+		  duration: 2000
+		})
+	},100)
+}
 
 App.mpType = 'app'
 const app = new Vue({
diff --git a/pda/manifest.json b/pda/manifest.json
index 6e27766..ae879f7 100644
--- a/pda/manifest.json
+++ b/pda/manifest.json
@@ -5,6 +5,30 @@
     "versionName" : "1.0.0",
     "versionCode" : "100",
     "transformPx" : false,
+		"h5" : {
+		    "router" : {
+		        "mode" : "hash",
+		        "base" : "./"
+		    },
+		    // "base" : "/h5/"
+		    "devServer" : {
+		        "port" : 8090,
+		        "historyApiFallback" : true,
+		        "disableHostCheck" : true,
+		        "proxy" : {
+		            "/admin_interface" : {
+		                // 杩欎釜瀛楁鍚嶉渶涓庝綘閰嶇疆鐨刡asePrefixUrl涓�鑷达紝绯荤粺璇嗗埆鍒板甫鏈�/dev-api璇锋眰鐨勫湴鍧�鏃讹紝浼氬湪鍓嶉潰鎷兼帴涓婁唬鐞嗘湇鍔″櫒鍦板潃
+		                // "target" : "http://192.168.0.173/admin_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+		                "target" : "http://192.168.0.139:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+		                "changeOrigin" : true, // 鍏佽璺ㄥ煙 
+		                "pathRewrite" : {
+		                    "^/admin_interface" : "" // 閲嶅啓鍦板潃锛屽鏋滃疄闄呮帴鍙d腑鏄笉甯�/dev-api锛岄渶瑕佸皢杩欎釜鍓嶇紑缃┖锛屽洜涓鸿繖涓墠缂�鍙槸涓轰簡璇嗗埆鐢紝璇嗗埆瀹屼箣鍚庡氨娌$敤浜�
+		                }
+		            }
+		        },
+		        "https" : false
+		    }
+		},
     /* 5+App鐗规湁鐩稿叧 */
     "app-plus" : {
         "usingComponents" : true,
diff --git a/pda/package-lock.json b/pda/package-lock.json
new file mode 100644
index 0000000..f3d0f48
--- /dev/null
+++ b/pda/package-lock.json
@@ -0,0 +1,11 @@
+{
+  "requires": true,
+  "lockfileVersion": 1,
+  "dependencies": {
+    "dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+    }
+  }
+}
diff --git a/pda/pages.json b/pda/pages.json
index 206c8e9..3e194d5 100644
--- a/pda/pages.json
+++ b/pda/pages.json
@@ -47,9 +47,9 @@
 		}
 	],
 	"globalStyle": {
-		"navigationBarTextStyle": "black",
+		"navigationBarTextStyle": "white",
 		"navigationBarTitleText": "",
-		"navigationBarBackgroundColor": "#ffffff",
+		"navigationBarBackgroundColor": "#4d99a9",
 		"backgroundColor": "#ffffff"
 	},
 	"uniIdRouter": {}
diff --git a/pda/pages/index/center.vue b/pda/pages/index/center.vue
index 7d8e376..a1aaff3 100644
--- a/pda/pages/index/center.vue
+++ b/pda/pages/index/center.vue
@@ -1,8 +1,9 @@
 <template>
   <view class="main_app">
     <view class="main_content">
-      <view class="title"
-        >瀹夋嘲鐗╂祦瑁呰揣骞冲彴<u-icon
+      <view class="title" @click="showPlatformgroup = true"
+        >{{ activePlatformGroup.name
+        }}<u-icon
           name="arrow-down"
           size="20"
           class="ml12"
@@ -12,65 +13,115 @@
       <view class="platform_list">
         <view
           class="item"
-          :class="{ active: index === 0 }"
-          v-for="(i, index) in 8"
-          :key="i"
-          >1鍙锋湀鍙�</view
+          :class="{ active: item.id === activePlatform.id }"
+          v-for="(item, index) in activePlatformGroup.platformList"
+          :key="index"
+          @click="platformClick(item)"
+          >{{ item.name }}</view
         >
       </view>
       <view class="status_wrap">
         <view class="status"
-          >浣滀笟锛�<text>{{ 0 }}</text></view
+          >浣滀笟锛�<text>{{ platformTaskInfo.workNum }}</text></view
         >
         <view class="status"
-          >宸插彨锛�<text>{{ 0 }}</text></view
+          >宸插彨锛�<text>{{ platformTaskInfo.callNum }}</text></view
         >
         <view class="status"
-          >绛夊緟锛�<text>{{ 0 }}</text></view
+          >绛夊緟锛�<text>{{ platformTaskInfo.waitNum }}</text></view
         >
         <view class="status"
-          >寮傚父锛�<text>{{ 0 }}</text></view
+          >寮傚父锛�<text>{{ platformTaskInfo.exceptionNum }}</text></view
         >
       </view>
     </view>
     <!--  -->
-    <view v-if="true" class="platform_ing">
-      <view class="head">
-        <view class="code">
-          <text>鐨�</text>
-          <text>AD1212</text>
+    <view style="padding-bottom: 140rpx">
+      <view
+        v-for="item in platformTaskInfo.platformJobList"
+        :key="item.id"
+        class="platform_ing"
+      >
+        <view class="head">
+          <view class="code">
+            <text>{{ item.carCodeFront.slice(0, 1) }}</text>
+            <text>{{ item.carCodeFront.slice(1, 2) }}</text>
+            <text>路</text>
+            <text>{{ item.carCodeFront.slice(2) }}</text>
+          </view>
+          <view
+            class="status"
+            v-if="item.status != 4 && item.status != 5"
+            :class="{ red: item.status == 8 }"
+            >{{ statusMap[item.status] }}</view
+          >
+          <view class="status" v-if="item.status == 4"
+            >鍙彿涓� {{ item.callDateTemp }}</view
+          >
+          <view class="status scs" v-if="item.status == 5"
+            >宸蹭綔涓� {{ item.startDateTemp }}</view
+          >
         </view>
-        <view class="status">鍙彿涓�</view>
+        <view class="line" v-if="item.type == 4">
+          <text class="label">鍚堝悓鍗曞彿</text>
+          <text class="value">{{ item.contractNum }}</text>
+        </view>
+        <view class="line" v-else>
+          <text class="label">杩愯緭鍗曞彿</text>
+          <text class="value">{{ item.code }}</text>
+          <text class="primaryColor" @click="handleDetail()">杩愬崟璇︽儏</text>
+        </view>
+        <view class="line">
+          <text class="label">椹鹃┒鍛�</text>
+          <text class="value"
+            >{{ item.driverName }} {{ item.drivierPhone }}</text
+          >
+        </view>
+        <view class="line">
+          <text class="label">鎬昏繍杈撻噺</text>
+          <text class="value">{{ item.totalNum }}涓囨敮</text>
+        </view>
+        <view class="line" v-if="item.type != 4">
+          <text class="label">杩愯緭鍏徃</text>
+          <text class="value">{{ item.carrierName }}</text>
+        </view>
+        <view class="btns">
+          <view v-if="item.status == 4" class="btn" @click="handlePass(item)"
+            >杩囧彿</view
+          >
+          <view
+            v-if="item.status == 4"
+            class="btn active"
+            @click="handleWork(item)"
+            >寮�濮嬩綔涓�</view
+          >
+
+          <view v-if="item.status == 5" class="btn" @click="handleErr(item)"
+            >寮傚父鎸傝捣</view
+          >
+          <view
+            v-if="item.status == 5 || item.status == 8"
+            class="btn"
+            @click="handleTransform(item)"
+            >杞Щ鏈堝彴</view
+          >
+          <view
+            v-if="item.status == 5 || item.status == 8"
+            class="btn active"
+            @click="handleFinish(item)"
+            >浣滀笟瀹屾垚</view
+          >
+        </view>
       </view>
-      <view class="line">
-        <text class="label">杩愯緭鍗曞彿</text>
-        <text class="value">11111</text>
-        <text class="primaryColor" @click="handleDetail()">杩愬崟璇︽儏</text>
-      </view>
-      <view class="line">
-        <text class="label">鎬昏繍杈撻噺</text>
-        <text class="value">11111</text>
-      </view>
-      <view class="line">
-        <text class="label">椹鹃┒鍛�</text>
-        <text class="value">11111</text>
-      </view>
-      <view class="btns">
-        <view class="btn">杩囧彿</view>
-        <view class="btn" @click="handleTransform">杞Щ鏈堝彴</view>
-        <view class="btn active">寮�濮嬩綔涓�</view>
+      <view v-if="!platformTaskInfo.platformJobList || platformTaskInfo.platformJobList.length == 0" class="empty_wrap">
+        <image src="@/static/default_nodata@2x.png" />
+        <text>鏆傛棤浣滀笟杞﹁締</text>
       </view>
     </view>
-    <image
-      v-if="true"
-      class="empty"
-      src="@/static/default_nodata@2x.png"
-      mode="widthFix"
-    ></image>
     <!--  -->
     <view class="main_footer">
-      <view class="btn">鍏ュ洯鍙彿</view>
-      <view class="btn active" @click="PlatformCallClick">鏈堝彴鍙彿</view>
+      <view class="btn" @click="PlatformCallClick(1)">鍏ュ洯鍙彿</view>
+      <view class="btn active" @click="PlatformCallClick(2)">鏈堝彴鍙彿</view>
     </view>
     <!-- 鍙彿 -->
     <u-popup
@@ -80,45 +131,69 @@
       round="10"
       @close="showPlatformCall = false"
     >
-      <view class="PlatformCallModal">
-        <view class="title">鏈堝彴鍙彿(1鍙锋湀鍙�)</view>
+      <view
+        class="PlatformCallModal"
+        :style="{ height: 'calc(100vh - ' + windowTop + 'px)' }"
+      >
+        <view class="title" v-if="callType == 2"
+          >鏈堝彴鍙彿({{ activePlatform.name }})</view
+        >
+        <view class="title" v-else>鍏ュ洯鍙彿</view>
         <view class="input_wrap">
           <u-icon name="search" class="mr12" size="19" color="#999999" />
           <input
+            v-model="platformCallSearch"
             type="text"
             placeholder="鎼滅储杞﹁締鐗岀収"
             placeholder-class="placeholder9"
+            @confirm="callQuery"
           />
         </view>
         <view class="order_list">
-          <scroll-view scroll-y="true" class="scroll_view">
-            <view class="platform_ing" v-for="i in 8">
+          <scroll-view scroll-y="true" @scrolltolower="callScrolltolower" class="scroll_view">
+            <view
+              class="platform_ing"
+              v-for="item in platformCallList"
+              :key="item.id"
+            >
               <view class="head">
-                <view class="code">
-                  <text>鐨�</text>
-                  <text>AD1212</text>
+                <view v-if="item.carCodeFront" class="code">
+                  <text>{{ item.carCodeFront.slice(0, 1) }}</text>
+                  <text>{{ item.carCodeFront.slice(1, 2) }}</text>
+                  <text>路</text>
+                  <text>{{ item.carCodeFront.slice(2) }}</text>
                 </view>
-                <view class="status">鍙彿涓�</view>
+                <view class="status" :class="{ scs: item.status == 4 }">{{
+                  statusMap[item.status]
+                }}</view>
               </view>
-              <view class="line">
+              <view class="line" v-if="item.type == 4">
+                <text class="label">鍚堝悓鍗曞彿</text>
+                <text class="value">{{ item.contractNum }}</text>
+              </view>
+              <view class="line" v-else>
                 <text class="label">杩愯緭鍗曞彿</text>
-                <text class="value">11111</text>
-                <text class="primaryColor">杩愬崟璇︽儏</text>
+                <text class="value">{{ item.code }}</text>
+                <text class="primaryColor" @click="handleDetail()"
+                  >杩愬崟璇︽儏</text
+                >
               </view>
               <view class="line">
                 <text class="label">椹鹃┒鍛�</text>
-                <text class="value">11111</text>
+                <text class="value"
+                  >{{ item.driverName }} {{ item.drivierPhone }}</text
+                >
               </view>
               <view class="line">
                 <text class="label">鎬昏繍杈撻噺</text>
-                <text class="value">11111</text>
+                <text class="value">{{ item.totalNum }}涓囨敮</text>
               </view>
-              <view class="line">
+              <view class="line" v-if="item.type != 4">
                 <text class="label">杩愯緭鍏徃</text>
-                <text class="value">11111</text>
+                <text class="value">{{ item.carrierName }}</text>
               </view>
               <view class="btns">
-                <view class="btn active">鍙彿</view>
+                <view class="btn active" @click="handleCall(item)">鍙彿</view>
               </view>
             </view>
           </scroll-view>
@@ -133,7 +208,10 @@
       round="10"
       @close="showDetail = false"
     >
-      <view class="PlatformCallModal">
+      <view
+        class="PlatformCallModal"
+        :style="{ height: 'calc(100vh - ' + windowTop + 'px)' }"
+      >
         <view class="title">杩愬崟璇︽儏</view>
         <view class="platform_ing" style="padding: 0">
           <view class="head">
@@ -193,46 +271,265 @@
       round="10"
       @close="showTransform = false"
     >
-      <view class="PlatformCallModal TransformModal">
+      <view class="TransformModal">
         <view class="title">杞Щ鏈堝彴</view>
         <view class="transform_list">
-          <view class="line" v-for="item,index in 9">
-            <view class="name">1鍙锋湀鍙�</view>
-            <view class="status">(绌洪棽)</view>
-            <image v-if="index == 1" src="@/static/ic_select@2x.png" class="checked" />
+          <view
+            class="line"
+            @click="transformPlatClick(item)"
+            v-for="item in activePlatformGroup.platformList"
+            :key="item.id"
+          >
+            <view class="name">{{ item.name }}</view>
+            <view class="status" :class="{ green: item.workStatus == 1 }"
+              >({{ item.workStatus == 0 ? "绌洪棽" : "浣滀笟涓�" }})</view
+            >
+            <image
+              v-if="transformPlatId == item.id"
+              src="@/static/ic_select@2x.png"
+              class="checked"
+            />
           </view>
         </view>
         <view class="btns">
-          <view class="btn" @click="showTransform = false">鍙栨秷</view>
-          <view class="btn active">纭畾</view>
+          <view class="btn" @click="transformCancel">鍙栨秷</view>
+          <view class="btn active" @click="transformSub">纭畾</view>
         </view>
       </view>
     </u-popup>
+    <!--  -->
+    <u-picker
+      :show="showPlatformgroup"
+      keyName="name"
+      :columns="[platformGroupList]"
+      @cancel="showPlatformgroup = false"
+      @confirm="platConfirm"
+    ></u-picker>
   </view>
 </template>
 
 <script>
+import {
+  getPlatformGroupList,
+  getPlatformWorkData,
+  platformCallList,
+  platformCallNumber,
+  platformInPark,
+  beginWork,
+  finishWork,
+  platformMove,
+  platformErr,
+  platformOverNumber
+} from '@/api'
+import { statusMap } from '@/utils/config.js'
+import dayjs from 'dayjs'
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
+
 export default {
   data() {
     return {
+      statusMap,
+      windowTop: 44,
       showPlatformCall: false, // 鏈堝彴鍙彿
       showDetail: false,
-      showTransform: false // 杞Щ
+      showTransform: false, // 杞Щ
+      showPlatformgroup: false,
+
+      platformGroupList: [],
+      activePlatformGroup: {},
+      platformTaskInfo: {},
+      activePlatform: {},
+
+      platformCallList: [],//鍙彿鍒楄〃
+      platformCallSearch: '',
+      platformCallTotal: 0,
+      platformCallPage: 1,
+      callType: 1,
+
+      transformPlatId: '', // 杞Щ璁板綍鏈堝彴id
+      transformId: '', // 杞Щ璁板綍浠诲姟id
     }
   },
   onLoad() {
-
+    this.getPlatformGroup()
+    const res = uni.getWindowInfo()
+    this.windowTop = res.windowTop
   },
   methods: {
+    getPlatformGroup() {
+      getPlatformGroupList({
+        queryData: 1,
+        queryType: 0
+      }).then(res => {
+        this.platformGroupList = res.data || []
+        if (this.platformGroupList.length > 0) {
+          this.activePlatformGroup = this.platformGroupList[0]
+          if (this.activePlatformGroup.platformList && this.activePlatformGroup.platformList.length > 0) {
+            this.activePlatform = this.activePlatformGroup.platformList[0]
+            this.getPlatformTask()
+          }
+        }
+      })
+    },
+    getPlatformTask() {
+      getPlatformWorkData({ platformId: this.activePlatform.id }).then(res => {
+        this.platformTaskInfo = res.data
+        this.circulInitTaskList()
+        setInterval(() => {
+          this.circulInitTaskList()
+        }, 1000)
+      })
+    },
+    circulInitTaskList() {
+      if (this.platformTaskInfo && this.platformTaskInfo.platformJobList && this.platformTaskInfo.platformJobList.length > 0) {
+        let time = new Date()
+        this.platformTaskInfo.platformJobList.forEach(item => {
+          if (item.callDate) {
+            let timeNum = time.getTime() - new Date(item.callDate).getTime()
+            if (timeNum > 3600000) {
+              item.callDateTemp = dayjs.duration(timeNum).format('H灏忔椂m鍒唖绉�')
+            } else {
+              item.callDateTemp = dayjs.duration(timeNum).format('m鍒唖绉�')
+            }
+          }
+          if (item.startDate) {
+            let timeNum = time.getTime() - new Date(item.startDate).getTime()
+            if (timeNum > 3600000) {
+              item.startDateTemp = dayjs.duration(timeNum).format('H灏忔椂m鍒唖s绉�')
+            } else {
+              item.startDateTemp = dayjs.duration(timeNum).format('m鍒唖绉�')
+            }
+          }
+        })
+        this.$forceUpdate()
+      }
+    },
+    platConfirm(e) {
+      const index = e.indexs[0]
+      this.activePlatformGroup = this.platformGroupList[index]
+      if (this.activePlatformGroup.platformList && this.activePlatformGroup.platformList.length > 0) {
+        this.activePlatform = this.activePlatformGroup.platformList[0]
+        this.getPlatformTask()
+      }
+      this.showPlatformgroup = false
+    },
+    platformClick(item) {
+      this.activePlatform = item
+      this.getPlatformTask()
+    },
     handleDetail() {
       this.showDetail = true
     },
-    PlatformCallClick() {
-      this.showPlatformCall = true
+    handleFinish(item) {
+      finishWork({ jobId: item.id }).then(res => {
+        this.showToast('瀹屾垚浣滀笟')
+        this.getPlatformTask()
+      })
     },
-    handleTransform() {
+    handleWork(item) { // 寮�濮嬩綔涓�
+      beginWork({ jobId: item.id }).then(res => {
+        this.showToast('宸插紑濮嬩綔涓�')
+        this.getPlatformTask()
+      })
+    },
+    handlePass(item) {
+      uni.showModal({
+        content: '鎮ㄧ‘璁よ瀵硅浠诲姟杩涜杩囧彿鍚�',
+        success: (res) => {
+          if (res.confirm) {
+            platformOverNumber({ jobId: item.id, platformId: this.activePlatform.id }).then(res => {
+              this.showToast('杩囧彿鎴愬姛')
+              this.getPlatformTask()
+            })
+          }
+        }
+      })
+
+    },
+    handleCall(item) {
+      const { callType, activePlatform } = this
+      this.platformCallList = []
+      this.platformCallPage = 1
+      if (callType == 1) { // 鍏ュ洯鍙彿
+        platformInPark({ jobId: item.id }).then(res => {
+          this.showToast('鍙彿鎴愬姛')
+          this.getPlatformCallList()
+        })
+      } else { // 鏈堝彴鍙彿
+        platformCallNumber({ platformId: activePlatform.id, jobId: item.id }).then(res => {
+          this.showToast('鍙彿鎴愬姛')
+          this.getPlatformCallList()
+          this.getPlatformTask()
+        })
+      }
+    },
+    PlatformCallClick(callType) {
+      this.callType = callType
+      this.showPlatformCall = true
+      this.platformCallList = []
+      this.platformCallPage = 1
+      this.platformCallSearch = ''
+      this.getPlatformCallList()
+    },
+    callQuery() {
+      this.platformCallList = []
+      this.platformCallPage = 1
+      this.getPlatformCallList()
+    },
+    callScrolltolower() {
+      const { platformCallTotal, platformCallList } = this
+      if(platformCallTotal > platformCallList.length){
+        this.getPlatformCallList()
+      }
+    },
+    getPlatformCallList() {
+      const { platformCallPage, callType, activePlatform, platformCallSearch } = this
+      platformCallList({
+        model: { callType, platformId: activePlatform.id, carCodeFront: platformCallSearch },
+        capacity: 10,
+        page: platformCallPage
+      }).then(res => {
+        if (res.data && res.data.records) {
+          this.platformCallList = [ ...this.platformCallList, ...res.data.records]
+          this.platformCallTotal = res.data.total
+        }
+      })
+    },
+    transformPlatClick(item) {
+      this.transformPlatId = item.id
+    },
+    transformCancel() {
+      this.transformPlatId = ''
+      this.showTransform = false
+    },
+    transformSub() {
+      const { transformPlatId, transformId } = this
+      platformMove({ platformId: transformPlatId, jobId: transformId }).then(res => {
+        this.showToast('杞Щ鏈堝彴鎴愬姛')
+        this.transformCancel()
+        this.getPlatformTask()
+      })
+    },
+    handleTransform(item) {
+      let { activePlatform } = this
+      this.transformId = item.id
+      this.transformPlatId = activePlatform.id
       this.showTransform = true
     },
+    handleErr(item) {
+      uni.showModal({
+        content: '鎮ㄧ‘璁よ瀵硅浠诲姟杩涜寮傚父鎸傝捣鍚�',
+        success: (res) => {
+          if (res.confirm) {
+            platformErr({ jobId: item.id }).then(ress => {
+              this.showToast('寮傚父鎸傝捣鎴愬姛')
+              this.getPlatformTask()
+            })
+          }
+        }
+      })
+    }
   }
 }
 </script>
@@ -323,15 +620,24 @@
         border-radius: 8rpx;
         border: 1rpx solid #dfdede;
         text {
-          padding: 0 12rpx;
           &:nth-of-type(1) {
             background: #e9f5f6;
+            padding: 0 12rpx;
+          }
+          &:nth-of-type(2) {
+            padding-left: 4rpx;
+          }
+          &:nth-of-type(4) {
+            padding-right: 6rpx;
           }
         }
       }
       .status {
         font-size: 30rpx;
         color: $uni-color-primary;
+      }
+      .scs {
+        color: #00ba67;
       }
     }
     .line {
@@ -399,7 +705,7 @@
   }
 }
 .PlatformCallModal {
-  height: calc(100vh - 50px);
+  height: calc(100vh - 44px);
   padding: 30rpx;
   .title {
     text-align: center;
@@ -415,7 +721,7 @@
     padding: 0 30rpx;
   }
   .order_list {
-    height: calc(100% - 120rpx);
+    height: calc(100% - 140rpx);
     .scroll_view {
       height: 100%;
     }
@@ -465,8 +771,62 @@
       }
     }
   }
+  .btns {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    .btn {
+      width: 336rpx;
+      height: 88rpx;
+      border-radius: 44rpx;
+      border: 1rpx solid $uni-color-primary;
+      color: $uni-color-primary;
+      font-size: 32rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+    .active {
+      color: #fff;
+      background-color: $uni-color-primary;
+    }
+  }
+}
+.TransformModal {
+  height: 900rpx;
+  padding: 30rpx;
+  position: relative;
+  .title {
+    text-align: center;
+    margin: 0 0 30rpx;
+  }
+  .btns {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    position: absolute;
+    z-index: 999;
+    left: 30rpx;
+    bottom: 30rpx;
+    .btn {
+      width: 336rpx;
+      height: 88rpx;
+      border-radius: 44rpx;
+      border: 1rpx solid $uni-color-primary;
+      color: $uni-color-primary;
+      font-size: 32rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+    .active {
+      color: #fff;
+      margin-left: 18rpx;
+      background-color: $uni-color-primary;
+    }
+  }
   .transform_list {
-    height: 760rpx;
+    height: 660rpx;
     margin-bottom: 30rpx;
     overflow: auto;
     .line {
@@ -485,34 +845,14 @@
         color: $uni-color-primary;
         margin-left: 12rpx;
       }
+      .green {
+        color: #00ba67;
+      }
       .checked {
         width: 40rpx;
         height: 40rpx;
       }
     }
   }
-  .btns {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    .btn {
-      width: 336rpx;
-      height: 88rpx;
-      border-radius: 44rpx;
-      border: 1rpx solid $uni-color-primary;
-      color: $uni-color-primary;
-      font-size: 32rpx;
-      display: flex;
-      justify-content: center;
-      align-items: center;
-    }
-    .active{
-      color: #fff;
-      background-color: $uni-color-primary;
-    }
-  }
-}
-.TransformModal{
-  height: 1000rpx;
 }
 </style>
\ No newline at end of file
diff --git a/pda/pages/index/control.vue b/pda/pages/index/control.vue
index 119ab38..02e61af 100644
--- a/pda/pages/index/control.vue
+++ b/pda/pages/index/control.vue
@@ -1,34 +1,47 @@
 <template>
   <view class="main_app">
-    <view class="title">
-      <view class="icon"></view>
-      <view class="name">瀹夋嘲鐗╂祦鍗歌揣鏈堝彴</view>
-    </view>
-    <div class="data_list">
-      <div class="line">
-        <div class="name">1鍙锋湀鍙�</div>
-        <u-switch v-model="list"></u-switch>
-      </div>
-      <div class="line">
-        <div class="name">1鍙锋湀鍙�</div>
-        <u-switch v-model="list"></u-switch>
-      </div>
-    </div>
+		<template v-for="item in platformGroupList">
+			<view class="title">
+			  <view class="icon"></view>
+			  <view class="name">{{item.name}}</view>
+			</view>
+			<view class="data_list">
+			  <view class="line" v-for="(platform, i) in item.platformList" :key="platform.id">
+			    <view class="name">{{platform.name}}</view>
+			    <u-switch v-model="platform.status" activeColor="#279BAA" inactiveColor="#cccccc" :inactiveValue="0" :activeValue="1" @change="e => changeStatus(platform)" />
+			  </view>
+			</view>
+		</template>
   </view>
 </template>
 
 <script>
+	import { getPlatformGroupList, updPlatformStatus } from '@/api'
 export default {
   data() {
     return {
-      list: []
+      platformGroupList: []
     }
   },
   onLoad() {
-
+		this.getPlatformGroup()
   },
   methods: {
-
+		changeStatus(item) {
+			console.log(item);
+			updPlatformStatus({
+				id: item.id,
+				status: item.status
+			})
+		},
+		getPlatformGroup() {
+			getPlatformGroupList({
+				queryData: 1,
+				queryType: 0
+			}).then(res => {
+				this.platformGroupList = res.data || []
+			})
+		},
   }
 }
 </script>
diff --git a/pda/pages/index/login.vue b/pda/pages/index/login.vue
index 6e0f386..60e8d8f 100644
--- a/pda/pages/index/login.vue
+++ b/pda/pages/index/login.vue
@@ -3,7 +3,7 @@
     <image class="login_bg" src="@/static/login_bg@2x.png" />
     <image class="login_logo" src="@/static/logo@2x.png" mode="widthFix" />
     <view class="login_title" style="marginTop: 40rpx;">瀹夋嘲鐗╂祦鏅烘収鍥尯</view>
-    <view class="login_title" style="marginBottom: 80rpx;">鐗╂祦杞︾鐞嗙郴缁�</view>
+    <view class="login_title" style="marginBottom: 60rpx;">鏁板瓧鍖栨湀鍙拌皟搴﹀钩鍙�</view>
     <view class="login_list">
       <view class="login_list_item">
         <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
@@ -42,8 +42,8 @@
   data() {
     return {
       form: {
-        account: '',
-        password: '',
+        username: '13996529050',
+        password: '123456',
       },
       isShowProtocol: false,
       ProtocolFlag: false,
@@ -53,7 +53,7 @@
   },
 
   onLoad() {
-    // this.initCaptcha()
+    this.initCaptcha()
   },
 
   methods: {
@@ -61,6 +61,33 @@
     changeFalg() {
       this.ProtocolFlag = !this.ProtocolFlag
     },
+		onLogin() {
+		  const { form, ProtocolFlag } = this
+		  if (!form.username) return uni.showToast({
+		    title: '璐﹀彿涓嶈兘涓虹┖',
+		    icon: 'none'
+		  })
+		  if (!form.password) return uni.showToast({
+		    title: '瀵嗙爜涓嶈兘涓虹┖',
+		    icon: 'none'
+		  })
+		  loginPost({
+		    ...form,
+				code: 1,
+		    uuid: this.captcha.uuid,
+		    openId: this.$store.state.openId
+		  }).then(res => {
+		    if (res.code === 200) {
+		      this.setToken(res.data)
+		      getUserInfo().then(ress => {
+		        this.setUserInfo(ress.data)
+		        uni.redirectTo({
+		          url: "/pages/index/index"
+		        })
+		      })
+		    }
+		  })
+		},
     getContent() {
       getSystemDictData({
         dictCode: 'SYSTEM',
@@ -78,41 +105,6 @@
         this.captcha = res.data
       })
     },
-
-    onLogin() {
-      const { form, ProtocolFlag } = this
-      if (!ProtocolFlag) return uni.showToast({
-        title: '璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁�',
-        icon: 'none'
-      })
-      if (!form.username) return uni.showToast({
-        title: '璐﹀彿涓嶈兘涓虹┖',
-        icon: 'none'
-      })
-      if (!form.password) return uni.showToast({
-        title: '瀵嗙爜涓嶈兘涓虹┖',
-        icon: 'none'
-      })
-      if (!form.code) return uni.showToast({
-        title: '楠岃瘉鐮佷笉鑳戒负绌�',
-        icon: 'none'
-      })
-      loginPost({
-        ...form,
-        uuid: this.captcha.uuid,
-        openId: this.$store.state.openId
-      }).then(res => {
-        if (res.code === 200) {
-          this.setToken(res.data)
-          getUserInfo().then(ress => {
-            this.setUserInfo(ress.data)
-            uni.redirectTo({
-              url: "/pages/staff/index"
-            })
-          })
-        }
-      })
-    }
   }
 }
 </script>
@@ -120,9 +112,8 @@
 <style lang="scss" scoped>
 .login {
   width: 100%;
-  height: 100vh;
   display: flex;
-  padding-top: 160rpx;
+  padding-top: 100rpx;
   box-sizing: border-box;
   align-items: center;
   flex-direction: column;
diff --git a/pda/pages/index/queueup.vue b/pda/pages/index/queueup.vue
index c983523..e9e23c7 100644
--- a/pda/pages/index/queueup.vue
+++ b/pda/pages/index/queueup.vue
@@ -1,8 +1,9 @@
 <template>
   <view class="main_app">
     <view class="main_content">
-      <view class="title"
-        >瀹夋嘲鐗╂祦瑁呰揣骞冲彴<u-icon
+      <view class="title" @click="showPlatformgroup = true"
+        >{{ platformGroup.name
+        }}<u-icon
           name="arrow-down"
           size="20"
           class="ml12"
@@ -12,63 +13,134 @@
       <view class="input_wrap">
         <u-icon name="search" class="mr12" size="19" color="#999999" />
         <input
+          v-model="carCodeFront"
           type="text"
           placeholder="鎼滅储杞﹁締鐗岀収"
           placeholder-class="placeholder9"
+          @confirm="handleQuery"
         />
       </view>
       <view class="count"
-        >宸茬鍒拌溅杈嗭細<text>{{ 10 }}</text></view
+        >宸茬鍒拌溅杈嗭細<text>{{ total }}</text></view
       >
     </view>
     <!--  -->
-    <div class="dataList">
-      <div class="item">
+    <view class="dataList">
+      <view class="item" v-for="item in platformLineUpList" :key="item.id">
         <view class="head">
-          <view class="code">
-            <text>鐨�</text>
-            <text>AD1212</text>
+          <view v-if="item.carCodeFront" class="code">
+            <text>{{ item.carCodeFront.slice(0, 1) }}</text>
+            <text>{{ item.carCodeFront.slice(1, 2) }}</text>
+            <text>路</text>
+            <text>{{ item.carCodeFront.slice(2) }}</text>
           </view>
-          <view class="status">绛惧埌鏃堕棿锛歿{ 11 }}</view>
+          <view class="status" v-if="item.signDate"
+            >绛惧埌鏃堕棿锛歿{ item.signDate.slice(11, 16) }}</view
+          >
         </view>
-        <view class="line">
+        <view class="line" v-if="item.type == 4">
+          <text class="label">鍚堝悓鍗曞彿</text>
+          <text class="value">{{ item.contractNum }}</text>
+        </view>
+        <view class="line" v-else>
           <text class="label">杩愯緭鍗曞彿</text>
-          <text class="value">11111</text>
+          <text class="value">{{ item.code }}</text>
           <text class="primaryColor" @click="handleDetail()">杩愬崟璇︽儏</text>
         </view>
         <view class="line">
           <text class="label">椹鹃┒鍛�</text>
-          <text class="value">11111</text>
+          <text class="value"
+            >{{ item.driverName }} {{ item.drivierPhone }}</text
+          >
         </view>
         <view class="line">
           <text class="label">鎬昏繍杈撻噺</text>
-          <text class="value">11111</text>
+          <text class="value">{{ item.totalNum }}涓囨敮</text>
         </view>
-        <view class="line">
+        <view class="line" v-if="item.type != 4">
           <text class="label">杩愯緭鍏徃</text>
-          <text class="value">11111</text>
+          <text class="value">{{ item.carrierName }}</text>
         </view>
-        <view class="btns">
+        <!-- <view class="btns">
           <view class="btn active">鍏ュ洯</view>
-        </view>
-      </div>
-    </div>
+        </view> -->
+      </view>
+      <view v-if="platformLineUpList.length == 0" class="empty_wrap">
+        <image src="@/static/default_nodata@2x.png" />
+        <text>鏆傛棤浣滀笟杞﹁締</text>
+      </view>
+    </view>
+    <u-picker
+      :show="showPlatformgroup"
+      keyName="name"
+      :columns="[platformGroupList]"
+      @cancel="showPlatformgroup = false"
+      @confirm="platConfirm"
+    ></u-picker>
   </view>
 </template>
 
 <script>
+import { platformLineUpPage, getPlatformGroupList } from '@/api'
 export default {
   data() {
     return {
-      showDetail: false
+      showDetail: false,
+      showPlatformgroup: false,
+      capacity: 10,
+      page: 1,
+      total: 0,
+      carCodeFront: '',
+      platformGroup: {},
+      platformGroupList: [],
+      platformLineUpList: []
     }
   },
   onLoad() {
-
+    this.getPlatformGroup()
   },
+	onReachBottom() {
+		if(this.total > this.platformLineUpList.length){
+			this.getList()
+		}
+	},
   methods: {
     handleDetail() {
       this.showDetail = true
+    },
+    getPlatformGroup() {
+      getPlatformGroupList({
+        queryData: 1,
+        queryType: 0
+      }).then(res => {
+        this.platformGroupList = res.data || []
+        if (this.platformGroupList && this.platformGroupList.length > 0) {
+          this.platformGroup = this.platformGroupList[0]
+          this.getList()
+        }
+      })
+    },
+    getList() {
+      const { page, capacity, platformGroup, carCodeFront } = this
+      platformLineUpPage({
+        capacity, page, model: { platformGroupId: platformGroup.id, callType: 2, carCodeFront }
+      }).then(res => {
+        if (res.data) {
+          this.platformLineUpList = [...this.platformLineUpList, ...res.data.records || []]
+          this.total = res.data.total || 0
+        }
+      })
+    },
+    handleQuery() {
+      this.page = 1
+      this.platformLineUpList = []
+      this.getList()
+    },
+    platConfirm(e) {
+      const index = e.indexs[0]
+      this.platformGroup = this.platformGroupList[index]
+      this.getList()
+      this.showPlatformgroup = false
     },
   }
 }
@@ -135,9 +207,15 @@
           border-radius: 8rpx;
           border: 1rpx solid #dfdede;
           text {
-            padding: 0 12rpx;
             &:nth-of-type(1) {
               background: #e9f5f6;
+              padding: 0 12rpx;
+            }
+            &:nth-of-type(2) {
+              padding-left: 4rpx;
+            }
+            &:nth-of-type(4) {
+              padding-right: 6rpx;
             }
           }
         }
diff --git a/pda/pages/index/set.vue b/pda/pages/index/set.vue
index 2a6c345..13473b0 100644
--- a/pda/pages/index/set.vue
+++ b/pda/pages/index/set.vue
@@ -1,33 +1,74 @@
 <template>
   <view class="main_app">
-    <view class="title">
-      <view class="icon"></view>
-      <view class="name">瀹夋嘲鐗╂祦鍗歌揣鏈堝彴</view>
-    </view>
-    <div class="data_list">
-      <div
-        class="item"
-        :class="{ active: i == 1 }"
-        v-for="(item, i) in 7"
-        :key="i"
-      >
-        {{ i }}鍙锋湀鍙�
-      </div>
-    </div>
+		<template v-for="item in platformGroupList">
+			<view class="title">
+			  <view class="icon"></view>
+			  <view class="name">{{item.name}}</view>
+			</view>
+			<view class="data_list">
+			  <view
+			    class="item"
+			    :class="{ active: platform.showConfig }"
+			    v-for="(platform, i) in item.platformList"
+			    :key="platform.id"
+					@click="platformClick(platform.id)"
+			  >
+			    {{platform.name}}
+			  </view>
+			</view>
+		</template>
+		<view class="btns">
+			<div class="btn" @click="$goBack">鍙栨秷</div>
+			<div class="btn active" @click="updUserPlatform">纭畾</div>
+		</view>
   </view>
 </template>
 
 <script>
+import { getPlatformGroupList, updUserPlatformConfig } from '@/api'
 export default {
   data() {
     return {
+			platformGroupList: []
     }
   },
   onLoad() {
-
+		this.getPlatformGroup()
   },
   methods: {
-
+		updUserPlatform(){
+			const { platformGroupList } = this
+			let ids = []
+			platformGroupList.forEach(item => {
+				item.platformList.forEach(platform => {
+						if(platform.showConfig){
+							ids.push(platform.id)
+						}
+				})
+			})
+			updUserPlatformConfig({ids}).then(res => {
+				this.showToast('鏇存柊鎴愬姛')
+				this.$goBack()
+			})
+		},
+		platformClick(id) {
+			const { platformGroupList } = this
+			platformGroupList.forEach(item => {
+				item.platformList.forEach(platform => {
+						if(platform.id === id){
+							platform.showConfig = !platform.showConfig
+						}
+				})
+			})
+		},
+		getPlatformGroup() {
+			getPlatformGroupList({
+				queryData: 1,
+				queryType: 1
+			}).then(res => {
+				this.platformGroupList = res.data || []
+			})
+		},
   }
 }
 </script>
@@ -43,6 +84,9 @@
     margin-bottom: 20rpx;
     padding: 30rpx;
      background-color: #fff;
+		 &:nth-last-child(1){
+			 margin-bottom: 120rpx;
+		 }
     .item {
       width: 210rpx;
       height: 80rpx;
@@ -83,4 +127,33 @@
     }
   }
 }
+.btns{
+	position: fixed;
+	left: 0;
+	bottom: 0;
+	width: 750rpx;
+	height: 120rpx;
+	background: #FFFFFF;
+	box-shadow: 0rpx -4rpx 12rpx 0rpx rgba(0,0,0,0.1);
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 0 30rpx;
+	.btn{
+		width: 336rpx;
+		height: 88rpx;
+		background: #FFFFFF;
+		border-radius: 44rpx;
+		border: 1rpx solid #999999;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		font-size: 32rpx;
+		color: #333333;
+	}
+	.active{
+		background: $uni-color-primary;
+		color: #fff;
+	}
+}
 </style>
\ No newline at end of file
diff --git a/pda/static/default_nodata@2x.png b/pda/static/default_nodata@2x.png
index a4de18b..e3f3124 100644
--- a/pda/static/default_nodata@2x.png
+++ b/pda/static/default_nodata@2x.png
Binary files differ
diff --git a/pda/utils/config.js b/pda/utils/config.js
index 03c8927..c34dbbf 100644
--- a/pda/utils/config.js
+++ b/pda/utils/config.js
@@ -2,3 +2,18 @@
 export const baseUrl = 'admin_interface/'
 export const uploadAvatar = `${baseUrl}visitsAdmin/cloudService/web/public/uploadFtp.do`
 export const uploadUrl = `${baseUrl}visitsAdmin/cloudService/public/uploadBatch`
+
+export const statusMap = {
+	0: '寰呯‘璁�',
+	1: '寰呯鍒�',
+	2: '绛夊緟鍙彿',
+	3: '鍏ュ洯绛夊緟',
+	4: '鏈堝彴绛夊緟', //宸插彨鍙�
+	5: '浣滀笟涓�',
+	6: '浣滀笟瀹屾垚',
+	7: '杞Щ涓�',
+	8: '寮傚父鎸傝捣',
+	9: '宸叉巿鏉冪鍥�',
+	10: '宸茬鍥�',
+	11: '宸茶繃鍙�',
+}
\ No newline at end of file
diff --git a/pda/utils/service.js b/pda/utils/service.js
index 41d0bdf..936c175 100644
--- a/pda/utils/service.js
+++ b/pda/utils/service.js
@@ -34,9 +34,10 @@
 								duration: 2000
 							})
 						})
+						return
 					}
 					if (data.code === 5112) {
-						uni.navigateTo({
+						return uni.navigateTo({
 							url: '/pages/login/login'
 						})
 					}
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index e8788fc..9a829ed 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -746,17 +746,18 @@
      * 0浠诲姟鍒涘缓 1鍙告満纭浠诲姟 2鍙告満绛惧埌 3鍏ュ洯绛夊緟 4鏈堝彴鍙彿 5寮�濮嬩綔涓� 6浣滀笟瀹屾垚 7鏈堝彴杞Щ 8浠诲姟鎸傝捣 9涓嬪彂鎺堟潈绂诲洯 10绂诲洯
      */
     public  enum PlatformJobLogType {
-        CREATE(0, "浠诲姟鍒涘缓","浠诲姟鍒涘缓" ),
-        CONFIRM_TASK(1, "鍙告満纭浠诲姟","鍙告満纭浠诲姟" ),
-        SIGN(2, "鍙告満绛惧埌","鍙告満绛惧埌"),
-        IN_WAIT(3, "鍏ュ洯绛夊緟","鍏ュ洯绛夊緟" ),
-        CALLED(4, "鏈堝彴鍙彿","鏈堝彴鍙彿" ),
-        WORKING(5, "寮�濮嬩綔涓�","寮�濮嬩綔涓�" ),
-        DONE(6, "浣滀笟瀹屾垚 ","浣滀笟瀹屾垚 " ),
-        TRANSFERING(7, "鏈堝彴杞Щ","鏈堝彴杞Щ" ),
-        EXCEPTION(8, "浠诲姟鎸傝捣","浠诲姟鎸傝捣" ),
+        CREATE(0, "浠诲姟鍒涘缓","鍏ュ洯棰勭害鎴愬姛" ),
+        CONFIRM_TASK(1, "鍙告満纭浠诲姟","宸插畬鎴愭椂闂寸‘璁�" ),
+        SIGN(2, "鍙告満绛惧埌","鎺掗槦绛夊緟鍙彿"),
+        IN_WAIT(3, "鍏ュ洯绛夊緟","鍙彿鍏ュ洯绛夊緟" ),
+        CALLED(4, "鏈堝彴鍙彿","{data}鍙彿" ),
+        WORKING(5, "寮�濮嬩綔涓�","杩涘叆{data}寮�濮嬩綔涓�" ),
+        DONE(6, "浣滀笟瀹屾垚 ","鏈堝彴浣滀笟瀹屾垚锛岄┒绂绘湀鍙�" ),
+        TRANSFERING(7, "鏈堝彴杞Щ","{data}鍙戣捣鏈堝彴杞Щ" ),
+        EXCEPTION(8, "浠诲姟鎸傝捣","浣滀笟寮傚父琚寕璧�" ),
         AUTHED_LEAVE(9, "涓嬪彂鎺堟潈绂诲洯","涓嬪彂鎺堟潈绂诲洯" ),
-        LEAVED(10, "宸茬鍥� ","宸茬鍥� " ),
+        LEAVED(10, "宸茬鍥� ","杞﹁締浠巤data}绂诲満 " ),
+        OVER_NUMBER(11, "宸茶繃鍙�","瓒呮椂鏈埌鎸囧畾鏈堝彴鑷姩杩囧彿" ),
         ;
 
         // 鎴愬憳鍙橀噺
@@ -811,8 +812,8 @@
     public  enum PlatformJobStatus {
         WAIT_CONFIRM(0, "寰呯‘璁�","寰呯‘璁�" ),
         WART_SIGN_IN(1, "寰呯鍒�","寰呯鍒�" ),
-        WAIT_CALL(2, "宸茬鍒�","宸茬鍒�"), //绛夊緟鍙彿鍏ュ洯
-        IN_WAIT(3, "鍏ュ洯绛夊緟","鍏ュ洯绛夊緟" ),//宸插叆鍥� 鏈彨鍙疯繘鍏ユ湀鍙�
+        WAIT_CALL(2, "宸茬鍒�","宸茬鍒�"),
+        IN_WAIT(3, "鍏ュ洯绛夊緟","鍏ュ洯绛夊緟" ),
         CALLED(4, "宸插彨鍙�","宸插彨鍙�" ),
         WORKING(5, "浣滀笟涓�","浣滀笟涓�" ),
         DONE(6, "浣滀笟瀹屾垚 ","浣滀笟瀹屾垚 " ),
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformCloudController.java
index 3ac0fde..5acfa7d 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformCloudController.java
@@ -9,8 +9,15 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.Platform;
+import com.doumee.dao.business.model.PlatformGroup;
+import com.doumee.dao.business.model.PlatformJob;
+import com.doumee.dao.web.reqeust.JobOperateDTO;
+import com.doumee.dao.web.reqeust.PlatformDataDTO;
+import com.doumee.dao.web.response.PlatformWorkVO;
+import com.doumee.service.business.PlatformGroupService;
 import com.doumee.service.business.PlatformJobService;
 import com.doumee.service.business.PlatformService;
+import com.doumee.service.business.PlatformShowParamService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,7 +30,7 @@
  * @author 姹熻箘韫�
  * @since 2024/04/28 16:06
  */
-@Api(tags = "鏈堝彴淇℃伅琛�")
+@Api(tags = "銆愬悗绔�戞湀鍙颁俊鎭〃")
 @RestController
 @RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/platform")
 public class PlatformCloudController extends BaseController {
@@ -32,7 +39,13 @@
     private PlatformService platformService;
 
     @Autowired
+    private PlatformGroupService platformGroupService;
+
+    @Autowired
     private PlatformJobService platformJobService;
+
+    @Autowired
+    private PlatformShowParamService platformShowParamService;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -103,4 +116,102 @@
     public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         return ApiResponse.success(platformService.findById(id));
     }
+
+
+
+
+    @ApiOperation("鑾峰彇鏈堝彴缁勪俊鎭�")
+    @PostMapping("/getPlatformGroupList")
+    public ApiResponse<List<PlatformGroup>>  getPlatformGroupList (@RequestBody PlatformDataDTO platformDataDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(platformGroupService.getAllPlatformGroup(platformDataDTO,getLoginUser(token)));
+    }
+
+    @ApiOperation("鑾峰彇鏈堝彴浠诲姟淇℃伅")
+    @GetMapping("/getPlatformWorkData")
+    public ApiResponse<PlatformWorkVO>  getPlatformWorkData (@RequestParam Integer platformId, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(platformJobService.getPlatformWorkVOById(platformId));
+    }
+
+    @ApiOperation("鏇存柊鏈堝彴閰嶇疆淇℃伅")
+    @GetMapping("/updUserPlatformConfig")
+    public ApiResponse  updUserPlatformConfig (@RequestParam List<Integer> ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        platformShowParamService.updUserConfig(ids,getLoginUser(token));
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+    @ApiOperation("杞﹁締鎺掗槦鎯呭喌")
+    @PostMapping("/platformLineUpPage")
+    public ApiResponse<PageData<PlatformJob>> platformLineUpPage (@RequestBody PageWrap<PlatformJob> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(platformJobService.platformCallList(pageWrap));
+    }
+
+
+    @ApiOperation("鍙彿鍒楄〃")
+    @PostMapping("/platformCallList")
+    public ApiResponse<PageData<PlatformJob>> platformCallList (@RequestBody PageWrap<PlatformJob> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(platformJobService.platformCallList(pageWrap));
+    }
+
+
+    @ApiOperation("鍙彿鍏ュ洯")
+    @PostMapping("/platformInPark")
+    public ApiResponse platformInPark (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.platformInPark(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @ApiOperation("鏈堝彴鍙彿")
+    @PostMapping("/platformCallNumber")
+    public ApiResponse platformCallNumber (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.platformCallNumber(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+    @ApiOperation("杞Щ鏈堝彴")
+    @PostMapping("/platformMove")
+    public ApiResponse platformMove (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.platformMove(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @ApiOperation("鏈堝彴杩囧彿")
+    @PostMapping("/platformOverNumber")
+    public ApiResponse platformOverNumber (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.platformOverNumber(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @ApiOperation("寮傚父鎸傝捣")
+    @PostMapping("/platformErr")
+    public ApiResponse platformErr (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.platformErr(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @ApiOperation("鎵嬪姩寮�濮嬩綔涓�")
+    @PostMapping("/beginWork")
+    public ApiResponse beginWork (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.beginWork(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+    @ApiOperation("瀹屾垚浣滀笟")
+    @PostMapping("/finishWork")
+    public ApiResponse finishWork (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.finishWork(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformGroupCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformGroupCloudController.java
index a614144..c4a02f9 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformGroupCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformGroupCloudController.java
@@ -9,8 +9,11 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.PlatformGroup;
+import com.doumee.dao.web.reqeust.PlatformDataDTO;
 import com.doumee.service.business.PlatformGroupService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -92,4 +95,14 @@
     public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         return ApiResponse.success(platformGroupService.findById(id));
     }
+
+    @ApiOperation("鑾峰彇鏈堝彴缁勪俊鎭�")
+    @PostMapping("/getPlatformGroupList")
+    @CloudRequiredPermission("business:platformgroup:query")
+    public ApiResponse<List<PlatformGroup>>  getPlatformGroupList (@RequestBody PlatformDataDTO platformDataDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(platformGroupService.getAllPlatformGroup(platformDataDTO,getLoginUser(token)));
+    }
+
+
+
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/openapi/HkOpenApiController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/openapi/HkOpenApiController.java
index 6342791..686dbf0 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/openapi/HkOpenApiController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/openapi/HkOpenApiController.java
@@ -7,8 +7,13 @@
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.openapi.request.*;
 import com.doumee.dao.openapi.response.*;
+import com.doumee.service.business.PlatformJobService;
+import com.doumee.service.business.PlatformLogService;
+import com.doumee.service.business.PlatformService;
+import com.doumee.service.business.PlatformWaterGasService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,67 +31,66 @@
 @RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/hk/api")
 public class HkOpenApiController extends BaseController {
 
+    @Autowired
+    private PlatformService platformService;
+
+    @Autowired
+    private PlatformLogService platformLogService;
+
+    @Autowired
+    private PlatformJobService platformJobService;
+
+    @Autowired
+    private PlatformWaterGasService platformWaterGasService;
+
     @PreventRepeat
     @ApiOperation("銆愮敤姘撮噺銆戞湰鏈堛�佷笂鏈堝拰鍘诲勾鍚屾湀")
     @PostMapping("/water/dataByMonth")
     @LoginNoRequired
     public ApiResponse<WaterByMonthResponse> waterDataByMonth(@RequestBody WaterByMonthRequest param) {
-        return ApiResponse.success(new WaterByMonthResponse());
-    }
-    @PreventRepeat
-    @ApiOperation("銆愮敤姘撮噺銆戣繎12涓湀鐢ㄦ按閲忎俊鎭垪琛�")
-    @PostMapping("/water/lastMonthsDataList")
-    @LoginNoRequired
-    public ApiResponse<List<PlatformLastMonthListResponse>> lastMonthsWaterList( ) {
-        return ApiResponse.success(new ArrayList<>());
-    }
-    @ApiOperation("銆愮敤姘旈噺銆戣繎12涓湀鐢ㄦ皵閲忎俊鎭垪琛�")
-    @PostMapping("/gas/lastMonthsDataList")
-    @LoginNoRequired
-    public ApiResponse<List<PlatformLastMonthListResponse>> lastMonthsGasList () {
-        return ApiResponse.success(new ArrayList<>());
+        return ApiResponse.success(platformWaterGasService.waterDataByMonth(param));
     }
     @PreventRepeat
     @ApiOperation("銆愮敤姘旈噺銆戞湰鏈堛�佷笂鏈堝拰鍘诲勾鍚屾湀")
     @PostMapping("/gas/dataByMonth")
     @LoginNoRequired
     public ApiResponse<GasByMonthResponse> gasDataByMonth(@RequestBody GasByMonthRequest param) {
-        return ApiResponse.success(new GasByMonthResponse());
+        return ApiResponse.success(platformWaterGasService.gasDataByMonth(param));
     }
     @PreventRepeat
     @ApiOperation("銆愭湀鍙般�戞寜澶╃粺璁¤繍鍗曡姹傚弬鏁�")
     @PostMapping("/platform/orderNumByDate")
     @LoginNoRequired
     public ApiResponse<PlatformOrderNumByDateResponse> orderNumByDate(@RequestBody PlatformOrderNumByDateRequest param) {
-        return ApiResponse.success(new PlatformOrderNumByDateResponse());
+        return ApiResponse.success(platformJobService.orderNumByDate(param));
     }
     @PreventRepeat
-    @ApiOperation("銆愭湀鍙般�戞湀鍙板悇鐘舵�佹暟閲忕粺璁�")
+    @ApiOperation("銆愭湀鍙般�戞湀鍙扮姸鎬佹暟閲忕粺璁�")
     @PostMapping("/platform/totalNumByStatus")
     @LoginNoRequired
-    public ApiResponse<PlatformNumByStatusResponse> totalNumByStatus( ) {
-        return ApiResponse.success(new PlatformNumByStatusResponse());
+    public ApiResponse<PlatformNumByStatusResponse> totalNumByStatus(@RequestBody PlatformNumByStatusRequest param) {
+        return ApiResponse.success(platformService.getPlatformNumByStatusResponse());
     }
     @PreventRepeat
     @ApiOperation("銆愭湀鍙般�戞湀鍙板綋鍓嶄綔涓氫俊鎭垪琛�")
     @PostMapping("/platform/workingDataList")
     @LoginNoRequired
-    public ApiResponse<List<PlatformDataListResponse>> platformWorkingDataList( ) {
-        return ApiResponse.success(new ArrayList<>());
+    public ApiResponse<List<PlatformDataListResponse>> platformWorkingDataList(@RequestBody PlatformDataListRequest param) {
+        return ApiResponse.success(platformJobService.platformWorkingDataList(param));
     }
     @PreventRepeat
     @ApiOperation("銆愭湀鍙般�戞湀鍙颁綔涓氳鎯呬俊鎭�")
     @PostMapping("/platform/workDataInfo")
     @LoginNoRequired
-    public ApiResponse<PlatformDataInfoResponse> platformWorkingDataInfo(@RequestBody PlatformDataInfoRequest param) {
-        return ApiResponse.success(new PlatformDataInfoResponse());
+    public ApiResponse<PlatformDataInfoResponse> platformWorkingDataList(@RequestBody PlatformDataInfoRequest param) {
+        return ApiResponse.success(platformJobService.platformWorkingDataList(param));
     }
     @PreventRepeat
     @ApiOperation("銆愭湀鍙般�戝綋鍓嶈溅杈嗙姸鎬佹暟閲忕粺璁�")
     @PostMapping("/platform/carStatusNum")
     @LoginNoRequired
-    public ApiResponse<CarNumByStatusResponse> carStatusNum( ) {
-        return ApiResponse.success(new CarNumByStatusResponse());
+    public ApiResponse<CarNumByStatusResponse> carStatusNum(@RequestBody CarNumByStatusRequest param) {
+        return ApiResponse.success(platformJobService.carStatusNum(param));
     }
 
     @PreventRepeat
@@ -94,21 +98,21 @@
     @PostMapping("/platform/carLogsList")
     @LoginNoRequired
     public ApiResponse<List<CarLogsListResponse>> carLogsList(@RequestBody CarLogsListRequest param) {
-        return ApiResponse.success(new ArrayList<>());
+        return ApiResponse.success(platformLogService.getCarLogsListResponse(param));
     }
     @PreventRepeat
     @ApiOperation("銆愭湀鍙般�戞帓闃熼槦鍒楀垪琛ㄩ泦鍚�")
     @PostMapping("/platform/queueList")
     @LoginNoRequired
-    public ApiResponse< PlatformQueuingListResponse> queueList( ) {
-        return ApiResponse.success(new PlatformQueuingListResponse());
+    public ApiResponse<PlatformQueuingListResponse> queueList(@RequestBody PlatformQueuingListRequest param) {
+        return ApiResponse.success(platformJobService.queueList(param));
     }
 
     @PreventRepeat
     @ApiOperation("銆愭湀鍙般�戦璀︿簨浠堕泦鍚堝垪琛�")
     @PostMapping("/platform/warningEventList")
     @LoginNoRequired
-    public ApiResponse<List<CarLogsListResponse>> warningEventList( ) {
+    public ApiResponse<List<PlatformWarnEventListResponse>> warningEventList(@RequestBody PlatformWarnEventListRequest param) {
         return ApiResponse.success(new ArrayList<>());
     }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/DriverPlatformController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/DriverPlatformController.java
index 688be9f..b87d935 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/DriverPlatformController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/DriverPlatformController.java
@@ -87,6 +87,16 @@
         return ApiResponse.success(platformBooksService.apply(platformBooksApplyDTO));
     }
 
+
+    @ApiOperation("鐗╂祦杞﹂绾︿慨鏀�")
+    @PostMapping("/applyEdit")
+    public ApiResponse<Integer> applyEdit (@RequestBody PlatformBooksApplyDTO platformBooksApplyDTO , @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        LoginUserInfo loginUserInfo = getLoginUser(token);
+        platformBooksApplyDTO.setUserId(loginUserInfo.getMemberId());
+        platformBooksApplyDTO.setDriverId(loginUserInfo.getMemberId());
+        return ApiResponse.success(platformBooksService.edit(platformBooksApplyDTO));
+    }
+
     @ApiOperation("鐗╂祦杞﹂绾﹁褰�")
     @PostMapping("/page")
     public ApiResponse<PageData<PlatformBooks>> findPage (@RequestBody PageWrap<PlatformBooks> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
@@ -111,6 +121,13 @@
     }
 
     /******************************************************鍙告満浠诲姟鎺ュ彛************************************************************************/
+    @ApiOperation("浠诲姟纭")
+    @PostMapping("/confirmTask")
+    public ApiResponse  confirmTask (@RequestBody ConfirmTaskDTO confirmTaskDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        confirmTaskDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.confirmTask(confirmTaskDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
 
     @ApiOperation("浠诲姟绛惧埌")
     @PostMapping("/signIn")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/PdaPlatformController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/PdaPlatformController.java
index bee4a37..8be5af1 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/PdaPlatformController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/PdaPlatformController.java
@@ -12,6 +12,7 @@
 import com.doumee.dao.web.reqeust.*;
 import com.doumee.dao.web.response.DriverHomeVO;
 import com.doumee.dao.web.response.LineUpVO;
+import com.doumee.dao.web.response.PlatformWorkVO;
 import com.doumee.service.business.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -55,17 +56,20 @@
     private PlatformService platformService;
 
     @ApiOperation("鑾峰彇鏈堝彴缁勪俊鎭�")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "queryType", dataType = "Integer", value = "0=鍏ㄩ儴鏈堝彴锛�1=鍚敤鏈堝彴 2=閰嶇疆鏄剧ず鏈堝彴", required = false)
-    })
-    @GetMapping("/getPlatformGroupList")
-    public ApiResponse<List<PlatformGroup>>  getPlatformGroupList (@RequestParam Integer queryType, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
-        return ApiResponse.success(platformGroupService.getAllPlatformGroup(queryType,getLoginUser(token)));
+    @PostMapping("/getPlatformGroupList")
+    public ApiResponse<List<PlatformGroup>>  getPlatformGroupList (@RequestBody PlatformDataDTO platformDataDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(platformGroupService.getAllPlatformGroup(platformDataDTO,getLoginUser(token)));
+    }
+
+    @ApiOperation("鑾峰彇鏈堝彴浠诲姟淇℃伅")
+    @GetMapping("/getPlatformWorkData")
+    public ApiResponse<PlatformWorkVO>  getPlatformWorkData (@RequestParam Integer platformId, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(platformJobService.getPlatformWorkVOById(platformId));
     }
 
     @ApiOperation("鏇存柊鏈堝彴閰嶇疆淇℃伅")
-    @PostMapping("/updUserPlatformConfig")
-    public ApiResponse  updUserPlatformConfig (@RequestBody List<Integer> ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+    @GetMapping("/updUserPlatformConfig")
+    public ApiResponse  updUserPlatformConfig (@RequestParam List<Integer> ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         platformShowParamService.updUserConfig(ids,getLoginUser(token));
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
@@ -73,22 +77,38 @@
     @ApiOperation("淇敼绂佸惎鐢ㄧ姸鎬�")
     @PostMapping("/updPlatformStatus")
     public ApiResponse  updPlatformStatus (@RequestBody Platform platform, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        platform.setLoginUserInfo(getLoginUser(token));
         platformService.updateStatusById(platform);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
     @ApiOperation("杞﹁締鎺掗槦鎯呭喌")
     @PostMapping("/platformLineUpPage")
-    public ApiResponse<PageData<PlatformJob>> platformLineUpPage (@RequestBody PageWrap<PlatformJob> pageWrap) {
-        return ApiResponse.success(platformJobService.findPage(pageWrap));
+    public ApiResponse<PageData<PlatformJob>> platformLineUpPage (@RequestBody PageWrap<PlatformJob> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(platformJobService.platformCallList(pageWrap));
     }
 
+
+    @ApiOperation("鍙彿鍒楄〃")
+    @PostMapping("/platformCallList")
+    public ApiResponse<PageData<PlatformJob>> platformCallList (@RequestBody PageWrap<PlatformJob> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(platformJobService.platformCallList(pageWrap));
+    }
+
+
+    @ApiOperation("鍙彿鍏ュ洯")
+    @PostMapping("/platformInPark")
+    public ApiResponse platformInPark (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jobOperateDTO.setLoginUserInfo(getLoginUser(token));
+        platformJobService.platformInPark(jobOperateDTO);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
 
     @ApiOperation("鏈堝彴鍙彿")
     @PostMapping("/platformCallNumber")
     public ApiResponse platformCallNumber (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jobOperateDTO.setLoginUserInfo(getLoginUser(token));
-        platformJobService.platformInPark(jobOperateDTO);
+        platformJobService.platformCallNumber(jobOperateDTO);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
@@ -97,7 +117,7 @@
     @PostMapping("/platformMove")
     public ApiResponse platformMove (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jobOperateDTO.setLoginUserInfo(getLoginUser(token));
-        platformJobService.platformInPark(jobOperateDTO);
+        platformJobService.platformMove(jobOperateDTO);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
@@ -105,7 +125,7 @@
     @PostMapping("/platformOverNumber")
     public ApiResponse platformOverNumber (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jobOperateDTO.setLoginUserInfo(getLoginUser(token));
-        platformJobService.platformInPark(jobOperateDTO);
+        platformJobService.platformOverNumber(jobOperateDTO);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
@@ -113,7 +133,7 @@
     @PostMapping("/platformErr")
     public ApiResponse platformErr (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jobOperateDTO.setLoginUserInfo(getLoginUser(token));
-        platformJobService.platformInPark(jobOperateDTO);
+        platformJobService.platformErr(jobOperateDTO);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
@@ -121,7 +141,7 @@
     @PostMapping("/beginWork")
     public ApiResponse beginWork (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jobOperateDTO.setLoginUserInfo(getLoginUser(token));
-        platformJobService.platformInPark(jobOperateDTO);
+        platformJobService.beginWork(jobOperateDTO);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
@@ -130,7 +150,7 @@
     @PostMapping("/finishWork")
     public ApiResponse finishWork (@RequestBody JobOperateDTO jobOperateDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         jobOperateDTO.setLoginUserInfo(getLoginUser(token));
-        platformJobService.platformInPark(jobOperateDTO);
+        platformJobService.finishWork(jobOperateDTO);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java
index 7f6c4b6..fafc0aa 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java
@@ -4,6 +4,7 @@
 import com.doumee.core.annotation.excel.ExcelColumn;
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.LoginUserModel;
+import com.doumee.dao.web.response.PlatformWorkVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -183,4 +184,10 @@
     @ApiModelProperty(value = "浣滀笟鐘舵�侊細0=绌洪棽锛�1=浣滀笟涓�")
     @TableField(exist = false)
     private Integer workStatus;
+
+
+
+    @ApiModelProperty(value = "鏈堝彴浣滀笟鏁版嵁")
+    @TableField(exist = false)
+    private PlatformWorkVO platformWorkVO;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformGroup.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformGroup.java
index 364d303..a82275a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformGroup.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformGroup.java
@@ -81,4 +81,13 @@
     @ApiModelProperty(value = "鏈堝彴缁勪笅鐨勬湀鍙�")
     @TableField(exist = false)
     private List<Platform> platformList;
+
+
+    @ApiModelProperty(value = "浣滀笟涓帓闃熻溅杈�", example = "1")
+    @TableField(exist = false)
+    private List<PlatformJob> workJobList;
+
+    @ApiModelProperty(value = "宸茬鍒版帓闃熻溅杈�", example = "1")
+    @TableField(exist = false)
+    private List<PlatformJob> signJobList;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java
index f3e24c0..cce09ae 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java
@@ -274,13 +274,21 @@
     @TableField(exist = false)
     private String finishTimeStr;
 
-    @ApiModelProperty(value = "鍏宠仈鏈堝彴缁勭紪鐮侊紙鍏宠仈platform_group琛級", example = "1")
-    @TableField(exist = false)
-    private Integer groupId;
-
     @ApiModelProperty(value = "浣滀笟鏈堝彴鍚嶇О")
     @TableField(exist = false)
     private String platformName ;
+
+    @ApiModelProperty(value = "wms涓氬姟涓婚敭")
+    @TableField(exist = false)
+    private Integer wmsId ;
+
+    @ApiModelProperty(value = "鏈堝彴缁勭被鍨嬶細0瀹夋嘲鐗╂祦瑁呰揣 1瀹夋嘲鐗╂祦鍗歌揣 2甯傚叕鍙稿嵏璐�")
+    @TableField(exist = false)
+    private Integer groupType ;
+
+    @ApiModelProperty(value = "鎵胯繍鍟�")
+    @TableField(exist = false)
+    private String carrierName ;
 
     @ApiModelProperty(value = "璺濈绛惧埌鐐硅窛绂�")
     @TableField(exist = false)
@@ -302,6 +310,14 @@
     @TableField(exist = false)
     private  PlatformWmsJob platformWmsJob;
 
+    @ApiModelProperty(value = "鏀惰揣鍦帮紙鐩殑鍦帮級")
+    @TableField(exist = false)
+    private String repertotyAddress;
+
+    @ApiModelProperty(value = "鍙彿绫诲瀷锛�1=鍙彿鍏ュ洯 锛� 2=鏈堝彴鍙彿 锛� 3=鎺掗槦鎯呭喌", example = "1")
+    @TableField(exist = false)
+    private Integer callType;
+
     public void dealTime(){
         if(Constants.equalsInteger(this.getStatus(),Constants.PlatformJobStatus.WAIT_CONFIRM.getKey())
                 || Constants.equalsInteger(this.getStatus(),Constants.PlatformJobStatus.WART_SIGN_IN.getKey())
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformLog.java
index dc52393..5ed449e 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformLog.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformLog.java
@@ -91,7 +91,7 @@
     @ExcelColumn(name="鍙傛暟3")
     private String param3;
 
-    @ApiModelProperty(value = "鍙傛暟4")
+    @ApiModelProperty(value = "鍙傛暟4 杞︾墝鐓�")
     @ExcelColumn(name="鍙傛暟4")
     private String param4;
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java
index a801e0d..ec20891 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java
@@ -60,8 +60,8 @@
     @ExcelColumn(name="鎺掑簭鐮�")
     private Integer sortnum;
 
-    @ApiModelProperty(value = "绫诲瀷 0鐢ㄧ數 1鐢ㄧ數 2娌硅��", example = "1")
-    @ExcelColumn(name="绫诲瀷 0鐢ㄧ數 1鐢ㄧ數 2娌硅��")
+    @ApiModelProperty(value = "绫诲瀷 0鐢ㄦ按 1鐢ㄦ皵 2鐢ㄦ补", example = "1")
+    @ExcelColumn(name="绫诲瀷 0鐢ㄦ按 1鐢ㄦ皵 2鐢ㄦ补")
     private Integer type;
 
     @ApiModelProperty(value = "鏁伴噺 (鐢ㄧ數椤匡紝鐢ㄧ數搴︼紱 娌硅�桳锛�", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/GasByMonthRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/GasByMonthRequest.java
index 23c3552..0131957 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/GasByMonthRequest.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/GasByMonthRequest.java
@@ -1,11 +1,12 @@
 package com.doumee.dao.openapi.request;
 
-import com.doumee.core.utils.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * Created by IntelliJ IDEA.
  *
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/PlatformOrderNumByDateRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/PlatformOrderNumByDateRequest.java
index ee8d53b..8277dd6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/PlatformOrderNumByDateRequest.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/PlatformOrderNumByDateRequest.java
@@ -1,11 +1,12 @@
 package com.doumee.dao.openapi.request;
 
-import com.doumee.core.utils.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * Created by IntelliJ IDEA.
  *
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/WaterByMonthRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/WaterByMonthRequest.java
index 556e6ea..816c6db 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/WaterByMonthRequest.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/request/WaterByMonthRequest.java
@@ -1,6 +1,5 @@
 package com.doumee.dao.openapi.request;
 
-import com.doumee.core.utils.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModel;
@@ -9,6 +8,7 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotBlank;
+import java.util.Date;
 
 /**
  * Created by IntelliJ IDEA.
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/CarNumByStatusResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/CarNumByStatusResponse.java
index 3c36936..8b0a5d3 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/CarNumByStatusResponse.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/CarNumByStatusResponse.java
@@ -13,13 +13,12 @@
 @Data
 @ApiModel("銆愭湀鍙般�戝綋鍓嶈溅杈嗙姸鎬佺粺璁℃暟閲忚繑鍥炲弬鏁�")
 public class CarNumByStatusResponse {
-    @ApiModelProperty(value = "鎺掗槦涓暟鎺�", example = "1")
-    private int queuingNum;
-
+    @ApiModelProperty(value = "鎺掗槦涓暟閲�", example = "1")
+    private Long queuingNum;
     @ApiModelProperty(value = "宸茶繘鍦烘暟閲�", example = "1")
-    private int inNum;
+    private Long inNum;
     @ApiModelProperty(value = "浣滀笟涓暟閲�", example = "1")
-    private int workingNum;
+    private Long workingNum;
     @ApiModelProperty(value = "宸茬鍦烘暟閲�", example = "1")
-    private int doneNum;
+    private Long doneNum;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/GasByMonthResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/GasByMonthResponse.java
index b0da793..9706276 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/GasByMonthResponse.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/GasByMonthResponse.java
@@ -20,9 +20,9 @@
     private BigDecimal currentMonth;
 
     @ApiModelProperty(value = "涓婁釜鏈堢敤姘旈噺锛堢珛鏂圭背锛�", example = "1")
-    private String lastMonth;
+    private BigDecimal lastMonth;
 
     @ApiModelProperty(value = "鍘诲勾鍚屾湀鐢ㄦ皵閲忥紙绔嬫柟绫筹級", example = "1")
-    private String lastYearMonth;
+    private BigDecimal lastYearMonth;
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataInfoResponse.java
index 1e8bef3..cf2adf0 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataInfoResponse.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataInfoResponse.java
@@ -21,6 +21,7 @@
     private String hkId;
     @ApiModelProperty(value = "鏈堝彴鍚嶇О")
     private String name;
+
     @ApiModelProperty(value = "鎵胯繍鍗曞彿")
     private String orderCode;
     @ApiModelProperty(value = "浣滀笟杞﹁締")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataListResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataListResponse.java
index 0ac0001..4d6ee20 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataListResponse.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformDataListResponse.java
@@ -22,7 +22,7 @@
     @ApiModelProperty(value = "鏈堝彴鍚嶇О")
     private String name;
     @ApiModelProperty(value = "褰撳墠浣滀笟鏃堕暱", example = "1")
-    private int workTime;
+    private Long workTime;
     @ApiModelProperty(value = "浣滀笟杞﹁締")
     private String carCode;
     @ApiModelProperty(value = "浣滀笟绫诲瀷锛�0=鍏ュ簱 1鍑哄簱", example = "1")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformNumByStatusResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformNumByStatusResponse.java
index a47ba90..b2b94bb 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformNumByStatusResponse.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformNumByStatusResponse.java
@@ -13,11 +13,14 @@
 @Data
 @ApiModel("銆愭湀鍙般�戞湀鍙板悇鐘舵�佹暟閲忕粺璁¤繑鍥炲弬鏁�")
 public class PlatformNumByStatusResponse {
+
     @ApiModelProperty(value = "浣跨敤涓暟閲�", example = "1")
-    private int usingNum;
+    private int usingNum = 0;
 
     @ApiModelProperty(value = "绌洪棽鏁伴噺", example = "1")
-    private int idleNum;
+    private int idleNum = 0;
+
     @ApiModelProperty(value = "鍋滅敤鏁伴噺", example = "1")
-    private int forbiddenNum;
+    private int forbiddenNum = 0;
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformOrderNumByDateResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformOrderNumByDateResponse.java
index fa34c24..6286d6e 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformOrderNumByDateResponse.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/PlatformOrderNumByDateResponse.java
@@ -17,9 +17,10 @@
 @Data
 @ApiModel("銆愭湀鍙般�戞寜澶╃粺璁¤繍鍗曡繑鍥炲弬鏁�")
 public class PlatformOrderNumByDateResponse {
+
     @ApiModelProperty(value = "杩愬崟瀹屾垚閲�", example = "1")
-    private int doneNum;
+    private Long doneNum;
 
     @ApiModelProperty(value = "杩愬崟鎬婚噺", example = "1")
-    private int totalNum;
+    private Long totalNum;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/WaterByMonthResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/WaterByMonthResponse.java
index 9793420..1fa7ed4 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/WaterByMonthResponse.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/openapi/response/WaterByMonthResponse.java
@@ -21,9 +21,9 @@
     private BigDecimal currentMonth;
 
     @ApiModelProperty(value = "涓婁釜鏈堢敤姘撮噺锛堝惃锛�", example = "1")
-    private String lastMonth;
+    private BigDecimal lastMonth;
 
     @ApiModelProperty(value = "鍘诲勾鍚屾湀鐢ㄦ按閲忥紙鍚級", example = "1")
-    private String lastYearMonth;
+    private BigDecimal lastYearMonth;
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ConfirmTaskDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ConfirmTaskDTO.java
new file mode 100644
index 0000000..e68fbf6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/ConfirmTaskDTO.java
@@ -0,0 +1,29 @@
+package com.doumee.dao.web.reqeust;
+
+import com.doumee.core.model.LoginUserInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/8/15 10:49
+ */
+@Data
+public class ConfirmTaskDTO {
+
+    @ApiModelProperty(value = "璁板綍涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒板満鏃ユ湡")
+    private Date arriveDate;
+
+    @ApiModelProperty(value = "鍚庤溅鐗岀収")
+    private String  carCodeBack;
+
+    @ApiModelProperty(value = "鐢ㄦ埛", hidden = true)
+    private LoginUserInfo loginUserInfo;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/PlatformDataDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/PlatformDataDTO.java
new file mode 100644
index 0000000..ffd05e0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/PlatformDataDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.web.reqeust;
+
+import com.doumee.core.model.LoginUserInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/12/7 11:19
+ */
+@Data
+@Api(tags = "鏈堝彴淇℃伅鏌ヨ涓氬姟" )
+public class PlatformDataDTO {
+
+    @ApiModelProperty(value = "鏌ヨ鏈堝彴绫诲瀷锛�0=鍏ㄩ儴鏈堝彴锛�1=閰嶇疆鏄剧ず鏈堝彴")
+    private Integer queryType;
+
+    @ApiModelProperty(value = "鏄惁鏌ヨ鏈堝彴浠诲姟鏁版嵁锛�0=鍚�;1=鏄� 鍚庡彴浣跨敤锛屽墠绔叆0")
+    private Integer queryData;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DriverHomeVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DriverHomeVO.java
index 430b316..5b3e933 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DriverHomeVO.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DriverHomeVO.java
@@ -7,6 +7,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
@@ -25,5 +26,7 @@
     @ApiModelProperty(value = "鍥尯瀵艰鍥�")
     private String reservationMap;
 
+    @ApiModelProperty(value = "绛惧埌闄愬埗璺濈")
+    private BigDecimal signDistance;
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/LineUpVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/LineUpVO.java
index 3c7b6c7..c59b0ea 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/LineUpVO.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/LineUpVO.java
@@ -2,6 +2,7 @@
 
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.dao.business.model.Platform;
+import com.doumee.dao.business.model.PlatformGroup;
 import com.doumee.dao.business.model.PlatformJob;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
@@ -20,7 +21,7 @@
 public class LineUpVO {
 
     @ApiModelProperty(value = "鏈堝彴缁勪俊鎭�")
-    private List<Platform> platformList;
+    private List<PlatformGroup> platformGroupList;
 
     @ApiModelProperty(value = "鐢ㄦ埛", hidden = true)
     private LoginUserInfo loginUserInfo;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/PlatformWorkVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/PlatformWorkVO.java
new file mode 100644
index 0000000..7fcd0c9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/PlatformWorkVO.java
@@ -0,0 +1,31 @@
+package com.doumee.dao.web.response;
+
+import com.doumee.dao.business.model.PlatformJob;
+import com.doumee.dao.system.model.Multifile;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel("鏈堝彴浠诲姟鏁版嵁")
+public class PlatformWorkVO {
+
+    @ApiModelProperty(value = "浠诲姟鍒楄〃")
+    private List<PlatformJob> platformJobList;
+
+    @ApiModelProperty(value = "浣滀笟鏁伴噺")
+    private Integer workNum = 0;
+
+    @ApiModelProperty(value = "宸插彨鍙锋暟閲�")
+    private Integer callNum = 0;
+
+    @ApiModelProperty(value = "绛夊緟鏁伴噺")
+    private Integer waitNum = 0;
+
+    @ApiModelProperty(value = "寮傚父鏁伴噺")
+    private Integer exceptionNum  = 0;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformBooksService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformBooksService.java
index 8931030..0a8dd08 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformBooksService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformBooksService.java
@@ -130,4 +130,10 @@
      */
     void revoke(RevokeDTO revokeDTO, LoginUserInfo loginUserInfo);
 
+    /**
+     * 淇敼棰勭害鐢宠
+     * @param platformBooksApplyDTO
+     * @return
+     */
+    Integer edit(PlatformBooksApplyDTO platformBooksApplyDTO);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformGroupService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformGroupService.java
index 5f98d89..1b843fc 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformGroupService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformGroupService.java
@@ -4,6 +4,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.PlatformGroup;
+import com.doumee.dao.web.reqeust.PlatformDataDTO;
+import com.doumee.dao.web.response.PlatformWorkVO;
+
 import java.util.List;
 
 /**
@@ -100,12 +103,11 @@
 
     /**
      * 鑾峰彇鏈堝彴缁勪俊鎭�
-     * @param queryType
+     * @param platformDataDTO
      * @param loginUserInfo
      * @return
      */
-    List<PlatformGroup> getAllPlatformGroup(Integer queryType, LoginUserInfo loginUserInfo);
-
+    List<PlatformGroup> getAllPlatformGroup(PlatformDataDTO platformDataDTO, LoginUserInfo loginUserInfo);
 
 
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java
index a842e2d..483569a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformJobService.java
@@ -5,12 +5,12 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Platform;
 import com.doumee.dao.business.model.PlatformJob;
-import com.doumee.dao.web.reqeust.JobDetailDTO;
-import com.doumee.dao.web.reqeust.JobOperateDTO;
-import com.doumee.dao.web.reqeust.LineUpDetailDTO;
-import com.doumee.dao.web.reqeust.SignInDTO;
+import com.doumee.dao.openapi.request.*;
+import com.doumee.dao.openapi.response.*;
+import com.doumee.dao.web.reqeust.*;
 import com.doumee.dao.web.response.DriverHomeVO;
 import com.doumee.dao.web.response.LineUpVO;
+import com.doumee.dao.web.response.PlatformWorkVO;
 
 import java.util.List;
 
@@ -97,6 +97,12 @@
     PageData<PlatformJob> findPage(PageWrap<PlatformJob> pageWrap);
 
     /**
+     * 鍙彿鍒楄〃鏁版嵁
+     * @param pageWrap
+     * @return
+     */
+    PageData<PlatformJob> platformCallList(PageWrap<PlatformJob> pageWrap);
+    /**
      * 鏉′欢缁熻
      *
      * @param platformJob 瀹炰綋瀵硅薄
@@ -182,4 +188,23 @@
      */
     List<Platform> getPlatformList(Integer groupId, LoginUserInfo loginUserInfo);
 
+    void confirmTask(ConfirmTaskDTO confirmTaskDTO);
+
+    /**
+     * 鑾峰彇鏈堝彴浠诲姟鏁版嵁
+     * @param platformId
+     * @return
+     */
+    PlatformWorkVO getPlatformWorkVOById(Integer platformId);
+
+
+    PlatformOrderNumByDateResponse orderNumByDate(PlatformOrderNumByDateRequest param);
+
+    List<PlatformDataListResponse> platformWorkingDataList(PlatformDataListRequest param);
+
+    PlatformDataInfoResponse platformWorkingDataList(PlatformDataInfoRequest param);
+
+    CarNumByStatusResponse carStatusNum(CarNumByStatusRequest param);
+
+    PlatformQueuingListResponse queueList(PlatformQueuingListRequest param);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformLogService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformLogService.java
index 6ba2888..e892949 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformLogService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformLogService.java
@@ -3,6 +3,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.PlatformLog;
+import com.doumee.dao.openapi.request.CarLogsListRequest;
+import com.doumee.dao.openapi.response.CarLogsListResponse;
+
 import java.util.List;
 
 /**
@@ -94,4 +97,6 @@
      * @return long
      */
     long count(PlatformLog platformLog);
+
+    List<CarLogsListResponse> getCarLogsListResponse(CarLogsListRequest carLogsListRequest);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformService.java
index 01093fb..beaa70c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformService.java
@@ -3,6 +3,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Platform;
+import com.doumee.dao.openapi.response.PlatformNumByStatusResponse;
+
 import java.util.List;
 
 /**
@@ -95,4 +97,8 @@
      * @return long
      */
     long count(Platform platform);
+
+
+    PlatformNumByStatusResponse getPlatformNumByStatusResponse();
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java
index 320008c..100767b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java
@@ -5,6 +5,11 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.PlatformWaterGas;
+import com.doumee.dao.openapi.request.GasByMonthRequest;
+import com.doumee.dao.openapi.request.WaterByMonthRequest;
+import com.doumee.dao.openapi.response.GasByMonthResponse;
+import com.doumee.dao.openapi.response.WaterByMonthResponse;
+
 import java.util.List;
 
 /**
@@ -98,4 +103,8 @@
      * @return long
      */
     long count(PlatformWaterGas platformWaterGas);
+
+    WaterByMonthResponse waterDataByMonth(WaterByMonthRequest param);
+
+    GasByMonthResponse gasDataByMonth(GasByMonthRequest param);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
index b698dd5..9cef87e 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -96,6 +96,8 @@
     private PlatformJobMapper platformJobMapper;
     @Autowired
     private PlatformLogMapper platformLogMapper;
+    @Autowired
+    private PlatformReasonMapper platformReasonMapper;
 
 
 
@@ -1410,9 +1412,13 @@
             platformBooks.setStatus(approveDTO.getStatus());
             platformBooks.setEditDate(new Date());
             platformBooks.setEditor(approveDTO.getLoginUserInfo().getMemberId());
+            PlatformReason platformReason = platformReasonMapper.selectById(platformBooks.getReasonId());
 
             //鐢熸垚浠诲姟璁板綍
             PlatformJob platformJob = platformBooks.toPlatformJob();
+            platformJob.setPlatformGroupId(platformReason.getGroupId().intValue());
+            platformJob.setType(Constants.platformJobType.sgscxh);
+            platformJob.setStatus(Constants.PlatformJobStatus.WART_SIGN_IN.getKey());
             platformJobMapper.insert(platformJob);
             platformBooks.setJobId(platformJob.getId());
             platformBooksMapper.updateById(platformBooks);
@@ -1421,7 +1427,9 @@
             platformLog.setCreateDate(new Date());
             platformLog.setJobId(platformJob.getId());
             platformLog.setIsdeleted(Constants.ZERO);
-            platformLog.setObjType(Constants.PlatformJobStatus.WART_SIGN_IN.getKey());
+            platformLog.setParam4(platformJob.getCarCodeFront());
+            platformLog.setContent(Constants.PlatformJobLogType.CREATE.getInfo());
+            platformLog.setObjType(Constants.PlatformJobLogType.CREATE.getKey());
             platformLog.setObjId(platformJob.getId().toString());
             platformLog.setAfterContent(JSONObject.toJSONString(platformJob));
             platformLogMapper.insert(platformLog);
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java
index 68318b2..e47c027 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformBooksServiceImpl.java
@@ -18,6 +18,7 @@
 import com.doumee.dao.business.join.ApproveJoinMapper;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.business.vo.ApproveDataVO;
+import com.doumee.dao.web.reqeust.ConfirmTaskDTO;
 import com.doumee.dao.web.reqeust.PlatformBooksApplyDTO;
 import com.doumee.dao.web.reqeust.PlatformBooksCheckNumDTO;
 import com.doumee.dao.web.reqeust.RevokeDTO;
@@ -158,14 +159,8 @@
                 .eq(pageWrap.getModel().getPlateNum() != null, PlatformBooks::getPlateNum, pageWrap.getModel().getPlateNum())
                 .eq(pageWrap.getModel().getDriverPhone() != null, PlatformBooks::getDriverPhone, pageWrap.getModel().getDriverPhone())
                 .ge(pageWrap.getModel().getQueryDate() != null, PlatformBooks::getCreateDate, pageWrap.getModel().getQueryDate())
+                .orderByDesc(PlatformBooks::getCreateDate)
         ;
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
         return PageData.from(platformBooksMapper.selectPage(page, queryWrapper));
     }
 
@@ -250,7 +245,7 @@
 
 
 
-//    @Override
+    @Override
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
     public Integer edit(PlatformBooksApplyDTO platformBooksApplyDTO){
         if(Objects.isNull(platformBooksApplyDTO)
@@ -265,8 +260,6 @@
                 || StringUtils.isBlank(platformBooksApplyDTO.getDriverPhone())
                 || StringUtils.isBlank(platformBooksApplyDTO.getDriverName())
                 || StringUtils.isBlank(platformBooksApplyDTO.getTransportImg())
-                || Objects.isNull(platformBooksApplyDTO.getReasonId())
-                || StringUtils.isBlank(platformBooksApplyDTO.getInReason())
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
@@ -279,7 +272,9 @@
         }
         BeanUtils.copyProperties(platformBooksApplyDTO,platformBooks);
         platformBooks.setEditDate(new Date());
-        platformBooksMapper.insert(platformBooks);
+        platformBooks.setReasonId(null);
+        platformBooks.setInReason(null);
+        platformBooksMapper.updateById(platformBooks);
         return platformBooks.getId();
     }
 
@@ -358,7 +353,6 @@
                 .eq(Approve::getObjId,revokeDTO.getId())
         );
     }
-
 
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformGroupServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformGroupServiceImpl.java
index 05ad10f..578a97b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformGroupServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformGroupServiceImpl.java
@@ -16,6 +16,8 @@
 import com.doumee.dao.business.model.PlatformGroup;
 import com.doumee.dao.business.model.PlatformJob;
 import com.doumee.dao.business.model.PlatformShowParam;
+import com.doumee.dao.web.reqeust.PlatformDataDTO;
+import com.doumee.dao.web.response.PlatformWorkVO;
 import com.doumee.service.business.PlatformGroupService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -202,10 +204,16 @@
 
 
     @Override
-    public List<PlatformGroup> getAllPlatformGroup(Integer queryType,LoginUserInfo loginUserInfo) {
+    public List<PlatformGroup> getAllPlatformGroup(PlatformDataDTO platformDataDTO, LoginUserInfo loginUserInfo) {
+        if(Objects.isNull(platformDataDTO)
+        || Objects.isNull(platformDataDTO.getQueryType())
+        || Objects.isNull(platformDataDTO.getQueryData())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
         List<PlatformGroup> platformGroups = platformGroupMapper.selectList(
                 new QueryWrapper<PlatformGroup>()
-                        .lambda().eq(PlatformGroup::getIsdeleted, Constants.ZERO)
+                        .lambda()
+                        .eq(PlatformGroup::getIsdeleted, Constants.ZERO)
                         .orderByAsc(PlatformGroup::getSortnum)
         );
         //鏌ヨ鏈堝彴缁勪笅鎵�鏈夋湀鍙�
@@ -214,10 +222,12 @@
                         .selectAll(Platform.class)
                         .select(" ( select count(1) from platform_job pj where t.id = pj.PLATFORM_ID and pj.STATUS = "+Constants.PlatformJobStatus.WORKING.getKey()+" ) as workStatus ")
                         .eq(Platform::getIsdeleted, Constants.ZERO)
-                        .eq(Objects.nonNull(queryType)&&!Constants.equalsInteger(queryType,Constants.ZERO),Platform::getStatus,Constants.ZERO)
+                        .eq(Objects.nonNull(platformDataDTO.getQueryType())&&!Constants.equalsInteger(platformDataDTO.getQueryType(),Constants.ZERO),
+                                Platform::getStatus,Constants.ZERO)
         );
         //澶勭悊鎴戠殑鏈堝彴淇℃伅 鏄惁閰嶇疆闅愯棌
-        if(Constants.equalsInteger(queryType,Constants.TWO)){
+        if(Constants.equalsInteger(platformDataDTO.getQueryType(),Constants.ONE)){
+            //鏌ヨ褰撳墠鐧诲綍浜洪厤缃殑鍙煡鐪嬫湀鍙�
             List<PlatformShowParam> platformShowParamList = platformShowParamMapper.selectList(new QueryWrapper<PlatformShowParam>()
                     .lambda()
                     .eq(PlatformShowParam::getIsdeleted, Constants.ZERO)
@@ -240,6 +250,26 @@
                 }
             }
         }
+        if(Constants.equalsInteger(platformDataDTO.getQueryData(),Constants.ONE)){
+            //鏌ヨ浠婂ぉ鎵�鏈夌殑浠诲姟鏁版嵁
+            List<PlatformJob> platformJobList =  platformJobJoinMapper.selectList(new QueryWrapper<PlatformJob>().lambda()
+                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                            .in(PlatformJob::getStatus,
+                                    Constants.PlatformJobStatus.WAIT_CALL.getKey(),
+                                    Constants.PlatformJobStatus.IN_WAIT.getKey(),
+                                    Constants.PlatformJobStatus.CALLED.getKey(),
+                                    Constants.PlatformJobStatus.WORKING.getKey(),
+                                    Constants.PlatformJobStatus.EXCEPTION.getKey(),
+                                    Constants.PlatformJobStatus.OVER_NUMBER.getKey()
+                            )
+//                    .like(PlatformJob::getArriveDate,DateUtil.getCurrDate())
+                    .orderByDesc(PlatformJob::getCreateDate)
+            );
+            for (Platform platform:allPlatformList) {
+                PlatformWorkVO platformWorkVO = PlatformGroupServiceImpl.getPlatformWorkVO(platform.getId(),platformJobList);
+                platform.setPlatformWorkVO(platformWorkVO);
+            }
+        }
         for (PlatformGroup platformGroup:platformGroups) {
             platformGroup.setPlatformList(allPlatformList.stream().filter(m->Constants.equalsInteger(m.getGroupId(),platformGroup.getId())).collect(Collectors.toList()));
         }
@@ -247,7 +277,31 @@
     }
 
 
+    public static PlatformWorkVO getPlatformWorkVO(Integer platformId,List<PlatformJob> platformJobList){
+        PlatformWorkVO platformWorkVO = new PlatformWorkVO();
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformJobList)){
+            //鑾峰彇鏈堝彴涓嬬殑鎵�鏈変綔涓氭暟鎹�
+            List<PlatformJob> platformJobs = platformJobList.stream().filter(i->Constants.equalsInteger(i.getPlatformId(),platformId)).collect(Collectors.toList());
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformJobs)){
+                platformWorkVO.setWorkNum(
+                        platformJobs.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())).collect(Collectors.toList()).size()
+                );
+                platformWorkVO.setCallNum(
+                        platformJobs.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())).collect(Collectors.toList()).size()
+                );
+                platformWorkVO.setWaitNum(
+                        platformJobs.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.PlatformJobStatus.IN_WAIT.getKey())).collect(Collectors.toList()).size()
+                );
+                platformWorkVO.setExceptionNum(
+                        platformJobs.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.PlatformJobStatus.EXCEPTION.getKey())).collect(Collectors.toList()).size()
+                );
+                platformWorkVO.setPlatformJobList(platformJobs);
+            }
+        }
+        return platformWorkVO;
+    }
 
 
 
 }
+
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
index 2544ffb..a4b0ac7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -15,12 +15,12 @@
 import com.doumee.dao.business.join.PlatformJobJoinMapper;
 import com.doumee.dao.business.join.PlatformJoinMapper;
 import com.doumee.dao.business.model.*;
-import com.doumee.dao.web.reqeust.JobDetailDTO;
-import com.doumee.dao.web.reqeust.JobOperateDTO;
-import com.doumee.dao.web.reqeust.LineUpDetailDTO;
-import com.doumee.dao.web.reqeust.SignInDTO;
+import com.doumee.dao.openapi.request.*;
+import com.doumee.dao.openapi.response.*;
+import com.doumee.dao.web.reqeust.*;
 import com.doumee.dao.web.response.DriverHomeVO;
 import com.doumee.dao.web.response.LineUpVO;
+import com.doumee.dao.web.response.PlatformWorkVO;
 import com.doumee.service.business.PlatformJobService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -33,9 +33,11 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -61,6 +63,9 @@
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
 
+    @Autowired
+    private PlatformWmsDetailMapper platformWmsDetailMapper;
+
 
     @Autowired
     private PlatformJoinMapper platformJoinMapper;
@@ -70,9 +75,6 @@
 
     @Autowired
     private PlatformWmsJobMapper platformWmsJobMapper;
-
-    @Autowired
-    private PlatformWmsDetailMapper platformWmsDetailMapper;
 
     @Autowired
     private PlatformGroupMapper platformGroupMapper;
@@ -147,7 +149,9 @@
                 .selectAll(PlatformJob.class)
                 .selectAs(Platform::getName,PlatformJob::getPlatformName)
                 .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+                .selectAs(PlatformWmsJob::getCarrierName,PlatformJob::getCarrierName)
                 .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+                .leftJoin(PlatformWmsJob.class,PlatformWmsJob::getCarryBillCode,PlatformJob::getBillCode)
                 .eq(pageWrap.getModel().getId() != null, PlatformJob::getId, pageWrap.getModel().getId())
                 .eq(pageWrap.getModel().getCreator() != null, PlatformJob::getCreator, pageWrap.getModel().getCreator())
                 .ge(pageWrap.getModel().getCreateDate() != null, PlatformJob::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
@@ -234,21 +238,61 @@
         platformJobIPage.getRecords().forEach(i->{
             i.dealTime();
             this.getWmsJobData(i);
+            this.queryWaitNum(i);
         });
         return PageData.from(platformJobIPage);
-//        PageData<PlatformJob> pageData = PageData.from(platformJobMapper.selectPage(page, queryWrapper));
-//        pageData.getRecords().forEach(i->{
-//            i.dealTime();
-//            this.getWmsJobData(i);
-//        });
-//        return pageData;
+    }
+
+
+
+    @Override
+    public PageData<PlatformJob> platformCallList(PageWrap<PlatformJob> pageWrap) {
+        IPage<PlatformJob> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<PlatformJob> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper
+                .selectAll(PlatformJob.class)
+                .selectAs(Platform::getName,PlatformJob::getPlatformName)
+                .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+                .selectAs(PlatformWmsJob::getCarrierName,PlatformJob::getCarrierName)
+                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+                .leftJoin(PlatformWmsJob.class,PlatformWmsJob::getCarryBillCode,PlatformJob::getBillCode)
+                .eq(pageWrap.getModel().getPlatformGroupId() != null, PlatformJob::getPlatformGroupId, pageWrap.getModel().getPlatformGroupId())
+                .like(pageWrap.getModel().getCarCodeFront() != null, PlatformJob::getCarCodeFront, pageWrap.getModel().getCarCodeFront())
+                .eq(Objects.nonNull(pageWrap.getModel().getCallType())
+                        &&Constants.equalsInteger(pageWrap.getModel().getCallType(),Constants.ONE),PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()
+                )
+                .and(Objects.nonNull(pageWrap.getModel().getCallType())
+                        &&Constants.equalsInteger(pageWrap.getModel().getCallType(),Constants.TWO),
+                        i->i.eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()).or()
+                                .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey()).or()
+                                .apply(" ( t.status = "+Constants.PlatformJobStatus.TRANSFERING.getKey()+" and t.PLATFORM_ID = "+pageWrap.getModel().getPlatformId()+" ) ")
+                )
+                .and(Objects.nonNull(pageWrap.getModel().getCallType())
+                                &&Constants.equalsInteger(pageWrap.getModel().getCallType(),Constants.THREE),
+                        i->i.eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()).or()
+                                .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey()).or()
+                                .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey()).or()
+                                .apply(" ( t.status = "+Constants.PlatformJobStatus.TRANSFERING.getKey()+" and t.PLATFORM_GROUP_ID = "+pageWrap.getModel().getPlatformGroupId()+" ) ")
+                )
+                .like(PlatformJob::getArriveDate,DateUtil.dateTypeToString(new Date(),"yyyy-MM-dd"))
+                .orderByDesc(PlatformJob::getStatus)
+        ;
+        IPage<PlatformJob> platformJobIPage = platformJobJoinMapper.selectJoinPage(page,PlatformJob.class,queryWrapper);
+        platformJobIPage.getRecords().forEach(i->{
+            i.dealTime();
+            this.getWmsJobData(i);
+            this.queryWaitNum(i);
+        });
+        return PageData.from(platformJobIPage);
     }
 
 
     public void getWmsJobData(PlatformJob platformJob){
         if(Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.zycxh)
-        || Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.zyczh)
-        || Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.sgscxh)) {
+            || Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.zyczh)
+            || Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.wxcxh)
+                || Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.wxczh)) {
 
             PlatformWmsJob platformWmsJob = platformWmsJobMapper.selectOne(new QueryWrapper<PlatformWmsJob>().lambda()
                     .eq(PlatformWmsJob::getIsdeleted,Constants.ZERO)
@@ -283,29 +327,33 @@
                             ,Constants.PlatformJobStatus.TRANSFERING.getKey())
                     .gt(PlatformJob::getSignDate,platformJob.getSignDate())
                     .eq(PlatformJob::getPlatformGroupId,platformJob.getPlatformGroupId())
-                    .like(PlatformJob::getArriveDate,DateUtil.getDate(platformJob.getArriveDate(),"yyyy-MM-dd")));
+                    .like(PlatformJob::getArriveDate,DateUtil.dateTypeToString(platformJob.getArriveDate(),"yyyy-MM-dd")));
             platformJob.setLineUpNum(lineUpNum.size());
             BigDecimal sumWorkRate = platformJob.getTotalNum();
             for (PlatformJob linePlatformJob:lineUpNum) {
                 this.getWmsJobData(linePlatformJob);
                 sumWorkRate = sumWorkRate.add(linePlatformJob.getTotalNum());
             }
-            //璁$畻棰勮绛夊緟鏃堕棿
-            List<Platform> platformList = platformJoinMapper.selectList(new QueryWrapper<Platform>().lambda().eq(Platform::getIsdeleted,Constants.ZERO).eq(Platform::getGroupId,platformJob.getPlatformGroupId()));
-            BigDecimal workRate = platformList.stream().map(m->m.getWorkRate()).reduce(BigDecimal.ZERO,BigDecimal::add);
-            if(sumWorkRate.compareTo(BigDecimal.ZERO) == Constants.ZERO|| workRate.compareTo(BigDecimal.ZERO)  == Constants.ZERO ){
-                BigDecimal sumMinute = sumWorkRate.divide(workRate,1, RoundingMode.HALF_DOWN).multiply(BigDecimal.valueOf(60L));
-                Integer sumMinuteInteger = sumMinute.intValue();
-                Integer hours = sumMinuteInteger/60;
-                Integer minus = sumMinuteInteger%60;
-                String  waitTime = "棰勮绛夊緟锛�";
-                if(!Constants.equalsInteger(hours,Constants.ZERO)){
-                    waitTime = waitTime + hours + "灏忔椂";
+            if(lineUpNum.size()>Constants.ZERO){
+                //璁$畻棰勮绛夊緟鏃堕棿
+                List<Platform> platformList = platformJoinMapper.selectList(new QueryWrapper<Platform>().lambda().eq(Platform::getIsdeleted,Constants.ZERO).eq(Platform::getGroupId,platformJob.getPlatformGroupId()));
+                BigDecimal workRate = platformList.stream().map(m->m.getWorkRate()).reduce(BigDecimal.ZERO,BigDecimal::add);
+                if(sumWorkRate.compareTo(BigDecimal.ZERO) == Constants.ZERO|| workRate.compareTo(BigDecimal.ZERO)  == Constants.ZERO ){
+                    BigDecimal sumMinute = sumWorkRate.divide(workRate,1, RoundingMode.HALF_DOWN).multiply(BigDecimal.valueOf(60L));
+                    Integer sumMinuteInteger = sumMinute.intValue();
+                    Integer hours = sumMinuteInteger/60;
+                    Integer minus = sumMinuteInteger%60;
+                    String  waitTime = "棰勮绛夊緟锛�";
+                    if(!Constants.equalsInteger(hours,Constants.ZERO)){
+                        waitTime = waitTime + hours + "灏忔椂";
+                    }
+                    if(!Constants.equalsInteger(hours,Constants.ZERO)){
+                        waitTime = waitTime + minus + "鍒嗛挓";
+                    }
+                    platformJob.setWaitTime(waitTime);
                 }
-                if(!Constants.equalsInteger(hours,Constants.ZERO)){
-                    waitTime = waitTime + minus + "鍒嗛挓";
-                }
-                platformJob.setWaitTime(waitTime);
+            }else{
+                platformJob.setWaitTime("绛夊緟鍙彿");
             }
         }else if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
             //鏌ヨ鏈�鍚庡紑濮嬩换鍔$殑鏈堝彴璁板綍  鏃ュ織琛�  鍥犱负瀛樺湪寮傚父鎸傝捣 杞Щ 绛夐棶棰�
@@ -319,6 +367,15 @@
                 BigDecimal sumMinute = platformJob.getTotalNum().divide(platformJob.getWorkRate(),1, RoundingMode.HALF_DOWN).multiply(BigDecimal.valueOf(60L));
                 platformJob.setFinishTimeStr(DateUtil.DateToStr(DateUtil.afterMinutesDate(platformLog.getCreateDate(),sumMinute.intValue()),"HH:mm"));
             }
+            //澶勭悊浣滀笟鏃堕暱
+            List<PlatformLog> platformLogList = platformLogMapper.selectList(new QueryWrapper<PlatformLog>().lambda()
+                    .eq(PlatformLog::getJobId,platformJob.getId())
+                    .isNotNull(PlatformLog::getParam3)
+                    .ne(PlatformLog::getParam3,Constants.ZERO+"")
+                    .orderByDesc(PlatformLog::getCreateDate));
+            platformJob.setWorkTime(platformLogList.stream().map(m->Long.valueOf(m.getParam3())).reduce(Long.valueOf(0),Long::sum));
+
+
         }
     }
     
@@ -334,7 +391,6 @@
     public DriverHomeVO getDriverHome(LoginUserInfo loginUserInfo){
         DriverHomeVO driverHomeVO = new DriverHomeVO();
         //TODO 杞挱鍥�
-
         List<PlatformJob> platformJobList =  platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
                 .selectAll(PlatformJob.class)
                 .selectAs(Platform::getName,PlatformJob::getPlatformName)
@@ -359,10 +415,44 @@
         driverHomeVO.setReservationMap(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.PLATFORM_GUIDEMAP).getCode());
         // 棰勭害鎸囧崡 鏂囨湰
         driverHomeVO.setBookingTips(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.PLATFORM_BOOKING_TIPS).getCode());
+        driverHomeVO.setSignDistance(new BigDecimal(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_DISTANCE).getCode()));
 
         return driverHomeVO;
     }
 
+
+
+    @Override
+    public void confirmTask(ConfirmTaskDTO confirmTaskDTO){
+        if(Objects.isNull(confirmTaskDTO)
+                || Objects.isNull(confirmTaskDTO.getId())
+                || Objects.isNull(confirmTaskDTO.getArriveDate())
+                || StringUtils.isBlank(confirmTaskDTO.getCarCodeBack())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        PlatformJob platformJob = platformJobMapper.selectById(confirmTaskDTO.getId());
+        if(Objects.isNull(platformJob)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!Constants.equalsInteger(platformJob.getStatus(),Constants.ZERO)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"涓氬姟鐘舵�佸凡娴佽浆,鏃犳硶杩涜璇ユ搷浣�");
+        }
+        if(confirmTaskDTO.getArriveDate().getTime()<=System.currentTimeMillis()){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"棰勮鍒板巶鏃堕棿蹇呴』澶т簬褰撳墠鏃堕棿");
+        }
+
+        PlatformJob oldPlatformJob = new PlatformJob();
+        BeanUtils.copyProperties(platformJob,oldPlatformJob);
+
+        platformJob.setArriveDate(confirmTaskDTO.getArriveDate());
+        platformJob.setStatus(Constants.PlatformJobStatus.WART_SIGN_IN.getKey());
+        platformJob.setEditDate(new Date());
+        platformJobMapper.updateById(platformJob);
+        //瀛樺偍鎿嶄綔鏃ュ織
+        savePlatformLog(Constants.PlatformJobLogType.CONFIRM_TASK.getKey(),oldPlatformJob,platformJob ,
+                Constants.PlatformJobLogType.CONFIRM_TASK.getInfo());
+    }
 
     /**
      * 璺濈绛惧埌
@@ -396,7 +486,8 @@
         platformJob.setStatus(Constants.PlatformJobStatus.WAIT_CALL.getKey());
         platformJobMapper.updateById(platformJob);
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.WAIT_CALL.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.SIGN.getKey(),oldPlatformJob,platformJob,
+                Constants.PlatformJobLogType.SIGN.getInfo());
     }
 
 
@@ -409,12 +500,12 @@
         Double lat = Double.parseDouble(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_LAT).getCode());
         Double lnt = Double.parseDouble(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_LNT).getCode());
         BigDecimal distance = new BigDecimal(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_DISTANCE).getCode());
-        //鑾峰彇2涓偣鐨勮窛绂籜绫�
+        //鑾峰彇2涓偣鐨勮窛绂� 鍗曚綅锛氱背
         Double getDistanceDouble = PositionUtil.getDistance(signInDTO.getLnt(),signInDTO.getLat(),lnt,lat);
         //杞崲km
         BigDecimal getDistance = BigDecimal.valueOf(getDistanceDouble).divide(new BigDecimal(1000),2,BigDecimal.ROUND_HALF_UP);
         if(distance.compareTo(getDistance)<Constants.ZERO){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瓒呭嚭鍙鍒拌窛绂伙紝鍙鍒拌窛绂籟"+distance+"]鍏噷]");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瓒呭嚭鍙鍒拌窛绂伙紝鍙鍒拌窛绂讳负["+distance+"]鍏噷]");
         }
         platformJob.setSignDistance(BigDecimal.valueOf(getDistanceDouble));
     }
@@ -483,6 +574,9 @@
         List<PlatformJob> platformJobList = platformJobJoinMapper.selectJoinList(PlatformJob.class,
                 new MPJLambdaWrapper<PlatformJob>()
                         .selectAll(PlatformJob.class)
+                        .selectAs(Platform::getName,PlatformJob::getPlatformName)
+                        .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+                        .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                         .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                         .eq(Constants.equalsInteger(lineUpDetailDTO.getQueryType(),Constants.ZERO)
                                 ,PlatformJob::getDrivierPhone,lineUpDetailDTO.getMobile())
@@ -495,36 +589,45 @@
         );
         //鑾峰彇鎵�鏈夋湀鍙扮粍
         List<Integer> platformIdList = platformJobList.stream().map(m->m.getPlatformGroupId()).collect(Collectors.toList());
-        List<Platform> platformList = platformJoinMapper.selectList(new QueryWrapper<Platform>().lambda()
-                .eq(Platform::getIsdeleted,Constants.ZERO)
-                .in(Platform::getId,platformIdList));
+        if(CollectionUtils.isEmpty(platformIdList)){
+            return lineUpVO;
+        }
+        List<PlatformGroup> platformGroupList = platformGroupMapper.selectList(new QueryWrapper<PlatformGroup>().lambda()
+                .eq(PlatformGroup::getIsdeleted,Constants.ZERO)
+                .in(PlatformGroup::getId,platformIdList));
 
-        for (Platform platform:platformList) {
+        for (PlatformGroup platformGroup:platformGroupList) {
             //鏌ヨ鏈湀鍙扮粍涓� 鑷繁鐨勬暟鎹� 鏈�鏃╃鍒扮殑
-            PlatformJob platformJob = platformJobList.stream().filter(i->Constants.equalsInteger(i.getPlatformId(),platform.getId())).findFirst().orElse(null);
+            PlatformJob platformJob = platformJobList.stream().filter(i->Constants.equalsInteger(i.getPlatformGroupId(),platformGroup.getId())).findFirst().orElse(null);
             //鏌ヨ鍦ㄥ綋鍓嶆湀鍙扮粍涓� 绛惧埌鎺掗槦杞﹁締鏁版嵁
             List<PlatformJob> platformJobSignInList = platformJobJoinMapper.selectJoinList(PlatformJob.class,
                     new MPJLambdaWrapper<PlatformJob>()
                             .selectAll(PlatformJob.class)
+                            .selectAs(Platform::getName,PlatformJob::getPlatformName)
+                            .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+                            .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                             .eq(PlatformJob::getIsdeleted,Constants.ZERO)
-                            .eq(PlatformJob::getPlatformGroupId,platform.getGroupId())
-                            .ge(Objects.nonNull(platformJob),PlatformJob::getSignDate,DateUtil.getDate(platformJob.getSignDate(),"yyyy-MM-dd HH:mm:ss"))
+                            .eq(PlatformJob::getPlatformGroupId,platformGroup.getId())
+                            .ge(Objects.nonNull(platformJob),PlatformJob::getSignDate,DateUtil.dateTypeToString(platformJob.getSignDate(),"yyyy-MM-dd HH:mm:ss"))
                             .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey(),
                                     Constants.PlatformJobStatus.IN_WAIT.getKey(),
                                     Constants.PlatformJobStatus.CALLED.getKey())
                             .orderByDesc(PlatformJob::getSignDate));
-            platform.setSignJobList(platformJobSignInList);
+            platformGroup.setSignJobList(platformJobSignInList);
             //鏌ヨ褰撳墠鏈堝彴缁勪笅
             List<PlatformJob> platformJobWorkList = platformJobJoinMapper.selectJoinList(PlatformJob.class,
                     new MPJLambdaWrapper<PlatformJob>()
                             .selectAll(PlatformJob.class)
+                            .selectAs(Platform::getName,PlatformJob::getPlatformName)
+                            .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+                            .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                             .eq(PlatformJob::getIsdeleted,Constants.ZERO)
-                            .eq(PlatformJob::getPlatformGroupId,platform.getGroupId())
+                            .eq(PlatformJob::getPlatformGroupId,platformGroup.getId())
                             .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey())
                             .orderByDesc(PlatformJob::getSignDate));
-            platform.setWorkJobList(platformJobWorkList);
+            platformGroup.setWorkJobList(platformJobWorkList);
         }
-        lineUpVO.setPlatformList(platformList);
+        lineUpVO.setPlatformGroupList(platformGroupList);
         return lineUpVO;
     }
 
@@ -533,7 +636,7 @@
      * 鑾峰彇宸蹭綔涓氭椂闂�
      * @param platformJob
      */
-    public void getWorkTime(PlatformJob platformJob){
+    public Long getWorkTime(PlatformJob platformJob){
         List<PlatformLog> platformLogList = platformLogMapper.selectList(new QueryWrapper<PlatformLog>()
                 .lambda().eq(PlatformLog::getIsdeleted,Constants.ZERO)
                 .eq(PlatformLog::getJobId,platformJob.getId())
@@ -561,6 +664,7 @@
             }
         }
         platformJob.setWorkTime(optTime);
+        return optTime;
     }
 
     /**
@@ -595,9 +699,9 @@
             //TODO 涓嬪彂鍏ュ洯鏉冮檺
 
         }
-
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.WAIT_CALL.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.IN_WAIT.getKey(),oldPlatformJob,platformJob,
+                Constants.PlatformJobLogType.IN_WAIT.getInfo());
 
     }
 
@@ -621,17 +725,31 @@
         ) ){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧�,涓氬姟鐘舵�佸凡娴佽浆锛�");
         }
-
+        
+        Platform platform = platformJoinMapper.selectById(jobOperateDTO.getPlatformId());
+        if(Objects.isNull(platform)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鏈堝彴淇℃伅");
+        }
         PlatformJob oldPlatformJob = new PlatformJob();
         BeanUtils.copyProperties(platformJob,oldPlatformJob);
 
         platformJob.setCallDate(new Date());
         platformJob.setCallUserId(jobOperateDTO.getLoginUserInfo().getId());
         platformJob.setStatus(Constants.PlatformJobStatus.CALLED.getKey());
+        platformJob.setPlatformId(jobOperateDTO.getPlatformId());
+        //鍒ゆ柇鏄惁闇�瑕佸~鍏呰繘鍘�
+        if(StringUtils.isBlank(platformJob.getPlatforms())){
+            platformJob.setPlatforms(jobOperateDTO.getPlatformId().toString());
+            platformJob.setPlatformNames(platform.getName());
+        }else{
+            platformJob.setPlatforms(platformJob.getPlatforms() + "," +jobOperateDTO.getPlatformId().toString());
+            platformJob.setPlatformNames(platformJob.getPlatformNames() + "," +platform.getName());
+        }
         platformJob.setEditDate(new Date());
         platformJobMapper.updateById(platformJob);
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.CALLED.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.CALLED.getKey(),oldPlatformJob,platformJob,
+                Constants.PlatformJobLogType.CALLED.getInfo().replace("{data}",platform.getName()));
     }
 
 
@@ -659,9 +777,18 @@
         if(Constants.equalsInteger(platformJob.getPlatformId(),jobOperateDTO.getPlatformId())){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏃犳硶杞Щ鏈湀鍙�");
         }
+        Platform oldPlatform = platformJoinMapper.selectById(platformJob.getPlatformId());
+
+        Platform platform = platformJoinMapper.selectById(jobOperateDTO.getPlatformId());
+        if(Objects.isNull(platform)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鏈堝彴淇℃伅");
+        }
 
         PlatformJob oldPlatformJob = new PlatformJob();
         BeanUtils.copyProperties(platformJob,oldPlatformJob);
+
+        platformJob.setPlatforms(platformJob.getPlatforms() + "," +jobOperateDTO.getPlatformId().toString());
+        platformJob.setPlatformNames(platformJob.getPlatformNames() + "," +platform.getName());
 
         platformJob.setTransPlatformDate(new Date());
         platformJob.setTransPlatformUserId(jobOperateDTO.getLoginUserInfo().getId());
@@ -672,7 +799,8 @@
 
         //TODO 璋冭捣WMS 閫氱煡鏈堝彴杞Щ
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.TRANSFERING.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.TRANSFERING.getKey(),oldPlatformJob,platformJob,
+                Constants.PlatformJobLogType.TRANSFERING.getInfo().replace("{data}",oldPlatform.getName()));
     }
 
 
@@ -683,18 +811,16 @@
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public void platformOverNumber(JobOperateDTO jobOperateDTO){
         if(Objects.isNull(jobOperateDTO)
-                || Objects.isNull(jobOperateDTO.getJobId())
-                || Objects.isNull(jobOperateDTO.getPlatformId())){
+                || Objects.isNull(jobOperateDTO.getJobId())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         PlatformJob platformJob = platformJobMapper.selectById(jobOperateDTO.getJobId());
         if(Objects.isNull(platformJob)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
-        if(!Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
+        if(!Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧�,涓氬姟鐘舵�佸凡娴佽浆锛�");
         }
-
         PlatformJob oldPlatformJob = new PlatformJob();
         BeanUtils.copyProperties(platformJob,oldPlatformJob);
 
@@ -702,7 +828,8 @@
         platformJob.setEditDate(new Date());
         platformJobMapper.updateById(platformJob);
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.WART_SIGN_IN.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.OVER_NUMBER.getKey(),oldPlatformJob,platformJob,
+                Constants.PlatformJobLogType.OVER_NUMBER.getInfo());
 
 
     }
@@ -715,8 +842,7 @@
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public void platformErr(JobOperateDTO jobOperateDTO){
         if(Objects.isNull(jobOperateDTO)
-                || Objects.isNull(jobOperateDTO.getJobId())
-                || Objects.isNull(jobOperateDTO.getPlatformId())){
+                || Objects.isNull(jobOperateDTO.getJobId())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         PlatformJob platformJob = platformJobMapper.selectById(jobOperateDTO.getJobId());
@@ -736,7 +862,8 @@
         platformJob.setEditDate(new Date());
         platformJobMapper.updateById(platformJob);
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.EXCEPTION.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.EXCEPTION.getKey(),oldPlatformJob,platformJob,
+                Constants.PlatformJobLogType.EXCEPTION.getInfo());
     }
 
 
@@ -747,8 +874,7 @@
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public void beginWork(JobOperateDTO jobOperateDTO){
         if(Objects.isNull(jobOperateDTO)
-                || Objects.isNull(jobOperateDTO.getJobId())
-                || Objects.isNull(jobOperateDTO.getPlatformId())){
+                || Objects.isNull(jobOperateDTO.getJobId())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         PlatformJob platformJob = platformJobMapper.selectById(jobOperateDTO.getJobId());
@@ -758,24 +884,26 @@
         if(!Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧�,涓氬姟鐘舵�佸凡娴佽浆锛�");
         }
-        platformJobMapper.update(null,new UpdateWrapper<PlatformJob>()
-                .lambda()
-                .set(Objects.isNull(platformJob.getStartDate()),PlatformJob::getStartDate,new Date())
-                .set(PlatformJob::getEditDate,new Date())
-                .set(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey())
-                .eq(PlatformJob::getId,jobOperateDTO.getJobId())
-        );
+
+        Platform platform = platformJoinMapper.selectById(platformJob.getPlatformId());
+        if(Objects.isNull(platform)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鏈堝彴淇℃伅");
+        }
 
         PlatformJob oldPlatformJob = new PlatformJob();
         BeanUtils.copyProperties(platformJob,oldPlatformJob);
+
+
         if(Objects.isNull(platformJob.getStartDate())){
             platformJob.setStartDate(new Date());
         }
         platformJob.setStatus(Constants.PlatformJobStatus.WORKING.getKey());
         platformJob.setEditDate(new Date());
         platformJobMapper.updateById(platformJob);
+
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.WORKING.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.WORKING.getKey(),oldPlatformJob,platformJob,
+                Constants.PlatformJobLogType.WORKING.getInfo().replace("{data}",platform.getName()));
     }
 
 
@@ -800,11 +928,12 @@
         BeanUtils.copyProperties(platformJob,oldPlatformJob);
 
         platformJob.setDoneDate(new Date());
-        platformJob.setStatus(Constants.PlatformJobStatus.EXCEPTION.getKey());
+        platformJob.setStatus(Constants.PlatformJobStatus.DONE.getKey());
         platformJob.setEditDate(new Date());
         platformJobMapper.updateById(platformJob);
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.EXCEPTION.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.DONE.getKey(),oldPlatformJob,platformJob ,
+                Constants.PlatformJobLogType.DONE.getInfo());
 
         if(Constants.equalsInteger(platformJob.getType(),Constants.TWO)){
             //TODO 澶栧崗杞﹁璐� 鏌ヨTMS 鐢靛瓙閿佹儏鍐�
@@ -858,7 +987,8 @@
         platformJob.setEditDate(new Date());
         platformJobMapper.updateById(platformJob);
         //瀛樺偍鎿嶄綔鏃ュ織
-        savePlatformLog(Constants.PlatformJobStatus.WORKING.getKey(),oldPlatformJob,platformJob);
+        savePlatformLog(Constants.PlatformJobLogType.WORKING.getKey(),oldPlatformJob,platformJob ,
+                Constants.PlatformJobLogType.DONE.getInfo());
     }
 
 
@@ -868,34 +998,33 @@
      * @param platformJobBefor
      * @param platformJobAfter
      */
-    public void savePlatformLog(Integer objType,PlatformJob platformJobBefor,PlatformJob platformJobAfter){
+    public void savePlatformLog(Integer objType,PlatformJob platformJobBefor,PlatformJob platformJobAfter,String content){
         PlatformLog platformLog = new PlatformLog();
         platformLog.setIsdeleted(Constants.ZERO);
         platformLog.setCreateDate(new Date());
         platformLog.setJobId(platformJobAfter.getId());
         platformLog.setObjType(objType);
+        platformLog.setContent(content);
+        platformLog.setParam4(platformJobAfter.getCarCodeFront());
         platformLog.setBeforeContent(JSONObject.toJSONString(platformJobBefor));
         platformLog.setAfterContent(JSONObject.toJSONString(platformJobAfter));
         platformLog.setObjId(platformJobAfter.getId().toString());
-        //鏌ヨ鏈�鍚庝竴娆″紑濮嬩綔涓氱殑鏃ュ織
-        PlatformLog lastBeginPlatform = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
-                .eq(PlatformLog::getIsdeleted,Constants.ZERO)
-                .eq(PlatformLog::getObjType,Constants.PlatformJobStatus.WORKING.getKey())
-                .eq(PlatformLog::getJobId,platformLog.getJobId())
-                .orderByDesc(PlatformLog::getCreateDate)
-                .last(" limit 1 ")
-        );
-        if(Objects.isNull(lastBeginPlatform)){
-            return;
-        }
-        if(Constants.equalsInteger(objType,Constants.PlatformJobStatus.EXCEPTION.getKey())
-            || Constants.equalsInteger(objType,Constants.PlatformJobStatus.TRANSFERING.getKey())){
+
+        if(Constants.equalsInteger(objType,Constants.PlatformJobLogType.EXCEPTION.getKey())){
+            //鏌ヨ鏈�鍚庝竴娆″紑濮嬩綔涓氱殑鏃ュ織
+            PlatformLog lastBeginPlatform = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
+                    .eq(PlatformLog::getIsdeleted,Constants.ZERO)
+                    .eq(PlatformLog::getObjType,Constants.PlatformJobLogType.WORKING.getKey())
+                    .eq(PlatformLog::getJobId,platformLog.getJobId())
+                    .orderByDesc(PlatformLog::getCreateDate)
+                    .last(" limit 1 ")
+            );
             //寮傚父鎸傝捣 涓庤浆绉讳腑 璁板綍鏈 浣滀笟鏃堕棿
-            platformLog.setParam1(DateUtil.getDate(lastBeginPlatform.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
-            platformLog.setParam2(DateUtil.getDate(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
-            String v = Long.toString(platformJobAfter.getDoneDate().getTime() - platformJobBefor.getStartDate().getTime() / 1000) ;
+            platformLog.setParam1(lastBeginPlatform.getParam1());
+            platformLog.setParam2(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
+            String v = Long.toString((platformLog.getCreateDate().getTime() - DateUtil.StringToDate(lastBeginPlatform.getParam1(),"yyyy-MM-dd HH:mm:ss").getTime() )/ 1000) ;
             platformLog.setParam3(v);
-        }else  if(Constants.equalsInteger(objType,Constants.PlatformJobStatus.DONE.getKey())){
+        }else if(Constants.equalsInteger(objType,Constants.PlatformJobLogType.TRANSFERING.getKey())){
             //鏌ヨ鏈�鍚庝竴娆℃棩蹇楁槸鍚︿负寮傚父鎸傝捣锛屽紓甯告寕璧峰悗鍙繘琛岃浆绉� 濡傛灉杩涜杞Щ閭d箞涓氬姟灏遍渶瑕侀噸鏂拌繘琛屽紑濮嬪氨涓嶉渶瑕佺壒娈婂鐞�  锛屽鏋滀笉鏄紓甯告寕璧疯繘琛屾暟鎹粨鏉� 鍒欑洿鎺ユ煡璇㈡渶鍚庝竴娆″紑濮嬬殑鏃堕棿
             PlatformLog lastPlatformLog = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
                     .eq(PlatformLog::getIsdeleted,Constants.ZERO)
@@ -903,15 +1032,51 @@
                     .orderByDesc(PlatformLog::getCreateDate)
                     .last(" limit 1 ")
             );
-            if(Objects.nonNull(lastPlatformLog) && Constants.equalsInteger(lastPlatformLog.getObjType(),Constants.PlatformJobStatus.EXCEPTION.getKey())){
+            if(!Constants.equalsInteger(lastPlatformLog.getObjType(),Constants.PlatformJobLogType.EXCEPTION.getKey())){
+                //鏌ヨ鏈�鍚庝竴娆″紑濮嬩綔涓氱殑鏃ュ織
+                PlatformLog lastBeginPlatform = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
+                        .eq(PlatformLog::getIsdeleted,Constants.ZERO)
+                        .eq(PlatformLog::getObjType,Constants.PlatformJobLogType.WORKING.getKey())
+                        .eq(PlatformLog::getJobId,platformLog.getJobId())
+                        .orderByDesc(PlatformLog::getCreateDate)
+                        .last(" limit 1 ")
+                );
+                //寮傚父鎸傝捣 涓庤浆绉讳腑 璁板綍鏈 浣滀笟鏃堕棿
+                platformLog.setParam1(lastBeginPlatform.getParam1());
+                platformLog.setParam2(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
+                String v = Long.toString((platformLog.getCreateDate().getTime() - DateUtil.StringToDate(lastBeginPlatform.getParam1(),"yyyy-MM-dd HH:mm:ss").getTime() )/ 1000) ;
+                platformLog.setParam3(v);
+            }else{
+                platformLog.setParam3("0");
+            }
+        }else  if(Constants.equalsInteger(objType,Constants.PlatformJobLogType.DONE.getKey())){
+            //鏌ヨ鏈�鍚庝竴娆℃棩蹇楁槸鍚︿负寮傚父鎸傝捣锛屽紓甯告寕璧峰悗鍙繘琛岃浆绉� 濡傛灉杩涜杞Щ閭d箞涓氬姟灏遍渶瑕侀噸鏂拌繘琛屽紑濮嬪氨涓嶉渶瑕佺壒娈婂鐞�  锛屽鏋滀笉鏄紓甯告寕璧疯繘琛屾暟鎹粨鏉� 鍒欑洿鎺ユ煡璇㈡渶鍚庝竴娆″紑濮嬬殑鏃堕棿
+            PlatformLog lastPlatformLog = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
+                    .eq(PlatformLog::getIsdeleted,Constants.ZERO)
+                    .eq(PlatformLog::getJobId,platformLog.getJobId())
+                    .orderByDesc(PlatformLog::getCreateDate)
+                    .last(" limit 1 ")
+            );
+            if(Objects.nonNull(lastPlatformLog) && Constants.equalsInteger(lastPlatformLog.getObjType(),Constants.PlatformJobLogType.EXCEPTION.getKey())){
                 platformLog.setParam3("0");
             }else{
+                //鏌ヨ鏈�鍚庝竴娆″紑濮嬩綔涓氱殑鏃ュ織
+                PlatformLog lastBeginPlatform = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
+                        .eq(PlatformLog::getIsdeleted,Constants.ZERO)
+                        .eq(PlatformLog::getObjType,Constants.PlatformJobLogType.WORKING.getKey())
+                        .eq(PlatformLog::getJobId,platformLog.getJobId())
+                        .orderByDesc(PlatformLog::getCreateDate)
+                        .last(" limit 1 ")
+                );
                 //闈炲紓甯告寕璧� 鍒欑洿鎺ヨ繃鍘绘渶鍚庝竴娆″紑濮嬩綔涓氱殑鏃ュ織鐨勫紑濮嬫椂闂�
-                platformLog.setParam1(DateUtil.getDate(lastBeginPlatform.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
-                platformLog.setParam2(DateUtil.getDate(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
-                String v = Long.toString(platformJobAfter.getDoneDate().getTime() - platformJobBefor.getStartDate().getTime() / 1000) ;
+                platformLog.setParam1(lastBeginPlatform.getParam1());
+                platformLog.setParam2(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
+                String v = Long.toString((platformJobAfter.getDoneDate().getTime() -  DateUtil.StringToDate(lastBeginPlatform.getParam1(),"yyyy-MM-dd HH:mm:ss").getTime()) / 1000) ;
                 platformLog.setParam3(v);
             }
+        }else if(Constants.equalsInteger(objType,Constants.PlatformJobLogType.WORKING.getKey())){
+            platformLog.setParam1(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
+            platformLog.setParam3("0");
         }else{
             platformLog.setParam3("0");
         }
@@ -982,6 +1147,14 @@
                 .eq(PlatformJob::getPlatformId,platform.getId())
                 .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                 .eq(PlatformJob::getDrivierPhone,loginUserInfo.getMobile())
+                .in(PlatformJob::getStatus,
+                        Constants.PlatformJobStatus.WAIT_CALL.getKey(),
+                        Constants.PlatformJobStatus.IN_WAIT.getKey(),
+                        Constants.PlatformJobStatus.CALLED.getKey(),
+                        Constants.PlatformJobStatus.WORKING.getKey(),
+                        Constants.PlatformJobStatus.EXCEPTION.getKey(),
+                        Constants.PlatformJobStatus.OVER_NUMBER.getKey()
+                )
                 .like(PlatformJob::getArriveDate, DateUtil.getCurrDate())
                 .orderByDesc(PlatformJob::getId)
         );
@@ -994,4 +1167,247 @@
         platform.setWorkJobList(platformJobList);
     }
 
+    @Override
+    public PlatformWorkVO getPlatformWorkVOById(Integer platformId){
+        //鑾峰彇鏈堝彴涓嬬殑鎵�鏈変綔涓氭暟鎹�
+        List<PlatformJob> platformJobList =  platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
+                .selectAll(PlatformJob.class)
+                .selectAs(Platform::getName,PlatformJob::getPlatformName)
+                .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+                .eq(PlatformJob::getPlatformId,platformId)
+                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                .in(PlatformJob::getStatus,
+                        Constants.PlatformJobStatus.WAIT_CALL.getKey(),
+                        Constants.PlatformJobStatus.IN_WAIT.getKey(),
+                        Constants.PlatformJobStatus.CALLED.getKey(),
+                        Constants.PlatformJobStatus.WORKING.getKey(),
+                        Constants.PlatformJobStatus.EXCEPTION.getKey(),
+                        Constants.PlatformJobStatus.OVER_NUMBER.getKey()
+                )
+                .like(PlatformJob::getArriveDate, DateUtil.getCurrDate())
+                .orderByDesc(PlatformJob::getId)
+        );
+        for (PlatformJob platformJob:platformJobList) {
+            //澶勭悊WSM鏁伴噺
+            this.getWmsJobData(platformJob);
+            //鏌ヨ鍓嶆柟鎺掗槦鏁伴噺
+            this.queryWaitNum(platformJob);
+        }
+        PlatformWorkVO platformWorkVO = PlatformGroupServiceImpl.getPlatformWorkVO(platformId,platformJobList);
+        return platformWorkVO;
+    }
+
+
+    @Override
+    public PlatformOrderNumByDateResponse orderNumByDate(PlatformOrderNumByDateRequest param){
+        PlatformOrderNumByDateResponse platformOrderNumByDateResponse = new PlatformOrderNumByDateResponse();
+        Date queryDate = (Objects.nonNull(param)&&Objects.nonNull(param.getTimeInfo()))?param.getTimeInfo():new Date();
+        String queryDateStr = DateUtil.getDate(queryDate,"yyyy-MM-dd");
+        //鏌ヨ浠婃棩鍏ㄩ儴浠诲姟
+        platformOrderNumByDateResponse.setTotalNum(
+            platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
+                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                    .and(i->
+                            i.like(PlatformJob::getDoneDate,queryDateStr)
+                            .or().ne(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey())
+                    )
+            )
+        );
+        //鏌ヨ浠婃棩瀹屾垚浠诲姟
+        platformOrderNumByDateResponse.setDoneNum(
+                platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
+                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                        .like(PlatformJob::getDoneDate,queryDateStr)
+                        .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey())
+                )
+        );
+        return platformOrderNumByDateResponse;
+    }
+
+
+
+    @Override
+    public List<PlatformDataListResponse> platformWorkingDataList(PlatformDataListRequest param){
+        List<PlatformDataListResponse> platformDataListResponseList = new ArrayList<>();
+        List<Platform> platformList = platformJoinMapper.selectList(
+                new MPJLambdaWrapper<Platform>().eq(Platform::getIsdeleted,Constants.ZERO)
+                .eq(Platform::getStatus,Constants.ZERO)
+        );
+        for (Platform platform:platformList) {
+            PlatformDataListResponse platformDataListResponse  = new PlatformDataListResponse();
+            platformDataListResponse.setId(platform.getId());
+            platformDataListResponse.setHkId(platform.getHkId());
+            platformDataListResponse.setName(platform.getName());
+            platformDataListResponse.setWorkStatus(Constants.ZERO);
+            //鏌ヨ褰撳墠浣滀笟杞﹁締
+            PlatformJob platformJob = platformJobMapper.selectOne(new QueryWrapper<PlatformJob>().lambda()
+                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                    .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey())
+                    .orderByDesc(PlatformJob::getWorkTime)
+                    .last(" limit 1")
+            );
+            if(Objects.nonNull(platformJob)){
+                platformDataListResponse.setCarCode(platformJob.getCarCodeFront());
+                platformDataListResponse.setWorkType(
+                        Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.zycxh)
+                                ||Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.wxcxh)
+                        ||Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.sgscxh)?Constants.ZERO:Constants.ONE
+                );
+                platformDataListResponse.setWorkStatus(Constants.ONE);
+                //鏌ヨ浣滀笟鏃堕暱
+                platformDataListResponse.setWorkTime(
+                        this.getWorkTime(platformJob)
+                );
+            }
+        }
+        return platformDataListResponseList;
+    }
+
+    @Override
+    public PlatformDataInfoResponse platformWorkingDataList(PlatformDataInfoRequest param){
+        if(Objects.isNull(param)
+        || Objects.isNull(param.getId())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        PlatformDataInfoResponse response = new PlatformDataInfoResponse();
+        Platform platform = platformJoinMapper.selectById(param.getId());
+        if(Objects.isNull(platform)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鏈堝彴淇℃伅");
+        }
+        response.setId(platform.getId());
+        response.setHkId(platform.getHkId());
+        response.setName(platform.getName());
+
+        PlatformJob platformJob = platformJobJoinMapper.selectJoinOne(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
+                        .selectAll(PlatformJob.class)
+                        .selectAs(Platform::getName,PlatformJob::getPlatformName)
+                        .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
+                        .selectAs(PlatformWmsJob::getId,PlatformJob::getWmsId)
+                        .selectAs(PlatformWmsJob::getCarrierName,PlatformJob::getCarrierName)
+                        .selectAs(PlatformWmsJob::getRepertotyAddress,PlatformJob::getRepertotyAddress)
+                        .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+                        .leftJoin(PlatformWmsJob.class,PlatformWmsJob::getCarryBillCode,PlatformJob::getBillCode)
+                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                        .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey())
+                        .eq(PlatformJob::getPlatformId,platform.getId())
+                        .orderByDesc(PlatformJob::getDoneDate)
+        );
+        if(Objects.nonNull(platformJob)){
+            response.setCarCode(platformJob.getCarCodeFront());
+            response.setCarrierName(platformJob.getCarrierName());
+            response.setOrderCode(platformJob.getBillCode());
+            response.setRepertotyAddress(platformJob.getRepertotyAddress());
+            //鏌ヨ渚涘簲鍟嗕俊鎭� 鍙湁瀛樺湪鎵胯繍鍗曞彿鎵嶆湁
+            if(Objects.nonNull(platformJob.getWmsId())){
+                List<PlatformWmsDetail> platformWmsDetailList = platformWmsDetailMapper.selectList(new QueryWrapper<PlatformWmsDetail>().lambda()
+                        .eq(PlatformWmsDetail::getIsdeleted,Constants.ZERO)
+                        .eq(PlatformWmsDetail::getJobId,platformJob.getId()));
+                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformWmsDetailList)){
+                    List<String> stringList = platformWmsDetailList.stream().map(m->m.getInRepertotyCode()).collect(Collectors.toList());
+                    response.setInRepertotyCode(stringList);
+                }
+            }
+        }
+        return response;
+    }
+
+
+    @Override
+    public CarNumByStatusResponse carStatusNum(CarNumByStatusRequest param){
+        CarNumByStatusResponse response = new CarNumByStatusResponse();
+        response.setQueuingNum(
+            platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
+                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                    .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey())
+            )
+        );
+        response.setInNum(
+                platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
+                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                        .and(i->i.eq(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey())
+                                .or()
+                                .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey())
+                        )
+                )
+        );
+        response.setWorkingNum(
+                platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
+                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                        .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey())
+                )
+        );
+        response.setDoneNum(
+                platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
+                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                        .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.LEAVED.getKey())
+                        .like(PlatformJob::getOutDate,DateUtil.getDate(new Date(),"yyyy-MM-dd"))
+                )
+        );
+        return response;
+    }
+
+
+    @Override
+    public PlatformQueuingListResponse  queueList(PlatformQueuingListRequest param){
+        PlatformQueuingListResponse response = new PlatformQueuingListResponse();
+
+        List<PlatformJob> platformJobList = platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
+                .selectAll(PlatformJob.class)
+                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+                .leftJoin(PlatformGroup.class,PlatformGroup::getId,PlatformJob::getPlatformGroupId)
+                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey())
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey())
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey())
+                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                .isNotNull(PlatformJob::getCarCodeFront)
+                .orderByDesc(PlatformJob::getCreateDate)
+                .eq(PlatformGroup::getType,Constants.ZERO));
+
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformJobList)){
+            response.setOutboundList(
+                    platformJobList.stream().map(m->m.getCarCodeFront()).collect(Collectors.toList())
+            );
+        }
+
+        platformJobList = platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
+                .selectAll(PlatformJob.class)
+                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+                .leftJoin(PlatformGroup.class,PlatformGroup::getId,PlatformJob::getPlatformGroupId)
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey())
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey())
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey())
+                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                .isNotNull(PlatformJob::getCarCodeFront)
+                .orderByDesc(PlatformJob::getCreateDate)
+                .eq(PlatformGroup::getType,Constants.ONE));
+
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformJobList)){
+            response.setInboundList(
+                    platformJobList.stream().map(m->m.getCarCodeFront()).collect(Collectors.toList())
+            );
+        }
+
+        platformJobList = platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
+                .selectAll(PlatformJob.class)
+                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
+                .leftJoin(PlatformGroup.class,PlatformGroup::getId,PlatformJob::getPlatformGroupId)
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey())
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey())
+                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey())
+                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
+                .isNotNull(PlatformJob::getCarCodeFront)
+                .orderByDesc(PlatformJob::getCreateDate)
+                .eq(PlatformGroup::getType,Constants.TWO));
+
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformJobList)){
+            response.setMunicipalComList(
+                    platformJobList.stream().map(m->m.getCarCodeFront()).collect(Collectors.toList())
+            );
+        }
+        return response;
+    }
+
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java
index 4008597..5811b1b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java
@@ -2,9 +2,12 @@
 
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.PlatformLogMapper;
 import com.doumee.dao.business.model.PlatformLog;
+import com.doumee.dao.openapi.request.CarLogsListRequest;
+import com.doumee.dao.openapi.response.CarLogsListResponse;
 import com.doumee.service.business.PlatformLogService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -14,7 +17,10 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 鏈堝彴_浣滀笟鎿嶄綔鍘嗗彶琛⊿ervice瀹炵幇
@@ -126,4 +132,30 @@
         QueryWrapper<PlatformLog> wrapper = new QueryWrapper<>(platformLog);
         return platformLogMapper.selectCount(wrapper);
     }
+
+
+
+    @Override
+    public List<CarLogsListResponse> getCarLogsListResponse(CarLogsListRequest carLogsListRequest){
+        List<CarLogsListResponse> carLogsListResponseList = new ArrayList<>();
+
+        List<PlatformLog> platformLogList = platformLogMapper.selectList(new QueryWrapper<PlatformLog>().lambda()
+                .notIn(PlatformLog::getObjType,
+                        Constants.PlatformJobLogType.CREATE.getKey(),
+                        Constants.PlatformJobLogType.CONFIRM_TASK.getKey()
+                )
+                .orderByDesc(PlatformLog::getCreateDate)
+                .last(Objects.nonNull(carLogsListRequest)&&Objects.nonNull(carLogsListRequest.getLimitNum())," limit " +carLogsListRequest.getLimitNum())
+        );
+        for (PlatformLog platformLog:platformLogList) {
+            CarLogsListResponse carLogsListResponse = new CarLogsListResponse();
+            carLogsListResponse.setCarCode(platformLog.getParam4());
+            carLogsListResponse.setContent(platformLog.getContent());
+            carLogsListResponse.setCreateDate(new Date());
+            carLogsListResponseList.add(carLogsListResponse);
+        }
+        return carLogsListResponseList;
+    }
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformServiceImpl.java
index 82709a7..4acdb01 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformServiceImpl.java
@@ -8,9 +8,11 @@
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.PlatformMapper;
+import com.doumee.dao.business.join.PlatformJoinMapper;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.Platform;
 import com.doumee.dao.business.model.PlatformGroup;
+import com.doumee.dao.openapi.response.PlatformNumByStatusResponse;
 import com.doumee.service.business.PlatformService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -24,6 +26,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 鏈堝彴淇℃伅琛⊿ervice瀹炵幇
@@ -35,6 +38,8 @@
 
     @Autowired
     private PlatformMapper platformMapper;
+    @Autowired
+    private PlatformJoinMapper platformJoinMapper;
 
     @Override
     public Integer create(Platform platform) {
@@ -65,6 +70,7 @@
     public void updateById(Platform platform) {
         platformMapper.updateById(platform);
     }
+
     @Override
     public void updateStatusById(Platform platform) {
         Platform model  =platformMapper.selectById(platform.getId());
@@ -162,4 +168,35 @@
         QueryWrapper<Platform> wrapper = new QueryWrapper<>(platform);
         return platformMapper.selectCount(wrapper);
     }
+
+
+    @Override
+    public PlatformNumByStatusResponse getPlatformNumByStatusResponse(){
+        PlatformNumByStatusResponse platformNumByStatusResponse = new PlatformNumByStatusResponse();
+        List<Platform> platformList =  platformJoinMapper.selectJoinList(Platform.class,new MPJLambdaWrapper<Platform>()
+                .selectAll(Platform.class)
+                .select(" ( select count(1) from platform_job pj where t.id = pj.PLATFORM_ID and pj.STATUS = "+Constants.PlatformJobStatus.WORKING.getKey()+" ) as workStatus ")
+                .eq(Platform::getIsdeleted,Constants.ZERO)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformList)){
+            //鍋滅敤鏁伴噺
+            platformNumByStatusResponse.setForbiddenNum(
+                    platformList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)).collect(Collectors.toList()).size()
+            );
+            //宸ヤ綔鏁伴噺
+            platformNumByStatusResponse.setUsingNum(
+                    platformList.stream().filter(i->i.getWorkStatus()>Constants.ZERO).collect(Collectors.toList()).size()
+            );
+            //绌洪棽鏁伴噺
+            platformNumByStatusResponse.setIdleNum(
+                    platformList.stream().filter(i->i.getWorkStatus()<=Constants.ZERO).collect(Collectors.toList()).size()
+            );
+        }
+        return platformNumByStatusResponse;
+    }
+
+
+
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java
index 202d2b0..5ba00a4 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java
@@ -12,6 +12,10 @@
 import com.doumee.dao.business.PlatformWaterGasMapper;
 import com.doumee.dao.business.model.PlatformReason;
 import com.doumee.dao.business.model.PlatformWaterGas;
+import com.doumee.dao.openapi.request.GasByMonthRequest;
+import com.doumee.dao.openapi.request.WaterByMonthRequest;
+import com.doumee.dao.openapi.response.GasByMonthResponse;
+import com.doumee.dao.openapi.response.WaterByMonthResponse;
 import com.doumee.service.business.PlatformWaterGasService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -22,9 +26,13 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.RequestBody;
 
+import java.math.BigDecimal;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛⊿ervice瀹炵幇
@@ -207,4 +215,91 @@
         QueryWrapper<PlatformWaterGas> wrapper = new QueryWrapper<>(platformWaterGas);
         return platformWaterGasMapper.selectCount(wrapper);
     }
+
+
+    @Override
+    public WaterByMonthResponse waterDataByMonth(WaterByMonthRequest param){
+        Date queryDate = (Objects.nonNull(param)&&Objects.nonNull(param.getTimeInfo()))?param.getTimeInfo():new Date();
+        //鑾峰彇涓婁釜鏈堟棩鏈�
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(queryDate);
+        calendar.add(Calendar.MONTH, -1);
+        Date beforMonth = calendar.getTime();
+        calendar.add(Calendar.MONTH, -11);
+        Date beforYearMonth = calendar.getTime();
+
+        WaterByMonthResponse waterByMonthResponse = new WaterByMonthResponse();
+
+        List<PlatformWaterGas> list = platformWaterGasMapper.selectList(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted,Constants.ZERO)
+                .eq(PlatformWaterGas::getType,Constants.ZERO)
+                .like(PlatformWaterGas::getTimeInfo,DateUtil.getDate(queryDate,"yyyy-MM"))
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            waterByMonthResponse.setCurrentMonth(list.stream().map(m->m.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        }
+
+        list = platformWaterGasMapper.selectList(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted,Constants.ZERO)
+                .eq(PlatformWaterGas::getType,Constants.ZERO)
+                .like(PlatformWaterGas::getTimeInfo,beforMonth)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            waterByMonthResponse.setLastMonth(list.stream().map(m->m.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        }
+
+        list = platformWaterGasMapper.selectList(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted,Constants.ZERO)
+                .eq(PlatformWaterGas::getType,Constants.ZERO)
+                .like(PlatformWaterGas::getTimeInfo,beforYearMonth)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            waterByMonthResponse.setLastYearMonth(list.stream().map(m->m.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        }
+        return waterByMonthResponse;
+    }
+
+
+    @Override
+    public GasByMonthResponse gasDataByMonth(GasByMonthRequest param){
+        Date queryDate = (Objects.nonNull(param)&&Objects.nonNull(param.getTimeInfo()))?param.getTimeInfo():new Date();
+        //鑾峰彇涓婁釜鏈堟棩鏈�
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(queryDate);
+        calendar.add(Calendar.MONTH, -1);
+        Date beforMonth = calendar.getTime();
+        calendar.add(Calendar.MONTH, -11);
+        Date beforYearMonth = calendar.getTime();
+
+        GasByMonthResponse response = new GasByMonthResponse();
+
+        List<PlatformWaterGas> list = platformWaterGasMapper.selectList(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted,Constants.ZERO)
+                .eq(PlatformWaterGas::getType,Constants.ONE)
+                .like(PlatformWaterGas::getTimeInfo,DateUtil.getDate(queryDate,"yyyy-MM"))
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            response.setCurrentMonth(list.stream().map(m->m.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        }
+
+        list = platformWaterGasMapper.selectList(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted,Constants.ZERO)
+                .eq(PlatformWaterGas::getType,Constants.ONE)
+                .like(PlatformWaterGas::getTimeInfo,beforMonth)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            response.setLastMonth(list.stream().map(m->m.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        }
+
+        list = platformWaterGasMapper.selectList(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted,Constants.ZERO)
+                .eq(PlatformWaterGas::getType,Constants.ONE)
+                .like(PlatformWaterGas::getTimeInfo,beforYearMonth)
+        );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
+            response.setLastYearMonth(list.stream().map(m->m.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        }
+        return response;
+    }
+
 }

--
Gitblit v1.9.3