jiangping
2024-08-14 7755e9ba6ca8ce58cc0a58578ddc1d965aba380a
最新版本
已添加3个文件
已修改21个文件
1021 ■■■■ 文件已修改
admin/src/api/platform/platformGroup.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaPlatformWindow.vue 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/utils/form.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/device.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceBroadcast.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceLed.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/platform.vue 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformGroupCloudController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/LedRecordsRequest.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/LedRecordsInfoResponse.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/PlatformStatusInfoResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java 321 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPlatformsServiceImpl.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/platform/platformGroup.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/platformGroup/page', data, {
    trim: true
  })
}
export function allList (data) {
  return request.post('/visitsAdmin/cloudService/business/platformGroup/list', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/platformGroup/exportExcel', data, {
    trim: true,
    download: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/platformGroup/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/platformGroup/updateById', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/platformGroup/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/visitsAdmin/cloudService/business/platformGroup/delete/batch', {
    params: {
      ids
    }
  })
}
admin/src/components/business/OperaPlatformWindow.vue
@@ -1,88 +1,60 @@
<template>
  <GlobalWindow
    :title="title"
    width="50%"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="form.creator" placeholder="请输入创建人编码" v-trim/>
      <el-form-item label="月台名称:"  >
       <span>{{form.name}}</span>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间"></el-date-picker>
      <el-form-item label="月台编码:" prop="code">
        <el-input v-model="form.code" placeholder="请输入月台编码" v-trim/>
       <span class="tip-warn"><i class="el-icon-warning"></i>说明:对应WMS系统中的编码</span>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="form.editor" placeholder="请输入更新人编码" v-trim/>
      <el-form-item label="所属月台分组:" prop="groupId">
        <el-select v-model="form.groupId"  >
          <el-option
              v-for="item in groupList"
              :key="item.id"
              :label="item.name"
              :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间"></el-date-picker>
      <el-form-item label="广播设备:" prop="broadcastIds">
        <el-select v-model="form.broadcastIds" multiple >
          <el-option
              v-for="item in broadcastList"
              :key="item.id"
              :label="item.name"
              :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="form.isdeleted" placeholder="请输入是否删除0否 1是" v-trim/>
      <el-form-item label="LED设备:" prop="ledIds">
        <el-select v-model="form.ledIds" multiple >
          <el-option
              v-for="item in ledList"
              :key="item.id"
              :label="item.name"
              :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入名称" v-trim/>
      <el-form-item label="同时作业数量:" prop="workingNum" >
        <el-input type="number" v-model="form.workingNum" placeholder="请输入同时作业数量" v-trim/>
      </el-form-item>
      <el-form-item label="备注" prop="remark">
        <el-input v-model="form.remark" placeholder="请输入备注" v-trim/>
      <el-form-item label="月台作业效率(万只/小时):" prop="workRate">
        <el-input type="number"  v-model="form.workRate" placeholder="请输入月台作业效率(万只/小时)" v-trim/>
      </el-form-item>
      <el-form-item label="状态 0启用 1禁用" prop="status">
        <el-input v-model="form.status" placeholder="请输入状态 0启用 1禁用" v-trim/>
      <el-form-item label="作业超时报警时间(分钟):" prop="waitCallTime">
        <el-input type="number"  v-model="form.waitCallTime" placeholder="请输入作业超时报警时间(分钟)" v-trim/>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
      <el-form-item label="所属月台分钟编码(g关联platform_group)" prop="groupId">
        <el-input v-model="form.groupId" placeholder="请输入所属月台分钟编码(g关联platform_group)" v-trim/>
      </el-form-item>
      <el-form-item label="工作开始时间" prop="startTime">
        <el-input v-model="form.startTime" placeholder="请输入工作开始时间" v-trim/>
      </el-form-item>
      <el-form-item label="工作结束时间" prop="endTime">
        <el-input v-model="form.endTime" placeholder="请输入工作结束时间" v-trim/>
      </el-form-item>
      <el-form-item label="同时作业数量" prop="workingNum">
        <el-input v-model="form.workingNum" placeholder="请输入同时作业数量" v-trim/>
      </el-form-item>
      <el-form-item label="等待教好时间(秒)" prop="wariCallTime">
        <el-input v-model="form.wariCallTime" placeholder="请输入等待教好时间(秒)" v-trim/>
      </el-form-item>
      <el-form-item label="停留超时报警时间(秒)" prop="alermTime">
        <el-input v-model="form.alermTime" placeholder="请输入停留超时报警时间(秒)" v-trim/>
      </el-form-item>
      <el-form-item label="最后事件推送时间" prop="lastEventTime">
        <el-date-picker v-model="form.lastEventTime" value-format="yyyy-MM-dd" placeholder="请输入最后事件推送时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="监控点名称,多个用英文逗号隔开" prop="deviceNames">
        <el-input v-model="form.deviceNames" placeholder="请输入监控点名称,多个用英文逗号隔开" v-trim/>
      </el-form-item>
      <el-form-item label="月台屏幕名称,多个用英文逗号隔开" prop="screenName">
        <el-input v-model="form.screenName" placeholder="请输入月台屏幕名称,多个用英文逗号隔开" v-trim/>
      </el-form-item>
      <el-form-item label="海康标识" prop="hkId">
        <el-input v-model="form.hkId" placeholder="请输入海康标识" v-trim/>
      </el-form-item>
      <el-form-item label="关联承租公司" prop="companys">
        <el-input v-model="form.companys" placeholder="请输入关联承租公司" v-trim/>
      </el-form-item>
      <el-form-item label="X坐标" prop="xpos">
        <el-input v-model="form.xpos" placeholder="请输入X坐标" v-trim/>
      </el-form-item>
      <el-form-item label="Y坐标" prop="ypos">
        <el-input v-model="form.ypos" placeholder="请输入Y坐标" v-trim/>
      </el-form-item>
      <el-form-item label="宽度" prop="width">
        <el-input v-model="form.width" placeholder="请输入宽度" v-trim/>
      </el-form-item>
      <el-form-item label="高度" prop="height">
        <el-input v-model="form.height" placeholder="请输入高度" v-trim/>
      </el-form-item>
      <el-form-item label="角度" prop="angle">
        <el-input v-model="form.angle" placeholder="请输入角度" v-trim/>
      </el-form-item>
      <el-form-item label="海康标识同步时间" prop="hkData">
        <el-date-picker v-model="form.hkData" value-format="yyyy-MM-dd" placeholder="请输入海康标识同步时间"></el-date-picker>
      <el-form-item label="停留超时报警时间(分钟):" prop="alermTime">
        <el-input type="number"  v-model="form.alermTime" placeholder="请输入请输入停留超时报警时间(分钟)" v-trim/>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -91,6 +63,9 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { numRuleGtZero } from '@/utils/form'
