浏览代码

Merge remote-tracking branch 'origin/visu_resources' into visu_resources

wangzhe 2 年之前
父节点
当前提交
045ce6381d

+ 17 - 0
src/api/forest.js

@@ -1,5 +1,13 @@
 import request from '@/utils/request'
 
+export function initByCameras(param) {
+  return request({
+    url: '/center-monitor/TVWallController/initByCameras',
+    method: 'get',
+    params:param
+  })
+
+}
 // 获取绑定的事件类型
 export function getMenuEventType() {
   return request({
@@ -296,3 +304,12 @@ export function eventHandling(id,eventCode) {
     data: {id:id,eventCode:eventCode,dataStatus:"1"}
   })
 }
+
+// 会议添加联系人并发送短信
+export function sendMessage(param) {
+  return request({
+    url: '/center-resources/VisuForestCloudMapController/sendMeetingMsgResources',
+    method: 'post',
+    data:param
+  })
+}

+ 1 - 1
src/api/leader.js

@@ -42,7 +42,7 @@ export function getRecordList(taskId) {
 // 巡林轨迹
 export function getPointList(recordId) {
   return request({
-    url: '/center-data/track/getTrack/'+recordId.toString(),
+    url: '/center-data/patrolTrack/getTrack/'+recordId.toString(),
     method: 'get',
   })
 }

+ 31 - 0
src/api/monitor.js

@@ -29,3 +29,34 @@ export function getRegionalFlag(id) {
     method: 'get',
   })
 }
+//获取点位周边摄像头
+export function findCameraByEventCoordinate(longitude,latitude) {
+  // longitude = '124.41986560821533';
+  // latitude = '43.08817137032747';
+  return request({
+    url: '/center-resources/VisuForestMonitorCenterController/findCameraByEventCoordinate?longitude='+longitude+"&latitude="+latitude+"&type=1",
+    method: 'get',
+  })
+}
+
+//转到固定点位
+export function rotation(lng,lat,list) {
+  // lng = '124.41986560821533';
+  // lat = '43.08817137032747';
+  return request({
+    url: '/center-resources/VisuForestMonitorCenterController/rotation',
+    method: 'post',
+    data:{
+      lng:lng,
+      lat:lat,
+      list:list
+    }
+  })
+}
+//根据部门ID获取具有查看权限的摄像头
+export function getCamerasByDeptId(deptId) {
+  return request({
+    url: '/center-resources/VisuForestMonitorCenterController/getCamerasByDeptId?deptId=' + deptId,
+    method: 'get',
+  })
+}

+ 1 - 1
src/assets/iconfont/iconfont.css

@@ -102,7 +102,7 @@
 .sj-icon-construction:before {
   content: "\e73f";
 }
-/* 矿资源 */
+/* 矿资源 */
 .sj-icon-deposit:before {
   content: "\e633";
 }

+ 137 - 13
src/components/TVWall.vue

@@ -36,9 +36,10 @@
 import { getDahuaVideoServer, getTVWallList } from '@/api/dahua/dahua'
 import { tvCameraList } from '@/api/haikang/haikang'
 import DHWs from '@/dahua/lib/DHWs'
-
+import { rotation } from '@/api/monitor'
 /** ----------------------------------摄像头预览结束------------------------------------- */
 export default {
+  array:[],
   dicts: ['event_source'],
   components: {},
   data() {
@@ -281,6 +282,137 @@ export default {
           })
       }
     },
