k94314517
2024-09-24 deb2a67c1a9824b288ce4a7a228347ffd60964fe
Merge remote-tracking branch 'origin/master'
已修改22个文件
2459 ■■■■ 文件已修改
admin/.env.test 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/platform/index.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/workbench/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/leaveAuth.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/operation.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/operationCity.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybill.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/components/PlatformQueuing.vue 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 268 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformRecord.vue 147 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/reserved.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/driver.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/center.vue 1707 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/queueup.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkInterfaceTestCloudController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseListPageResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/FireDeviceStatusListResponse.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test
@@ -1,4 +1,4 @@
# 测试环境配置
NODE_ENV = 'production'
VUE_APP_API_URL  = 'http://10.50.250.178:8088/gateway_interface/'
VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
admin/src/api/platform/index.js
@@ -8,7 +8,11 @@
export function platformCallList(data) {
  return request.post('/visitsAdmin/cloudService/business/platform/platformCallList', data)
}
// 叫号
//  入园叫号
export function platformInPark(data) {
  return request.post('/visitsAdmin/cloudService/business/platform/platformInPark', data)
}
// 月台叫号
export function platformCallNumber(data) {
  return request.post('/visitsAdmin/cloudService/business/platform/platformCallNumber', data)
}
admin/src/api/workbench/index.js
@@ -2,7 +2,7 @@
// 顶部导航
export function getAppHeaderNav (data) {
  return request.get('/visitsAdmin/cloudService/business/hksync/getHkMenuLink', data)
  return request.get('/visitsAdmin/cloudService/business/hksync/getHkMenuLink?type='+ data)
}
// 主体数据
export function getWorkbenchBody (data) {
admin/src/components/common/CommonHeader.vue
@@ -8,10 +8,10 @@
            <div>服务中心</div>
            <div class="linellae"></div>
          </div>
          <div class="item" @click="getHeaderNav('')">安防中心</div>
          <div class="item" @click="getHeaderNav('')">消防中心</div>
          <div class="item" @click="getHeaderNav('')">能管中心</div>
          <div class="item" @click="getHeaderNav('')">驾驶舱</div>
          <div class="item" @click="getHeaderNav('0')">安防中心</div>
          <div class="item" @click="getHeaderNav('1')">消防中心</div>
          <div class="item" @click="getHeaderNav('2')">能管中心</div>
          <div class="item" @click="getHeaderNav('3')">驾驶舱</div>
        </div>
        <!-- <div class="title-en">Diagnosis of Intelligent Manufacturing Integrated Service Platfrom</div> -->
      </div>
@@ -155,11 +155,9 @@
        this.$refs.changePwdDataForm.resetFields()
      })
    },
    getHeaderNav(){
      getAppHeaderNav({
        type: ''
      }).then(res => {
        this.headerNavData = res
    getHeaderNav(type){
      getAppHeaderNav(type).then(res => {
        window.open(res, "_blank");
      })
    },
    // 确定修改密码
admin/src/views/index.vue
@@ -65,7 +65,7 @@
        <div class="funcs">
          <div class="home_title">常用功能</div>
          <div class="list">
            <div v-for="item in funcList" :key="item.name" class="item">
            <div v-for="item in funcList" @click="funcClick(item)" :key="item.name" class="item">
              <img class="mb10" :src="item.url" alt="" />
              <div>{{ item.name }}</div>
            </div>
@@ -227,47 +227,56 @@
import { weeks } from '@/utils/config'
import {
  getWorkbenchBody,
  getWorkbenchHead
  getWorkbenchHead,
  getAppHeaderNav
} from '@/api'
const colors = ['#52a4f7', '#7678f7', '#5fc6d5']
export default {
  data () {
  data() {
    return {
      colors,
      nowDate: '',
      nowWeek: '',
      funcList: [
        { name: '访客报备', path: '', url: require('@/assets/icons/home_func1.png') },
        { name: '隐患随手拍', path: '', url: require('@/assets/icons/home_func2.png') },
        { name: '预约会议室', path: '', url: require('@/assets/icons/home_func3.png') },
        { name: '访客报备', path: '', url: require('@/assets/icons/home_func1.png'), path: '/business/reportRecord' },
        { name: '隐患随手拍', path: '', url: require('@/assets/icons/home_func2.png'), path: '/operation/danger/record' },
        { name: '预约会议室', path: '', url: require('@/assets/icons/home_func3.png'), path: '/meeting/bookings' },
        { name: '考勤工作台', path: '', url: require('@/assets/icons/home_func4.png') }
      ]
    }
  },
  computed: {
    userInfo(){
    userInfo() {
      return this.$store.state.userInfo
    }
  },
  created () {
  created() {
    this.updateDate()
    setInterval(() => {
      this.updateDate()
    }, 1000 * 60 * 60)
  },
  mounted () {
  mounted() {
    this.initData()
  },
  methods: {
    updateDate () {
    funcClick(item) {
      if (item.name == '考勤工作台') {
        getAppHeaderNav(4).then(res => {
          window.open(res, "_blank")
          return
        })
      }
      this.$router.push(item.path)
    },
    updateDate() {
      this.nowDate = dayjs().format('YYYY年M月D日')
      this.nowWeek = weeks[new Date().getDay()]
    },
    initData () {
    initData() {
      this.getWorkBody() //主体数据
      this.getWorkHead() //主体数据
      this.initEchart1()
      this.initEchart2()
      this.initEchart3()
@@ -279,7 +288,7 @@
    getWorkHead() {
      getWorkbenchHead()
    },
    initEchart1 () {
    initEchart1() {
      const myChart = echarts.init(document.getElementById('echart1'))
      const option = {
        series: [
@@ -307,7 +316,7 @@
        myChart.resize()
      })
    },
    initEchart2 () {
    initEchart2() {
      const myChart = echarts.init(document.getElementById('echart2'))
      myChart.setOption({
        grid: {
@@ -362,7 +371,7 @@
        myChart.resize()
      })
    },
    initEchart3 () {
    initEchart3() {
      const myChart = echarts.init(document.getElementById('echart3'))
      myChart.setOption({
        tooltip: {
@@ -461,7 +470,7 @@
        myChart.resize()
      })
    },
    initEchart4 () {
    initEchart4() {
      const myChart = echarts.init(document.getElementById('echart4'))
      myChart.setOption({
        tooltip: {
@@ -568,23 +577,28 @@
div {
  box-sizing: border-box;
}
.home_title {
  font-weight: 600;
  font-size: 16px;
  color: #222222;
  line-height: 22px;
}
.main {
  display: flex;
  position: relative;
  z-index: 99;
  .app_content {
    flex: 1;
    .static_card {
      height: 187px;
      color: #fff;
      display: flex;
      justify-content: space-between;
      .card {
        flex: 1;
        height: 187px;
@@ -592,16 +606,20 @@
        box-shadow: 0px 2px 10px 0px rgba(32, 127, 247, 0.4);
        border-radius: 8px;
        margin-right: 14px;
        &:nth-of-type(2) {
          background: linear-gradient(270deg, #8383ff 0%, #6b6eff 100%);
        }
        &:nth-of-type(3) {
          background: linear-gradient(270deg, #42d49d 0%, #12bb8b 100%);
        }
        &:nth-of-type(4) {
          margin-right: 0;
          background: linear-gradient(270deg, #30d3de 0%, #04b7cd 100%);
        }
        .header {
          height: 103px;
          display: flex;
@@ -609,16 +627,19 @@
          align-items: center;
          padding: 20px 20px 12px;
          border-bottom: 1px solid rgba(255, 255, 255, 0.2);
          img {
            width: 40px;
            height: 40px;
          }
          .num {
            font-weight: 600;
            font-size: 30px;
            margin-top: 12px;
          }
        }
        .content {
          height: 82px;
          display: flex;
@@ -629,20 +650,25 @@
        }
      }
    }
    .funcs {
      height: 149px;
      padding: 20px;
      background: #fff;
      margin: 10px 0;
      .list {
        display: flex;
        padding-top: 20px;
        .item {
          display: flex;
          flex-direction: column;
          align-items: center;
          justify-content: center;
          margin-right: 24px;
          cursor: pointer;
          img {
            width: 44px;
            height: 44px;
@@ -651,9 +677,11 @@
      }
    }
  }
  .app_side {
    width: 408px;
    margin-left: 10px;
    .task {
      background: #fff;
      border-radius: 2px;
@@ -661,6 +689,7 @@
      padding: 20px;
      height: 346px;
      margin-bottom: 10px;
      .header {
        .num {
          position: relative;
@@ -675,27 +704,33 @@
          border-radius: 8px;
          margin-left: 13px;
        }
        .more {
          font-size: 13px;
          color: #999999;
        }
      }
      .list {
        .item {
          display: flex;
          align-items: center;
          margin-top: 15px;
          .content {
            flex: 1;
            .title {
              color: #222222;
              margin-bottom: 5px;
            }
            .time {
              color: #999999;
              font-size: 12px;
            }
          }
          .btn {
            margin-left: 10px;
            width: 58px;
@@ -711,12 +746,14 @@
        }
      }
    }
    .warnning {
      background: #fff;
      border-radius: 2px;
      border: 1px solid #eeeeee;
      padding: 20px;
      height: 508px;
      .header {
        .num {
          position: relative;
@@ -731,13 +768,16 @@
          border-radius: 8px;
          margin-left: 13px;
        }
        .more {
          font-size: 13px;
          color: #999999;
        }
      }
      .list {
        padding-top: 6px;
        .item {
          margin-top: 10px;
          padding: 15px;
@@ -745,29 +785,35 @@
          height: 140px;
          background: rgba(32, 127, 247, 0.05);
          border-radius: 4px;
          .name_wrap {
            margin-bottom: 10px;
            .name {
              font-weight: 600;
              color: #222222;
            }
            .identity {
              font-size: 13px;
              color: #207ff7;
            }
          }
          .line {
            color: #666666;
            margin-bottom: 8px;
            font-size: 13px;
          }
          .auth {
            .time {
              font-weight: 600;
              font-size: 13px;
              color: #ee3821;
            }
            .btn{
            .btn {
              margin-left: 10px;
              width: 58px;
              text-align: center;
@@ -784,6 +830,7 @@
      }
    }
  }
  .static_wrap {
    .wrap {
      background: #fff;
@@ -792,30 +839,37 @@
      border: 1px solid #eeeeee;
      height: 250px;
      flex: 1;
      &:nth-of-type(2n) {
        margin-left: 10px;
      }
      .echart {
        width: 100%;
        height: 190px;
      }
      .header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        .more {
          font-size: 13px;
          color: #999999;
        }
      }
    }
    .static1 {
      .content {
        display: flex;
        justify-content: center;
        align-items: center;
        .echart_wrap {
          position: relative;
          .pie_text {
            position: absolute;
            left: 50%;
@@ -824,16 +878,20 @@
            z-index: 999;
          }
        }
        .echart {
          width: 150px;
          height: 150px;
        }
        .list {
          margin-left: 36px;
          .item {
            display: flex;
            align-items: center;
            margin: 8px 0;
            .icon {
              width: 16px;
              height: 16px;
@@ -841,6 +899,7 @@
              margin-right: 6px;
              background: linear-gradient(270deg, #29aeff 0%, #207ff7 100%);
            }
            .text {
              margin-right: 6px;
            }
@@ -850,6 +909,7 @@
    }
  }
}
.main_home {
  background: #f4f7fc;
  position: relative;
@@ -858,6 +918,7 @@
  overflow: auto;
  padding: 20px;
  padding-top: 92px;
  .home_header {
    position: absolute;
    top: 0;
admin/src/views/platform/LogisticsRecord/leaveAuth.vue
@@ -47,7 +47,7 @@
      <el-table-column label="操作" align="center" fixed="right" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <el-button type="text" v-permissions="['business:platformbooks:detail']"
            @click="handleAuth(scope.row)">离远授权</el-button>
            @click="handleAuth(scope.row)">离园授权</el-button>
        </template>
      </el-table-column>
    </el-table>
@@ -171,12 +171,11 @@
      })
    },
    handleAuth(row) {
      this.$confirm('是否对当前运单的车辆进行离园授权,是则进行离园授权?', '提示', {
      this.$prompt('备注', '离园授权', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        platformPowerLevel({ jobId: row.id }).then(res => {
      }).then(({ remark }) => {
        platformPowerLevel({ jobId: row.id,remark }).then(res => {
          Message.success('离园授权成功')
          this.getList()
        })
admin/src/views/platform/LogisticsRecord/operation.vue
@@ -55,6 +55,8 @@
import UploadFaceImg from '@/components/common/UploadFaceImg'
import { Message } from 'element-ui'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration);
export default {
  components: {
    Pagination,
@@ -146,6 +148,7 @@
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
          item.workTime = dayjs.duration(item.workTime, 'seconds').format('H时m分s秒');
        })
        this.pagination.total = res.total || 0
      }, () => {
admin/src/views/platform/LogisticsRecord/operationCity.vue
@@ -56,6 +56,8 @@
import UploadFaceImg from '@/components/common/UploadFaceImg'
import { Message } from 'element-ui'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration);
export default {
  components: {
    Pagination,
@@ -147,6 +149,7 @@
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
          item.workTime = dayjs.duration(item.workTime, 'seconds').format('H时m分s秒');
        })
        this.pagination.total = res.total || 0
      }, () => {
admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -39,10 +39,10 @@
      </el-table-column>
      <el-table-column prop="name" label="操作" min-width="120" align="center" fixed="right" show-overflow-tooltip>
        <template v-slot="scope">
          <el-button type="text" class="red" v-permissions="['business:platformjob:delete']"
          <el-button v-if="scope.row.status == '12'" type="text" class="red" v-permissions="['business:platformjob:delete']"
            @click="handleDel(scope.row)">删除</el-button>
          <el-button type="text" v-permissions="['business:platformjob:query']"
            @click="handleDetail(scope.row)">预约详情</el-button>
          <el-button v-if="scope.row != 12" type="text" v-permissions="['business:platformjob:query']"
            @click="handleDetail(scope.row)">运单详情</el-button>
        </template>
      </el-table-column>
    </el-table>
@@ -143,8 +143,8 @@
        model: {
          ...filters,
          jobType: '0',
          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
          createDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
          createDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
admin/src/views/platform/components/PlatformQueuing.vue
@@ -1,18 +1,10 @@
<template>
  <GlobalWindow
    :title="'月台叫号-'+title"
    :visible.sync="isShowModal"
    :showConfirm="false"
    width="800px"
  >
  <GlobalWindow :title="callType == 1 ? '叫号入园-' + title : '月台叫号-' + title" :visible.sync="isShowModal"
    :showConfirm="false" width="800px">
    <div class="queuing_modal">
      <div class="df_ac mb20">
        <span>搜索车辆:</span>
        <el-input
          class="flex1 mr20"
          v-model="carCodeFront"
          placeholder="请输入车牌号"
        ></el-input>
        <el-input class="flex1 mr20" v-model="carCodeFront" placeholder="请输入车牌号"></el-input>
        <el-button type="primary" @click="getList">查找</el-button>
        <el-button @click="reset">重置</el-button>
      </div>
@@ -34,7 +26,7 @@
            </div>
            <div v-else class="ite">
              <span>运输单号:</span>
              <span>{{ item.code }}</span>
              <span>{{ item.billCode }}</span>
            </div>
            <div class="ite">
              <span>驾驶员:</span>
@@ -60,11 +52,7 @@
          </div>
        </div>
      </div>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="pagination"
      >
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination">
      </pagination>
    </div>
  </GlobalWindow>
@@ -73,7 +61,7 @@
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import Pagination from '@/components/common/Pagination'
import { platformCallList, platformCallNumber } from '@/api'
import { platformCallList, platformCallNumber, platformInPark } from '@/api'
import { statusMap } from '../config'
import { Message } from 'element-ui'
export default {
@@ -81,7 +69,7 @@
    GlobalWindow,
    Pagination
  },
  data () {
  data() {
    return {
      statusMap,
      isShowModal: false,
@@ -93,24 +81,35 @@
      },
      carCodeFront: '',
      title: '',
      callType: '1',
      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()
      })
    handleCall(item) {
      const { activePlat, callType } = this
      if (callType == 1) { // 入园叫号
        platformInPark({
          jobId: item.id,
          platformId: activePlat.id
        }).then(() => {
          Message.success('叫号成功')
          this.getList()
        })
      } else {
        platformCallNumber({ platformId: activePlat.id, jobId: item.id }).then(res => {
          Message.success('叫号成功')
          this.$emit('success')
          this.getList()
        })
      }
    },
    getList () {
      const { activePlat, pagination, carCodeFront } = this
    getList() {
      const { activePlat, pagination, carCodeFront, callType } = this
      platformCallList({
        model: { callType: '2', platformId: activePlat.id, carCodeFront },
        model: { callType, platformId: activePlat.id, carCodeFront },
        page: pagination.page,
        capacity: pagination.pageSize
      }).then(res => {
@@ -118,21 +117,21 @@
        this.pagination.total = res.total
      })
    },
    reset () {
    reset() {
      this.carCodeFront = ''
      this.pagination.page = 1
      this.pagination.pageSize = 10
      this.getList()
    },
    handleSizeChange (e) {
    handleSizeChange(e) {
      this.pagination.pageSize = e
      this.getList()
    },
    handlePageChange (e) {
    handlePageChange(e) {
      this.pagination.page = e
      this.getList()
    },
    handleSub () {
    handleSub() {
      const { param } = this
      this.subLoading = true
      PlatformEdit({
@@ -153,8 +152,10 @@
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.queuing_modal {
  padding: 10px 30px;
  .list {
    .item {
      background: #f4fafb;
@@ -162,8 +163,10 @@
      border: 1px solid #dfe2e8;
      margin-bottom: 10px;
      padding: 16px;
      .head {
        margin-bottom: 15px;
        .plate {
          width: 90px;
          text-align: center;
@@ -174,9 +177,11 @@
          border: 1px solid #279baa;
          background-color: #fff;
        }
        .status {
          color: $primaryColor;
        }
        .code {
          display: flex;
          font-weight: 600;
@@ -188,24 +193,29 @@
          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;
        flex-wrap: wrap;
        .ite {
          width: 33.3%;
          margin-bottom: 8px;
          span {
            &:nth-child(1) {
              color: #666666;
@@ -213,6 +223,7 @@
          }
        }
      }
      .footer {
        .detail {
          color: $primaryColor;
admin/src/views/platform/index.vue
@@ -2,13 +2,8 @@
  <div class="main_app">
    <div class="mb20 main_header">
      <div class="platgroup_tabs">
        <div
          class="tab"
          :class="{ active: activeGroup.id === item.id }"
          @click="platgroupClick(item)"
          v-for="(item, i) in PlatGroupList"
          :key="i"
        >
        <div class="tab" :class="{ active: activeGroup.id === item.id }" @click="platgroupClick(item)"
          v-for="(item, i) in PlatGroupList" :key="i">
          {{ item.name }}
        </div>
        <!-- <el-tabs v-model="activeGroup.id" @tab-click="platgroupClick">
@@ -20,9 +15,7 @@
          />
        </el-tabs> -->
      </div>
      <el-button type="primary" class="ml20" @click="handleSet"
        >配置月台</el-button
      >
      <el-button type="primary" class="ml20" @click="handleSet">配置月台</el-button>
    </div>
    <!--  -->
    <div v-if="activeGroup.platformList" class="platform_list">
@@ -34,38 +27,23 @@
            </div>
            <div class="name">{{ item.name }}</div>
            <div class="ite">
              <span class="placeholder9">作业:</span
              ><span>{{ item.platformWorkVO.workNum }}</span>
              <span class="placeholder9">作业:</span><span>{{ item.platformWorkVO.workNum }}</span>
            </div>
            <div class="ite">
              <span class="placeholder9">已叫:</span
              ><span>{{ item.platformWorkVO.callNum }}</span>
              <span class="placeholder9">已叫:</span><span>{{ item.platformWorkVO.callNum }}</span>
            </div>
            <div class="ite">
              <span class="placeholder9">等待:</span
              ><span>{{ item.platformWorkVO.waitNum }}</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>
              <span class="placeholder9">异常:</span><span class="red">{{ item.platformWorkVO.exceptionNum }}</span>
            </div>
          </div>
          <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>
          <el-button @click="handleQueuing(item, 1)">叫号入园</el-button>
          <el-button type="primary" @click="handleQueuing(item, 2)">月台叫号</el-button>
        </div>
        <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="list" v-if="item.platformWorkVO && item.platformWorkVO.platformJobList">
          <div class="info" :class="{err: task.status == 8}" v-for="task in item.platformWorkVO.platformJobList" :key="task.id">
            <div class="line">
              <div class="left">
                <div v-if="task.carCodeFront" class="code">
@@ -76,18 +54,14 @@
                </div>
              </div>
              <div class="right">
                <div
                  class="status"
                  v-if="task.status != 4 && task.status != 5"
                  :class="{ red: task.status == 8 }"
                >
                <div class="status_item" 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">
                <div class="status_item" 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 class="status_item scs" v-if="task.status == 5">
                  <span class="lab">作业中</span> {{ task.startDateTemp }}
                </div>
              </div>
            </div>
@@ -98,13 +72,13 @@
              </div>
              <div v-else class="ite">
                <span>运输单号:</span>
                <span>{{ task.code }}</span>
                <span>{{ task.billCode }}</span>
              </div>
              <div class="ite">
              <div class="ite siji">
                <span>驾驶员:</span>
                <span>{{ task.driverName }}</span>
              </div>
              <div class="ite">
              <div class="ite phone">
                <span>手机号:</span>
                <span>{{ task.drivierPhone }}</span>
              </div>
@@ -120,66 +94,38 @@
            </div>
            <div class="line">
              <div v-if="task.type != 4" class="left">
                <span class="primaryColor pointer" @click="handleDetail"
                  >运单详情</span
                >
                <span class="primaryColor pointer" @click="handleDetail">运单详情</span>
              </div>
              <div v-else></div>
              <div class="right">
                <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
                  v-if="task.status == 4"
                  type="primary"
                  @click="handleWork(task)"
                  >开始作业</el-button
                >
                <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 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">
        <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>
    <!-- 配置显示月台 -->
    <GlobalWindow
      title="配置显示月台"
      :visible.sync="isShowSet"
      :confirm-working="setLoading"
      @confirm="handleSetSub"
      width="560px"
    >
    <GlobalWindow title="配置显示月台" :visible.sync="isShowSet" :confirm-working="setLoading" @confirm="handleSetSub"
      width="560px">
      <div class="set_modal">
        <div class="mb10" v-for="group in PlatGroupList" :key="group.id">
          <div class="title">{{group.name}}</div>
          <div class="title">{{ group.name }}</div>
          <div class="list">
            <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 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>
@@ -190,33 +136,14 @@
    <!-- 运单详情 -->
    <!--  -->
    <!-- 叫号 -->
    <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"
    >
    <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 v-for="item in activeGroup.platformList" :key="item.id" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </div>
@@ -254,7 +181,7 @@
    WaybillDetail,
    GlobalWindow
  },
  data () {
  data() {
    return {
      statusMap,
      activeGroup: {},
@@ -275,29 +202,29 @@
      timer: null
    }
  },
  created () {
  created() {
    this.getPlatGroupList()
    // this.getList()
  },
  methods: {
    handleWork (item) {
    handleWork(item) {
      platformBeginWork({ jobId: item.id }).then(res => {
        Message.success('已开始作业')
        this.getPlatGroupList()
      })
    },
    handleFinish (item) {
    handleFinish(item) {
      platformFinishWork({ jobId: item.id }).then(res => {
        Message.success('完成作业')
        this.getPlatGroupList()
      })
    },
    handleTransform (item, task) {
    handleTransform(item, task) {
      this.activePlatId = item.id
      this.activetaskId = task.id
      this.isShowTransform = true
    },
    transformSub () {
    transformSub() {
      const { activePlatId, activetaskId } = this
      platformMove({ platformId: activePlatId, jobId: activetaskId }).then(res => {
        Message.success('转移月台成功')
@@ -305,8 +232,8 @@
        this.getPlatGroupList()
      })
    },
    handlePass (item) {
      this.$confirm('您确认要对该任务进行过号吗', '温馨提示', {
    handlePass(item) {
      this.$confirm(`确认 ${item.carCodeFront}置为过号吗?过号后,需要重新签到才能进入园区`, '温馨提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
@@ -317,7 +244,7 @@
        })
      })
    },
    handleErr (item) {
    handleErr(item) {
      this.$confirm('您确认要对该任务进行异常挂起吗', '温馨提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
@@ -329,14 +256,14 @@
        })
      })
    },
    platgroupClick (item) {
    platgroupClick(item) {
      this.activeGroup = { ...item }
      this.circulInitTaskList()
      this.timer = setInterval(() => {
        this.circulInitTaskList()
      }, 1000)
    },
    getPlatGroupList () {
    getPlatGroupList() {
      getPlatformGroupList({
        queryData: 1,
        queryType: 1
@@ -355,7 +282,7 @@
        }
      })
    },
    circulInitTaskList () {
    circulInitTaskList() {
      if (this.activeGroup && this.activeGroup.platformList && this.activeGroup.platformList.length > 0) {
        const time = new Date()
        this.activeGroup.platformList.forEach(plat => {
@@ -383,31 +310,32 @@
        this.$forceUpdate()
      }
    },
    handleQueuing (item) {
    handleQueuing(item, callType) {
      this.isShowQueuing = true
      this.$nextTick(() => {
        this.$refs.PlatformQueuingRef.isShowModal = true
        this.$refs.PlatformQueuingRef.callType = callType
        this.$refs.PlatformQueuingRef.activePlat = { ...item }
        this.$refs.PlatformQueuingRef.getList()
        this.$refs.PlatformQueuingRef.title = item.name
      })
    },
    handleDetail () {
    handleDetail() {
      this.isShowDetail = true
      this.$nextTick(() => {
        this.$refs.WaybillDetailRef.isShowModal = true
      })
    },
    getList () {
    getList() {
      const { groupId } = this
      listByGroupId(groupId).then(res => {
        this.platList = res
      })
    },
    handleSet () {
    handleSet() {
      this.isShowSet = true
    },
    handleSetSub () {
    handleSetSub() {
      const { PlatGroupList } = this
      const ids = []
      PlatGroupList.forEach(item => {
@@ -427,7 +355,7 @@
        this.setLoading = false
      })
    },
    platformSetClick (id) {
    platformSetClick(id) {
      const { PlatGroupList } = this
      PlatGroupList.forEach(item => {
        item.platformList.forEach(platform => {
@@ -443,8 +371,10 @@
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.platform_list {
  width: 100%;
  .item {
    /* padding: 16px 24px; */
    background: #ffffff;
@@ -452,27 +382,32 @@
    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 20px;
      .shengyin{
      .shengyin {
        width: 12px;
        height: 12px;
        margin-right: 3px;
      }
      .left {
        flex: 1;
        display: flex;
        align-items: center;
        .name {
          font-size: 16px;
          margin-right: 50px;
        }
        .status {
          line-height: 25px;
          height: 25px;
@@ -481,18 +416,19 @@
          color: #ffffff;
          padding: 0 6px;
        }
        .ite {
          margin-right: 30px;
        }
      }
    }
    .list {
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
      margin-top: 10px;
      padding: 16px;
      width: calc( 100% - 48px );
      width: calc(100% - 0);
      .info {
        background: #f4fafb;
        border-radius: 2px;
@@ -500,23 +436,41 @@
        padding: 16px;
        border-radius: 2px;
        margin-bottom: 10px;
        width: calc( 31.6% - 16px );
        .status {
        width: calc(31.6% - 22px);
        margin-right: 10px;
        &:nth-of-type(3n) {
          margin-right: 0;
        }
        .status_item {
          .lab {
            font-weight: 500;
          }
          color: #00ba67;
        }
        .line {
          display: flex;
          align-items: center;
          justify-content: space-between;
          flex-wrap: wrap;
          margin-bottom: 6px;
          .ite {
            width: 33.3%;
            margin-top: 8px;
          }
          .siji {
            width: 29%;
          }
          .phone {
            width: 37.6%;
          }
          .left {
            .code {
              display: flex;
@@ -529,18 +483,21 @@
              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 {
            display: flex;
            align-items: center;
@@ -549,18 +506,22 @@
      }
      .jobing {
        background: #effbf5;
        .status {
          color: #00ba67;
        }
      }
      .err {
        background: #fef6f6;
        .status {
          color: #ed4545;
        }
      }
    }
    .empty_plat{
    .empty_plat {
      width: 100%;
      height: 170px;
      display: flex;
@@ -569,27 +530,33 @@
      align-items: center;
      font-size: 12px;
      color: #B2B2B2;
      img{
      img {
        width: 110px;
      }
    }
  }
  .emyty{
    .head{
      background: linear-gradient( 270deg, #FFFFFF 0%, #F7F7F7 100%) !important;
  .emyty {
    .head {
      background: linear-gradient(270deg, #FFFFFF 0%, #F7F7F7 100%) !important;
    }
    .status{
    .status {
      background: #CCCCCC !important;
    }
  }
}
.main_header {
  display: flex;
  position: relative;
  .platgroup_tabs {
    flex: 1;
    display: flex;
    border-bottom: 1px solid #dfe2e8;
    .tab {
      color: #666666;
      margin-right: 40px;
@@ -597,6 +564,7 @@
      padding-bottom: 18px;
      border-bottom: 2px solid #fff;
    }
    .active {
      font-weight: 500;
      font-size: 15px;
@@ -604,6 +572,7 @@
      border-bottom: 2px solid $primary-color;
    }
  }
  .ml20 {
    position: absolute;
    width: 120px;
@@ -612,6 +581,7 @@
    top: -4px;
  }
}
/*  */
.set_modal {
  .title {
@@ -619,9 +589,11 @@
    font-weight: 600;
    margin-bottom: 16px;
  }
  .list {
    display: flex;
    flex-wrap: wrap;
    .item {
      cursor: pointer;
      padding: 0 36px;
@@ -635,7 +607,8 @@
      margin-right: 13px;
      position: relative;
      overflow: hidden;
      .bg{
      .bg {
        position: absolute;
        right: -12px;
        bottom: -12px;
@@ -644,22 +617,25 @@
        background: $primaryColor;
        transform: rotate(45deg);
      }
      .scs{
      .scs {
        position: absolute;
        right: -1px;
        bottom: -1px;
        color: #fff;
        z-index: 99999;
        transform:scale(.8)
        transform: scale(.8)
      }
    }
    .active {
      background: rgba(39,155,170,0.06);
      background: rgba(39, 155, 170, 0.06);
      border: 1px solid $primaryColor;
      color: $primaryColor;
    }
  }
}
/*  */
/*  */
</style>
admin/src/views/statistics/platformRecord.vue
@@ -1,82 +1,45 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="月台名称"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="月台组"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="车前牌照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="车后牌照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业开始"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业结束"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业时长"
        min-width="100"
        show-overflow-tooltip
      /><el-table-column
        prop="name"
        label="运输单号/合同号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column prop="platformName" label="月台名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="platformGroupName" label="月台组" min-width="100" show-overflow-tooltip />
      <el-table-column prop="carCodeFront" label="车前牌照号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="carCodeBack" label="车后牌照号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="startDate" label="作业开始" min-width="100" show-overflow-tooltip />
      <el-table-column prop="doneDate" label="作业结束" min-width="100" show-overflow-tooltip />
      <el-table-column prop="workTime" label="作业时长" min-width="100" show-overflow-tooltip /><el-table-column prop="name"
        label="运输单号/合同号" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <span>{{ scope.row.billCode || scope.row.contractNum }}</span>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration);
import { platformJobPage, getPlatformGroupList } from '@/api'
export default {
  components: {
    Pagination,
    QueryForm
  },
  data () {
  data() {
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
@@ -84,18 +47,18 @@
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            filed: 'platformName',
            type: 'input',
            label: '月台名称'
          },
          {
            filed: 'bbb',
            filed: 'platformGroupId',
            type: 'select',
            label: '月台组',
            options: []
          },
          {
            filed: 'aaaa',
            filed: 'carCodeFront',
            type: 'input',
            label: '车牌号'
          },
@@ -109,22 +72,64 @@
      }
    }
  },
  created() {
    this.getList()
    this.getGroupList()
  },
  methods: {
    handleSub () {
    handleSub() {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!')
        }
      })
    },
    getList (page) { },
    clear () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    getGroupList() {
      getPlatformGroupList({queryData: 0,queryType: 0}).then(res => {
        this.queryFormConfig.formItems[1].options = res.map(i => {
          return {
            value: i.id,
            label: i.name
          }
        })
      })
    },
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      platformJobPage({
        model: {
          ...filters,
          queryStatus: '5,6,9,10',
          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
          item.workTime = dayjs.duration(item.workTime, 'seconds').format('H时m分s秒');
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
      this.pagination.page = 1
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style>
</style>
<style></style>
h5/pages/driver/reserved.vue
@@ -7,8 +7,8 @@
                    <text>*</text>
                    <text>入园原因</text>
                </view>
                <view class="value" @click="showReason = true">
                    <text class="mr6" :style="{ color: param.inReason ? '#000000' : '#999999' }">{{ param.inReason ? param.inReason : '请选择' }}</text>
                <view class="value" @click="reasonClick">
                    <text class="mr6" :class="{gray: param.id}" :style="{ color: param.inReason ? '#000000' : '#999999' }">{{ param.inReason ? param.inReason : '请选择' }}</text>
                    <u-icon name="arrow-right" color="#CCCCCC" size="16"></u-icon>
                </view>
            </view>
@@ -105,7 +105,8 @@
        </view>
        
        <!--  -->
        <u-picker :show="showReason" keyName="reason" :columns="reasonList" @confirm="reasonConfirm"></u-picker>
        <u-picker :show="showReason" keyName="reason" closeOnClickOverlay @close="showReason = false"
            @cancel="showReason = false" :columns="reasonList" @confirm="reasonConfirm"></u-picker>
        <u-datetime-picker
            :show="showDatetime"
            closeOnClickOverlay
@@ -149,6 +150,12 @@
        this.initData()
    },
    methods: {
        reasonClick() {
            if(this.param.id){
                return
            }
            this.showReason = true
        },
        onSubmit() {
            const param = { ...this.param }
            if (!param.arriveDate) return this.showToast('请选择到场时间')
@@ -297,6 +304,9 @@
            display: flex;
            align-items: center;
            justify-content: flex-end;
            .gray{
                color: #999999 !important;
            }
            .btns {
                display: flex;
                align-items: center;
h5/pages/staff/task/driver.vue
@@ -2,7 +2,7 @@
  <view class="main_app">
    <view class="status_wrap">
      <view class="name">{{info.driverName}}的入园预约</view>
      <view class="desc">{{info.carCodeFront}}</view>
      <view class="gray">{{info.carCodeFront}}</view>
            <view class="desc" :class="{
                gray: info.businessStatus == '2' || info.businessStatus == '3' || info.businessStatus == '4',
              }">{{ infoStatus }}</view>
@@ -425,14 +425,15 @@
      margin-bottom: 20rpx;
      color: #222222;
    }
    .desc {
      font-size: 26rpx;
      color: #999999;
      color: #ed4545;
            margin-bottom: 12rpx;
    }
        .gray {
            color: #999999;
            margin-bottom: 12rpx;
        }
    .status {
pda/pages/index/center.vue
@@ -1,858 +1,851 @@
<template>
  <view class="main_app">
    <view class="main_content">
      <view class="title" @click="showPlatformgroup = true"
        >{{ activePlatformGroup.name
        }}<u-icon
          name="arrow-down"
          size="20"
          class="ml12"
          color="#999999"
        ></u-icon
      ></view>
      <view class="platform_list">
        <view
          class="item"
          :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>{{ platformTaskInfo.workNum }}</text></view
        >
        <view class="status"
          >已叫:<text>{{ platformTaskInfo.callNum }}</text></view
        >
        <view class="status"
          >等待:<text>{{ platformTaskInfo.waitNum }}</text></view
        >
        <view class="status"
          >异常:<text>{{ platformTaskInfo.exceptionNum }}</text></view
        >
      </view>
    </view>
    <!--  -->
    <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="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 v-if="!platformTaskInfo.platformJobList || platformTaskInfo.platformJobList.length == 0" class="empty_wrap">
        <image src="@/static/default_nodata@2x.png" />
        <text>暂无作业车辆</text>
      </view>
    </view>
    <!--  -->
    <view class="main_footer">
      <view class="btn" @click="PlatformCallClick(1)">入园叫号</view>
      <view class="btn active" @click="PlatformCallClick(2)">月台叫号</view>
    </view>
    <!-- 叫号 -->
    <u-popup
      :show="showPlatformCall"
      closeable
      safeAreaInsetTop
      round="10"
      @close="showPlatformCall = false"
    >
      <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" @scrolltolower="callScrolltolower" class="scroll_view">
            <view
              class="platform_ing"
              v-for="item in platformCallList"
              :key="item.id"
            >
              <view class="head">
                <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" :class="{ scs: item.status == 4 }">{{
                  statusMap[item.status]
                }}</view>
              </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 class="btn active" @click="handleCall(item)">叫号</view>
              </view>
            </view>
          </scroll-view>
        </view>
      </view>
    </u-popup>
    <!-- 运单详情 -->
    <u-popup
      :show="showDetail"
      closeable
      safeAreaInsetTop
      round="10"
      @close="showDetail = false"
    >
      <view
        class="PlatformCallModal"
        :style="{ height: 'calc(100vh - ' + windowTop + 'px)' }"
      >
        <view class="title">运单详情</view>
        <view class="platform_ing" style="padding: 0">
          <view class="head">
            <view class="code">
              <text>皖</text>
              <text>AD1212</text>
            </view>
          </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="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>
        <view class="detail_list">
          <view class="item">
            <view class="orderId">合同编号:{{ 111 }}</view>
            <view class="addr">收货地:{{ 111 }}</view>
            <view class="content">
              <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>
      </view>
    </u-popup>
    <!-- 转移月台 -->
    <u-popup
      :show="showTransform"
      closeable
      safeAreaInsetTop
      round="10"
      @close="showTransform = false"
    >
      <view class="TransformModal">
        <view class="title">转移月台</view>
        <view class="transform_list">
          <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="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, // 转移
      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分s秒')
            } else {
              item.callDateTemp = dayjs.duration(timeNum).format('m分s秒')
            }
          }
          if (item.startDate) {
            let timeNum = time.getTime() - new Date(item.startDate).getTime()
            if (timeNum > 3600000) {
              item.startDateTemp = dayjs.duration(timeNum).format('H小时m分ss秒')
            } else {
              item.startDateTemp = dayjs.duration(timeNum).format('m分s秒')
            }
          }
        })
        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
    },
    handleFinish(item) {
      finishWork({ jobId: item.id }).then(res => {
        this.showToast('完成作业')
        this.getPlatformTask()
      })
    },
    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>
<style lang="scss">
.main_app {
  padding: 0rpx;
  height: calc(100vh - 44px);
  font-size: 30rpx;
  color: #333333;
  background: url("@/static/bg_yuetai@2x.png") no-repeat;
  background-size: 100% 100%;
  .main_content {
    background-color: #fff;
    padding: 30rpx;
    .platform_list {
      display: flex;
      flex-wrap: wrap;
      .item {
        width: 210rpx;
        height: 80rpx;
        line-height: 80rpx;
        text-align: center;
        background: #ffffff;
        border-radius: 8rpx;
        border: 1rpx solid #999999;
        font-size: 30rpx;
        color: #222222;
        margin-bottom: 20rpx;
        margin-right: 30rpx;
        &:nth-of-type(3n) {
          margin-right: 0;
        }
      }
      .active {
        color: #fff;
        background-color: $uni-color-primary;
        border-color: $uni-color-primary;
      }
    }
    .status_wrap {
      display: flex;
      align-items: center;
      justify-content: space-evenly;
      width: 690rpx;
      height: 76rpx;
      margin-top: 4rpx;
      background: #ffffff;
      box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.18);
      border-radius: 8rpx;
      .status {
        color: #666666;
        text {
          color: #111111;
        }
        &:nth-last-child(1) {
          text {
            color: #ed4545;
          }
        }
      }
    }
    .title {
      font-weight: 500;
      font-size: 32rpx;
      color: #111111;
      line-height: 44rpx;
      margin-bottom: 30rpx;
      display: flex;
      justify-content: center;
    }
  }
  .platform_ing {
    margin-top: 20rpx;
    padding: 30rpx;
    background-color: #fff;
    .head {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 30rpx;
      .code {
        display: flex;
        font-weight: 600;
        height: 60rpx;
        line-height: 60rpx;
        font-size: 32rpx;
        color: #111111;
        border-radius: 8rpx;
        border: 1rpx solid #dfdede;
        text {
          &: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 {
      display: flex;
      margin-bottom: 20rpx;
      .label {
        width: 144rpx;
        color: #666666;
      }
      .value {
        flex: 1;
      }
    }
    .btns {
      display: flex;
      justify-content: flex-end;
      .btn {
        width: 210rpx;
        height: 76rpx;
        line-height: 76rpx;
        text-align: center;
        background: #ffffff;
        border-radius: 40rpx;
        border: 1rpx solid #999999;
        margin-left: 20rpx;
      }
      .active {
        background-color: $uni-color-primary;
        color: #fff;
        border-color: $uni-color-primary;
      }
    }
  }
  .empty {
    width: 220rpx;
    margin: 160rpx auto;
  }
  .main_footer {
    width: 750rpx;
    height: 136rpx;
    position: fixed;
    bottom: 0;
    left: 0;
    padding: 24rpx 30rpx;
    display: flex;
    justify-content: space-between;
    font-size: 32rpx;
    background-color: #fff;
    .btn {
      width: 224rpx;
      height: 88rpx;
      line-height: 88rpx;
      text-align: center;
      background: #ffffff;
      border-radius: 44rpx;
      color: $uni-color-primary;
      border: 1rpx solid $uni-color-primary;
    }
    .active {
      width: 436rpx;
      background-color: $uni-color-primary;
      color: #fff;
      border-color: $uni-color-primary;
    }
  }
}
.PlatformCallModal {
  height: calc(100vh - 44px);
  padding: 30rpx;
  .title {
    text-align: center;
    margin: 0 0 30rpx;
  }
  .input_wrap {
    display: flex;
    align-items: center;
    width: 690rpx;
    height: 76rpx;
    background: #f7f7f7;
    border-radius: 38rpx;
    padding: 0 30rpx;
  }
  .order_list {
    height: calc(100% - 140rpx);
    .scroll_view {
      height: 100%;
    }
    .platform_ing {
      border-radius: 8rpx;
      border: 1rpx solid #dfe2e8;
    }
  }
  .detail_list {
    border-top: 1rpx solid #e5e5e5;
    padding: 30rpx 0;
    .orderId {
      font-size: 30rpx;
      color: $uni-color-primary;
      margin-bottom: 14rpx;
    }
    .addr {
      font-size: 26rpx;
      color: #666666;
      margin-bottom: 20rpx;
    }
    .content {
      width: 100%;
      padding: 20rpx;
      background: #f7f7f7;
      border-radius: 8rpx;
      .line {
        display: flex;
        margin-bottom: 20rpx;
        &:nth-of-type(2n) {
          padding-bottom: 20rpx;
          border-bottom: 1rpx solid #e5e5e5;
        }
        &:last-child {
          padding-bottom: 0rpx;
          border-bottom: none;
        }
        .label {
          font-size: 28rpx;
          color: #666666;
          width: 88rpx;
        }
        .value {
          font-size: 28rpx;
          color: #222222;
        }
      }
    }
  }
  .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: 660rpx;
    margin-bottom: 30rpx;
    overflow: auto;
    .line {
      display: flex;
      align-items: center;
      border-bottom: 1rpx solid #e5e5e5;
      padding-bottom: 30rpx;
      margin-bottom: 30rpx;
      .name {
        font-size: 32rpx;
        color: #111111;
      }
      .status {
        flex: 1;
        font-size: 28rpx;
        color: $uni-color-primary;
        margin-left: 12rpx;
      }
      .green {
        color: #00ba67;
      }
      .checked {
        width: 40rpx;
        height: 40rpx;
      }
    }
  }
}
<template>
    <view class="main_app">
        <view class="main_content">
            <view class="title" @click="showPlatformgroup = true">{{ activePlatformGroup.name
        }}<u-icon name="arrow-down" size="20" class="ml12" color="#999999"></u-icon></view>
            <view class="platform_list">
                <view class="item" :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>{{ platformTaskInfo.workNum }}</text></view>
                <view class="status">已叫:<text>{{ platformTaskInfo.callNum }}</text></view>
                <view class="status">等待:<text>{{ platformTaskInfo.waitNum }}</text></view>
                <view class="status">异常:<text>{{ platformTaskInfo.exceptionNum }}</text></view>
            </view>
        </view>
        <!--  -->
        <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="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 v-if="!platformTaskInfo.platformJobList || platformTaskInfo.platformJobList.length == 0" class="empty_wrap">
                <image src="@/static/default_nodata@2x.png" />
                <text>暂无作业车辆</text>
            </view>
        </view>
        <!--  -->
        <view class="main_footer">
            <view class="btn" @click="PlatformCallClick(1)">入园叫号</view>
            <view class="btn active" @click="PlatformCallClick(2)">月台叫号</view>
        </view>
        <!-- 叫号 -->
        <u-popup :show="showPlatformCall" closeable safeAreaInsetTop round="10" @close="showPlatformCall = false">
            <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" @scrolltolower="callScrolltolower" class="scroll_view">
                        <view class="platform_ing" v-for="item in platformCallList" :key="item.id">
                            <view class="head">
                                <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" :class="{ scs: item.status == 4 }">{{
                  statusMap[item.status]
                }}</view>
                            </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 class="btn active" @click="handleCall(item)">叫号</view>
                            </view>
                        </view>
                    </scroll-view>
                </view>
            </view>
        </u-popup>
        <!-- 运单详情 -->
        <u-popup :show="showDetail" closeable safeAreaInsetTop round="10" @close="showDetail = false">
            <view class="PlatformCallModal" :style="{ height: 'calc(100vh - ' + windowTop + 'px)' }">
                <view class="title">运单详情</view>
                <view class="platform_ing" style="padding: 0">
                    <view class="head">
                        <view class="code">
                            <text>皖</text>
                            <text>AD1212</text>
                        </view>
                    </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="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>
                <view class="detail_list">
                    <view class="item">
                        <view class="orderId">合同编号:{{ 111 }}</view>
                        <view class="addr">收货地:{{ 111 }}</view>
                        <view class="content">
                            <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>
            </view>
        </u-popup>
        <!-- 转移月台 -->
        <u-popup :show="showTransform" closeable safeAreaInsetTop round="10" @close="showTransform = false">
            <view class="TransformModal">
                <view class="title">转移月台</view>
                <view class="transform_list">
                    <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="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, // 转移
                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分s秒')
                            } else {
                                item.callDateTemp = dayjs.duration(timeNum).format('m分s秒')
                            }
                        }
                        if (item.startDate) {
                            let timeNum = time.getTime() - new Date(item.startDate).getTime()
                            if (timeNum > 3600000) {
                                item.startDateTemp = dayjs.duration(timeNum).format('H小时m分ss秒')
                            } else {
                                item.startDateTemp = dayjs.duration(timeNum).format('m分s秒')
                            }
                        }
                    })
                    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
            },
            handleFinish(item) {
                finishWork({
                    jobId: item.id
                }).then(res => {
                    this.showToast('完成作业')
                    this.getPlatformTask()
                })
            },
            handleWork(item) { // 开始作业
                beginWork({
                    jobId: item.id
                }).then(res => {
                    this.showToast('已开始作业')
                    this.getPlatformTask()
                })
            },
            handlePass(item) {
                uni.showModal({
                    content: `确认 ${item.carCodeFront}置为过号吗?过号后,需要重新签到才能进入园区`,
                    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>
<style lang="scss">
    .main_app {
        padding: 0rpx;
        height: calc(100vh - 44px);
        font-size: 30rpx;
        color: #333333;
        background: url("@/static/bg_yuetai@2x.png") no-repeat;
        background-size: 100% 100%;
        .main_content {
            background-color: #fff;
            padding: 30rpx;
            .platform_list {
                display: flex;
                flex-wrap: wrap;
                .item {
                    width: 210rpx;
                    height: 80rpx;
                    line-height: 80rpx;
                    text-align: center;
                    background: #ffffff;
                    border-radius: 8rpx;
                    border: 1rpx solid #999999;
                    font-size: 30rpx;
                    color: #222222;
                    margin-bottom: 20rpx;
                    margin-right: 30rpx;
                    &:nth-of-type(3n) {
                        margin-right: 0;
                    }
                }
                .active {
                    color: #fff;
                    background-color: $uni-color-primary;
                    border-color: $uni-color-primary;
                }
            }
            .status_wrap {
                display: flex;
                align-items: center;
                justify-content: space-evenly;
                width: 690rpx;
                height: 76rpx;
                margin-top: 4rpx;
                background: #ffffff;
                box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.18);
                border-radius: 8rpx;
                .status {
                    color: #666666;
                    text {
                        color: #111111;
                    }
                    &:nth-last-child(1) {
                        text {
                            color: #ed4545;
                        }
                    }
                }
            }
            .title {
                font-weight: 500;
                font-size: 32rpx;
                color: #111111;
                line-height: 44rpx;
                margin-bottom: 30rpx;
                display: flex;
                justify-content: center;
            }
        }
        .platform_ing {
            margin-top: 20rpx;
            padding: 30rpx;
            background-color: #fff;
            .head {
                display: flex;
                justify-content: space-between;
                align-items: center;
                margin-bottom: 30rpx;
                .code {
                    display: flex;
                    font-weight: 600;
                    height: 60rpx;
                    line-height: 60rpx;
                    font-size: 32rpx;
                    color: #111111;
                    border-radius: 8rpx;
                    border: 1rpx solid #dfdede;
                    text {
                        &: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 {
                display: flex;
                margin-bottom: 20rpx;
                .label {
                    width: 144rpx;
                    color: #666666;
                }
                .value {
                    flex: 1;
                }
            }
            .btns {
                display: flex;
                justify-content: flex-end;
                .btn {
                    width: 210rpx;
                    height: 76rpx;
                    line-height: 76rpx;
                    text-align: center;
                    background: #ffffff;
                    border-radius: 40rpx;
                    border: 1rpx solid #999999;
                    margin-left: 20rpx;
                }
                .active {
                    background-color: $uni-color-primary;
                    color: #fff;
                    border-color: $uni-color-primary;
                }
            }
        }
        .empty {
            width: 220rpx;
            margin: 160rpx auto;
        }
        .main_footer {
            width: 750rpx;
            height: 136rpx;
            position: fixed;
            bottom: 0;
            left: 0;
            padding: 24rpx 30rpx;
            display: flex;
            justify-content: space-between;
            font-size: 32rpx;
            background-color: #fff;
            .btn {
                width: 224rpx;
                height: 88rpx;
                line-height: 88rpx;
                text-align: center;
                background: #ffffff;
                border-radius: 44rpx;
                color: $uni-color-primary;
                border: 1rpx solid $uni-color-primary;
            }
            .active {
                width: 436rpx;
                background-color: $uni-color-primary;
                color: #fff;
                border-color: $uni-color-primary;
            }
        }
    }
    .PlatformCallModal {
        height: calc(100vh - 44px);
        padding: 30rpx;
        .title {
            text-align: center;
            margin: 0 0 30rpx;
        }
        .input_wrap {
            display: flex;
            align-items: center;
            width: 690rpx;
            height: 76rpx;
            background: #f7f7f7;
            border-radius: 38rpx;
            padding: 0 30rpx;
        }
        .order_list {
            height: calc(100% - 140rpx);
            .scroll_view {
                height: 100%;
            }
            .platform_ing {
                border-radius: 8rpx;
                border: 1rpx solid #dfe2e8;
            }
        }
        .detail_list {
            border-top: 1rpx solid #e5e5e5;
            padding: 30rpx 0;
            .orderId {
                font-size: 30rpx;
                color: $uni-color-primary;
                margin-bottom: 14rpx;
            }
            .addr {
                font-size: 26rpx;
                color: #666666;
                margin-bottom: 20rpx;
            }
            .content {
                width: 100%;
                padding: 20rpx;
                background: #f7f7f7;
                border-radius: 8rpx;
                .line {
                    display: flex;
                    margin-bottom: 20rpx;
                    &:nth-of-type(2n) {
                        padding-bottom: 20rpx;
                        border-bottom: 1rpx solid #e5e5e5;
                    }
                    &:last-child {
                        padding-bottom: 0rpx;
                        border-bottom: none;
                    }
                    .label {
                        font-size: 28rpx;
                        color: #666666;
                        width: 88rpx;
                    }
                    .value {
                        font-size: 28rpx;
                        color: #222222;
                    }
                }
            }
        }
        .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: 660rpx;
            margin-bottom: 30rpx;
            overflow: auto;
            .line {
                display: flex;
                align-items: center;
                border-bottom: 1rpx solid #e5e5e5;
                padding-bottom: 30rpx;
                margin-bottom: 30rpx;
                .name {
                    font-size: 32rpx;
                    color: #111111;
                }
                .status {
                    flex: 1;
                    font-size: 28rpx;
                    color: $uni-color-primary;
                    margin-left: 12rpx;
                }
                .green {
                    color: #00ba67;
                }
                .checked {
                    width: 40rpx;
                    height: 40rpx;
                }
            }
        }
    }
</style>
pda/pages/index/queueup.vue
@@ -21,7 +21,7 @@
        />
      </view>
      <view class="count"
        >已签到车辆:<text>{{ total }}</text></view
        >总排队车辆:<text>{{ total }}</text></view
      >
    </view>
    <!--  -->
@@ -139,6 +139,7 @@
    platConfirm(e) {
      const index = e.indexs[0]
      this.platformGroup = this.platformGroupList[index]
            this.platformLineUpList = []
      this.getList()
      this.showPlatformgroup = false
    },
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkInterfaceTestCloudController.java
@@ -35,11 +35,10 @@
 * @author 江蹄蹄
 * @date 2023/11/30 15:33
 */
@Api(tags = "海康数据同步接口")
@Api(tags = "海康接口测试工具接口")
@RestController
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/hktest")
public class HkInterfaceTestCloudController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
@@ -67,32 +66,32 @@
        return ApiResponse.success(  HKService.wxAccessToken(configId,tageId));
    }
    @ApiOperation("【海康】测试分页获取告警事件")
    @GetMapping("/nhEventPageList")
    @PostMapping("/nhEventPageList")
    @LoginNoRequired
    public ApiResponse<BaseResponse> nhEventPageList(@RequestBody NhEventPageListRequest param, HttpServletResponse response) {
        return ApiResponse.success(  HKService.nhEventPageList(param));
    }
    @ApiOperation("【海康】分页查询消防传感器部件状态")
    @GetMapping("/sensorStatusSearch")
    @PostMapping("/sensorStatusSearch")
    @LoginNoRequired
    public ApiResponse<BaseResponse> sensorStatusSearch(@RequestBody SensorStatusListRequest param, HttpServletResponse response) {
        return ApiResponse.success(  HKService.sensorStatusSearch(param));
    }
    @ApiOperation("【海康】查询消防传感器列表")
    @GetMapping("/fireChannelSearch")
    @PostMapping("/fireChannelSearch")
    @LoginNoRequired
    public ApiResponse<BaseResponse> fireChannelSearch(@RequestBody FireChannelListRequest param, HttpServletResponse response) {
        return ApiResponse.success(  HKService.fireChannelSearch(param));
    }
    @ApiOperation("【海康】海康询消防设备列表")
    @GetMapping("/fireDeviceSearch")
    @PostMapping("/fireDeviceSearch")
    @LoginNoRequired
    public ApiResponse<BaseResponse> fireDeviceSearch(@RequestBody FireDeviceListRequest param, HttpServletResponse response) {
        return ApiResponse.success(  HKService.fireDeviceSearch(param));
    }
    @ApiOperation("【海康】分页查询消防设备部件状态")
    @GetMapping("/fireDeviceStatusSearch")
    @PostMapping("/fireDeviceStatusSearch")
    @LoginNoRequired
    public ApiResponse<BaseResponse> fireDeviceStatusSearch(@RequestBody FireDeviceStatuslListRequest param, HttpServletResponse response) {
        return ApiResponse.success(  HKService.fireDeviceStatusSearch(param));
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -593,24 +593,24 @@
     * @param body
     * @return
     */
    public static String fireDeviceStatusSearch(Map<String,String> body) {
        return startDoGetStringArtemis(HKConstants.InterfacePath.fireDeviceStatusSearch,body);
    public static String fireDeviceStatusSearch(String body) {
        return startDoPostStringArtemis(HKConstants.InterfacePath.fireDeviceStatusSearch,body);
    }
    /**
     *    分页查询消防传感器部件状态
     * @param body
     * @return
     */
    public static String sensorStatusSearch(Map<String,String> body) {
        return startDoGetStringArtemis(HKConstants.InterfacePath.sensorStatusSearch,body);
    public static String sensorStatusSearch(String body) {
        return startDoPostStringArtemis(HKConstants.InterfacePath.sensorStatusSearch,body);
    }
    /**
     *    询消防设备列表
     * @param body
     * @return
     */
    public static String fireChannelSearch(Map<String,String> body) {
        return startDoGetStringArtemis(HKConstants.InterfacePath.fireChannelSearch,body);
    public static String fireChannelSearch(String body) {
        return startDoPostStringArtemis(HKConstants.InterfacePath.fireChannelSearch,body);
    }
    /**
@@ -618,8 +618,8 @@
     * @param body
     * @return
     */
    public static String fireDeviceSearch(Map<String,String> body) {
        return startDoGetStringArtemis(HKConstants.InterfacePath.fireDeviceSearch,body);
    public static String fireDeviceSearch(String body) {
        return startDoPostStringArtemis(HKConstants.InterfacePath.fireDeviceSearch,body);
    }
    /**
     *    获取全量用户列表
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseListPageResponse.java
@@ -13,6 +13,6 @@
  private int pageNo    ;// number    False    当前页码
  private int totalPage;//    number    False    总页数
  @JSONField(name="list",alternateNames = {"rows","records"})
  @JSONField(name="list",alternateNames = {"rows","list"})
  private List<T> list    ;// object[]    False    权限组对象列表
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/FireDeviceStatusListResponse.java
@@ -4,21 +4,16 @@
@Data
public class FireDeviceStatusListResponse {
      private String id    ;//String    false    预告警事件唯一标识
      private String warningName    ;//String    false    预告警名称
      private String nodeType    ;//Number    false    节点类型
      private String nodeId    ;//String    false    节点ID
      private String nodeName;//    String    false    节点名称
      private String nodePath;//    String    false    节点路径
      private String ruleType    ;//String    false    预告警类型
      private String warningLevel    ;//Number    false    预告警等级,1:一般,2:严重,3:故障
      private String warningValue    ;//String    false    数据项当前值
      private String warningEventTip;//    String    false    异常原因
      private String createTime;//    String    false    发生时间
      private String benchmark;//    String    false    基准数据
      private String handleStatus;//    Number    false    处理状态:1:未处理,2:已处理
      private String note;//    String    false    处理意见
      private String handleTime;//    String    false    处理时间
      private String normal;//    Boolean    false    预告警是否正常
      private String deviceId;//    String    false    设备id
        private String cn    ;//String    false
        private String regionIndexCode    ;//String    false
        private String indexCode;//    String    false
        private String regionName;//    String    false
        private String deviceIndexCode;//    String    false
        private String deviceType;//    Number    false
        private String unitStatus    ;//Number    false
        private String online;//    Number    false
        private String collectTime;//    String    false
        private String faultType;//    String    false
        private String faultName;//    String    false
        private String faultNum;//    String    false
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -926,7 +926,7 @@
    public  static  BaseResponse<BaseListPageResponse<FireDeviceStatusListResponse>>   fireDeviceStatusSearch(FireDeviceStatuslListRequest param){
        log.info("【海康查询消防设备部件状态】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.fireDeviceStatusSearch(toMap(param));
            String res = HKTools.fireDeviceStatusSearch(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<FireDeviceStatusListResponse>>>(){};
            BaseResponse<BaseListPageResponse<FireDeviceStatusListResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
@@ -944,7 +944,7 @@
    public  static  BaseResponse<BaseListPageResponse<SensorStatusListResponse>>   sensorStatusSearch(SensorStatusListRequest param){
        log.info("【海康分页查询消防传感器部件状态】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.sensorStatusSearch(toMap(param));
            String res = HKTools.sensorStatusSearch(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<SensorStatusListResponse>>>(){};
            BaseResponse<BaseListPageResponse<SensorStatusListResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
@@ -963,7 +963,7 @@
    public  static  BaseResponse<BaseListPageResponse<FireChannelListResponse>>   fireChannelSearch(FireChannelListRequest param){
        log.info("【海康查询消防传感器列表】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.fireChannelSearch(toMap(param));
            String res = HKTools.fireChannelSearch(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<FireChannelListResponse>>>(){};
            BaseResponse<BaseListPageResponse<FireChannelListResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
@@ -981,7 +981,7 @@
    public  static  BaseResponse<BaseListPageResponse<FireDeviceListResponse>>   fireDeviceSearch(FireDeviceListRequest param){
        log.info("【海康询消防设备列表】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.fireDeviceSearch(toMap(param));
            String res = HKTools.fireDeviceSearch(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<FireDeviceListResponse>>>(){};
            BaseResponse<BaseListPageResponse<FireDeviceListResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
@@ -1338,7 +1338,6 @@
            log.error("【海康获取全部月台信息】================失败====:\n" + e.getMessage());
        }
        return null;
    }
    /**
     *发送消息给LED
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -1027,7 +1027,6 @@
     */
    private void dealCarsInErrorPlatformBiz( PlatformJob model,EventPlatformCarsStatusInfoRequest status) {
        //TODO-----------------处理车辆进入错误月台业务逻辑
        List<PlatformDevice> deviceList = platformDeviceMapper.selectList(new QueryWrapper<PlatformDevice>().lambda()
                .eq(PlatformDevice::getPlatformId,model.getPlatformId())
                .eq(PlatformDevice::getIsdeleted,Constants.ZERO));
@@ -1041,7 +1040,6 @@
                continue;
            }
            if(Constants.equalsInteger(device.getType(),Constants.ZERO)){
                //如果是LED
                TransparentChannelBodyRequest body = new TransparentChannelBodyRequest();
                TransparentChannelHeadRequest head = new TransparentChannelHeadRequest();
@@ -1053,16 +1051,21 @@
                body.setMethod("ControlLedGereral");//固定值
                request.setIndexCode(device.getHkId());
                request.setOperationType(219);//固定值
                regions.setActionType(0);
                regions.setActionType(32);
                regions.setContent(content);
                regions.setRegionNo(1);
                regions.setRegionType(14);
                regions.setFontColor(2);
                regions.setFontColor(1);
                regions.setCircleTimes(1);//循环次数
                regions.setFontSize(31);//
                regions.setFontSize(32);//
                regions.setStayTime(1);//单位??
                regions.setRegionLeftTopXPos(0);
                regions.setRegionLeftTopYPos(0);
                regions.setRegionRightBottomXPos(255);
                regions.setRegionRightBottomYPos(31);
                request.setRegions(new ArrayList<>());
                request.getRegions().add(regions);
                regions.setSpeed(13);
                body.setParams(request);
                HKService.transparentchannel(head,body);
            }else  if(Constants.equalsInteger(device.getType(),Constants.ZERO)){
@@ -1073,9 +1076,9 @@
        if(broadcastList.size()>0){
            CustomBroadcastRequest request = new CustomBroadcastRequest();
            request.setAudioPointIndexCode(broadcastList);
            request.setPlayDuration(60);//单位秒
            request.setPlayDuration(15);//单位秒
            request.setBroadCastMode("tts");
            request.setPriority(15);
            request.setPriority(1);
            request.setState(1);//播放/停止标识 1-播放,0-停止
            request.setPlayTtsContent(content);
            HKService.customBroadcast(request);