import { allList } from '@/api/platform/platformGroup'
import { getList as deviceList } from '@/api/business/device'
export default {
  name: 'OperaPlatformWindow',
  extends: BaseOpera,
@@ -98,37 +73,25 @@
  data () {
    return {
      // è¡¨å•数据
      groupList: [],
      broadcastList: [],
      ledList: [],
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        ledIds: null,
        broadcastIds: null,
        name: '',
        remark: '',
        status: '',
        sortnum: '',
        groupId: '',
        startTime: '',
        endTime: '',
        workingNum: '',
        wariCallTime: '',
        alermTime: '',
        lastEventTime: '',
        deviceNames: '',
        screenName: '',
        hkId: '',
        companys: '',
        xpos: '',
        ypos: '',
        width: '',
        height: '',
        angle: '',
        hkData: ''
        workingNum: 1,
        workRate: '',
        waitCallTime: '',
        alermTime: ''
      },
      // éªŒè¯è§„则
      rules: {
        workingNum: [{ required: true, validator: numRuleGtZero, message: '请输入同时作业数量,必须大于0! ', trigger: 'blur' }]
      }
    }
  },
@@ -137,6 +100,60 @@
      api: '/platform/platform',
      'field.id': 'id'
    })
  },
  methods: {
    /**
     * æ‰“开窗口
     * @title çª—口标题
     * @target ç¼–辑的对象
     */
    open (title, target) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
          this.form.company = []
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.form.workingNum = this.form.workingNum || 1
      })
      this.loadGroupList()
      this.loadLedList()
      this.loadBroadcastList()
    },
    loadGroupList () {
      allList({})
        .then(res => {
          this.groupList = res || []
        })
    },
    loadLedList () {
      deviceList({ type: 2 })
        .then(res => {
          this.ledList = res || []
        })
    },
    loadBroadcastList () {
      deviceList({ type: 3 })
        .then(res => {
          this.broadcastList = res || []
        })
    }
  }
}
</script>
<style scoped>
.labelTip{
  font-size: 12px;
  color: #666666;
}
</style>
admin/src/utils/form.js
@@ -26,7 +26,15 @@
export function numRule (rule, value, callback) {
  // debugger
  if (value == null || value < 0 || !value) {
  if (value == null || !value || value < 0) {
    callback(new Error())
  } else {
    callback()
  }
}
export function numRuleGtZero (rule, value, callback) {
  // debugger
  if (value == null || !value || value <= 0) {
    callback(new Error())
  } else {
    callback()
admin/src/views/business/device.vue
@@ -80,7 +80,6 @@
import Pagination from '@/components/common/Pagination'
import OperaDeviceWindow from '@/components/business/OperaDeviceWindow'
import { syncDevices, updateEntranceById } from '@/api/business/device'
import { memberSync } from '@/api/business/member'
export default {
  name: 'Device',
  extends: BaseTable,
@@ -92,7 +91,8 @@
        doorName: '',
        regionPathName: '',
        isEntrance: '',
        online: ''
        online: '',
        type:0
      },
      options: []
    }
@@ -117,7 +117,7 @@
      this.$dialog.actionConfirm('操作确认提醒', '您确认同步全部信息吗?')
        .then(() => {
          this.isWorking.delete = true
          syncDevices({})
          syncDevices({type:0})
            .then(res => {
              this.$tip.apiSuccess(res || '同步成功')
              this.search()
admin/src/views/business/deviceBroadcast.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
<template>
    <TableLayout :permissions="['business:device:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="名称" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar">
                <li><el-button type="primary" @click="synchronousData">同步</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
            >
                <el-table-column prop="name" label="设备名称"></el-table-column>
                <el-table-column prop="doorName" label="门禁点名称"></el-table-column>
                <el-table-column prop="regionPathName" label="区域名称"></el-table-column>
                <el-table-column prop="doorNo" label="门禁点编号"></el-table-column>
                <el-table-column prop="manufature" label="厂商"></el-table-column>
                <el-table-column prop="online" label="在线状态">
                    <template slot-scope="{row}">
                        <span v-if="row.online == 0">离线</span>
                        <span v-if="row.online == 1">在线</span>
                    </template>
                </el-table-column>
                <el-table-column prop="ip" label="设备ip"></el-table-column>
                <el-table-column prop="port" label="设备端口"></el-table-column>
                <el-table-column label="是否园区入口">
                    <template slot-scope="{row}">
                        <el-switch
                            @change="changeManufature($event, row)"
                            v-model="row.isEntrance"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
                            :active-value="1"
                            :inactive-value="0">
                        </el-switch>
                    </template>
                </el-table-column>
                <el-table-column prop="no" label="设备号"></el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
        </template>
        <!-- æ–°å»º/修改 -->
<!--        <OperaDeviceWindow ref="operaDeviceWindow" @success="handlePageChange"/>-->
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDeviceWindow from '@/components/business/OperaDeviceWindow'
import { syncDevices, updateEntranceById } from '@/api/business/device'
export default {
  name: 'Device',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDeviceWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        doorName: '',
        regionPathName: '',
        isEntrance: '',
        online: '',
        type: 3
      },
      options: []
    }
  },
  created () {
    this.config({
      module: '设备信息表',
      api: '/business/device',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    changeManufature(e, row) {
      updateEntranceById({
        id: row.id,
        isEntrance: e
      })
    },
    synchronousData () {
      this.$dialog.actionConfirm('操作确认提醒', '您确认同步全部信息吗?')
        .then(() => {
          this.isWorking.delete = true
          syncDevices({type: 3})
            .then(res => {
              this.$tip.apiSuccess(res || '同步成功')
              this.search()
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking.delete = false
            })
        })
        .catch(() => {})
    }
  }
}
</script>
admin/src/views/business/deviceLed.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
<template>
    <TableLayout :permissions="['business:device:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="名称" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar">
                <li><el-button type="primary" @click="synchronousData">同步</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
            >
                <el-table-column prop="name" label="设备名称"></el-table-column>
                <el-table-column prop="doorName" label="门禁点名称"></el-table-column>
                <el-table-column prop="regionPathName" label="区域名称"></el-table-column>
                <el-table-column prop="doorNo" label="门禁点编号"></el-table-column>
                <el-table-column prop="manufature" label="厂商"></el-table-column>
                <el-table-column prop="online" label="在线状态">
                    <template slot-scope="{row}">
                        <span v-if="row.online == 0">离线</span>
                        <span v-if="row.online == 1">在线</span>
                    </template>
                </el-table-column>
                <el-table-column prop="ip" label="设备ip"></el-table-column>
                <el-table-column prop="port" label="设备端口"></el-table-column>
                <el-table-column label="是否园区入口">
                    <template slot-scope="{row}">
                        <el-switch
                            @change="changeManufature($event, row)"
                            v-model="row.isEntrance"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
                            :active-value="1"
                            :inactive-value="0">
                        </el-switch>
                    </template>
                </el-table-column>
                <el-table-column prop="no" label="设备号"></el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
        </template>
        <!-- æ–°å»º/修改 -->
<!--        <OperaDeviceWindow ref="operaDeviceWindow" @success="handlePageChange"/>-->
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDeviceWindow from '@/components/business/OperaDeviceWindow'
import { syncDevices, updateEntranceById } from '@/api/business/device'
export default {
  name: 'Device',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDeviceWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        doorName: '',
        regionPathName: '',
        isEntrance: '',
        online: '',
        type:2
      },
      options: []
    }
  },
  created () {
    this.config({
      module: '设备信息表',
      api: '/business/device',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    changeManufature(e, row) {
      updateEntranceById({
        id: row.id,
        isEntrance: e
      })
    },
    synchronousData () {
      this.$dialog.actionConfirm('操作确认提醒', '您确认同步全部信息吗?')
        .then(() => {
          this.isWorking.delete = true
          syncDevices({type:2})
            .then(res => {
              this.$tip.apiSuccess(res || '同步成功')
              this.search()
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking.delete = false
            })
        })
        .catch(() => {})
    }
  }
}
</script>
admin/src/views/platform/platform.vue
@@ -25,21 +25,28 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="月台名称" min-width="100px"></el-table-column>
        <el-table-column prop="hkId" label="月台编码" min-width="100px"></el-table-column>
        <el-table-column prop="groupName" label="所属月台组" min-width="100px"></el-table-column>
        <el-table-column prop="workingNum" label="同时叫号车辆数" min-width="100px"></el-table-column>
        <el-table-column prop="alermTime" label="停留超时报警时间(分钟)" min-width="100px">
          <template scope="{row}">{{row.alermTime?(row.alermTime/60):'-'}}</template>
        <el-table-column prop="name" label="月台名称" fixed min-width="100px"></el-table-column>
        <el-table-column prop="code" label="月台编码" fixed min-width="100px"></el-table-column>
        <el-table-column prop="groupName" label="所属月台组" fixed min-width="100px"></el-table-column>
        <el-table-column prop="workingNum" label="同时叫号车辆数" min-width="120px"></el-table-column>
        <el-table-column prop="alermTime" label="停留超时报警时间(分钟)" min-width="180px">
          <template scope="{row}">{{row.alermTime?(row.alermTime):'-'}}</template>
        </el-table-column>
        <el-table-column prop="waitCallTime" label="作业超时报警时间(分钟)" min-width="100px">
          <template scope="{row}"> {{row.waitCallTime?(row.alermTime/60):'-'}}</template>
        <el-table-column prop="waitCallTime" label="作业超时报警时间(分钟)" min-width="180px">
          <template scope="{row}"> {{row.waitCallTime?(row.alermTime):'-'}}</template>
        </el-table-column>
        <el-table-column prop="workRate" label="月台作业效率(万只/小时)" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px"></el-table-column>
        <el-table-column prop="broadcastName" label="关联广播" min-width="100px"></el-table-column>
        <el-table-column prop="ledName" label="关联LED" min-width="100px"></el-table-column>
        <el-table-column prop="hkDate" label="同步时间" min-width="100px"></el-table-column>
        <el-table-column prop="workRate" label="月台作业效率(万只/小时)" min-width="180px"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px">
          <template scope="{row}">
            <span v-if="row.status == 0">无车</span>
            <span v-if="row.status == 1">有车</span>
            <span v-if="row.status == 2">超时停靠</span>
            <span v-if="row.status == 3">错误停靠</span>
          </template>
        </el-table-column>
        <el-table-column prop="broadcastNames" label="关联广播" min-width="100px"></el-table-column>
        <el-table-column prop="ledNames" label="关联LED" min-width="100px"></el-table-column>
        <el-table-column prop="hkDate" label="同步时间" min-width="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:platform:update', 'business:platform:delete'])"
          label="操作"
@@ -70,8 +77,6 @@
import SearchFormCollapse from '@/components/common/SearchFormCollapse'
import Pagination from '@/components/common/Pagination'
import OperaPlatformWindow from '@/components/business/OperaPlatformWindow'
import { syncDevices, updateEntranceById } from '@/api/business/device'
import { syncPlatforms } from '@/api/platform/platform'
export default {
  name: 'Platform',
  extends: BaseTable,
@@ -96,12 +101,6 @@
    this.search()
  },
  methods: {
    changeManufature (e, row) {
      updateEntranceById({
        id: row.id,
        isEntrance: e
      })
    },
    syncData () {
      this.$dialog.actionConfirm('操作确认提醒', '您确认同步全部信息吗?')
        .then(() => {
@@ -124,7 +123,7 @@
      this.$dialog.actionConfirm('操作确认提醒', '您确认同步全部信息吗?')
        .then(() => {
          this.isWorking.working = true
          this.api.syncPlatforms({})
          this.api.syncPlatformStatus({})
            .then(res => {
              this.$tip.apiSuccess(res || '同步成功')
              this.search()
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java
@@ -8,6 +8,7 @@
import com.doumee.core.haikang.model.param.request.event.parks.EventPlatWorkstatusRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Device;
import com.doumee.service.business.impl.hksync.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -58,7 +59,7 @@
    @ApiOperation("【海康】全量同步门禁设备接口")
    @PostMapping("/syncDevices")
    @RequiresPermissions("business:hksync:device")
    public ApiResponse syncHkDevices(@RequestBody AcsDeviceListRequest param) {
    public ApiResponse syncHkDevices(@RequestBody Device param) {
        String result = hkSyncDeviceService.syncHkDevices(param);
        return ApiResponse.success(result);
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -9,6 +9,7 @@
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Device;
import com.doumee.service.business.impl.hksync.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -59,8 +60,17 @@
    @ApiOperation("【海康】全量同步门禁设备接口")
    @PostMapping("/syncDevices")
    @CloudRequiredPermission("business:hksync:device")
    public ApiResponse syncHkDevices(@RequestBody AcsDeviceListRequest param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        String result = hkSyncDeviceService.syncHkDevices(param);
    public ApiResponse syncHkDevices(@RequestBody Device param, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        String result = null;
        if(Constants.equalsInteger(param.getType(),Constants.ZERO)){
             result = hkSyncDeviceService.syncHkDevices(param);
        }else if(Constants.equalsInteger(param.getType(),Constants.TWO)){
            //同步LED
            result = hkSyncDeviceService.syncHkLed(param);
        }else if(Constants.equalsInteger(param.getType(),Constants.THREE)){
            //同步广播
            result = hkSyncDeviceService.syncHkBroadcast(param);
        }
        return ApiResponse.success(result);
    }
    @PreventRepeat
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformGroupCloudController.java
@@ -16,6 +16,8 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @since 2024/04/28 16:06
@@ -64,8 +66,16 @@
    @PostMapping("/page")
    @CloudRequiredPermission("business:platformgroup:query")
    public ApiResponse<PageData<PlatformGroup>> findPage (@RequestBody PageWrap<PlatformGroup> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        return ApiResponse.success(platformGroupService.findPage(pageWrap));
    }
    @ApiOperation("查询列表")
    @PostMapping("/list")
    @CloudRequiredPermission("business:platformgroup:query")
    public ApiResponse<List<PlatformGroup>> list (@RequestBody PlatformGroup pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        pageWrap.setIsdeleted(Constants.ZERO);
        return ApiResponse.success(platformGroupService.findList(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -10,6 +10,7 @@
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.tomcat.util.bcel.Const;
@@ -625,11 +626,14 @@
    }
    /**
     * èŽ·å–æœˆå°çŠ¶æ€
     * @param body
     * @return
     */
    public static String platformStatus(String param) {
        return startDoPostStringArtemis(HKConstants.InterfacePath.platformStatus+"?platformIds="+param,null);
        if(StringUtils.isNotBlank(param)){
            return startDoPostStringArtemis(HKConstants.InterfacePath.platformStatus+"?platformIds="+param,null);
        }else{
            return startDoPostStringArtemis(HKConstants.InterfacePath.platformStatus,null);
        }
    }
    /**
     * èŽ·å–æœˆå°ç»„ä»¶é…ç½®çš„LED设备清单
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/LedRecordsRequest.java
@@ -4,5 +4,6 @@
@Data
public class LedRecordsRequest {
    private Integer  pageNo        ;//String    true    åˆ†é¡µé¡µç 
    private Integer  pageSize        ;//String    true    åˆ†é¡µå¤§å°
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/LedRecordsInfoResponse.java
@@ -7,4 +7,5 @@
@Data
public class LedRecordsInfoResponse {
    private String indexCode;
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/PlatformStatusInfoResponse.java
@@ -8,7 +8,7 @@
public class PlatformStatusInfoResponse {
 private String  platformtId    ;//String    false    æœˆå°ID
 private String  platformId    ;//String    false    æœˆå°ID
 private String  cameraIndexcode    ;//String    false    æœˆå°å…³è”监控点
 private String  plateNo    ;//String    false    è½¦ç‰Œå·
 private String  name;//    String    false    æœˆå°åç§°
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -1097,13 +1097,13 @@
     *用于设置广播的自定播放和停止
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<LedRecordsInfoResponse>>   customBroadcast(CustomBroadcastRequest param){
    public  static  BaseResponse    customBroadcast(CustomBroadcastRequest param){
        log.info("【海康用于设置广播的自定播放和停止】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.customBroadcast(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<LedRecordsInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<LedRecordsInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
                    new TypeReference< BaseResponse>(){};
            BaseResponse    result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康用于设置广播的自定播放和停止");
            return  result;
        }catch (Exception e){
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Platform;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/06/28 10:03
 */
public interface PlatformMapper extends BaseMapper<Platform> {
public interface PlatformMapper extends MPJBaseMapper<Platform> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
@@ -71,8 +71,8 @@
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "类型 0门禁 1车库", example = "1")
    @ExcelColumn(name="类型 0门禁 1车库")
    @ApiModelProperty(value = "类型 0门禁 1车库 2LED 3广播", example = "1")
    @ExcelColumn(name="类型 0门禁 1车库 2LED 3广播")
    private Integer type;
    @ApiModelProperty(value = "是否园区出入口 0不是 1是", example = "1")
    @ExcelColumn(name="是否园区出入口 0不是 1是")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java
@@ -52,13 +52,16 @@
    @ApiModelProperty(value = "名称")
    @ExcelColumn(name="名称")
    private String name;
    @ApiModelProperty(value = "编码")
    @ExcelColumn(name="编码")
    private String code;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0启用 1禁用", example = "1")
    @ExcelColumn(name="状态 0启用 1禁用")
    @ApiModelProperty(value = "月台状态 0-无车 1-有车 2-超时停靠 3-错误停靠", example = "1")
    @ExcelColumn(name="月台状态 0-无车 1-有车 2-超时停靠 3-错误停靠")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
@@ -143,5 +146,20 @@
    @ApiModelProperty(value = "led名称", example = "1")
    @TableField(exist = false)
    private String ledName;
    @ApiModelProperty(value = "分组名称", example = "1")
    @TableField(exist = false)
    private String groupName;
    @ApiModelProperty(value = "关联LED编码集合,英文逗号隔开", example = "1")
    @TableField(exist = false)
    private String ledIds;
    @ApiModelProperty(value = "关联广播编码集合,英文逗号隔开", example = "1")
    @TableField(exist = false)
    private String broadcaseIds;
    @ApiModelProperty(value = "关联LED名称集合,英文逗号隔开", example = "1")
    @TableField(exist = false)
    private String ledNames;
    @ApiModelProperty(value = "关联广播编名称集合,英文逗号隔开", example = "1")
    @TableField(exist = false)
    private String broadcaseNames;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -7,6 +7,7 @@
import com.doumee.core.haikang.model.param.request.event.parks.EventPlatWorkstatusRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
import com.doumee.dao.business.model.Device;
import com.doumee.dao.business.model.ParkBook;
import io.swagger.models.auth.In;
@@ -24,7 +25,7 @@
     * @param param
     * @return
     */
    String syncHkDevices(AcsDeviceListRequest param);
    String syncHkDevices(Device param);
    /**
     * åŒæ­¥æµ·åº·åœè½¦åº“
@@ -89,4 +90,8 @@
    void dealWorkstatusEvent(EventPlatWorkstatusRequest param, HttpServletResponse response);
    void dealCarstatusEvent(EventPlatCarstatusRequest param, HttpServletResponse response);
    String syncHkLed(Device param);
    String syncHkBroadcast(Device param);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.DeviceMapper;
import com.doumee.dao.business.model.Device;
@@ -102,6 +103,7 @@
    public PageData<Device> findPage(PageWrap<Device> pageWrap) {
        IPage<Device> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Device> queryWrapper = new QueryWrapper<>();
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(Device::getId, pageWrap.getModel().getId());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformServiceImpl.java
@@ -2,14 +2,17 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.PlatformMapper;
import com.doumee.dao.business.model.Platform;
import com.doumee.dao.business.model.PlatformGroup;
import com.doumee.service.business.PlatformService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -87,9 +90,13 @@
    @Override
    public PageData<Platform> findPage(PageWrap<Platform> pageWrap) {
        IPage<Platform> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Platform> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<Platform> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Platform.class)
                    .selectAs(PlatformGroup::getName,Platform::getGroupName)
                    .leftJoin(PlatformGroup.class,PlatformGroup::getId,Platform::getGroupId);
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.lambda()
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        queryWrapper
                .eq(pageWrap.getModel().getId() != null, Platform::getId, pageWrap.getModel().getId())
                .eq(pageWrap.getModel().getCreator() != null, Platform::getCreator, pageWrap.getModel().getCreator())
                .ge(pageWrap.getModel().getCreateDate() != null, Platform::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
@@ -126,7 +133,7 @@
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(platformMapper.selectPage(page, queryWrapper));
        return PageData.from(platformMapper.selectJoinPage(page,Platform.class, queryWrapper));
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -69,8 +69,17 @@
     * @return
     */
    @Override
//    @Async
    public String syncHkDevices(AcsDeviceListRequest param){
    public String syncHkDevices(Device param){
        return null;
    }
    @Override
    public String syncHkLed(Device param){
        return null;
    }
    @Override
    public String syncHkBroadcast(Device param){
        return null;
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java
@@ -2,16 +2,15 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.tea.TeaException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.AcsDeviceStatusListRequest;
import com.doumee.core.haikang.model.param.request.DoorsListRequest;
import com.doumee.core.haikang.model.param.request.ParkListRequest;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
@@ -46,7 +45,7 @@
     */
    @Override
//    @Async
    public String syncHkDevices(AcsDeviceListRequest param){
    public String syncHkDevices(Device param){
        if(Constants.DEALING_HK_SYNCDEVICE){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "同步任务正在执行哦,请稍后查看结果!") ;
        }
@@ -57,13 +56,14 @@
            List<Device> editList = new ArrayList<>();
            Date date = new Date();
            //查询全部门禁设备数据
            List<Device> allList = deviceMapper.selectList(null);
            List<Device> allList = deviceMapper.selectList(new QueryWrapper<Device>().lambda()
                    .eq(Device::getType,Constants.ZERO));
            List<DoorsInfoResponse> allDoors = getAllDoorList();
            List<AcsDeviceInfoResponse> allHkList = getAllDeViceList();
            /**
             * èŽ·å–å¢žåˆ æ”¹æ•°æ®é›†åˆ
             */
            getDataChangeList(allList,allDoors,allHkList,addList,editList,deleteList,date);
            getDataChangeList(allList,allDoors,allHkList,addList,editList,deleteList,date );
            if(deleteList.size()>0){
                //逻辑删除
                for(Device d : deleteList){
@@ -86,6 +86,146 @@
            Constants.DEALING_HK_SYNCDEVICE =false;
        }
    }
    /**
     * åŒæ­¥æµ·åº·é—¨ç¦è®¾å¤‡æ•°æ®
     * @param param
     * @return
     */
    @Override
//    @Async
    public String syncHkLed(Device param){
        if(Constants.DEALING_HK_SYNCDEVICE){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "同步任务正在执行哦,请稍后查看结果!") ;
        }
        Constants.DEALING_HK_SYNCDEVICE =true;
        try {
            List<Device> deleteList = new ArrayList<>();
            List<Device> addList = new ArrayList<>();
            List<Device> editList = new ArrayList<>();
            Date date = new Date();
            //查询全部门禁设备数据
            List<Device> allList = deviceMapper.selectList(new QueryWrapper<Device>().lambda()
                    .eq(Device::getType,Constants.TWO));
            List<LedRecordsInfoResponse> allHkList = getAllLedList();
            /**
             * èŽ·å–å¢žåˆ æ”¹æ•°æ®é›†åˆ
             */
            getLedDataChangeList(allList,allHkList,addList,editList,deleteList,date);
            if(deleteList.size()>0){
                //逻辑删除
                for(Device d : deleteList){
                    deviceMapper.updateById(d);
                }
            }
            if(addList.size()>0){
                deviceMapper.insert(addList);
            }
            if(editList.size()>0){
                for(Device d : editList){
                    deviceMapper.updateById(d);
                }
            }
            return "同步数据:新增【"+addList.size()+"】条,更新【"+editList.size()+"】条,删除【"+deleteList.size()+"】条";
        }catch (Exception e){
            e.printStackTrace();
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "同步失败!");
        }finally {
            Constants.DEALING_HK_SYNCDEVICE =false;
        }
    }
    private void getLedDataChangeList(List<Device> allList, List<LedRecordsInfoResponse> allHkList, List<Device> addList, List<Device> editList, List<Device> deleteList, Date date) {
        if(allHkList!=null && allHkList.size()>0){
            //获取海康全部门禁组数据
            for(LedRecordsInfoResponse device : allHkList){
                Device model = getExistedLed(device,allList);
                if(model !=null){
                    //如果已存在,则更新数据
                    model =  initLedDataByHkData(model,device,date);
                    editList.add(model);
                }else{
                    //如果不存在,则新增数据
                    model = new Device();
                    model =  initLedDataByHkData(model,device,date);
                    model.setIsEntrance(Constants.ZERO);
                    addList.add(model);
                }
            }
        }
        //判断获取删除的门禁设备,逻辑删除
        getDeleteLedList(allList,allHkList,deleteList,date);
    }
    /**
     * åŒæ­¥æµ·åº·é—¨ç¦è®¾å¤‡æ•°æ®
     * @param param
     * @return
     */
    @Override
//    @Async
    public String syncHkBroadcast(Device param){
        if(Constants.DEALING_HK_SYNCDEVICE){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "同步任务正在执行哦,请稍后查看结果!") ;
        }
        Constants.DEALING_HK_SYNCDEVICE =true;
        try {
            List<Device> deleteList = new ArrayList<>();
            List<Device> addList = new ArrayList<>();
            List<Device> editList = new ArrayList<>();
            Date date = new Date();
            //查询全部广播点设备数据
            List<Device> allList = deviceMapper.selectList(new QueryWrapper<Device>().lambda()
                    .eq(Device::getType,Constants.THREE));
            List<FetchAudioChannelInfoResponse> allHkList = getAllBroadcastList();
            /**
             * èŽ·å–å¢žåˆ æ”¹æ•°æ®é›†åˆ
             */
            getBroadcastDataChangeList(allList,allHkList,addList,editList,deleteList,date);
            if(deleteList.size()>0){
                //逻辑删除
                for(Device d : deleteList){
                    deviceMapper.updateById(d);
                }
            }
            if(addList.size()>0){
                deviceMapper.insert(addList);
            }
            if(editList.size()>0){
                for(Device d : editList){
                    deviceMapper.updateById(d);
                }
            }
            return "同步数据:新增【"+addList.size()+"】条,更新【"+editList.size()+"】条,删除【"+deleteList.size()+"】条";
        }catch (Exception e){
            e.printStackTrace();
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "同步失败!");
        }finally {
            Constants.DEALING_HK_SYNCDEVICE =false;
        }
    }
    private void getBroadcastDataChangeList(List<Device> allList, List<FetchAudioChannelInfoResponse> allHkList, List<Device> addList, List<Device> editList, List<Device> deleteList, Date date) {
        if(allHkList!=null && allHkList.size()>0){
            //获取海康全部门禁组数据
            for(FetchAudioChannelInfoResponse device : allHkList){
                Device model = getExistedBroadcast(device,allList);
                if(model !=null){
                    //如果已存在,则更新数据
                    model =  initBroadcastDataByHkData(model,device,date);
                    editList.add(model);
                }else{
                    //如果不存在,则新增数据
                    model = new Device();
                    model =  initBroadcastDataByHkData(model,device,date);
                    model.setIsEntrance(Constants.ZERO);
                    addList.add(model);
                }
            }
        }
        //判断获取删除的门禁设备,逻辑删除
        getDeleteBroadcastList(allList,allHkList,deleteList,date);
    }
    @Override
//    @Async
    public void getAscDeviceStatus(){
@@ -177,6 +317,73 @@
        }
        return  allDoorList;
    }
    /**
     * èŽ·å–å…¨éƒ¨å¹¿æ’­ç‚¹æ•°æ®
     * @return
     */
    public  List<FetchAudioChannelInfoResponse>  getAllBroadcastList(){
        List<FetchAudioChannelInfoResponse> allDoorList = new ArrayList<>();
        Date date = new Date();
        boolean hasNext = true;
        int curTotal = 0;
        int curPage = 1;
        while (hasNext){
            //分页遍历循环查询所有门禁设备数据
            FetchAudioChannelRequest param = new FetchAudioChannelRequest();
            param.setPageNo(curPage);
            param.setPageSize(100);
            BaseResponse<BaseListPageResponse<FetchAudioChannelInfoResponse>>  response = HKService.fetchAudioChannel(param);
            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
            }
            BaseListPageResponse<FetchAudioChannelInfoResponse> r = response.getData();
            curTotal += 100;
            if(curTotal >= r.getTotal()){
                hasNext = false;
            }
            if(r.getList() == null || r.getList().size()==0){
                hasNext =false;
            }else{
                allDoorList.addAll(r.getList());
            }
            curPage++;
        }
        return  allDoorList;
    }
    /**
     * èŽ·å–å…¨éƒ¨LED数据
     * @return
     */
    public  List<LedRecordsInfoResponse>  getAllLedList(){
        List<LedRecordsInfoResponse> allDoorList = new ArrayList<>();
        Date date = new Date();
        boolean hasNext = true;
        int curTotal = 0;
        int curPage = 1;
        while (hasNext){
            //分页遍历循环查询所有门禁设备数据
            LedRecordsRequest param = new LedRecordsRequest();
            param.setPageNo(curPage);
            param.setPageSize(100);
            BaseResponse<BaseListPageResponse<LedRecordsInfoResponse>>    response = HKService.ledRecords(param);
            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
            }
            BaseListPageResponse<LedRecordsInfoResponse> r = response.getData();
            curTotal += 100;
            if(curTotal >= r.getTotal()){
                hasNext = false;
            }
            if(r.getList() == null || r.getList().size()==0){
                hasNext =false;
            }else{
                allDoorList.addAll(r.getList());
            }
            curPage++;
        }
        return  allDoorList;
    }
    public  List<AscDeviceStatusInfoResponse>  getAllDeviceStatusList(){
        List<AscDeviceStatusInfoResponse> allDoorList = new ArrayList<>();
        Date date = new Date();
@@ -207,7 +414,13 @@
        return  allDoorList;
    }
    private void getDataChangeList(List<Device> allList, List<DoorsInfoResponse> hkDoorList , List<AcsDeviceInfoResponse> allHkList, List<Device> addList, List<Device> editList,List<Device> deleteList, Date date) {
    private void getDataChangeList(List<Device> allList,
                                   List<DoorsInfoResponse> hkDoorList ,
                                   List<AcsDeviceInfoResponse> allHkList,
                                   List<Device> addList,
                                   List<Device> editList,
                                   List<Device> deleteList,
                                   Date date ) {
        if(hkDoorList!=null && hkDoorList.size()>0){
            //获取海康全部门禁组数据
            for(DoorsInfoResponse device : hkDoorList){
@@ -229,6 +442,30 @@
        getDeleteDoorList(allList,hkDoorList,deleteList,date);
    }
    private Device initLedDataByHkData(Device model, LedRecordsInfoResponse door, Date date) {
        model.setIsdeleted(Constants.ZERO);
        model.setHkId(door.getIndexCode());
        model.setHkDate(date);
        model.setHkStatus(Constants.ONE);
        model.setType(Constants.TWO);
        model.setRemark(JSONObject.toJSONString(door));
        model.setDoorId(door.getIndexCode());
        return  model;
    }
    private Device initBroadcastDataByHkData(Device model, FetchAudioChannelInfoResponse device, Date date) {
        model.setIsdeleted(Constants.ZERO);
        model.setHkDate(date);
        model.setHkId(device.getAudioChannelIndexCode());
        model.setName(device.getAudioChannelName());
        model.setHkStatus(Constants.ONE);
        model.setType(Constants.THREE);
        model.setChannelNo(device.getChannelNo());
        model.setChannelInfo(device.getChannelType());
        model.setResourceType(device.getAudioChannelType());
        model.setStatus(device.getState());
        model.setRegionName(device.getRegionName());
        return  model;
    }
    private Device initDoorDataByHkData(Device model, DoorsInfoResponse door, Date date, List<AcsDeviceInfoResponse> allHkList) {
        AcsDeviceInfoResponse device = getDeviceByDoorid(door.getParentIndexCode(),allHkList);
        model.setIsdeleted(Constants.ZERO);
@@ -356,6 +593,28 @@
        }
        return  null;
    }
    private Device getExistedLed(LedRecordsInfoResponse device, List<Device> allList) {
        if(allList.size()>0){
            for(Device r : allList){
                if(StringUtils.equals(r.getHkId(), device.getIndexCode())){
                    //表示未删除
                    return  r;
                }
            }
        }
        return  null;
    }
    private Device getExistedBroadcast(FetchAudioChannelInfoResponse device, List<Device> allList) {
        if(allList.size()>0){
            for(Device r : allList){
                if(StringUtils.equals(r.getHkId(), device.getAudioChannelIndexCode())){
                    //表示未删除
                    return  r;
                }
            }
        }
        return  null;
    }
    private Device getExistedDevice(AcsDeviceInfoResponse device, List<Device> allList) {
        if(allList.size()>0){
            for(Device r : allList){
@@ -390,6 +649,28 @@
            }
        }
    }
    private void getDeleteLedList(List<Device> allList,  List<LedRecordsInfoResponse> allHkList,List<Device> deleteList ,Date date) {
        if(allList!=null && allList.size()>0){
            for(Device device : allList){
                if(isDeletedLedDevice(device,allHkList)){
                    device.setIsdeleted(Constants.ONE);
                    device.setEditDate(date);
                    deleteList.add(device);
                }
            }
        }
    }
    private void getDeleteBroadcastList(List<Device> allList,  List<FetchAudioChannelInfoResponse> allHkList,List<Device> deleteList ,Date date) {
        if(allList!=null && allList.size()>0){
            for(Device device : allList){
                if(isDeletedBroadcastDevice(device,allHkList)){
                    device.setIsdeleted(Constants.ONE);
                    device.setEditDate(date);
                    deleteList.add(device);
                }
            }
        }
    }
    private boolean isDeletedDoorDevice(Device device, List<DoorsInfoResponse> allHkList) {
        if(allHkList.size()>0){
@@ -403,6 +684,30 @@
        return  true;
    }
    private boolean isDeletedLedDevice(Device device, List<LedRecordsInfoResponse> allHkList) {
        if(allHkList.size()>0){
            for(LedRecordsInfoResponse r : allHkList){
                if(StringUtils.equals(device.getDoorId(), r.getIndexCode())){
                    //表示未删除
                    return  false;
                }
            }
        }
        return  true;
    }
    private boolean isDeletedBroadcastDevice(Device device, List<FetchAudioChannelInfoResponse> allHkList) {
        if(allHkList.size()>0){
            for(FetchAudioChannelInfoResponse r : allHkList){
                if(StringUtils.equals(device.getDoorId(), r.getAudioChannelIndexCode())){
                    //表示未删除
                    return  false;
                }
            }
        }
        return  true;
    }
    private boolean isDeletedDevice(Device device, List<AcsDeviceInfoResponse> allHkList) {
        if(allHkList.size()>0){
            for(AcsDeviceInfoResponse r : allHkList){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPlatformsServiceImpl.java
@@ -13,14 +13,18 @@
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.DeviceMapper;
import com.doumee.dao.business.PlatformDeviceMapper;
import com.doumee.dao.business.PlatformMapper;
import com.doumee.dao.business.model.Device;
import com.doumee.dao.business.model.Platform;
import com.doumee.dao.business.model.PlatformDevice;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@@ -34,6 +38,8 @@
    @Autowired
    private PlatformMapper platformMapper;
    @Autowired
    private PlatformDeviceMapper platformDeviceMapper;
    /**
     * åŒæ­¥æµ·åº·æœˆå°æ•°æ®
@@ -41,7 +47,7 @@
     * @return
     */
    @Override
//    @Async
    @Transactional
    public String syncPlatforms(PlatformsListRequest param){
        if(Constants.DEALING_HK_SYNCPLATFORM){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "同步任务正在执行哦,请稍后查看结果!") ;
@@ -51,6 +57,7 @@
            List<Platform> deleteList = new ArrayList<>();
            List<Platform> addList = new ArrayList<>();
            List<Platform> editList = new ArrayList<>();
            List<PlatformDevice> deviceList = new ArrayList<>();
            Date date = new Date();
            //查询全部门禁设备数据
            List<Platform> allList = platformMapper.selectList(null);
@@ -58,15 +65,15 @@
            /**
             * èŽ·å–å¢žåˆ æ”¹æ•°æ®é›†åˆ
             */
            getDataChangeList(allList,allHkList,addList,editList,deleteList,date);
            getDataChangeList(allList,allHkList,addList,deviceList,editList,deleteList,date);
            if(deleteList.size()>0){
                //逻辑删除
                for(Platform d : deleteList){
                    platformMapper.updateById(d);
                }
            }
            if(addList.size()>0){
                platformMapper.insert(addList);
            if(deviceList.size()>0){
                platformDeviceMapper.insert(deviceList);
            }
            if(editList.size()>0){
                for(Platform d : editList){
@@ -100,7 +107,7 @@
                    platformMapper.update(null,new UpdateWrapper<Platform>().lambda()
                            .set(Platform::getStatus,d.getStatus())
                            .set(Platform::getEditDate,date)
                            .eq(Platform::getHkId,d.getPlatformtId()));
                            .eq(Platform::getHkId,d.getPlatformId()));
                }
            }
        }catch (Exception e){
@@ -144,7 +151,8 @@
    }
    private void getDataChangeList(List<Platform> allList,
                                   List<PlatformListInfoResponse> allHkList,
                                   List<Platform> addList,
                                   List<Platform> addList ,
                                   List<PlatformDevice> deviceList,
                                   List<Platform> editList,
                                   List<Platform> deleteList, Date date) {
        if(allHkList!=null && allHkList.size()>0){
@@ -155,16 +163,39 @@
                    //如果已存在,则更新数据
                    model =  initDataByHkData(model,device,date);
                    editList.add(model);
                    //清空监控点数据
                    platformDeviceMapper.delete(new UpdateWrapper<PlatformDevice>().lambda()
                            .eq(PlatformDevice::getPlatformId,model.getId()));
                    deviceList.addAll(getCameraList(device.getCameras(),model));
                }else{
                    //如果不存在,则新增数据
                    model = new Platform();
                    model =  initDataByHkData(model,device,date);
                    platformMapper.insert(model);
                    addList.add(model);
                    deviceList.addAll(getCameraList(device.getCameras(),model));
                }
            }
        }
        //判断获取删除的门禁设备,逻辑删除
        getDeleteList(allList,allHkList,deleteList,date);
    }
    private List<PlatformDevice> getCameraList(List<PlatformCameraInfoResponse> cameras, Platform model) {
        List<PlatformDevice> list = new ArrayList<>();
        if(cameras!=null || cameras.size()>0){
            for(PlatformCameraInfoResponse param :cameras){
                PlatformDevice d = new PlatformDevice();
                d.setCreateDate(model.getCreateDate());
                d.setPlatformId(model.getId());
                d.setIsdeleted(Constants.ZERO);
                d.setDeviceId(param.getCameraIdompan());
                d.setName(param.getCameraName());
                d.setType(Constants.ONE);
                list.add(d);
            }
        }
        return list;
    }
    /**
@@ -176,6 +207,7 @@
     */
    private Platform initDataByHkData(Platform model, PlatformListInfoResponse device,Date date ) {
        model.setIsdeleted(Constants.ZERO);
        model.setCreateDate(date);
        model.setHkDate(date);
        model.setHkId(device.getPlatformId());
        model.setCreateDate(DateUtil.getISO8601DateByStr(device.getCreateTime()));