+    playRealMonitorVideo(array) { // 自定义设备树自动播放指定通道编码视频
+      const config = this.ws.config
+      const { loginIp, userCode } = config
+      this.ws.postMessage('playRealMonitorVideo', {
+        loginIp,
+        userCode,
+        params: {
+          ctrlCode: "ctrl1",
+          array: array
+        }
+      })
+
+    },
+
+    //火点联动电视墙调用
+    showTVWall1(longitude,latitude,tvListJson) {
+      // let that=this;
+      /** ----------------------------------大华摄像头预览开始------------------------------------- */
+      this.ws.addEventListener('connectStateChange', data => {
+        if (data) {
+          console.log('连接成功')
+        } else {
+          console.log('连接失败,下载客户端')
+          this.alertReinstall()
+          this.isShowTipe && this.$modal.confirm({
+            title: '下载客户端',
+            content: '检测到您未安装部分插件,将影响部分功能使用,请下载后使用?',
+            onOk: () => {
+              //这里写下载方法
+              this.isShowTipe = false
+            },
+            onCancel: () => {
+              this.isShowTipe = false
+            }
+          });
+        }
+      })
+      getDahuaVideoServer().then(newResponse => {
+        this.ws.detectConnectQt().then(res => {
+          if (res) { // 连接客户端成功
+            this.alertLogin()
+            this.ws.login({
+              loginIp: newResponse.loginIp,
+              loginPort: newResponse.loginPort,
+              userName: newResponse.userName,
+              userPwd: newResponse.userPwd,
+              // loginIp: '192.168.100.100',
+              // loginPort: 8314,
+              // userName: 'system',
+              // userPwd: 'Admin@123',
+              token: '',
+              https: 1
+            })
+            this.ws.on('loginState', (res) => {
+              this.isLogin = res
+              console.log('---res-----', res)
+              if (res) {
+                this.alertLoginSuccess()
+                this.activePanel = 'key2'
+                console.log(tvListJson)
+                const array=[]
+                const array1=[]
+                tvListJson[0].treeLabels.forEach((item,index)=>
+                {
+                  if (index!=0)
+                  {
+                    const param =Object.assign({})
+                    param.channelId=item.labelCode
+                    array.push(param)
+                    array1.push(item.labelCode)
+                  }
+
+                })
+                this.create1(longitude,latitude,tvListJson,array,array1)
+                // var obj=JSON.parse(tvListJson)
+              } else {
+                this.alertLoginFailed()
+              }
+            })
+          } else { // 连接客户端失败
+            this.alertReinstall()
+          }
+        })
+
+      })
+      /** ----------------------------------大华摄像头预览结束------------------------------------- */
+      /** ----------------------------------海康摄像头预览开始------------------------------------- */
+      // tvCameraList().then(response => {
+      //   this.cameraList=response.data
+      // })
+      // that.initPlugin()
+      // setTimeout(function() {
+      //   that.playhk();
+      // }, 5000)
+      // /** ----------------------------------海康摄像头预览结束------------------------------------- */
+      this.TVWallVisible = true
+
+    },
+    rotation(lng,lat,list){
+      rotation(lng,lat,list).then(res => {
+        console.log(res)
+
+      })
+    },
+    create1(longitude,latitude,tvListJson,array,array1) { // 调用创建控件接口
+      let _this = this
+      const params = [
+        {
+          'ctrlType': 'realMonitorUI',
+          'ctrlCode': 'ctrl1',
+          'ctrlProperty': {
+            'displayMode': 1,
+            'splitNum': 1,
+            'channelList': [
+              {
+                'channelId': ''
+              }
+            ]
+          },
+          'visible': true,
+          'domId': 'dom1'
+        }
+      ]
+      this.setPos()
+      this.customizeTree(tvListJson);
+      _this.ws.createCtrl(params);
+      _this.playRealMonitorVideo(array)
+      setTimeout(() => {
+        _this.rotation(longitude,latitude,array1)
+      }, 5000)
+    },
     showTVWall() {
       // let that=this;
       /** ----------------------------------大华摄像头预览开始------------------------------------- */
@@ -368,7 +500,6 @@ export default {
     },
 
     create(tvListJson) { // 调用创建控件接口
-      debugger
       let _this = this
       const params = [
         {
@@ -388,17 +519,10 @@ export default {
         }
       ]
       this.setPos()
-      _this.ws.createCtrl(params).then(res => {
-        this.customizeTree(tvListJson)
-      }).catch(e => {
-        console.log(e)
-      })
-      _this.ws.on('createCtrlResult', (res) => {
-        this.customizeTree(tvListJson)
-        _this.ws.on('createCtrlResult', (res) => {
-          this.customizeTree(tvListJson)
-        })
-      })
+      this.customizeTree(tvListJson);
+      setTimeout(function () {
+        _this.ws.createCtrl(params);
+      }, 3000);
     },
     setPos() {
       let target = document.getElementById(this.domId)

+ 756 - 0
src/components/TVWalls.vue

@@ -0,0 +1,756 @@
+<template>
+  <div>
+    <el-dialog title="电视墙" :visible.sync="TVWallVisible" v-if="TVWallVisible" customClass="TVWallCustomWidth"
+               @close="cancelEventLocationShow()">
+      <!--<div @click="findCameraByEventCoordinate()">视频联动</div>-->
+      <!--<div class="forthis" style="width: 22%; position: absolute;left: 0;z-index: 9999999999999;">-->
+      <!--<div class="i-list-con" style="height: 46vh; overflow-y: scroll;">-->
+      <!--<span v-for="(item,index) in cameraList" :key="index">-->
+      <!--<div class="d-l-con" @click="playhk(item.channelCode)">-->
+      <!--<div class="d-l-l-text">-->
+      <!--<i class="i-small"></i>-->
+      <!--<h4>{{ item.cameraName }}</h4>-->
+      <!--</div>-->
+      <!--</div>-->
+      <!--</span>-->
+      <!--</div>-->
+      <!--</div>-->
+      <!--<div style="width:70%;height:400px;position:absolute;">-->
+      <!--&lt;!&ndash;视频窗口展示-&#45;&#45;大华&ndash;&gt;-->
+      <!--<div id="dom1" class="dom1"></div>-->
+      <!--&lt;!&ndash;视频窗口展示-&#45;&#45;海康&ndash;&gt;-->
+      <!--<div id="playWnd" class="playWnd" style="left: 0px; top: 0px;"></div>-->
+      <!--</div>-->
+
+      <div id="dom1" class="dom1"></div>
+    </el-dialog>
+  </div>
+
+</template>
+
+<script>
+/** ----------------------------------摄像头预览开始------------------------------------- */
+import {getDahuaVideoServer, getTVWallList} from '@/api/dahua/dahua'
+import {tvCameraList} from '@/api/haikang/haikang'
+import {findCameraByEventCoordinate, rotation} from '@/api/monitor'
+import DHWs from '@/dahua/lib/DHWs'
+
+/** ----------------------------------摄像头预览结束------------------------------------- */
+export default {
+  dicts: ['event_source'],
+  components: {},
+  data() {
+    return {
+      tvListJson: [
+        {
+          'switchTab': '1',
+          'treeLabels': [
+            {
+              'labelCode': '123456',
+              'labelName': '视频场景',
+              'parentLabelCode': null
+            },
+            {
+              'labelCode': '5a81d1bd499b4940a21fc63ca51f4dfa',
+              'labelName': '标签2',
+              'parentLabelCode': 123456
+            },
+            {
+              'labelCode': 'd941adbbd3e64dac92cc448dec5293cd',
+              'labelName': '标签1',
+              'parentLabelCode': 123456
+            }
+          ],
+          'labelChannels': [{
+            'channelDates': [{
+              'channelCode': '6044981090191552',
+              'channelName': '复兴大桥中段-交通事故',
+              'channelSn': null,
+              'cameraType': 0,
+              'online': 1
+            },
+              {
+                'channelCode': 'ZgVzqsjwA1DTF561VGHK5E',
+                'channelName': '北京7青羊东二路77号2通道1',
+                'channelSn': null,
+                'cameraType': 1,
+                'online': 1
+              }
+            ],
+            'labelCode': 'd941adbbd3e64dac92cc448dec5293cd'
+          },
+            {
+              'channelDates': [{
+                'channelCode': 'ZgVzqsjwA1DTF561VGHKK7',
+                'channelName': '北京7青羊东二路77号2通道2',
+                'channelSn': null,
+                'cameraType': 2,
+                'online': 0
+              }],
+              'labelCode': '5a81d1bd499b4940a21fc63ca51f4dfa'
+            }
+          ]
+        },
+        {
+          'switchTab': '2',
+          'labelChannels': [{
+            'channelDates': [{
+              'channelCode': 'ZgVzqsjwA1DTF561VGHK5E',
+              'channelName': '北京7青羊东二路77号2通道1',
+              'channelSn': null,
+              'cameraType': 1,
+              'online': 1
+            },
+              {
+                'channelCode': 'ZgVzqsjwA1DTF561VGHKK7',
+                'channelName': '北京7青羊东二路77号2通道2',
+                'channelSn': null,
+                'cameraType': 2,
+                'online': 0
+              }
+            ]
+          }]
+        }
+      ],
+      TVWallVisible: false,
+      activeName: 'tv',
+      channelId: ['ZgVzqsjwA1DTF561VHG69F'],
+      /** ----------------------------------摄像头预览开始------------------------------------- */
+      showModal: true,
+      activePanel: 'key1',
+      isLogin: false,
+      loginType: '1',
+      token: '',
+      ctrlType: 'playerWin',
+      https: 1,
+      httpsList: [
+        {
+          value: 0,
+          label: 0
+        },
+        {
+          value: 1,
+          label: 1
+        }
+      ],
+      ctrlTypeList: [{
+        value: 'playerWin',
+        label: '播放控件'
+      }, {
+        value: 'realMonitorUI',
+        label: '带设备树实时预览控件'
+      }, {
+        value: 'playbackUI',
+        label: '带设备树视频回放控件'
+      }, {
+        value: 'TVWallUI',
+        label: '视频上墙'
+      }],
+      ctrlList: [
+        {
+          value: 'ctrl1',
+          label: '控件1'
+        },
+        {
+          value: 'ctrl2',
+          label: '控件2'
+        },
+        {
+          value: 'ctrl3',
+          label: '控件3'
+        }
+      ],
+      splitList: [
+        {
+          value: 1,
+          label: '1 * 1'
+        },
+        {
+          value: 4,
+          label: '2 * 2'
+        },
+        {
+          value: 9,
+          label: '3 * 3'
+        }
+      ],
+      displayModeList: [
+        {
+          value: 1,
+          label: '播放器预览模式'
+        },
+        {
+          value: 2,
+          label: '播放器回放模式'
+        }
+      ],
+      mixedVideoDisplayModeList: [
+        {
+          value: 1,
+          label: '播放实时视频'
+        },
+        {
+          value: 2,
+          label: '播放回放视频'
+        }
+      ],
+      ctrl: 'ctrl1',
+      splitNum: 1,
+      displayMode: 1,
+      displayTimeRange: [],
+      modalDisplayTimeRange: [],
+      mixedVideoTime: null,
+      recordPath: 'C:\\DSS LightWeight\\DSS LightWeight Client\\Record\\',
+      downloadName: '',
+      downTimeRange: [],
+      downloadFormat: 0,
+      downloadFormatList: [{
+        value: 0,
+        label: 'dav'
+      },
+        {
+          value: 1,
+          label: 'avi'
+        }, {
+          value: 2,
+          label: 'mp4'
+        }],
+      downloadSource: 3,
+      downloadSourceList: [
+        {
+          value: 3,
+          label: '中心录像'
+        }, {
+          value: 2,
+          label: '设备录像'
+        }],
+      showDownloadStreamType: false,
+      downloadStreamType: 1,
+      downloadStreamTypeList: [{
+        value: 1,
+        label: '主码流'
+      },
+        {
+          value: 2,
+          label: '辅码流'
+        },
+        {
+          value: 3,
+          label: '三码流'
+        }],
+      downloadIsShow: true,
+      downloadIsShowList: [{
+        value: true,
+        label: '是'
+      },
+        {
+          value: false,
+          label: '否'
+        }],
+      crtPosX: 0,
+      crtPosY: 0,
+      crtWidth: 1148,
+      crtHeight: 650,
+      domId: 'dom1',
+      mixedVideoDisplayMode: 2,
+      isShowTipe: true,
+      autoList: [],
+      stringList: [],
+      data: null,
+      /** ----------------------------------摄像头预览结束------------------------------------- */
+      cameraList: [],
+      initCount: 0,
+      pubKey: '',
+      oWebControl: null
+    }
+  },
+  created() {
+    const DHWsInstance = DHWs.getInstance()
+    this.ws = DHWsInstance
+  },
+  methods: {
+    cancelEventLocationShow() {
+      // this.activeName = 'tv'
+      this.TVWallVisible = false
+      this.destroy()
+
+      if (this.oWebControl != null) {
+        this.oWebControl.JS_HideWnd()   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
+        this.oWebControl.JS_Disconnect().then(function () {  // 断开与插件服务连接成功
+          },
+          function () {  // 断开与插件服务连接失败
+          })
+      }
+    },
+    showTVWall(data, val) {
+      this.tvListJson = data
+      this.data = val
+      this.autoList = []
+      this.stringList = []
+      for (let i = 1; i < data[0].treeLabels.length; i++) {
+        this.autoList.push({"channelId": data[0].treeLabels[i].labelCode})
+        this.stringList.push(data[0].treeLabels[i].labelCode)
+      }
+      console.log("this.autoList",this.autoList);
+      console.log("this.stringList",this.stringList);
+      // let that=this;
+      /** ----------------------------------大华摄像头预览开始------------------------------------- */
+      this.ws.addEventListener('connectStateChange', data => {
+        if (data) {
+          console.log('连接成功')
+        } else {
+          console.log('连接失败,下载客户端')
+          this.alertReinstall()
+          this.isShowTipe && this.$modal.confirm({
+            title: '下载客户端',
+            content: '检测到您未安装部分插件,将影响部分功能使用,请下载后使用?',
+            onOk: () => {
+              //这里写下载方法
+              this.isShowTipe = false
+            },
+            onCancel: () => {
+              this.isShowTipe = false
+            }
+          });
+        }
+      })
+      this.preview()
+      /** ----------------------------------大华摄像头预览结束------------------------------------- */
+      /** ----------------------------------海康摄像头预览开始------------------------------------- */
+      // tvCameraList().then(response => {
+      //   this.cameraList=response.data
+      // })
+      // that.initPlugin()
+      // setTimeout(function() {
+      //   that.playhk();
+      // }, 5000)
+      // /** ----------------------------------海康摄像头预览结束------------------------------------- */
+      this.TVWallVisible = true
+    },
+    /** ----------------------------------大华摄像头预览开始------------------------------------- */
+    alertLogin: function () {
+      this.$modal.msg('登录中....')
+    },
+    alertLoginSuccess: function () {
+      this.$modal.msgSuccess('登录成功!')
+    },
+    alertLoginFailed: function () {
+      this.$modal.msgError('登陆失败!')
+    },
+    alertReinstall: function () {
+      this.$modal.msgWarning('请重新安装客户端')
+    },
+    /** 预览按钮操作 */
+    preview() {
+      getDahuaVideoServer().then(newResponse => {
+        this.ws.detectConnectQt().then(res => {
+          if (res) { // 连接客户端成功
+            this.alertLogin()
+            this.ws.login({
+              loginIp: newResponse.loginIp,
+              loginPort: newResponse.loginPort,
+              userName: newResponse.userName,
+              userPwd: newResponse.userPwd,
+              // loginIp: '192.168.100.100',
+              // loginPort: 8314,
+              // userName: 'system',
+              // userPwd: 'Admin@123',
+              token: '',
+              https: 1
+            })
+            this.ws.on('loginState', (res) => {
+              this.isLogin = res
+              console.log('---res-----', res)
+              if (res) {
+                this.alertLoginSuccess()
+                this.activePanel = 'key2'
+                this.create(this.tvListJson)
+              } else {
+                this.alertLoginFailed()
+              }
+            })
+          } else { // 连接客户端失败
+            this.alertReinstall()
+          }
+        })
+      })
+    },
+    playRealMonitorVideo() { // 自定义设备树自动播放指定通道编码视频
+      const config = this.ws.config
+      const {loginIp, userCode} = config
+      this.ws.postMessage('playRealMonitorVideo', {
+        loginIp,
+        userCode,
+        params: {
+          ctrlCode: "ctrl1",
+          array: this.autoList
+        }
+      })
+    },
+    create(tvListJson) { // 调用创建控件接口
+      let _this = this
+      const params = [
+        {
+          'ctrlType': 'realMonitorUI',
+          'ctrlCode': 'ctrl1',
+          'ctrlProperty': {
+            'displayMode': 1,
+            'splitNum': 1,
+            'channelList': [
+              {
+                'channelId': ''
+              }
+            ]
+          },
+          'visible': true,
+          'domId': 'dom1'
+        }
+      ]
+      this.setPos()
+      this.customizeTree(tvListJson);
+      _this.ws.createCtrl(params);
+      _this.playRealMonitorVideo();
+      if (_this.data != undefined && _this.data != null) {
+        setTimeout( _this.rotation(_this.data.longitude, _this.data.latitude, _this.stringList),5000)
+      }
+    },
+    rotation(lng,lat,list){
+      rotation(lng,lat,list);
+    },
+    setPos() {
+      let target = document.getElementById(this.domId)
+      console.log(target, 'target')
+      target.style.right = `${this.crtPosX}px`
+      target.style.top = `${this.crtPosY}px`
+      target.style.width = `${this.crtWidth}px`
+      target.style.height = `${this.crtHeight}px`
+      if (document.createEvent) {
+        var event = document.createEvent('HTMLEvents')
+        event.initEvent('resize', true, true)
+        window.dispatchEvent(event)
+      } else if (document.createEventObject) {
+        window.fireEvent('onresize')
+      }
+    },
+    destroy() { // 调用销毁控件接口
+      if (!this.isLogin) {
+        this.$modal.msgWarning('正在登陆客户端,请稍等......')
+        return false
+      }
+      const ctrls = this.ws.ctrls.map(i => {
+        if (i.ctrlCode === this.ctrl) {
+          return i.ctrlCode
+        }
+      })
+      this.ws.destroyCtrl(ctrls)
+    },
+    customizeTree(tvListJson) { // 调用控件接口树
+      const config = this.ws.config
+      const {loginIp, userCode} = config
+      this.ws.postMessage('customizeTree', {
+        loginIp,
+        userCode,
+        params: {
+          array: tvListJson
+        }
+      })
+    },
+    /** ----------------------------------大华摄像头预览结束------------------------------------- */
+    /** ----------------------------------海康摄像头预览开始------------------------------------- */
+    // 创建播放实例
+    initPlugin() {
+      let that = this
+      that.oWebControl = new WebControl({
+        szPluginContainer: 'playWnd',                       // 指定容器id
+        iServicePortStart: 15900,                           // 指定起止端口号,建议使用该值
+        iServicePortEnd: 15909,
+        szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11',   // 用于IE10使用ActiveX的clsid
+        cbConnectSuccess: function () {                     // 创建WebControl实例成功
+          that.oWebControl.JS_StartService('window', {         // WebControl实例创建成功后需要启动服务
+            dllPath: './VideoPluginConnect.dll'         // 值"./VideoPluginConnect.dll"写死
+          }).then(function () {                           // 启动插件服务成功
+            that.oWebControl.JS_SetWindowControlCallback({   // 设置消息回调
+              cbIntegrationCallBack: cbIntegrationCallBack
+            })
+
+            that.oWebControl.JS_CreateWnd('playWnd', 850, 615).then(function () { //JS_CreateWnd创建视频播放窗口,宽高可设定
+              that.init()  // 创建播放实例成功后初始化
+            })
+          }, function () { // 启动插件服务失败
+          })
+        },
+        cbConnectError: function () { // 创建WebControl实例失败
+          that.oWebControl = null
+          $('#playWnd').html('插件未启动,正在尝试启动,请稍候...<a href="./hk/VideoWebPlugin.exe">点击下载插件</a>')
+          WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
+          initCount++
+          if (initCount < 3) {
+            setTimeout(function () {
+              that.initPlugin()
+            }, 3000)
+          } else {
+            $('#playWnd').html('插件启动失败,请检查插件是否安装!<a href="./hk/VideoWebPlugin.exe">点击下载插件</a>')
+          }
+        },
+        cbConnectClose: function (bNormalClose) {
+          // 异常断开:bNormalClose = false
+          // JS_Disconnect正常断开:bNormalClose = true
+          console.log('cbConnectClose')
+          that.oWebControl = null
+        }
+      })
+    },
+    //初始化
+    init() {
+      let that = this
+      this.getPubKey(function () {
+        ////////////////////////////////// 请自行修改以下变量值	////////////////////////////////////
+        var appkey = '24699060'                           //综合安防管理平台提供的appkey,必填
+        var secret = that.setEncrypt('tt1pMbsrlwGZUWucdAPw')   //综合安防管理平台提供的secret,必填
+        var ip = '36.49.108.22'                           //综合安防管理平台IP地址,必填
+        var playMode = 0                                  //初始播放模式:0-预览,1-回放
+        var port = 1443                                    //综合安防管理平台端口,若启用HTTPS协议,默认443
+        var snapDir = 'D:\\SnapDir'                       //抓图存储路径
+        var videoDir = 'D:\\VideoDir'                     //紧急录像或录像剪辑存储路径
+        var layout = '3x3'                                //playMode指定模式的布局
+        var enableHTTPS = 1                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
+        var encryptedFields = 'secret'					   //加密字段,默认加密领域为secret
+        var showToolbar = 1                               //是否显示工具栏,0-不显示,非0-显示
+        var showSmart = 1                                 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
+        var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769'  //自定义工具条按钮
+        ////////////////////////////////// 请自行修改以上变量值	////////////////////////////////////
+
+        that.oWebControl.JS_RequestInterface({
+          funcName: 'init',
+          argument: JSON.stringify({
+            appkey: appkey,                            //API网关提供的appkey
+            secret: secret,                            //API网关提供的secret
+            ip: ip,                                    //API网关IP地址
+            playMode: playMode,                        //播放模式(决定显示预览还是回放界面)
+            port: port,                                //端口
+            snapDir: snapDir,                          //抓图存储路径
+            videoDir: videoDir,                        //紧急录像或录像剪辑存储路径
+            layout: layout,                            //布局
+            enableHTTPS: enableHTTPS,                  //是否启用HTTPS协议
+            encryptedFields: encryptedFields,          //加密字段
+            showToolbar: showToolbar,                  //是否显示工具栏
+            showSmart: showSmart,                      //是否显示智能信息
+            buttonIDs: buttonIDs                       //自定义工具条按钮
+          })
+        }).then(function (oData) {
+          that.oWebControl.JS_Resize(850, 615)  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
+        })
+      })
+    },
+    //获取公钥
+    getPubKey(callback) {
+      let that = this
+      that.oWebControl.JS_RequestInterface({
+        funcName: 'getRSAPubKey',
+        argument: JSON.stringify({
+          keyLength: 1024
+        })
+      }).then(function (oData) {
+        console.log(oData)
+        if (oData.responseMsg.data) {
+          that.pubKey = oData.responseMsg.data
+          callback()
+        }
+        125
+      })
+    },
+//RSA加密
+    setEncrypt(value) {
+      var encrypt = new JSEncrypt()
+      encrypt.setPublicKey(this.pubKey)
+      return encrypt.encrypt(value)
+    },
+    //播放海康摄像头
+    playhk(channelCode) {
+      var cameraIndexCode = channelCode     //获取输入的监控点编号值,必填
+      var streamMode = 0                                     //主子码流标识:0-主码流,1-子码流
+      var transMode = 1                                      //传输协议:0-UDP,1-TCP
+      var gpuMode = 0                                        //是否启用GPU硬解,0-不启用,1-启用
+      var wndId = -1                                         //播放窗口序号(在2x2以上布局下可指定播放窗口)
+
+      cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
+      cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
+
+      this.oWebControl.JS_RequestInterface({
+        funcName: 'startPreview',
+        argument: JSON.stringify({
+          cameraIndexCode: cameraIndexCode,                //监控点编号
+          streamMode: streamMode,                         //主子码流标识
+          transMode: transMode,                           //传输协议
+          gpuMode: gpuMode,                               //是否开启GPU硬解
+          wndId: wndId                                     //可指定播放窗口
+        })
+      })
+    }
+    /** ----------------------------------海康摄像头预览结束------------------------------------- */
+  }
+}
+
+// 推送消息
+function cbIntegrationCallBack(oData) {
+  console.log(JSON.stringify(oData.responseMsg))
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+@import '@/assets/styles/base.scss';
+
+.event-info-con {
+  width: 100%;
+  display: flex;
+
+  .e-left {
+    width: 32%;
+  }
+
+  .e-center {
+    width: 30%;
+    margin-left: 1%;
+
+    .img-company {
+      width: 100%;
+      height: 18.3vh;
+
+      img {
+      }
+    }
+  }
+
+  .e-right {
+    margin-left: 1%;
+    width: 45%;
+  }
+
+  .e-location-left {
+    width: 28%;
+    margin-top: 1rem;
+  }
+
+  .e-location-right {
+    width: 71%;
+    margin-top: 1.3rem;
+    margin-left: 1rem;
+  }
+}
+
+.el-dialog:not(.is-fullscreen) {
+  margin-top: 5.5vh !important;
+}
+
+.bottom-menu-normal {
+  max-width: 90%;
+  padding: 0 3rem;
+  position: absolute;
+  left: 50%;
+  transform: translateX(-50%);
+  bottom: 0;
+  z-index: 100000;
+  border-radius: 5px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background: url(../assets/images/integrated/btm-menu.png) center no-repeat;
+  background-size: cover;
+  overflow: hidden;
+
+  .btm-m-con {
+    position: relative;
+    color: $inBlue;
+    font-size: .5rem;
+    padding: 1rem 1.5rem;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    -webkit-transform: translateY(0);
+    transform: translateY(0);
+    transition: all 0.2s ease-in-out;
+    cursor: pointer;
+    white-space: nowrap;
+
+    i {
+      font-size: 1rem;
+      color: $inBlue;
+      text-shadow: 0 0 10px rgba($color: $inBlue, $alpha: .6);
+      margin-right: 0.2rem;
+    }
+  }
+
+  .btm-m-con:hover {
+    text-shadow: 0 0 20px rgba($color: $inBlueHover, $alpha: 1.0);
+    filter: brightness(2.3);
+    -webkit-transform: translateX(0.2rem);
+    transform: translateX(0.2rem);
+    transition: all 0.2s ease-in-out;
+
+    i {
+      color: $inBlueHover;
+      text-shadow: 0 0 20px rgba($color: $inBlueHover, $alpha: 1.0);
+    }
+  }
+
+  .m-l-none {
+    .el-input__inner {
+      margin-left: 0 !important;
+    }
+  }
+
+}
+
+/*海康*/
+html, body {
+  padding: 0;
+  margin: 0;
+}
+
+.playWnd {
+  margin: -13px 0 0 255px;
+  width: 850px; /*播放容器的宽和高设定*/
+  height: 615px;
+  border: 1px solid red;
+}
+
+.operate {
+  margin-top: 24px;
+}
+
+.operate::after {
+  content: '';
+  display: block;
+  clear: both;
+}
+
+.module {
+  float: left;
+  width: 340px;
+  /*min-height: 320px;*/
+  margin-left: 16px;
+  padding: 16px 8px;
+  box-sizing: border-box;
+  border: 1px solid #e5e5e5;
+}
+
+.module .item {
+  margin-bottom: 4px;
+}
+
+.module input[type="text"] {
+  box-sizing: border-box;
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 0;
+  width: 150px;
+  min-height: 20px;
+}
+
+.module .btn {
+  min-width: 80px;
+  min-height: 24px;
+  margin-top: 100px;
+  margin-left: 80px;
+}
+</style>

+ 1 - 1
src/utils/request.js

@@ -20,7 +20,7 @@ const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: process.env.VUE_APP_BASE_API,
   // 超时
-  timeout: 10000
+  timeout: 20000
 })
 
 // request拦截器

+ 2 - 2
src/views/bigdata/bigdata.vue

@@ -30,7 +30,7 @@
         <div class="b-con mg-b-20">
           <div class="b-tit"><img src="@/assets/images/integrated/bigdata-tit-icon.png">
             <!--<span>林场分布统计</span>-->
-            <span>矿资源</span>
+            <span>矿资源</span>
           </div>
           <!--<chartForestFarm></chartForestFarm>-->
           <chartAncientTree></chartAncientTree>
@@ -75,7 +75,7 @@
         <!--<div class="b-con mg-b-20">-->
           <!--<div class="b-tit"><img src="@/assets/images/integrated/bigdata-tit-icon.png">-->
             <!--<span>森林资源年统计</span>-->
-            <!--&lt;!&ndash;<span>矿资源</span>&ndash;&gt;-->
+            <!--&lt;!&ndash;<span>矿资源</span>&ndash;&gt;-->
           <!--</div>-->
           <!--<chartPitG2></chartPitG2>-->
           <!--&lt;!&ndash;<chartAncientTree></chartAncientTree>&ndash;&gt;-->

+ 1 - 1
src/views/datacenter.vue

@@ -374,7 +374,7 @@ export default {
                 '                </div>' +
                 '                </div>' +
                 '                </span></div>'
-            } else if (resourceTable == 'centerdata_t_resources_deposit') { //矿资源
+            } else if (resourceTable == 'centerdata_t_resources_deposit') { //矿资源
               markersMap.icon = 'sj-icon-map-centerdata-t-forest-farm'
               markersMap.lng = res.data.resourceList[i].longitude
               markersMap.lat = res.data.resourceList[i].latitude

+ 237 - 40
src/views/eventdetailsdialog.vue

@@ -59,6 +59,7 @@
                    </div> -->
                 <!-- 底部工具栏end -->
                 <div class="fire-m">
+                  <el-button size="small" icon="el-icon-s-grid" @click="showTVWallDiaLog()">火点联动</el-button>
                   <el-button size="small" icon="el-icon-upload" @click="showheatPlotting()">火灾蔓延
                   </el-button>
                 </div>
@@ -161,7 +162,7 @@
                                 </el-button>
                               </div>
                               <div class="z-info-btm-grp-right">
-                                <el-button size="small" icon="el-icon-mic" @click="joinMeeting()">会议
+                                <el-button size="small" icon="el-icon-mic" @click="Meeting()">会议
                                 </el-button>
                               </div>
                             </div>
@@ -240,10 +241,15 @@
                               <div class="z-info-btm-input-btn"
                                    v-else-if="eventStatusValue=='forest_event_status_5'&&statusFlag=='1'">
                                 <el-button size="small"
-                                           icon="el-icon-success" style="text-align:left"
+                                           icon="el-icon-success" style="text-align:left" v-if="eventType == 1"
                                            @click="updateCentereventTEventcatalogueStatus('gd',false)">
                                   填报
                                 </el-button>
+                                <el-button size="small"
+                                           icon="el-icon-success" style="text-align:left" v-if="eventType != 1"
+                                           @click="updateCentereventTEventcatalogueStatus('gd',true)">
+                                  归档
+                                </el-button>
                                 <el-button size="small" icon="el-icon-chat-dot-square" @click="sendEventLog()">发送
                                 </el-button>
                               </div>
@@ -272,7 +278,7 @@
                class="top-dialog"
                @close="cancelEventConfirm()">
       <el-form label-width="80px">
-        <el-form-item label="火灾半径" v-if="eventStatusButton=='qs'">
+        <el-form-item label="火灾半径" v-if="eventStatusButton=='qs' && eventTypeXl==null">
           <el-input type="number" v-model="sendHuoZaiBanJing" placeholder="请输入火灾半径"/>
         </el-form-item>
         <el-form-item :label="deptNameitem">
@@ -288,7 +294,7 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="事件类型" v-if="eventStatusButton=='qs'&& eventTypeXl == null">
+        <el-form-item label="事件类型" v-if="eventStatusButton=='qs' && eventTypeXl == null">
           <el-select v-model="sendEventType" placeholder="请选择事件类型!" clearable>
             <el-option
               v-for="item in eventTypeList"
@@ -466,6 +472,84 @@
         <div style="clear: both;"></div>
       </el-form>
     </el-dialog>
+    <!--    会议弹窗  start -->
+    <el-dialog title="视频会议" :visible.sync="showMeetingMsgDialog" v-if="showMeetingMsgDialog" width="65%"
+               @close="closeMeetingMsgDialog()">
+      <el-form label-width="1500px">
+        <div class="bottom">
+          <!-- 左侧菜单栏 -->
+          <div class="bottomLeft">
+            <div class="leftItem d-l-con padding-box nowrap" v-for="(item,index) in depteventList">
+              <div class="bgt-info">
+                <div class="bgt-info-name" :class="{on:iconCurrentIndex==item.deptId}"
+                     @click="dutysystemSelect(item.deptId,item.deptName,item.id)">{{ item.deptName }}
+                </div>
+              </div>
+            </div>
+          </div>
+          <!-- 左侧菜单栏对应的右侧的内容 -->
+          <div class="bottomRight" ref="wrapper">
+            <el-button
+              size="mini"
+              type="danger"
+              v-if="depteventId!=null&&depteventId!=''"
+              @click="addLine">添加
+            </el-button>
+            <el-button
+              size="mini"
+              type="danger"
+              v-if="depteventId!=null&&depteventId!=''"
+              @click="finUserByDept">选择
+            </el-button>
+            <el-table
+              :data="dutysystemTableData"
+              style="width: 100%"
+              :rules="rules">
+              <el-table-column prop="id" label="主键" v-if="false">
+                <template slot-scope="scope" hidden>
+                  <el-input v-model="scope.row.id" readonly placeholder="主键"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="name" label="姓名">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.name" placeholder="姓名" οninput="value=value.replace(/^[\u4e00-\u9fa5]{2,4}$/,'')"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="post" label="岗位">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.post" placeholder="岗位"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="telphone" label="手机号码">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.telphone" placeholder="手机号码" οninput="value=value.replace(/^((13[0-9])|(14[5-9])|(15([0-3]|[5-9]))|(16[6-7])|(17[1-8])|(18[0-9])|(19[1|3])|(19[5|6])|(19[8|9]))\d{8}$/,'')"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="bookbuytime" label="操作">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    icon="el-icon-delete"
+                    @click="handleDelete(scope.$index, scope.row)">删除
+                  </el-button>
+                  <!--<el-button-->
+                  <!--size="mini"-->
+                  <!--type="danger"-->
+                  <!--icon="el-icon-save"-->
+                  <!--@click="handleSave(scope.$index, scope.row)">保存-->
+                  <!--</el-button>-->
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </div>
+        <el-button size="mini" type="primary" class="fr_button" @click="sendMsg">发送短信
+        </el-button>
+        <div style="clear: both;"></div>
+      </el-form>
+    </el-dialog>
+    <!--    会议弹窗  end   -->
     <el-dialog title="火险报告" :visible.sync="showEventConfirm_gd" v-if="showEventConfirm_gd" width="100%"
                class="top-dialog"
                @close="cancelEventConfirm_gd()">
@@ -980,6 +1064,7 @@
     <el-dialog title="人员选择" :visible.sync="showFindUserByDept" width="40%">
       <findUserByDept v-if="showFindUserByDept" ref="findUserByDept" :deptId="iconCurrentIndex" @addSelection="addSelection"></findUserByDept>
     </el-dialog>
+    <TVWall ref="TVWall"></TVWall>
   </div>
 </template>
 
@@ -991,6 +1076,7 @@ import vBottomMenu from '@/components/vBottomMenu.vue' //一体化公共底部
 import eventLogUpload from '@/views/eventLogUpload.vue' //日志上传文件
 import areaSupermap from '@/components/supermap'//区域标记地图
 import TcPlayer from '@/components/TcPlayer' //视频预览
+import TVWall from '@/components/TVWall.vue' //电视墙弹窗
 import findUserByDept from '@/views/findUserByDept' //责任人选择弹框
 import {
   getEventDetail,
@@ -1007,8 +1093,10 @@ import {
   dutysystemList,
   dutysystemAdd,
   dutysystemRemove,
-  userFeginlist,
-  eventHandling
+  sendMessage,
+  eventHandling,
+  initByCameras,
+  userFeginlist
 } from '@/api/forest'
 import {
   treeselectAll as deptTreeselect
@@ -1039,11 +1127,54 @@ export default {
     supermapDialog,
     eventLogUpload,
     areaSupermap,
+    TVWall,
     TcPlayer,
     findUserByDept
   },
   data() {
     return {
+      aa:[
+        {
+          "switchTab":"2",
+          "treeLabels":[
+            {
+              "id":null,
+              "labelCode":"999",
+              "labelName":"电视墙",
+              "parentLabelCode":""
+            },
+            {
+              "id":"spcamera00288",
+              "labelCode":"22030300001321100289",
+              "labelName":"四平市伊通县西苇椽子沟村",
+              "parentLabelCode":"999"
+            }
+          ],
+          "labelChannels":[
+            {
+              "labelCode":"22030300001321100289",
+              "channelDates":[
+                {
+                  "channelCode":"22030300001321100289",
+                  "channelName":"四平市伊通县西苇椽子沟村可见光",
+                  "channelSn":null,
+                  "cameraType":null,
+                  "online":"1",
+                  "cameraCode":null
+                },
+                {
+                  "channelCode":"22030300001321100290",
+                  "channelName":"四平市伊通县西苇椽子沟村热成像",
+                  "channelSn":null,
+                  "cameraType":null,
+                  "online":"1",
+                  "cameraCode":null
+                }
+              ]
+            }
+          ]
+        }
+      ],
       showFindUserByDept: false,//责任人选择框
       //海康
       cameraTitle: '',
@@ -1066,7 +1197,7 @@ export default {
       sendDeptId: null,//签收部门/发起部门
       sendDeptName: null,//签收部门/发起部门
       sendEventType: null,//事件类型
-      sendHuoZaiBanJing: null,//火灾报告
+      sendHuoZaiBanJing: 0,//火灾报告
       sendGuanLianYuAn: null,//关联预案
       sendUserFegin: [],//联系人
       sendTaskSource: null,//任务来源
@@ -1193,6 +1324,7 @@ export default {
       visuForestCloudYuAnBo: null,
       eventDialog: false,
       showResponsibilityDialog: false,//责任制弹窗
+      showMeetingMsgDialog: false,//发送会议短信弹窗
       depteventList: [],//责任制部门列表
       iconCurrentIndex: '',
       dutysystemDeptName: '',
@@ -1265,6 +1397,10 @@ export default {
   },
   methods: {
     /************************************责任制-开始****************************************/
+    //初始化责任制数据列表
+    initDutysystemTableData(){
+      this.dutysystemTableData = [];
+    },
     addLine: function() {//添加负责人行数
       var newValue = {
         id: '',//主键
@@ -1345,6 +1481,13 @@ export default {
       this.iconCurrentIndex = ''
       this.showResponsibilityDialog = false
     },
+    closeMeetingMsgDialog() {//会议弹窗关闭
+      this.dutysystemTableData = []
+      this.dutysystemDeptName = ''
+      this.depteventId = ''
+      this.iconCurrentIndex = ''
+      this.showMeetingMsgDialog = false
+    },
     addResponsibilityDialog() {//责任制保存
       let reg_user = /^[\u4e00-\u9fa5]{2,4}$/;    //2-4个中文字符正则
       let reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;    //11位手机号码正则
@@ -1381,6 +1524,27 @@ export default {
       this.eventDialog = false;
       this.$emit('getFirespread', this.eventCode);
     },
+    showTVWallDiaLog() {
+      this.initByCameras()
+      // this.$refs.TVWall.showTVWall();
+
+    },
+    initByCameras()
+    {
+      const params=Object.assign({})
+      params.longitude=this.longitude;
+      params.latitude=this.latitude;
+      params.type='7'
+      initByCameras(params).then(res=>
+      {
+        this.$refs.TVWall.showTVWall1(this.longitude,this.latitude,res.data);
+        this.$refs.supermap.isEditableLayers = false
+        this.$refs.bottomMenu.showChild = false
+        this.$refs.bottomMenu.showBanChild = false
+        this.$refs.bottomMenu.showChangChild = false
+      })
+
+    },
     showUpdateYjYuAn() {
       listYuAn().then(res => {
         //关联预案列表
@@ -1429,7 +1593,7 @@ export default {
                 click: '',
                 parameter: '',
                 keepBindPopup: false,
-                isAggregation: false
+                isAggregation: true
               }
               if (res.data.length > 50) {
                 markersMap.isAggregation = true
@@ -1516,7 +1680,7 @@ export default {
       this.sendDeptName = null
       this.sendUserFegin = []
       this.sendEventType = null
-      this.sendHuoZaiBanJing = null
+      this.sendHuoZaiBanJing = 0
       this.sendGuanLianYuAn = null
       this.longitude = null
       this.latitude = null
@@ -1539,7 +1703,7 @@ export default {
       this.sendDeptName = null
       this.sendUserFegin = []
       this.sendEventType = null
-      this.sendHuoZaiBanJing = null
+      this.sendHuoZaiBanJing = 0
       this.sendGuanLianYuAn = null
       this.sendTaskTitle = null
       this.sendTaskSource = null
@@ -1777,30 +1941,33 @@ export default {
           })
 
         } else if (eventStatus == 'gd') {
-          let double = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;    //数字和两位小数
-          let number = /^[+]{0,1}(\d+)$/g;    //正整数
+          if(that.eventType == 1){
+            let double = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;    //数字和两位小数
+            let number = /^[+]{0,1}(\d+)$/g;    //正整数
 
-          if(!double.test(that.table2.areaTotal)){
-            that.$message.error(`面积只能填写到小数后两位!`)
-            return
-          }
-          if(!number.test(that.table2.peopleTotal)){
-            that.$message.error(`人员请填写正整数!`)
-            return
-          }
-          if(that.table2.forestComposition == '' || that.table2.forestComposition==null){
-            that.$message.error(`林木组成不能为空!`)
-            return
-          }
-          if(that.table2.forestToken == '' || that.table2.forestToken==null){
-            that.$message.error(`林令不能为空!`)
-            return
-          }
+            if(!double.test(that.table2.areaTotal)){
+              that.$message.error(`面积只能填写到小数后两位!`)
+              return
+            }
+            if(!number.test(that.table2.peopleTotal)){
+              that.$message.error(`人员请填写正整数!`)
+              return
+            }
+            if(that.table2.forestComposition == '' || that.table2.forestComposition==null){
+              that.$message.error(`林木组成不能为空!`)
+              return
+            }
+            if(that.table2.forestToken == '' || that.table2.forestToken==null){
+              that.$message.error(`林令不能为空!`)
+              return
+            }
             if(that.table2.porosities == '' || that.table2.porosities==null){
-            that.$message.error(`疏密度不能为空!`)
-            return
+              that.$message.error(`疏密度不能为空!`)
+              return
+            }
           }
 
+
           //事件处理流程--归档
           let param = {
             deptId: that.deptId,
@@ -1838,10 +2005,6 @@ export default {
               return
             }
             if (eventStatus == 'qs') {
-              if (that.sendHuoZaiBanJing == '' || that.sendHuoZaiBanJing == null) {
-                that.$message.error(`请输入火灾半径!`)
-                return
-              }
               if (that.sendEventType == '' || that.sendEventType == null) {
                 that.$message.error(`请选择事件类型!`)
                 return
@@ -1930,7 +2093,7 @@ export default {
           click: '',
           parameter: '',
           keepBindPopup: false,
-          isAggregation: false,
+          isAggregation: true,
           radius: 0
         }
         if (res.data.catalogue.eventStatusValue == 'forest_event_status_1' && res.data.catalogue.urgeCount == 0) {
@@ -1968,7 +2131,7 @@ export default {
             click: 'preview',
             parameter: {code:res.data.centermonitorTCamera.cameraCode,type:res.data.centermonitorTCamera.cameraFactory},
             keepBindPopup: false,
-            isAggregation: false,
+            isAggregation: true,
             radius: 0
           }
           markersMap.bindPopupHtml = '<div class="map-tip">' +
@@ -2016,7 +2179,7 @@ export default {
           click: '',
           parameter: '',
           keepBindPopup: false,
-          isAggregation: false,
+          isAggregation: true,
           radius: 0
         }
         if (res.data.catalogue.eventStatusValue == 'forest_event_status_1' && res.data.catalogue.urgeCount == 0) {
@@ -2056,7 +2219,7 @@ export default {
             click: 'preview',
             parameter: {code:res.data.centermonitorTCamera.cameraCode,type:res.data.centermonitorTCamera.cameraFactory},
             keepBindPopup: false,
-            isAggregation: false,
+            isAggregation: true,
             radius: 0
           }
           markersMap.bindPopupHtml = '<div class="map-tip">' +
@@ -2344,13 +2507,47 @@ export default {
     },
     /** ----------------------------------海康摄像头预览结束------------------------------------- */
     /** ----------------------------------视频会议开始------------------------------------- */
+    sendMsg() {// 视频会议发送短信
+      let reg_user = /^[\u4e00-\u9fa5]{2,4}$/;    //2-4个中文字符正则
+      let reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;    //11位手机号码正则
+      for(let i in this.dutysystemTableData){
+        if(!reg_user.test(this.dutysystemTableData[i].name)){
+          this.$message.error(`请输入正确姓名!`)
+          return;
+        }
+        if(!reg_tel.test(this.dutysystemTableData[i].telphone)){
+          this.$message.error(`请输入正确手机号码!`)
+          return;
+        }
+
+        if(this.dutysystemTableData[i].id==null || this.dutysystemTableData[i].id==''){
+          this.dutysystemTableData[i].dept = this.dutysystemDeptName;
+          this.dutysystemTableData[i].depteventId = this.depteventId;
+        }
+      }
+      const param = {centereventTDutySystemList:this.dutysystemTableData,eventCode:this.eventCode,eventName:this.eventName,eventId:this.eventId}
+      sendMessage(param).then(res => {
+        this.$message.success(res.msg);
+        this.dutysystemSelect(this.iconCurrentIndex, this.dutysystemDeptName, this.depteventId);
+        this.showMeetingMsgDialog = false;
+        this.joinMeeting();
+      })
+    },
     joinMeeting(){
       let hwMeetingUrl;
       selectConfigKey('hwMeetingUrl').then(res => {
         hwMeetingUrl = res.data
-        window.open(hwMeetingUrl+"/"+this.eventId+"/"+this.eventName+"的会议"+"/"+Cookies.get("nickName"));
+        window.open(hwMeetingUrl+"/joinConferences/"+this.eventId+"/"+this.eventName+"的会议"+"/"+Cookies.get("nickName"));
       })
-    }
+    },
+    Meeting() {//弹出发送会议短信弹窗
+      let param = { eventCode: this.eventCode }
+      centereventtdepteventList(param).then(res => {
+        this.depteventList = res.data
+        this.showMeetingMsgDialog = true
+        this.initDutysystemTableData();
+      })
+    },
     /** ----------------------------------视频会议结束------------------------------------- */
   }
 }

+ 3 - 7
src/views/firespread.vue

@@ -1021,7 +1021,7 @@
         sendDeptId: null,//签收部门/发起部门
         sendDeptName: null,//签收部门/发起部门
         sendEventType: null,//事件类型
-        sendHuoZaiBanJing: null,//火灾报告
+        sendHuoZaiBanJing: 0,//火灾报告
         sendGuanLianYuAn: null,//关联预案
         sendUserFegin: [],//联系人
         sendTaskSource: null,//任务来源
@@ -1456,7 +1456,7 @@
         this.sendDeptName = null
         this.sendUserFegin = []
         this.sendEventType = null
-        this.sendHuoZaiBanJing = null
+        this.sendHuoZaiBanJing = 0
         this.sendGuanLianYuAn = null
         this.longitude = null
         this.latitude = null
@@ -1479,7 +1479,7 @@
         this.sendDeptName = null
         this.sendUserFegin = []
         this.sendEventType = null
-        this.sendHuoZaiBanJing = null
+        this.sendHuoZaiBanJing = 0
         this.sendGuanLianYuAn = null
         this.sendTaskTitle = null
         this.sendTaskSource = null
@@ -1765,10 +1765,6 @@
                 return
               }
               if (eventStatus == 'qs') {
-                if (that.sendHuoZaiBanJing == '' || that.sendHuoZaiBanJing == null) {
-                  that.$message.error(`请输入火灾半径!`)
-                  return
-                }
                 if (that.sendEventType == '' || that.sendEventType == null) {
                   that.$message.error(`请选择事件类型!`)
                   return

+ 3 - 5
src/views/forest.vue

@@ -417,7 +417,7 @@
             @getTodayEvents="getTodayEvents" @getFirespread="getFirespread" @getSupermap="getSupermap"></eventdetailsdialog>
 
         <firespread ref="firespread" :calendarDay="calendarDay" @getEventList="getEventList"
-            @getTodayEvents="getTodayEvents" @showEventDialog="showEventDialog" @getSupermap="getSupermap"></firespread>
+            @getTodayEvents="getTodayEvents" @showEventDialog="showEventDialog" @getSupermap="getSupermap" @showDialog="showDialog"></firespread>
         <eventLocation ref="eventLocation"></eventLocation>
         <TVWall ref="TVWall"></TVWall>
     </div>
@@ -1214,7 +1214,7 @@ export default {
         websocketonmessage(e) { //数据接收
             console.log('接收数据', e.data)
             // let data = "{\"fromId\":\"forest\",\"fromUserId\":\""+Cookies.get('username')+"\",\"toUserId\":\""+Cookies.get('username')+"\"}";
-            let data = "{\"fromId\":\"forest\",\"fromUserId\":\"admin\",\"toUserId\":\"admin\"}";
+            let data = "{\"fromId\":\"resources\"}";
             if (this.calendarDay == this.getCurrentDataStr() && data != e.data) {
                 // 处理收到的消息
                 this.handleWebSoceketEvent(e.data)
@@ -1243,9 +1243,7 @@ export default {
          * @param {string} ping 心跳名称 默认字符串ping
          */
         sendPing(time = 60000, ping = {
-            'fromId': 'forest',
-            'fromUserId': Cookies.get('username'),
-            'toUserId': Cookies.get('username')
+            'fromId': 'resources'
         }) {
             clearInterval(this.setIntervalWesocketPush)
             this.setIntervalWesocketPush = setInterval(() => {

+ 26 - 1
src/views/leader.vue

@@ -45,9 +45,17 @@
           <dv-border-box-13 backgroundColor="rgba(12, 19, 38, .90)" style="padding-bottom: 1rem;">
             <img src="../assets/images/integrated/light.png" style="width: 100%; margin-top: .4rem;" />
             <div class="i-list-con h-27">
+              <el-input
+                v-model="nickName"
+                placeholder="请输入姓名"
+                clearable
+                size="small"
+                prefix-icon="el-icon-search"
+                style="margin-bottom: 20px"
+              />
               <div class="d-l-con-icon">
                 <div class="icon-con" :class="{on:listCurrentIndex1==item.userId}"
-                     v-for="(item,index) in peopleList" @click="getPlanList(item.userId)">
+                     v-for="(item,index) in peopleList2" @click="getPlanList(item.userId)">
                   <div class="icon icon-mid el-icon-user"></div>
                   <div class="icon-text personnel-name">
                     <h6>{{ item.nickName }}</h6>
@@ -172,6 +180,8 @@
         indentdisabled: false,
         visuForestCloudRYBO: [], //人员类型列表
         peopleList: [], //人员列表
+        nickName: '',
+        peopleList2: [], //人员列表
         connectList: [], //画线
         xunLinListOne: [], //巡林任务
         recordList: [], //巡查记录
@@ -192,6 +202,19 @@
     mounted(){
       this.bottomMenuList() //获取底部公共组件消息和任务
     },
+    watch:
+      {
+        nickName(val) {
+          this.peopleList2 = [];
+
+          for (let i in this.peopleList) {
+            if (this.peopleList[i].nickName.indexOf(val) != -1) {
+              this.peopleList2.push(this.peopleList[i]);
+            }
+          }
+          console.log(this.peopleList2)
+        }
+      },
     methods: {
       /** ----------------------------------底部按钮公用组件开始------------------------------------- */
       bottomMenuList() {
@@ -284,8 +307,10 @@
         this.listCurrentIndex2 = ''
         this.iconCurrentIndex1 = linJob
         this.peopleList = []
+        this.peopleList2 = []
         getForestLeader(linJob, linType).then(res => {
           this.peopleList = res.data
+          this.peopleList2 = res.data
         })
         this.connectList = []
         this.personId = null;

+ 31 - 2
src/views/monitor.vue

@@ -106,7 +106,15 @@
               <dv-decoration-3 style="width:150px;height:15px;margin-right: 1rem;"/>
             </div>
             <div class="i-list-con h-43">
-              <div class="d-l-con" v-for="(item,index) in visuForestCloudCameraBOList"
+              <el-input
+                v-model="rightDeptName"
+                placeholder="请输入摄像头名称"
+                clearable
+                size="small"
+                prefix-icon="el-icon-search"
+                style="margin-bottom: 20px"
+              />
+              <div class="d-l-con" v-for="(item,index) in visuForestCloudCameraBOListSearch"
                    :class="{on:listCurrentIndex2 == index}"
                    v-on:click="dropLocation(item.latitude,item.longitude,index)">
                 <div class="d-l-l-text">
@@ -144,6 +152,7 @@
     </div>
     <eventLocation ref="eventLocation"></eventLocation>
     <TVWall ref="TVWall"></TVWall>
+    <TVWalls ref="TVWalls"></TVWalls>
     <el-dialog :title="cameraTitle" :visible.sync="cameraVisible" v-if="cameraVisible" customClass="videoCustomWidth"
                @close="cancelEventLocationShow()">
       <div style="width:1020px;height:625px;position:relative;">
@@ -159,6 +168,7 @@ import {
   selectDeviceType,
   selectCameraByDeptId,
   selectKeyAreaList,
+  getCamerasByDeptId,
   getRegionalFlag
 } from '@/api/monitor'
 import { treeselect } from '@/api/system/dept'
@@ -167,6 +177,7 @@ import vheader from '@/components/v-header.vue' //一体化共用头部
 import vBottomMenu from '@/components/vBottomMenu.vue' //一体化公共底部菜单
 import eventLocation from '@/components/eventLocation.vue' //事件定位弹窗
 import TVWall from '@/components/TVWall.vue' //电视墙弹窗
+import TVWalls from '@/components/TVWalls.vue' //电视墙弹窗
 
 /** ----------------------------------摄像头预览开始------------------------------------- */
 import {
@@ -187,6 +198,7 @@ export default {
     vheader,
     vBottomMenu,
     eventLocation,
+    TVWalls,
     TVWall
   },
   created() {
@@ -253,12 +265,22 @@ export default {
       indentText: '收起左右栏',
       indentdisabled: false,
       domId: 'dom1',
+      rightDeptName: undefined,
+      visuForestCloudCameraBOListSearch:[]
     }
   },
   watch: {
     // 根据名称筛选部门树
     deptName(val) {
       this.$refs.tree.filter(val)
+    },
+    rightDeptName(val){
+      this.visuForestCloudCameraBOListSearch=[];
+      for (let i in this.visuForestCloudCameraBOList) {
+        if(this.visuForestCloudCameraBOList[i].cameraName.indexOf(val) != -1){
+          this.visuForestCloudCameraBOListSearch.push(this.visuForestCloudCameraBOList[i]);
+        }
+      }
     }
   },
   methods: {
@@ -277,8 +299,13 @@ export default {
     },
 // 节点单击事件
     handleNodeClick(data) {
+      let that = this
+      console.log("节点单击事件",data);
       // this.findCameraByDept(data.id)
-      this.selectCameraByDeptId(data.id);
+      that.selectCameraByDeptId(data.id);
+      getCamerasByDeptId(data.id).then(res => {
+        that.$refs.TVWalls.showTVWall(res.data, {longitude: data.deptLongitude, latitude: data.deptLatitude});
+      })
     },
     selectKeyAreaList() {
       this.keyAreaList=[]
@@ -399,6 +426,7 @@ export default {
         }
 
         that.visuForestCloudCameraBOList = res.data.visuForestCloudCameraBOList
+        that.visuForestCloudCameraBOListSearch = res.data.visuForestCloudCameraBOList
         if (res.data.visuForestCloudCameraBOList != null && res.data.visuForestCloudCameraBOList
           .length > 0) {
           for (let i = 0; i < res.data.visuForestCloudCameraBOList.length; i++) {
@@ -493,6 +521,7 @@ export default {
       selectCameraByDeptId(depId).then(res => {
         //根据设备类型查看列表
         that.visuForestCloudCameraBOList = res.data
+        that.visuForestCloudCameraBOListSearch = res.data
         if (res.data != null && res.data.length > 0) {
           for (let i = 0; i < res.data.length; i++) {
             let markersMap = {

+ 6 - 4
vue.config.js

@@ -9,7 +9,7 @@ const CompressionPlugin = require('compression-webpack-plugin')
 
 const name = process.env.VUE_APP_TITLE || '四平市态势感知平台' // 网页标题
 
-const port = process.env.port || process.env.npm_config_port || 80 // 端口
+const port = process.env.port || process.env.npm_config_port || 81 // 端口
 
 const ssl_path = require('path')
 const fs = require('fs')
@@ -18,7 +18,7 @@ const fs = require('fs')
 // 这里只列一部分,具体配置参考文档
 module.exports = {
   // 部署生产环境和开发环境下的URL。
-  // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上datacenter
+  // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
   // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
   publicPath: process.env.NODE_ENV === 'production' ? '/' : '/',
   // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
@@ -48,11 +48,13 @@ module.exports = {
      * 寻找附件-有缘人@阿弥陀佛
      * @param attach_ids
      */
+
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        // target: `http://127.0.0.1:3031`,
-        target: `http://121.36.228.66:3031`,
+        target: `http://127.0.0.1:3031`,
+        // target: `http://192.168.2.118:3031`,
+        // target: `http://121.36.228.66:3031`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''