3 Commity d556d913f9 ... 5b6ce9666d

Autor SHA1 Wiadomość Data
  fan 5b6ce9666d 激活调整应急处置卡和联系方式页面与对应配置 2 miesięcy temu
  fan 0fd56c8ed7 https适配调整;驾驶舱出入统计,防爆扩音模块调整;门禁,扩音,激光云台弹窗优化 2 miesięcy temu
  fan c09aed1211 防爆扩音webRTC接入,页面功能测试;门禁弹窗页面数据接入,功能测试;激光云台弹窗页面数据接入,功能测试;底部菜单调整 2 miesięcy temu
35 zmienionych plików z 2542 dodań i 237 usunięć
  1. 2 0
      .gitignore
  2. 3 3
      package-lock.json
  3. 1 0
      public/index.html
  4. 38 16
      public/js/config.js
  5. 104 0
      public/js/fbky.js
  6. 64 13
      src/components/ImageVideoORI/index.vue
  7. 1 1
      src/store/modules/mqtt.js
  8. 0 2
      src/utils/webRTU.js
  9. 4 4
      src/views/Home.vue
  10. 1 1
      src/views/basePage/components/videoWindow/VideoImageWindow.vue
  11. 5 2
      src/views/basePage/index.vue
  12. 222 0
      src/views/basePage/mixins/LoadLayer/fbky.js
  13. 2 1
      src/views/basePage/mixins/LoadLayer/index.js
  14. 1 1
      src/views/basePage/mixins/LoadLayer/perimeter.js
  15. 28 0
      src/views/basePage/mixins/MapEvent.js
  16. 4 4
      src/views/basePage/mixins/MqttUtil.js
  17. 187 4
      src/views/basePage/panels/PersonStatistics.vue
  18. 22 3
      src/views/basePage/panels/RiskStatistics/index.vue
  19. 228 0
      src/views/basePage/panels/SoundStatistics.vue
  20. 12 5
      src/views/components/baseFooter/FooterNavigation.vue
  21. 13 10
      src/views/components/baseHeader/left.vue
  22. 157 58
      src/views/components/dialog/AccessControlDialog.vue
  23. 19 5
      src/views/components/dialog/JGYTControlDialog/index.vue
  24. 1084 0
      src/views/components/dialog/SoundDialog/Fbky.vue
  25. 159 62
      src/views/components/dialog/SoundDialog/index.vue
  26. 2 1
      src/views/components/dialog/VideoImageWindow copy.vue
  27. 1 1
      src/views/components/dialog/VideoImageWindow.vue
  28. 8 2
      src/views/components/emergency/CardDetailDialog.vue
  29. 1 0
      src/views/components/emergency/CardListDialog.vue
  30. 153 28
      src/views/components/emergency/ContactInfoDialog.vue
  31. 1 1
      src/views/videoMonitor/components/videoContent.vue
  32. 7 3
      src/views/videoMonitor/index.vue
  33. 1 1
      src/views/videoMonitorType/components/videoContent.vue
  34. 3 1
      src/views/videoMonitorType/index.vue
  35. 4 4
      vue.config.js

+ 2 - 0
.gitignore

@@ -1,6 +1,8 @@
 .DS_Store
 node_modules
 dist
+dist.zip
+dist.7z
 public/model
 
 # local env files

+ 3 - 3
package-lock.json

@@ -3361,9 +3361,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001301",
-      "resolved": "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001301.tgz",
-      "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==",
+      "version": "1.0.30001700",
+      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz",
+      "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==",
       "dev": true
     },
     "case-sensitive-paths-webpack-plugin": {

+ 1 - 0
public/index.html

@@ -10,6 +10,7 @@
   <script src="js/layers.js?"></script>
   <script src="js/layerconfig.js?"></script>
   <script src="js/buildings.js?"></script>
+  <script src="js/fbky.js"></script>
   <script src="js/station.js"></script>
   <script src="js/chart.js"></script>
   <script src="js/mapModeConfig.js"></script>

+ 38 - 16
public/js/config.js

@@ -9,7 +9,9 @@ const BASE_URL = '/yapi' //开发接口代理
  */
 const HOME_DATA = {
   startDate: '2024-11-27',
-  curStation: '都匀',
+  group: '国家管网集团西南管道公司',
+  company: '贵阳输油气分公司',
+  curStation: '都匀作业区',
 }
 
 /**
@@ -138,20 +140,24 @@ const MQTT_CONFIG = {
     'Risk/New',
     'dashboard/risk/drawrisktime',
     'Visualization/DataComm/NewAlarm',
-    'Visualization/Number/RecentlyLevelByDate'
+    'Visualization/Number/RecentlyLevelByDate',
+    'Visualization/Number/RecentlyLevelByDateDYMZ',
+    'Visualization/Number/RecentlyLevelByDateKKQG',
+    'Visualization/Number/RecentlyLevelByDateDSSZ',
+    'Visualization/Number/RecentlyLevelByDateYWSZ'
   ],
 }
 //后台管理根路径
 const ISMSAdminWeb = {
   // path: "http://localhost:9528/#/",
-  // path: "http://11.100.46.218:8080/#/",
-  path: `http://192.168.195.134:8080/#/`,
+  path: "https://11.100.46.218:8080/#/",
+  // path: `http://192.168.195.134:8080/#/`,
   // path: `http://${window.location.hostname}:8080/#/`,
 }
 
 //都匀调度系统access_key配置
-ACCESS_KEY = ''
-SECRET_KEY = ''
+ACCESS_KEY = 'kczzol9ws3bk8gc1p0mx'
+SECRET_KEY = 'fakj8yw61ocot5uvub0o'
 //房顶配置
 const MODEL_ROOF_LIST = [{ model: 'JHFSZ', part: ['门卫室-顶', '办公区屋顶'] }]
 
@@ -623,6 +629,10 @@ const GY_STATIONS = [
     direction: 'right',
     position: [106.62632139900707, 26.650595691076745, 1.4650695463064403],
     layers: ['周界', '泄漏', '摄像头'],
+    webRTCUrl: "wss://dispatcher:1443/webrtc",
+    // webRTCUrl: "wss://192.168.10.39:1443/webrtc",
+    admin: "8889",
+    password: "123456",
   },
   {
     id: '657316634284793856',
@@ -633,6 +643,9 @@ const GY_STATIONS = [
     direction: 'left',
     position: [106.62630660166043, 26.650596074566966, 1.4660467809229363],
     layers: ['周界', '泄漏', '摄像头'],
+    webRTCUrl: "",
+    admin: "8889",
+    password: "123456",
   },
   {
     id: '657316533462114304',
@@ -643,6 +656,9 @@ const GY_STATIONS = [
     direction: 'right',
     position: [106.62631864686837, 26.650589347228493, 1.4654720522226603],
     layers: ['周界', '泄漏', '摄像头'],
+    webRTCUrl: "wss://192.168.20.31:1443/webrtc",
+    admin: "8889",
+    password: "123456",
   },
   {
     id: '657316587124039680',
@@ -653,6 +669,9 @@ const GY_STATIONS = [
     direction: 'right',
     position: [106.6263209022603, 26.650585399041464, 1.4657059185197159],
     layers: ['周界', '泄漏', '摄像头'],
+    webRTCUrl: "wss://11.100.46.233:1443/webrtc",
+    admin: "8889",
+    password: "123456",
   },
   {
     id: '',
@@ -663,6 +682,9 @@ const GY_STATIONS = [
     direction: 'right',
     position: [106.6263329708765, 26.65057999393088, 1.4648986180330343],
     layers: ['周界', '泄漏', '摄像头'],
+    webRTCUrl: "",
+    admin: "8889",
+    password: "123456",
   },
   // {
   //   id: '784104499768729600',
@@ -743,8 +765,8 @@ const GY_JGYT_CONFIG = [
         buildId: '657317980832538624',
         children: [
           {
-            id: '1',
-            // id: '660856349529219072',
+            // id: '1',
+            id: '660856349529219072',
             name: '云台1',
             ndTag: 'DY_Leak_PTZ_Concn',
           },
@@ -757,14 +779,14 @@ const GY_JGYT_CONFIG = [
         buildId: '657318879332147200',
         children: [
           {
-            id: '2',
-            // id: '660856349529219074',
+            // id: '2',
+            id: '660856349529219074',
             name: '云台1',
             ndTag: 'DS_JGYT_01_DATA_ND',
           },
           {
-            id: '3',
-            // id: '660856349529219076',
+            // id: '3',
+            id: '660856349529219076',
             name: '云台2',
             ndTag: 'DS_JGYT_02_DATA_ND',
           },
@@ -777,8 +799,8 @@ const GY_JGYT_CONFIG = [
         buildId: '657318695416111104',
         children: [
           {
-            id: '4',
-            // id: '660856349529219073',
+            // id: '4',
+            id: '660856349529219073',
             name: '云台1',
             ndTag: 'KK_Leak_PTZ_Concn',
           },
@@ -791,8 +813,8 @@ const GY_JGYT_CONFIG = [
         buildId: '657319107443564544',
         children: [
           {
-            id: '5',
-            // id: '660856349529219075',
+            // id: '5',
+            id: '660856349529219075',
             name: '云台1',
             ndTag: 'YW_Leak_PTZ_Concn',
           },

+ 104 - 0
public/js/fbky.js

@@ -0,0 +1,104 @@
+const FBKYLIST = [
+  {
+    id: '100', buildId: "002001", show: false, number: "800", name: "站控室电话", departmentId: "657316479015854080", cameraID: '654277056716087296', type: 'IP电话', description: 'IP电话', height: '10', location: { buildId: "002001", floorNo: 1, x: 142993, y: 181829 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '101', buildId: "002001", show: true, number: "801", name: "场站大门口", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 142993, y: 181829 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '102', buildId: "002001", show: true, number: "802", name: "工艺区入口", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 170785, y: 168499 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '103', buildId: "002001", show: true, number: "806", name: "车棚南侧", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 93349, y: 157396 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '104', buildId: "002001", show: true, number: "805", name: "工艺区西侧", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 123543, y: 110370 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '105', buildId: "002001", show: true, number: "804", name: "工艺区西北角", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 141861, y: 104851 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '106', buildId: "002001", show: true, number: "803", name: "工艺区东北角", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 195886, y: 130349 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '107', buildId: "002001", show: true, number: "807", name: "控制器音柱", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 127662, y: 146190 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '108', buildId: "002001", show: true, number: "808", name: "站控室吸顶扬声器1", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 123301, y: 152338 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '109', buildId: "002001", show: true, number: "809", name: "站控室吸顶扬声器2", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '扩音喇叭', description: '扩音喇叭', height: '10', location: { buildId: "002001", floorNo: 1, x: 124892, y: 146938 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '110', buildId: "002001", show: false, number: "11903", name: "工艺区喊话", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '广播', description: '工艺区喊话广播', height: '10', location: { buildId: "002001", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '111', buildId: "002001", show: false, number: "21903", name: "生活区喊话", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '广播', description: '生活区喊话广播', height: '10', location: { buildId: "002001", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '112', buildId: "002001", show: false, number: "31903", name: "站控室喊话", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '广播', description: '站控室喊话广播', height: '10', location: { buildId: "002001", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '113', buildId: "002001", show: false, number: "99997", name: "全喊话", departmentId: "657316479015854080", cameraID: '654277056716087296', type: '广播', description: '全喊话广播', height: '10', location: { buildId: "002001", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '200', buildId: "002003", show: false, number: "900", name: "值班室", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "IP电话", description: "IP电话", height: '10', location: { buildId: "002003", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '201', buildId: "002003", show: true, number: "901", name: "门卫室门口", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002003", floorNo: 1, x: 151147, y: 111633 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '202', buildId: "002003", show: true, number: "902", name: "综合值班室对面", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002003", floorNo: 1, x: 175525, y: 129842 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '203', buildId: "002003", show: true, number: "903", name: "综合值班室右侧", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002003", floorNo: 1, x: 180110, y: 148691 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '204', buildId: "002003", show: true, number: "904", name: "工艺区西南角", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002003", floorNo: 1, x: 141669, y: 190188 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '205', buildId: "002003", show: true, number: "905", name: "工艺区西北角", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002003", floorNo: 1, x: 104106, y: 161964 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '206', buildId: "002003", show: true, number: "906", name: "值班室音柱", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002003", floorNo: 1, x: 153289, y: 148709 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '207', buildId: "002003", show: true, number: "907", name: "值班室吸顶音箱", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002003", floorNo: 1, x: 157210, y: 148418 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '208', buildId: "002003", show: false, number: "1903", name: "工艺区喊话", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "广播", description: "工艺区喊话广播", height: '10', location: { buildId: "002003", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '209', buildId: "002003", show: false, number: "2903", name: "生活区喊话", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "广播", description: "生活区喊话广播", height: '10', location: { buildId: "002003", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '210', buildId: "002003", show: false, number: "99997", name: "全喊话", departmentId: "657316587124039680", cameraID: '654277056716087296', type: "广播", description: "全喊话广播", height: '10', location: { buildId: "002003", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '300', buildId: "002002", show: false, number: "900", name: "机柜间", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "IP电话", description: "IP电话", height: '10', location: { buildId: "002002", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '301', buildId: "002002", show: true, number: "901", name: "大门口", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002002", floorNo: 1, x: 219596, y: 249905 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '302', buildId: "002002", show: true, number: "902", name: "综合楼前东", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002002", floorNo: 1, x: 235655, y: 222241 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '303', buildId: "002002", show: true, number: "903", name: "综合楼前西", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002002", floorNo: 1, x: 210903, y: 227583 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '304', buildId: "002002", show: true, number: "904", name: "工艺区东南角", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002002", floorNo: 1, x: 261258, y: 196725 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '305', buildId: "002002", show: true, number: "905", name: "工艺区西南角", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002002", floorNo: 1, x: 150147, y: 191562 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '306', buildId: "002002", show: true, number: "906", name: "机柜间音柱", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002002", floorNo: 1, x: 223637, y: 236999 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '307', buildId: "002002", show: true, number: "907", name: "库房吸顶音箱", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "扩音喇叭", description: "扩音喇叭", height: '10', location: { buildId: "002002", floorNo: 1, x: 228977, y: 223699 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+  {
+    id: '308', buildId: "002002", show: false, number: "99997", name: "全", departmentId: "657316533462114304", cameraID: '654277056716087296', type: "广播", description: "广播", height: '10', location: { buildId: "002002", floorNo: 1, x: 125200, y: 151989 }, iconPath: "/Resource/Portrait/2024/12/11/icon_KY_nor@2x_2aba6726.png",
+  },
+]

+ 64 - 13
src/components/ImageVideoORI/index.vue

@@ -8,7 +8,11 @@
     </div>
     <div class="dialog-body">
       <div :style="imgStyle">
-        <img style="width: 100%; height: 100%; object-fit: contain" :src="url" v-if="url" />
+        <img
+          style="width: 100%; height: 100%; object-fit: contain"
+          :src="url"
+          v-if="url"
+        />
         <div class="image-slot" v-else>
           <i class="el-icon-video-camera"></i>
         </div>
@@ -47,7 +51,13 @@
             @mousedown.native="ptzCommHandle(23, false)"
             @mouseup.native="ptzCommHandle(23, true)"
           ></el-button>
-          <el-button style="margin-left: 0px" type="info" icon="el-icon-rank" size="mini" disabled></el-button>
+          <el-button
+            style="margin-left: 0px"
+            type="info"
+            icon="el-icon-rank"
+            size="mini"
+            disabled
+          ></el-button>
           <el-button
             style="margin-left: 0px"
             type="info"
@@ -98,9 +108,17 @@
           ></el-button>
           <br />
           <a>速度:</a>
-          <el-select style="margin-top: 10px; width: 70px" size="mini" v-model="speed" placeholder="请选择速度">
+          <el-select
+            style="margin-top: 10px; width: 70px"
+            size="mini"
+            v-model="speed"
+            placeholder="请选择速度"
+          >
             <el-option
-              v-for="item in Array.from({ length: 7 }, (item, index) => index + 1)"
+              v-for="item in Array.from(
+                { length: 7 },
+                (item, index) => index + 1
+              )"
               :key="item"
               :label="item"
               :value="item"
@@ -109,25 +127,50 @@
         </div>
         <div style="padding-top: 20px; padding-left: 15px">
           <a>预置点:</a>
-          <el-select style="width: 70px" size="mini" v-model="presetIndex" placeholder="请选择预置点">
+          <el-select
+            style="width: 70px"
+            size="mini"
+            v-model="presetIndex"
+            placeholder="请选择预置点"
+          >
             <el-option
-              v-for="item in Array.from({ length: 255 }, (item, index) => index + 1)"
+              v-for="item in Array.from(
+                { length: 255 },
+                (item, index) => index + 1
+              )"
               :key="item"
               :label="item"
               :value="item"
             ></el-option>
           </el-select>
-          <el-button style="margin-left: 10px; margin-top: 10px" type="info" size="mini" @click="ptzPresetHandle(8)"
+          <el-button
+            style="margin-left: 10px; margin-top: 10px"
+            type="info"
+            size="mini"
+            @click="ptzPresetHandle(8)"
             >设置</el-button
           >
-          <el-button style="margin-left: 10px; margin-top: 10px" type="info" size="mini" @click="ptzPresetHandle(39)"
+          <el-button
+            style="margin-left: 10px; margin-top: 10px"
+            type="info"
+            size="mini"
+            @click="ptzPresetHandle(39)"
             >转到</el-button
           >
         </div>
       </div>
       <div class="playback-panel" v-if="cameraData.canPlayBack">
-        <el-date-picker v-model="startTime" type="datetime" placeholder="选择回放开始时间"></el-date-picker>
-        <el-button style="margin-left: 10px" type="success" @click="playBackHandle">回放</el-button>
+        <el-date-picker
+          v-model="startTime"
+          type="datetime"
+          placeholder="选择回放开始时间"
+        ></el-date-picker>
+        <el-button
+          style="margin-left: 10px"
+          type="success"
+          @click="playBackHandle"
+          >回放</el-button
+        >
         <el-button type="primary" @click="realTimekHandle">实时</el-button>
       </div>
     </div>
@@ -173,7 +216,12 @@ export default {
         let clientHeight = document.documentElement.clientHeight;
         return {
           height: clientHeight - 174 + this.addHeight + "px",
-          width: ((clientHeight - 234) / (this.size.height - 60)) * (this.size.width - 40) + 40 + this.addWidth + "px",
+          width:
+            ((clientHeight - 234) / (this.size.height - 60)) *
+              (this.size.width - 40) +
+            40 +
+            this.addWidth +
+            "px",
         };
       } else {
         return {
@@ -220,7 +268,8 @@ export default {
   },
   methods: {
     init(str) {
-      this.ws = new WebSocket("ws://" + window.location.host + process.env.VUE_APP_BASE_API + "/VideoOverWebSocket");
+      this.ws = new WebSocket(VUE_APP_BASE_WS() + "/VideoOverWebSocket");
+      // this.ws = new WebSocket("ws://" + window.location.host + process.env.VUE_APP_BASE_API + "/VideoOverWebSocket");
       let _this = this;
       this.ws.onmessage = function (evt) {
         if (typeof evt.data === "string") {
@@ -258,7 +307,9 @@ export default {
     playBackHandle() {
       if (this.ws && this.ws.readyState == 1) {
         let time = Dayjs(this.startTime).format("YYYY-MM-DD HH:mm:ss");
-        this.ws.send(JSON.stringify({ id: this.cameraData.id, startTime: time }));
+        this.ws.send(
+          JSON.stringify({ id: this.cameraData.id, startTime: time })
+        );
       } else {
         this.init(JSON.stringify({ id: this.cameraData.id, startTime: time }));
       }

+ 1 - 1
src/store/modules/mqtt.js

@@ -21,7 +21,7 @@ const mutations = {
       username: MQTT_CONFIG.username,
       password: MQTT_CONFIG.password,
     }
-    const host = 'ws://' + window.location.host + BASE_URL + MQTT_CONFIG.host
+    const host = 'wss://' + window.location.host + BASE_URL + MQTT_CONFIG.host
 
     console.log(new Date(), 'Connecting global mqtt client')
 

+ 0 - 2
src/utils/webRTU.js

@@ -1,2 +0,0 @@
-import { rtcHelperWithLogging } from './plugins/tr-webrtc.min.js';
-let rtcHelper = rtcHelperWithLogging;

+ 4 - 4
src/views/Home.vue

@@ -8,13 +8,13 @@
     <router-view ref="routerView" />
     <!-- 底部背景 -->
     <div class="footer" v-show="hasToken && !fullScreen"></div>
-    <base-footer v-show="hasToken && !fullScreen" />
+    <base-footer v-show="false" />
     <!-- 应急选项卡列表 -->
-    <!-- <card-list-dialog /> -->
+    <card-list-dialog />
     <!-- 应急选项卡详情 -->
-    <!-- <card-detail-dialog /> -->
+    <card-detail-dialog />
     <!-- 联系人弹窗 -->
-    <!-- <contact-info-dialog /> -->
+    <contact-info-dialog />
     <!-- 报警详情弹窗 由vuex控制 -->
     <alarm-detail-dialog />
     <!-- 一键报警弹窗 由vuex控制 -->

+ 1 - 1
src/views/basePage/components/videoWindow/VideoImageWindow.vue

@@ -363,7 +363,7 @@ export default {
     },
     init(str) {
       // this.socketList[`ws_${this.cameraId}`];
-      this.ws = new WebSocket('ws://' + window.location.host + BASE_URL + '/VideoOverWebSocket')
+      this.ws = new WebSocket('wss://' + window.location.host + BASE_URL + '/VideoOverWebSocket')
       this.ws.onmessage = evt => {
         if (typeof evt.data === 'string') {
           console.log(JSON.parse(evt.data).Msg)

+ 5 - 2
src/views/basePage/index.vue

@@ -13,7 +13,7 @@
       @showPersonLayer="showPersonLayer"
       @openBuilding="openBuilding"
     />
-    <footer-navigation v-show="fullScreen" />
+    <footer-navigation v-show="mapMode.value === 'home'" />
 
     <!-- 楼层控制 -->
     <floor-control
@@ -140,6 +140,7 @@
     >
       <div v-if="!fullScreen" class="panel_box right_panel">
         <!-- <weather /> -->
+        <sound-statistics />
         <person-statistics />
         <intelligent-video />
       </div>
@@ -197,6 +198,7 @@ import Overview from "./panels/Overview";
 import RiskStatistics from "./panels/RiskStatistics";
 import RiskHint from "./panels/RiskHint";
 import Weather from "./panels/Weather";
+import SoundStatistics from "./panels/SoundStatistics";
 import PersonStatistics from "./panels/PersonStatistics";
 import IntelligentVideo from "./panels/IntelligentVideo/index";
 import StationSelect from "./panels/StationSelect";
@@ -251,6 +253,7 @@ export default {
     RiskStatistics,
     RiskHint,
     Weather,
+    SoundStatistics,
     PersonStatistics,
     IntelligentVideo,
     GatherAlarmDialog,
@@ -359,7 +362,7 @@ export default {
     },
     openDialog,
     setMapMode(newValue) {
-      console.log(newValue.value);
+      console.log("模式参数信息:",newValue.value);
       const mode = MAP_MODE_LIST[newValue.value];
       if (!!mode) {
         console.log("模式切换");

+ 222 - 0
src/views/basePage/mixins/LoadLayer/fbky.js

@@ -0,0 +1,222 @@
+import { Entity, NearFarScalar, PolylineDashMaterialProperty, DistanceDisplayCondition, Cartesian3, Color, PropertyBag } from "cesium";
+import { getTagList } from "@/API/fire";
+import { flyToByViewer, addNewDatasource } from "@/utils/mapUtil";
+import { _locate } from '@/utils'
+import { getViewer } from "@/store/map/mapService";
+import { mapGetters } from 'vuex'
+export default {
+  data() {
+    return {
+      fbkyTagsData: [],
+      fbkyAlarmIds: [],
+      cloneFbkyTagsData: [],
+    };
+  },
+  computed: {
+    ...mapGetters(['buildId', 'buildInfo', 'mapMode', 'switchConfig']),
+    fbkyTagsShow() {
+      if (this.mapMode.value === '3d') {
+        return this.switchConfig.find(e => e?.type && e.type === 'fbky')?.show
+      } else {
+        return false
+      }
+    },
+  },
+  watch: {
+    buildId: {
+      handler(val) {
+        if (!val) return
+        setTimeout(() => {
+          // console.log('防爆扩音图层建筑变化', val)
+          this.getFbkyTagsData()
+          // this.animationFbky({})
+        }, 1000)
+      },
+      immediate: true,
+    },
+  },
+  mounted() {
+    setTimeout(() => {
+      this.initFbky()
+    }, 1000)
+  },
+  methods: {
+    initFbky() {
+      this.$store.dispatch("globalConfig/pushSwitchConfig", {
+        type: "fbky",
+        label: "防爆扩音",
+        name: "防爆扩音",
+        show: true,
+        selected: false,
+        elements: this.fbkyTagsData,
+      });
+    },
+    async getFbkyTagsData() {
+      try {
+        let p = { buildId: this.buildInfo.positioningBuildId }
+        // console.log('防爆扩音数据获取参数:', p)
+        let res = await getTagList(p);
+        // this.fbkyTagsData = res.data.content || [];
+        this.fbkyTagsData = FBKYLIST.filter((e) => e.buildId == this.buildInfo.positioningBuildId && e.show);
+        console.log("防爆扩音信息", this.fbkyTagsData);
+        this.$store.dispatch("globalConfig/updateSwitchConfig", {
+          type: "fbky",
+          label: "防爆扩音",
+          name: "防爆扩音",
+          show: this.fbkyTagsShow,
+          selected: false,
+          elements: this.fbkyTagsData,
+        });
+        this.addFbkyTags();
+      } catch (err) {
+        console.log(err);
+      }
+    },
+    addFbkyTags() {
+      let dataSource = addNewDatasource("layer_fbky");
+      this.fbkyTagsData.forEach((data, index) => {
+        const gpsPoint = this.transPosition([{ x: data.location.x, y: data.location.y, z: data.height }])
+        dataSource.entities.add(
+          new Entity({
+            id: data.id,
+            position: Cartesian3.fromDegrees(...gpsPoint[0]),
+            show: this.fbkyTagsShow,
+            billboard: {
+              image: BASE_URL + data.iconPath,
+              scale: 0.5, //固定值
+              scaleByDistance: new NearFarScalar(10, 1, 10000, 1),
+            },
+            polyline: {
+              positions: Cartesian3.fromDegreesArrayHeights([
+                gpsPoint[0][0],
+                gpsPoint[0][1],
+                gpsPoint[0][2],
+                gpsPoint[0][0],
+                gpsPoint[0][1],
+                0,
+              ]),
+              width: 2,
+              material: new PolylineDashMaterialProperty({
+                color: Color.CYAN,
+              }),
+            },
+            properties: new PropertyBag({
+              type: "layer_fbky",
+              details: data,
+            }),
+          })
+        );
+      });
+    },
+    async pushFbkyStatus(data) {
+      if (data.id) {
+        this.fbkyAlarmIds = [data.id]
+      } else {
+        data.id = this.fbkyAlarmIds.length ? this.fbkyAlarmIds[0] : ''
+      }
+      if (data.alarmType > 0) {
+        // console.log('防爆扩音报警数据:', data)
+        //模型判断与切换
+        if (data?.buildId === this.buildInfo?.positioningBuildId) {
+          // console.log("聚焦报警");
+          this.animationFbky(data)
+        } else {
+          const curStation = GY_STATIONS.find(e => e.positioningBuildId === data.buildId)
+          // console.log('报警站点信息:', curStation)
+          if (!curStation) return
+          this.$store.dispatch('globalConfig/setMapMode', {
+            value: '3d',
+          })
+          await this.$store.dispatch('model/setBuildInfoByBuildId', curStation.buildId)
+          setTimeout(() => {
+            this.animationFbky(data)
+          }, 2000)
+        }
+      } else {
+        this.animationFbky(data)
+      }
+    },
+    animationFbky(data) {
+      const viewer = getViewer()
+      const dataSource = viewer.dataSources.getByName('layer_fbky')
+      if (dataSource.length > 0) {
+        let item = dataSource[0].entities.getById(data.id)
+        console.log(item, "地图实体数据", item.properties.details._value, '接收参数', data);
+        if (!!item) {
+          const { longitude, latitude } = this.buildInfo.gpsCoordinate0
+          const gpsAlarmPoint = _locate(item.properties.details._value.location.x, item.properties.details._value.location.y, { x: longitude, y: latitude })
+          if (data.alarmType > 0) {
+            //报警点标记
+            if (data.alarmPoint) {
+              //地图元素
+              item.show = true
+              setTimeout(() => {
+                item.billboard = {
+                  image: BASE_URL + "/Resource/Portrait/2024/12/05/icon_HZ_sel@2x_2d5703e3.png",
+                  width: 50,
+                  height: 50,
+                  // verticalOrigin: VerticalOrigin.BOTTOM,
+                  distanceDisplayCondition: new DistanceDisplayCondition(0, 700.0),
+                }
+                item.position = Cartesian3.fromDegrees(gpsAlarmPoint.x, gpsAlarmPoint.y, item.properties.details._value.height)
+                //视角漂移
+                flyToByViewer(item)
+                //增加属性
+                item.properties.details._value.alarmPoint = data.alarmPoint
+                item.properties.details._value.alarmType = data.alarmType
+                item.properties.details._value.camera = data.camera
+                item.properties.details._value.alarmState = 1
+                item.properties.details._value.alarmStatus = true
+                item.properties.details._value.alarmPosition = [gpsAlarmPoint.x, gpsAlarmPoint.y, item.properties.details._value.height]
+                // console.log(item.properties.details._value, "66666666666666666666666666666");
+                //数据
+                this.$store.dispatch('globalConfig/updateAlarmDataObj', {
+                  fbky: [item.properties.details._value],
+                })
+                //视频弹窗
+                if (!!data?.camera?.id) {
+                  this.$store.dispatch('dialog/openVideoDialog', data.camera.id)
+                }
+              }, 1000)
+            } else {
+              item.show = true
+              setTimeout(() => {
+                item.billboard = {
+                  image: BASE_URL + item.properties.details._value.iconPath,
+                  width: 50,
+                  height: 50,
+                  distanceDisplayCondition: new DistanceDisplayCondition(0, 700.0),
+                }
+                item.position = Cartesian3.fromDegrees(gpsAlarmPoint.x, gpsAlarmPoint.y, item.properties.details._value.height)
+              }, 200)
+            }
+          } else {
+            // this.$store.dispatch('globalConfig/updateAlarmDataObj', {
+            //   fbky: this.fbkyTagsData,
+            // })
+            item.show = true
+            setTimeout(() => {
+              item.billboard = {
+                image: BASE_URL + item.properties.details._value.iconPath,
+                width: 50,
+                height: 50,
+                distanceDisplayCondition: new DistanceDisplayCondition(0, 700.0),
+              }
+              item.position = Cartesian3.fromDegrees(gpsAlarmPoint.x, gpsAlarmPoint.y, item.properties.details._value.height)
+            }, 200)
+            // console.log('c测试', gpsAlarmPoint, item);
+
+          }
+        }
+      }
+    },
+    transPosition(pointList = []) {
+      const { longitude, latitude } = this.buildInfo.gpsCoordinate0
+      return pointList.reduce((pre, cur) => {
+        const { x, y } = _locate(cur.x, cur.y, { x: longitude, y: latitude })
+        pre.push([x, y, +cur.z])
+        return pre
+      }, [])
+    },
+  },
+};

+ 2 - 1
src/views/basePage/mixins/LoadLayer/index.js

@@ -6,7 +6,8 @@ import perimeter from './perimeter' //周界
 import camera from './camera' //摄像头
 import fire from './fire' //火灾
 import risk from './risk' //风险
+import fbky from './fbky' //防爆扩音
 
 export default {
-  mixins: [Person, Rail, AreaAlarm, JGYT, perimeter, camera, fire, risk],
+  mixins: [Person, Rail, AreaAlarm, JGYT, perimeter, camera, fire, risk, fbky],
 }

+ 1 - 1
src/views/basePage/mixins/LoadLayer/perimeter.js

@@ -228,7 +228,7 @@ export default {
         }
         let item = dataSource[0].entities.getById(data.segmentId)
         if (!!item) {
-          if (data.alarmType > 0) {
+          if (data.alarmType > 0 || data.alarmType < 4) {
             if (data.alarmPoint) {
               //地图元素
               let x = 1

+ 28 - 0
src/views/basePage/mixins/MapEvent.js

@@ -175,6 +175,34 @@ export default {
               })
             } else if (type === 'fbky') {
               console.log("数据内容fbky:----------------", data);
+              const fbkyInfo = pickObj.id.properties._details._value
+              const gpsAlarmPoint = this.transPosition([{ x: fbkyInfo.location.x, y: fbkyInfo.location.y, z: fbkyInfo.height }])
+              // console.log('坐标点转化', gpsAlarmPoint);
+              fbkyInfo.alarmType = -1
+              this.mapDialogConfig.fire = []
+              // console.log("无报警", this.mapDialogConfig.fbky);
+              this.mapDialogConfig.fire.push({
+                show: false,
+                dialogMsg: { data: fbkyInfo, position: [gpsAlarmPoint[0][0], gpsAlarmPoint[0][1], gpsAlarmPoint[0][2]] },
+              })
+              for (let d of this.mapDialogConfig.fbky) {
+                ; (() => {
+                  setTimeout(() => {
+                    d.show = true
+                    if (d.dialogMsg.data.cameras?.length) {
+                      this.$store.dispatch('dialog/openVideoDialog', d.dialogMsg.data.cameras[0].cameraId)
+                    }
+                    this.$store.dispatch('home/setMapPopupConfig', {
+                      isShow: true,
+                      type: 'point',
+                      position: [gpsAlarmPoint[0][0], gpsAlarmPoint[0][1], gpsAlarmPoint[0][2]],
+                      dialogid: 'fbky_' + d.dialogMsg?.data?.id,
+                      p1: 140,
+                      p2: 236,
+                    })
+                  }, 0)
+                })()
+              }
               // this.$store.dispatch('dialog/openLayerDetailDialog', {
               //   id: data.id,
               //   type: 'fbky',

+ 4 - 4
src/views/basePage/mixins/MqttUtil.js

@@ -27,7 +27,7 @@ export default {
         username: MQTT_CONFIG.username,
         password: MQTT_CONFIG.password,
       }
-      let host = this.VUE_APP_BASE_WS() + MQTT_CONFIG.host
+      let host = VUE_APP_BASE_WS() + MQTT_CONFIG.host
       //host = "ws://192.168.92.200:18002" + MQTT_CONFIG.host;
       //console.log(host);
       console.log(new Date(), 'Connecting map mqtt client')
@@ -76,9 +76,9 @@ export default {
       this.globalClient.unsubscribe(topics)
     },
     //server地址
-    VUE_APP_BASE_WS() {
-      return 'ws://' + window.location.host + BASE_URL
-    },
+    // VUE_APP_BASE_WS() {
+    //   return 'ws://' + window.location.host + BASE_URL
+    // },
     onMessage(packet) {
       // console.log(packet);
       const topic = packet.topic

+ 187 - 4
src/views/basePage/panels/PersonStatistics.vue

@@ -1,8 +1,9 @@
 <template>
   <div class="page_container">
-    <base-title title="进出人员" />
+    <base-title title="出入统计" />
     <div class="page_content">
-      <div class="person_title">人员信息</div>
+      <!-- 都匀人员不统计 -->
+      <!-- <div class="person_title">人员信息</div>
       <div class="person_num_box">
         <vue-seamless
           :data="personList"
@@ -59,8 +60,81 @@
           </div>
           <div v-else>暂无数据</div>
         </vue-seamless>
-      </div>
+      </div> -->
       <div class="person_type_box">
+        <div class="person_title">出入设备</div>
+        <div class="type_content">
+          <div class="left_part">
+            <img
+              :src="require('@/assets/imgs/panels/img_personnel_02@2x.png')"
+              alt=""
+              @click="openPersonList()"
+            />
+            <span class="totle">{{ count }}</span>
+            <span class="text">总数</span>
+          </div>
+          <div class="right_part">
+            <div
+              class="row_item"
+              v-for="(item, index) in devicesTypeCount"
+              :key="index"
+            >
+              <img
+                v-if="item.name === '员工'"
+                :src="require('@/assets/imgs/panels/icon_staff@2x.png')"
+                alt=""
+              />
+              <img
+                v-if="item.name === '访客'"
+                :src="require('@/assets/imgs/panels/icon_visitor@2x.png')"
+                alt=""
+              />
+              <img
+                v-if="item.name === '施工'"
+                :src="require('@/assets/imgs/panels/icon_construction@2x.png')"
+                alt=""
+              />
+              <div class="row_main">
+                <img
+                  :src="require('@/assets/imgs/panels/icon_arrow@2x.png')"
+                  alt=""
+                />
+                <span class="name">{{ item.name }}</span>
+                <div class="line"></div>
+                <span class="num">{{ item.value }}</span>
+                <span class="unit">个</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="person_events_box">
+        <div class="person_title">出入信息</div>
+        <div class="person_event_box">
+          <vue-seamless
+            :data="eventsList"
+            class="seamless-warp-event"
+            :class-option="scrollOptionEvent"
+            ref="seamlessScroll"
+            :key="seamLessTimeKeyEvent"
+          >
+            <div v-if="eventsList.length">
+              <div class="event_item" v-for="item of eventsList" :key="item.id">
+                <div class="person_event_title">
+                  <span class="person_event_name">{{
+                    item.accessControlName
+                  }}</span>
+                  <span class="split"></span>
+                  <span class="person_event_time">{{ item.eventTime }}</span>
+                </div>
+                <div class="person_event_content">{{ item.content }}</div>
+              </div>
+            </div>
+            <div v-else>暂无数据</div>
+          </vue-seamless>
+        </div>
+      </div>
+      <!-- <div class="person_type_box">
         <div class="person_title">类型统计</div>
         <div class="type_content">
           <div class="left_part">
@@ -106,7 +180,7 @@
             </div>
           </div>
         </div>
-      </div>
+      </div> -->
     </div>
   </div>
 </template>
@@ -115,6 +189,8 @@
 import BaseTitle from "./BaseTitle.vue";
 import VueSeamless from "vue-seamless-scroll";
 import { getPersonTypeList, getAccessInfo } from "@/API/positioning";
+import { getAccessInfoList, getAccessLogList } from "@/API/accessControl";
+import Dayjs from "dayjs";
 
 export default {
   name: "PersonStatistics",
@@ -122,7 +198,9 @@ export default {
   data() {
     return {
       total: 4,
+      count: 6,
       seamLessTimeKey: new Date().getTime(),
+      seamLessTimeKeyEvent: new Date().getTime(),
       personTypeCount: [
         {
           name: "员工",
@@ -137,6 +215,20 @@ export default {
           value: 1,
         },
       ],
+      devicesTypeCount: [
+        {
+          name: "都匀末站",
+          value: 3,
+        },
+        {
+          name: "凯口清管站",
+          value: 1,
+        },
+        {
+          name: "独山首站",
+          value: 2,
+        },
+      ],
       personRiskCount: [
         {
           code: "306001",
@@ -165,6 +257,12 @@ export default {
         waitTime: 5000,
         openWatch: true,
       },
+      scrollOptionEvent: {
+        limitMoveNum: 1,
+        singleHeight: 66,
+        waitTime: 5000,
+        openWatch: true,
+      },
       personList: [
         {
           id: "1",
@@ -211,16 +309,54 @@ export default {
           imgUrl: "~@/assets/imgs/stationMap/img_无照片.png",
         },
       ],
+      eventsList: [
+        {
+          id: "1",
+          accessControlName: "都匀门口人脸识别",
+          eventTime: "2025-01-16 15:51:46",
+          content: "【张华亚】在门禁【都匀门口人脸识别】人脸认证通过",
+        },
+        // {
+        //   id: "3",
+        //   name: "306004",
+        //   startTime: "2022-11-16 15:51:46",
+        //   content: "周界入侵触发,事件等级较低",
+        // },
+        // {
+        //   id: "4",
+        //   name: "306003",
+        //   startTime: "2022-11-16 15:51:46",
+        //   content: "激光云台触发气体泄漏,事件等级中",
+        // },
+      ],
     };
   },
   created() {
     this.openPersonInfo();
+    this.initAccessLogList();
   },
   mounted() {
     // this.getPersonTypeList();
     // this.startMqtt();
   },
   methods: {
+    async initAccessLogList() {
+      try {
+        const params = {
+          pageSize: 100,
+          pageIndex: 1,
+          startTime: Dayjs(new Date())
+            .subtract(1, "day")
+            .format("YYYY-MM-DD HH:mm:ss"),
+          endTime: Dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss"),
+        };
+        const res = await getAccessLogList(params);
+        this.eventsList = res.data.content;
+        console.log("门禁事件列表", params, this.eventsList);
+      } catch (err) {
+        console.log(err);
+      }
+    },
     async openPersonInfo() {
       try {
         const res = await getAccessInfo({ id: "789185626355277824" });
@@ -442,6 +578,53 @@ export default {
         }
       }
     }
+    .person_events_box {
+      .person_event_box {
+        height: 66px;
+        overflow: hidden;
+        .seamless-warp-event {
+          max-height: 66px;
+          .event_item {
+            height: 14%;
+            position: relative;
+            .person_event_title {
+              margin-top: 2px;
+              height: 27px;
+              background-image: linear-gradient(
+                90deg,
+                #53A3FF 2%,
+                rgba(249, 40, 40, 0) 100%
+              );
+              display: flex;
+              align-items: center;
+              color: #fff;
+              position: relative;
+              img {
+                width: 14px;
+                height: 14px;
+              }
+              .person_event_name {
+                margin-left: 19px;
+              }
+              .split {
+                width: 2px;
+                height: 20px;
+                border-left: 2px solid #fff;
+                margin: 0 8px;
+              }
+            }
+            .person_event_content {
+              margin-left: 14px;
+              padding: 10px 0;
+              font-size: 13px;
+              color: #ffffff;
+              letter-spacing: 1px;
+              font-weight: 400;
+            }
+          }
+        }
+      }
+    }
     .right_part {
       width: 300px;
       display: flex;

+ 22 - 3
src/views/basePage/panels/RiskStatistics/index.vue

@@ -20,11 +20,13 @@
 import BaseTitle from "../BaseTitle.vue";
 import RiskChart from "./RiskChart.vue";
 import { random } from "lodash-es";
+import { mapGetters } from "vuex";
 export default {
   name: "RiskStatistics",
   components: { BaseTitle, RiskChart },
   data() {
     return {
+      dId: "0",
       searchType: "1",
       // levelTrendData: {
       //   name: ["11.30", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6"],
@@ -42,7 +44,18 @@ export default {
       },
     };
   },
-
+  watch: {
+    departmentId(oldVal, newVal) {
+      console.log("部门id信息风险统计", oldVal, newVal, this.buildId);
+      // if (oldVal === newVal) {
+      // }
+      this.dId = newVal;
+      setTimeout(() => {}, 200);
+    },
+  },
+  computed: {
+    ...mapGetters(["departmentId", "buildId"]),
+  },
   mounted() {
     this.startMqtt();
     return;
@@ -57,7 +70,13 @@ export default {
   },
   methods: {
     startMqtt() {
-      const topics = ["Visualization/Number/RecentlyLevelByDate"];
+      const topics = [
+        "Visualization/Number/RecentlyLevelByDate",
+        "Visualization/Number/RecentlyLevelByDateDYMZ",
+        "Visualization/Number/RecentlyLevelByDateKKQG",
+        "Visualization/Number/RecentlyLevelByDateDSSZ",
+        "Visualization/Number/RecentlyLevelByDateYWSZ",
+      ];
       const _this = this;
       this.$store.dispatch("mqtt/subscribe", {
         topic: topics,
@@ -75,7 +94,7 @@ export default {
                 })
               );
             });
-            // console.log("风险统计数据", this.levelTrendData.data);
+            console.log("风险统计数据", this.levelTrendData.data);
           }
         },
       });

+ 228 - 0
src/views/basePage/panels/SoundStatistics.vue

@@ -0,0 +1,228 @@
+<template>
+  <div class="page_container">
+    <base-title title="防爆扩音" />
+    <div class="page_content">
+      <div class="person_num_box">
+        <div class="item" v-for="item of fbkyList" :key="item.id">
+          <div class="left">
+            <img src="~@/assets/imgs/maps/img_wqr.png" @click="openInfo(item)" />
+            <span class="totle">{{ item.count }}</span>
+            <span class="text">数量</span>
+          </div>
+          <div class="divider"></div>
+          <div class="right">
+            <div class="position">{{ item.name }}</div>
+            <div class="rymain">
+              <div class="tag">
+                <el-tag
+                  class="select-tag"
+                  v-for="it in item.list"
+                  size="small"
+                  :key="it.id"
+                  :type="it.id"
+                  effect="dark"
+                >
+                  {{ it.name }}
+                </el-tag>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import BaseTitle from "./BaseTitle.vue";
+export default {
+  name: "Weather",
+  components: { BaseTitle },
+  data() {
+    return {
+      fbkyList: [
+        {
+          id: "1",
+          name: "都匀末站",
+          count: 9,
+          list: [
+            { id: "1", name: "大门口" },
+            { id: "2", name: "工艺区" },
+          ],
+        },
+        {
+          id: "2",
+          name: "凯口清管站",
+          count: 6,
+          list: [
+            { id: "1", name: "大门口" },
+            { id: "2", name: "工艺区" },
+          ],
+        },
+        {
+          id: "3",
+          name: "独山首站",
+          count: 6,
+          list: [
+            { id: "1", name: "大门口" },
+            { id: "2", name: "工艺区" },
+          ],
+        },
+      ],
+    };
+  },
+  mounted() {
+    this.init();
+    this.startMqtt();
+  },
+  methods: {
+    init() {
+      this.fbkyList[0].count = FBKYLIST.filter(
+        (e) => e.buildId == "002001" && e.type == "扩音喇叭"
+      ).length;
+      this.fbkyList[1].count = FBKYLIST.filter(
+        (e) => e.buildId == "002002" && e.type == "扩音喇叭"
+      ).length;
+      this.fbkyList[2].count = FBKYLIST.filter(
+        (e) => e.buildId == "002003" && e.type == "扩音喇叭"
+      ).length;
+      this.fbkyList[0].list = FBKYLIST.filter(
+        (e) => e.buildId == "002001" && e.type == "扩音喇叭"
+      );
+      this.fbkyList[1].list = FBKYLIST.filter(
+        (e) => e.buildId == "002002" && e.type == "扩音喇叭"
+      );
+      this.fbkyList[2].list = FBKYLIST.filter(
+        (e) => e.buildId == "002003" && e.type == "扩音喇叭"
+      );
+      console.log("防爆扩音系统设备统计", this.fbkyList);
+    },
+    openInfo(item) {},
+    startMqtt() {
+      const topics = [
+        "DataCommunication/TagData/xxx",
+        "DataCommunication/TagData/xxx",
+        "DataCommunication/TagData/xxx",
+        "DataCommunication/TagData/xxx",
+        "DataCommunication/TagData/xxx",
+        "DataCommunication/TagData/xxx",
+      ];
+      const _this = this;
+      this.$store.dispatch("mqtt/subscribe", {
+        topic: topics,
+        onMessage: (topic, message, packet) => {
+          const content = message.toString();
+          const data = JSON.parse(content);
+          if (topic.startsWith("DataCommunication/TagData/")) {
+            const topicIndex = topics.indexOf(topic);
+            if (topicIndex > -1) {
+              _this.weatherList[topicIndex] = data.Value;
+              _this.weatherList[topicIndex] = data.Unit;
+            }
+          }
+        },
+      });
+      this.$once("hook:beforeDestroy", () => {
+        this.$store.dispatch("mqtt/unsubscribe", topics);
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.page_container {
+  width: 410px;
+  z-index: 2;
+  .page_content {
+    width: 100%;
+    height: 210px;
+    .person_num_box {
+      width: 100%;
+      height: auto;
+      overflow: hidden;
+      .item {
+        margin-top: 6px;
+        margin-left: 6px;
+        height: 48%;
+        display: flex;
+        position: relative;
+        .left {
+          width: 18%;
+          height: 100%;
+          text-align: center;
+          margin-right: 8px;
+          display: flex;
+          flex-direction: column;
+          justify-content: center;
+          align-items: center;
+          img {
+            width: 80px;
+            height: 80px;
+          }
+          .totle {
+            margin-top: -72px;
+            font-size: 20px;
+            color: #ffffff;
+            letter-spacing: 1.26px;
+            text-shadow: 0 0 10px rgba(0, 180, 255, 0.5);
+            font-weight: 700;
+          }
+          .text {
+            margin-top: -4px;
+            font-size: 14px;
+            color: #ffffff;
+            letter-spacing: 0;
+            text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
+            font-weight: 400;
+          }
+        }
+        .divider {
+          width: 1%;
+        }
+        .right {
+          width: 80%;
+          height: 70px;
+          position: relative;
+          .position {
+            font-family: 优设标题黑;
+            font-size: 16px;
+            color: #ffffff;
+            letter-spacing: 1.29px;
+            position: absolute;
+            z-index: 99;
+            background-image: linear-gradient(180deg, #eeeeee, #5cd5ff);
+            -webkit-background-clip: text;
+            background-clip: text;
+            color: transparent;
+            font-weight: 400;
+            padding-left: 10px;
+            margin-top: -7px;
+          }
+          .rymain {
+            max-height: 110px;
+            width: 100%;
+            height: calc(100% - 14px);
+            position: absolute;
+            bottom: 0;
+            opacity: 0.9;
+            background-image: linear-gradient(
+              270deg,
+              rgba(0, 24, 46, 0.1) 0%,
+              #00487b 98%
+            );
+            font-size: 12px;
+            overflow: auto;
+            color: #b3c0d4;
+            .tag {
+              .select-tag {
+                margin: 2px;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 12 - 5
src/views/components/baseFooter/FooterNavigation.vue

@@ -1,5 +1,8 @@
 <template>
-  <div class="footer-navigation-container">
+  <div
+    class="footer-navigation-container"
+    v-if="$route.name == 'basePage' || $route.name === null"
+  >
     <div class="btn-box">
       <div
         class="btn"
@@ -106,6 +109,9 @@ export default {
       ],
     };
   },
+  watch: {
+    $route(to, from) {},
+  },
   mounted() {
     this.getNavigationList();
   },
@@ -157,7 +163,7 @@ export default {
           item.level = this.btnPositionList[index].level;
           this.btnList.push(btn);
         });
-        // this.initMap(); //都匀加载驾驶舱模型//托克托不需要
+        this.initMap(); //都匀加载驾驶舱模型//托克托不需要
         // console.log(this.btnList, "按钮列表");
       } catch (err) {
         console.log(err);
@@ -195,7 +201,7 @@ export default {
     openFooterDialog(type) {
       if (type) {
         switch (type) {
-          case "防爆扩音":
+          case "fbky":
             console.log("防爆扩音");
             this.$store.dispatch("globalConfig/setSoundDialog", {
               show: true,
@@ -203,7 +209,7 @@ export default {
               type: "All",
             });
             break;
-          case "出入控制":
+          case "crkz":
             console.log("出入控制");
             this.$store.dispatch("globalConfig/setAccessControlDialog", {
               show: true,
@@ -211,7 +217,7 @@ export default {
               type: "All",
             });
             break;
-          case "激光云台":
+          case "jgyt":
             console.log("激光云台");
             this.$store.dispatch("globalConfig/setJGYTControlDialog", {
               show: true,
@@ -235,6 +241,7 @@ export default {
   border: 0px solid red;
   pointer-events: initial;
   position: absolute;
+  z-index: 1800; // loading层是2000 设置高一些,下拉菜单会盖住loading层
   left: 50%;
   bottom: 0;
   transform: translate(-50%, 0);

+ 13 - 10
src/views/components/baseHeader/left.vue

@@ -71,17 +71,20 @@
             <el-dropdown-item disabled>
               <!-- <div>{{ username }}</div> -->
             </el-dropdown-item>
-            <el-dropdown-item @click.native="test2">
+            <!-- <el-dropdown-item @click.native="test2">
               <span style="display: block">110一键报警</span>
             </el-dropdown-item>
-            <el-dropdown-item @click.native="test3">
-              <span style="display: block">防爆扩音</span>
-            </el-dropdown-item>
             <el-dropdown-item @click.native="test">
               <span style="display: block">报警声音弹窗</span>
             </el-dropdown-item>
             <el-dropdown-item @click.native="test1">
               <span style="display: block">入场动画开关</span>
+            </el-dropdown-item> -->
+            <!-- <el-dropdown-item @click.native="test3">
+              <span style="display: block">防爆扩音</span>
+            </el-dropdown-item> -->
+            <el-dropdown-item @click.native="toAdmin">
+              <span style="display: block">管理系统</span>
             </el-dropdown-item>
             <el-dropdown-item @click.native="goToLogout">
               <span style="display: block">退出登录</span>
@@ -274,12 +277,12 @@ export default {
     setShouldAnimation,
     test3() {
       console.log("防爆扩音");
-      // this.getTestList();
-      this.$store.dispatch("globalConfig/setSoundDialog", {
-        show: true,
-        dialogMsg: {},
-        type: "All",
-      });
+      this.getTestList();
+      // this.$store.dispatch("globalConfig/setSoundDialog", {
+      //   show: true,
+      //   dialogMsg: {},
+      //   type: "All",
+      // });
     },
     async getTestList() {
       try {

+ 157 - 58
src/views/components/dialog/AccessControlDialog.vue

@@ -7,7 +7,7 @@
     <div class="dialog_box">
       <!-- 内容 -->
       <div>
-        <el-row class="access_video">
+        <el-row class="access_video" :key="refresh">
           <el-col :span="8">
             <div class="select">
               <div class="select_title">
@@ -33,8 +33,8 @@
             <div class="select_video">
               <div class="select_video_main">
                 <video-image-window
-                  :cameraData="cameraCarInfo1"
-                  :cameraId="cameraCarInfo1.id"
+                  :cameraData="cameraCarInfo1.camera"
+                  :cameraId="cameraCarInfo1.camera.id"
                 />
               </div>
             </div>
@@ -64,8 +64,8 @@
             <div class="select_video">
               <div class="select_video_main">
                 <video-image-window
-                  :cameraData="cameraCarInfo2"
-                  :cameraId="cameraCarInfo2.id"
+                  :cameraData="cameraCarInfo2.camera"
+                  :cameraId="cameraCarInfo2.camera.id"
                 />
               </div>
             </div>
@@ -95,8 +95,8 @@
             <div class="select_video">
               <div class="select_video_main">
                 <video-image-window
-                  :cameraData="cameraFaceInfo"
-                  :cameraId="cameraFaceInfo.id"
+                  :cameraData="cameraFaceInfo.camera"
+                  :cameraId="cameraFaceInfo.camera.id"
                 />
               </div>
             </div>
@@ -106,8 +106,8 @@
           <el-col :span="8">
             <div class="search-box">
               <div class="search-item">
-                <span class="search-label">场站:</span>
-                <el-select
+                <span class="search-label">出入设备列表</span>
+                <!-- <el-select
                   value-key="id"
                   v-model="department"
                   style="width: 110px"
@@ -122,7 +122,7 @@
                     :value="item"
                     :label="item.name"
                   ></el-option>
-                </el-select>
+                </el-select> -->
               </div>
               <!-- <el-cascader
                   v-model="query.departmentId"
@@ -155,7 +155,11 @@
           </el-col>
           <el-col :span="16">
             <div class="record_list">
-              <div class="record_title">出入门记录</div>
+              <div class="record_title">
+                <span>出入门记录</span>
+                <span class="more" @click="more">更多</span>
+              </div>
+
               <div class="record_info">
                 <base-table-list :tableConfig="recordTableConfig" />
               </div>
@@ -173,6 +177,8 @@ import VideoImageWindow from "@/views/components/dialog/VideoImageWindow.vue";
 import { dealAlarm } from "@/API/common";
 import { getDepartmentByPid } from "@/API/alarm";
 import { getAccessInfoList, getAccessLogList } from "@/API/accessControl";
+import { getCameraList } from "@/API/custom";
+import Dayjs from "dayjs";
 import { mapGetters } from "vuex";
 export default {
   name: "accessControlDialog",
@@ -181,39 +187,52 @@ export default {
     "accessControlDialog.show": {
       handler(newVal) {
         this.baseDialogConfig.show = newVal;
+        if (newVal) {
+          this.initAccessControlList("");
+          this.initAccessLogList();
+        }
       },
       // deep: true,
       immediate: true,
     },
     dataList: {
       handler(newValue, oldValue) {
-        this.filterKey = "";
+        // this.filterKey = "";
         this.tableConfig.tableData = newValue;
+        if (newValue && newValue.length > 1) {
+          this.getCameraList();
+        }
+        this.refresh();
       },
       deep: true,
     },
     recordList: {
       handler(newValue, oldValue) {
-        this.filterKey = "";
-        this.recrodTableConfig.tableData = newValue;
+        // this.filterKey = "";
+        if (newValue && newValue.length > 1) {
+          this.recordTableConfig.tableData = newValue;
+        }
+        this.refresh();
       },
       deep: true,
     },
   },
   data() {
     return {
+      refreshKey: 0,
       BASE_URL,
       dataList: [
         {
-          id: "",
+          id: "1",
           name: "",
           buildName: "",
         },
       ],
       recordList: [
         {
-          id: "",
-          name: "",
+          id: "1",
+          accessControlName: "",
+          personName: "",
           eventTime: "",
           content: "",
         },
@@ -240,18 +259,22 @@ export default {
         needIndex: false,
         height: 130,
         header: [
-          { title: "设备名称", prop: "name", width: "80px" },
-          { title: "人员名称", prop: "personName", width: "100px" },
-          { title: "时间", prop: "eventTime", width: "" },
-          { title: "详细描述", prop: "content", width: "" },
+          { title: "设备名称", prop: "accessControlName", width: "30px" },
+          { title: "人员名称", prop: "personName", width: "30px" },
+          { title: "时间", prop: "eventTime", width: "30px" },
+          { title: "详细描述", prop: "content", width: "300px" },
         ],
         tableData: [],
       },
+      cameraList: [{ id: "1", name: "摄像头1" }],
       cameraFaceList: [{ id: "1", name: "摄像头1" }],
-      cameraCarList: [{ id: "2", name: "摄像头2" }],
-      cameraFaceInfo: { id: "1", name: "摄像头1" },
-      cameraCarInfo1: { id: "2", name: "摄像头2" },
-      cameraCarInfo2: { id: "3", name: "摄像头3" },
+      cameraCarList: [
+        { id: "2", name: "摄像头2" },
+        { id: "3", name: "摄像头3" },
+      ],
+      cameraFaceInfo: { id: "1", name: "摄像头1", camera: { id: "1" } },
+      cameraCarInfo1: { id: "2", name: "摄像头2", camera: { id: "1" } },
+      cameraCarInfo2: { id: "3", name: "摄像头3", camera: { id: "1" } },
       departmentOptions: [],
       department: {
         id: "",
@@ -263,17 +286,21 @@ export default {
       },
     };
   },
-  created() {},
-  computed: {
-    ...mapGetters(["accessControlDialog"]),
-  },
-  mounted() {
-    this.initAccessControlList("");
-    this.initAccessLogList();
+  created() {
+    // this.initAccessControlList("");
+    // this.initAccessLogList();
     // this.getDepartmentByPid();
     this.departmentOptions = GY_STATIONS.filter((e) => e.id !== "");
   },
+  computed: {
+    ...mapGetters(["accessControlDialog"]),
+  },
+  mounted() {},
   methods: {
+    refresh() {
+      this.refreshKey++;
+      // console.log("this.refreshKey:", this.refreshKey);
+    },
     async initAccessControlList(buildId) {
       try {
         const params = {
@@ -284,24 +311,6 @@ export default {
         const res = await getAccessInfoList(params);
         this.dataList = res.data.content;
         console.log("门禁列表", this.dataList);
-        //人脸识别列表
-        this.cameraFaceList = this.dataList.filter((e) => e.faceRecognition);
-        //车辆识别列表
-        this.cameraCarList = this.dataList.filter((e) => !e.faceRecognition);
-        console.log("门禁摄像头列表", this.cameraFaceList, this.cameraCarList);
-        if (this.cameraFaceList && this.cameraCarList.length > 0) {
-          this.cameraFaceInfo = this.cameraFaceList[0];
-        }
-        if (this.cameraCarList && this.cameraCarList.length > 1) {
-          this.cameraCarInfo1 = this.cameraCarList[0];
-          this.cameraCarInfo2 = this.cameraCarList[1];
-        }
-        console.log(
-          "门禁摄像头",
-          this.cameraFaceInfo,
-          this.cameraCarInfo1,
-          this.cameraCarInfo2
-        );
       } catch (err) {
         console.log(err);
       }
@@ -311,14 +320,63 @@ export default {
         const params = {
           pageSize: 100,
           pageIndex: 1,
+          startTime: Dayjs(new Date())
+            .subtract(1, "day")
+            .format("YYYY-MM-DD HH:mm:ss"),
+          endTime: Dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss"),
         };
         const res = await getAccessLogList(params);
         this.recordList = res.data.content;
-        // console.log("门禁事件列表", this.recordList);
+        console.log("门禁事件列表", params, this.recordList);
       } catch (err) {
         console.log(err);
       }
     },
+    async getCameraList() {
+      try {
+        const params = {
+          // name: "识别",
+          enable: true,
+        };
+        const res = await getCameraList(params);
+        this.cameraList = res.data.content;
+        console.log("摄像头列表", this.cameraList);
+        if (this.dataList && this.dataList.length > 1) {
+          this.cameraFaceList = [];
+          this.cameraCarList = [];
+          for (let i = 0; i < this.dataList.length; i++) {
+            const e = this.dataList[i];
+            if (e.faceRecognition) {
+              this.cameraFaceList.push(e);
+            } else {
+              this.cameraCarList.push(e);
+            }
+          }
+        }
+        // //人脸识别列表
+        // this.cameraFaceList = this.dataList.filter((e) => e.faceRecognition);
+        // //车辆识别列表
+        // this.cameraCarList = this.dataList.filter((e) => !e.faceRecognition);
+        this.filterInfo();
+      } catch (err) {
+        console.log(err);
+      }
+    },
+    filterCamera(c) {
+      if (this.cameraList && this.cameraList.length > 0) {
+        var a = c;
+        for (let i = 0; i < this.cameraList.length; i++) {
+          const e = this.cameraList[i];
+          if (e.id && e.id === c.cameraID) {
+            a["camera"] = e;
+          }
+        }
+        // a["camera"] = this.cameraList.filter((e) => e.id === c.cameraID)[0];
+        return a;
+      } else {
+        return null;
+      }
+    },
     closeDialog() {
       this.$store.dispatch("globalConfig/setAccessControlDialog", {
         show: false,
@@ -371,28 +429,64 @@ export default {
       this.filterInfo();
     },
     filterInfo() {
-      if (this.department.positioningBuildId) {
-        this.initAccessControlList(this.department.positioningBuildId);
-      } else {
-        this.initAccessControlList("");
+      console.log("当前属站", this.department);
+      // if (this.department.positioningBuildId) {
+      //   //人脸识别列表
+      //   this.cameraFaceList = this.dataList.filter(
+      //     (e) =>
+      //       e.faceRecognition &&
+      //       e.buildId === this.department.positioningBuildId
+      //   );
+      //   //车辆识别列表
+      //   this.cameraCarList = this.dataList.filter(
+      //     (e) =>
+      //       !e.faceRecognition &&
+      //       e.buildId === this.department.positioningBuildId
+      //   );
+      // } else {
+      //   //人脸识别列表
+      //   this.cameraFaceList = this.dataList.filter((e) => e.faceRecognition);
+      //   //车辆识别列表
+      //   this.cameraCarList = this.dataList.filter((e) => !e.faceRecognition);
+      // }
+      // console.log("分类门禁列表", this.cameraFaceList, this.cameraCarList);
+      if (this.cameraFaceList && this.cameraFaceList.length > 0) {
+        this.cameraFaceInfo = this.filterCamera(this.cameraFaceList[0]);
       }
+      if (this.cameraCarList && this.cameraCarList.length > 1) {
+        this.cameraCarInfo1 = this.filterCamera(this.cameraCarList[0]);
+        this.cameraCarInfo2 = this.filterCamera(this.cameraCarList[1]);
+      }
+      console.log(
+        "门禁摄像头",
+        this.cameraFaceInfo,
+        this.cameraCarInfo1,
+        this.cameraCarInfo2
+      );
     },
     exchangeVideo(type, e) {
+      console.log(this.cameraList, "切换摄像头", e);
       switch (type) {
         case 1:
-          // this.cameraCarInfo1 = this.cameraCarList.filter((c) => c.id === e);
+          this.cameraCarInfo1 = this.filterCamera(e);
           break;
         case 2:
-          // this.cameraCarInfo2 = this.cameraCarList.filter((c) => c.id === e);
+          this.cameraCarInfo2 = this.filterCamera(e);
           break;
         case 3:
-          // this.cameraFaceInfo = this.cameraFaceList.filter((c) => c.id === e);
+          this.cameraFaceInfo = this.filterCamera(e);
           break;
 
         default:
           break;
       }
     },
+    more() {
+      this.$router.push({
+        path: "/Page1?path=accessControl%2FaccessControl%2Flog",
+      });
+      this.closeDialog();
+    },
     openAll() {},
     closeAll() {},
     openBroadcast() {},
@@ -515,6 +609,11 @@ export default {
     color: #fff;
     .record_title {
       padding: 6px;
+      .more {
+        font-size: 0.073333rem /* 16/192 */;
+        color: #bdbfc9;
+        padding-left: 6px;
+      }
     }
     .record_info {
     }

+ 19 - 5
src/views/components/dialog/JGYTControlDialog/index.vue

@@ -119,20 +119,23 @@ export default {
     "jgytControlDialog.show": {
       handler(newVal) {
         this.baseDialogConfig.show = newVal;
+        if (newVal) {
+          this.filterInfo();
+        }
       },
       // deep: true,
       immediate: true,
     },
     dataList: {
       handler(newValue, oldValue) {
-        this.filterKey = "";
+        // this.filterKey = "";
         this.tableConfig.tableData = newValue;
       },
       deep: true,
     },
     recordList: {
       handler(newValue, oldValue) {
-        this.filterKey = "";
+        // this.filterKey = "";
         this.recrodTableConfig.tableData = newValue;
       },
       deep: true,
@@ -151,8 +154,9 @@ export default {
       recordList: [
         {
           id: "",
-          name: "",
-          eventTime: "",
+          laserPtzName: "",
+          concentration: "",
+          startTime: "",
           content: "",
         },
       ],
@@ -172,7 +176,13 @@ export default {
           { title: "名称", prop: "name", width: "" },
           { title: "所在场站", prop: "departmentName", width: "" },
         ],
-        tableData: [],
+        tableData: [
+          {
+            id: "",
+            name: "",
+            departmentName: "",
+          },
+        ],
       },
       recordTableConfig: {
         needIndex: true,
@@ -207,6 +217,8 @@ export default {
     this.initJGYTList("");
     this.initJGYTAlarmList("");
     // this.getDepartmentByPid();
+    this.tableConfig.tableData = this.dataList;
+    this.recordTableConfig.tableData = this.recordList;
     this.departmentOptions = GY_STATIONS.filter((e) => e.id !== "");
   },
   methods: {
@@ -298,8 +310,10 @@ export default {
     filterInfo() {
       if (this.department.positioningBuildId) {
         this.initJGYTList(this.department.positioningBuildId);
+        this.initJGYTAlarmList(this.department.positioningBuildId);
       } else {
         this.initJGYTList("");
+        this.initJGYTAlarmList("");
       }
     },
     exchangeVideo() {},

+ 1084 - 0
src/views/components/dialog/SoundDialog/Fbky.vue

@@ -0,0 +1,1084 @@
+<template>
+  <div class="fbky-container">
+    <div class="websocket">
+      <div class="websocket_left">
+        <div class="set_case">
+          <div class="set_split call_left set_call">
+            <div class="set_box">
+              <div class="set_item">
+                <div class="set_group">
+                  <span class="set_name">呼出号码:</span>
+                  <input
+                    type="text"
+                    class="set_ipt ipt_number"
+                    id="destinationNumber"
+                    :v-model="ringNumber"
+                  />
+                </div>
+                <div class="set_group">
+                  <button class="btn cyan_btn" @click="dial(0)">
+                    语音呼出
+                  </button>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="set_split call_right">
+            <div class="set_box come_box">
+              <div class="set_item">
+                <div class="set_group">
+                  <span class="set_name">当前来电:</span>
+                  <span id="call_in_now" callID=""></span>
+                </div>
+                <div class="set_group group_right">
+                  <button class="btn blue_btn margin" @click="callInAnswer(1)">
+                    视频接听
+                  </button>
+                  <button class="btn cyan_btn margin" @click="callInAnswer(0)">
+                    语音接听
+                  </button>
+                  <button class="btn white_btn" @click="callInHangup()">
+                    挂断
+                  </button>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="set_case">
+          <div class="set_split his_left">
+            <div class="set_box">
+              <div class="set_item call_box">
+                <span class="set_name" style="color: red"
+                  >执行操作前,请选择正在通话列表(支持同时多路通话):</span
+                >
+                <div class="call_case">
+                  <ul id="call_list"></ul>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="set_split his_right">
+            <div class="set_box">
+              <div class="set_item set_first">
+                <span class="set_name">call ID:</span>
+                <input
+                  type="text"
+                  class="set_ipt ipt_call"
+                  id="callID"
+                  readonly
+                />
+                <button class="btn blue_btn" @click="callHoldUnhold()">
+                  保持/取消保持指定通话
+                </button>
+              </div>
+              <div class="set_item">
+                <span
+                  id="mute_off_status"
+                  class="set_status off_status margin"
+                  hidden=""
+                  >己关闭</span
+                >
+                <span
+                  id="mute_on_status"
+                  class="set_status on_status margin"
+                  hidden=""
+                  >未关闭</span
+                >
+                <button class="btn blue_btn" @click="callMuteUnmute()">
+                  关闭/打开指定通话本地声音
+                </button>
+              </div>
+              <div class="set_item">
+                <span
+                  id="mute_video_off_status"
+                  class="set_status off_status margin"
+                  hidden=""
+                  >已关闭</span
+                >
+                <span
+                  id="mute_video_on_status"
+                  class="set_status on_status margin"
+                  hidden=""
+                  >未关闭</span
+                >
+                <button class="btn blue_btn" @click="callMuteUnmuteVideo()">
+                  关闭/打开指定通话本地视频
+                </button>
+              </div>
+              <div class="set_item">
+                <button class="btn blue_btn margin" @click="callHangup()">
+                  挂断指定通话
+                </button>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="video_box">
+          <div class="video_left">
+            <div class="video_item video_item1">
+              <span class="video_name">local_video</span>
+              <video
+                class="video_tag"
+                id="local_video"
+                width="10%"
+                height="10%"
+                autoplay="true"
+              ></video>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="websocket_right">
+        <div class="set_box set_zhuce">
+          <div class="set_item">
+            <span class="set_name">登录状态:</span>
+            <span id="off_status" class="set_status off_status">未登录</span>
+            <span id="on_status" class="set_status on_status" hidden=""
+              >已登录</span
+            >
+          </div>
+          <div class="set_item">
+            <span class="set_name"><i class="must">*</i>Websocket URL:</span>
+            <input
+              type="text"
+              class="set_ipt"
+              v-model="socketUrl"
+              placeholder="wss://192.168.10.39:1443/webrtc"
+            />
+          </div>
+          <div class="set_item">
+            <span class="set_name" style="flex: none"></span>
+            <span style="color: red"
+              >配置wss后,如果连接失败,请先查看是不是https证书问题
+              可以通话访问对应的https页面,手动允许浏览器安全提示</span
+            >
+          </div>
+          <div class="set_item">
+            <span class="set_name">麦克风:</span>
+            <select class="set_slt" id="audioInputDev">
+              <option value="">请选择</option>
+            </select>
+          </div>
+          <div class="set_item">
+            <span class="set_name">摄像头:</span>
+            <select class="set_slt" id="videoInputDev">
+              <option value="">请选择</option>
+            </select>
+          </div>
+          <div class="set_item">
+            <span class="set_name">扬声器:</span>
+            <select class="set_slt" id="audioOutputDev">
+              <option value="">请选择</option>
+            </select>
+          </div>
+          <div class="set_item">
+            <span class="set_name"><i class="must">*</i>用户名:</span>
+            <input
+              type="text"
+              class="set_ipt"
+              v-model="login"
+              placeholder="8889"
+            />
+          </div>
+          <div class="set_item">
+            <span class="set_name"><i class="must">*</i>密码:</span>
+            <input
+              type="text"
+              class="set_ipt"
+              v-model="password"
+              placeholder="123456"
+            />
+          </div>
+          <div class="set_item">
+            <span class="set_name" style="flex: none"></span>
+            <span style="color: red"
+              >支持断线重连,通话中关闭网页,在重新登录后会恢复正在进行的通话</span
+            >
+          </div>
+          <div class="set_item">
+            <span class="set_name">自动登录:</span>
+            <label class="check_box">
+              <input v-model="autoReg" type="checkbox" class="check" />
+              <span>是</span>
+            </label>
+          </div>
+          <div class="set_item">
+            <span class="set_name">自动接听:</span>
+            <label class="check_box">
+              <input v-model="autoAnswer" type="checkbox" class="check" />
+              <span>是</span>
+            </label>
+          </div>
+          <div class="set_item">
+            <span class="set_name" style="flex: none"></span>
+            <span style="color: red"
+              >注意:每个通话都需要在页面中有一个独立的video标签做为载体,
+              不管是纯音频通话还是音视频通话,
+              多个通话同时使用一个video标签时,后者会覆盖前者通话的视频和音频,
+              测试多路通话时,请每次切换不同的video标签</span
+            >
+          </div>
+          <div class="set_item">
+            <span class="set_name">下次通话视频位置:</span>
+            <select class="set_slt" id="peerTag">
+              <option value="video1">video1</option>
+              <option value="video2">video2</option>
+              <option value="video3">video3</option>
+              <option value="video4">video4</option>
+              <option value="video5">video5</option>
+              <option value="video6">video6</option>
+              <option value="video7">video7</option>
+              <option value="video8">video8</option>
+            </select>
+          </div>
+          <div class="set_item">
+            <button class="btn blue_btn margin" @click="initPerimeter()">
+              载入登录
+            </button>
+            <button class="btn cyan_btn margin" @click="webRtcLogin()">
+              登录
+            </button>
+            <button class="btn white_btn margin" @click="webRtcLogout()">
+              登出
+            </button>
+            <button class="btn cyan_btn" @click="callHangupAll()">
+              挂断所有
+            </button>
+          </div>
+        </div>
+        <div class="set_box set_equipment">
+          <div class="set_item">
+            <span class="set_name">本机IP:</span>
+            <input type="text" class="set_ipt" id="localIp" v-model="localIp" />
+          </div>
+        </div>
+        <!-- <div class="set_box">
+          <div class="set_item set_his">
+            <span class="set_name">呼叫历史记录(本地缓存):</span>
+            <div class="his_case">
+              <ul id="his_list"></ul>
+            </div>
+          </div>
+        </div> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { rtcHelper } from "@/plugins/tr-webrtc.min.js";
+import Dayjs from "dayjs";
+export default {
+  name: "Fbky",
+  props: {
+    curFbkyData: {
+      //分机登录参数
+      type: Object,
+      require: true,
+      default: () => ({}),
+    },
+    ringNumber: {
+      //号码参数
+      type: String,
+      require: true,
+      default: "809",
+    },
+    callDisable: {
+      //呼出或挂断控制
+      type: Boolean,
+      require: true,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      login: "8889", //分机号
+      password: "123456", //分机密码
+      socketUrl: "wss://dispatcher:1443/webrtc", //webSocketURL
+      // socketUrl: "wss://192.168.10.39:1443/webrtc", //webSocketURL
+      localIp: "",
+      autoReg: false,
+      autoAnswer: false,
+      mic: "", //麦克风选择
+      cam: "", //摄像头选择
+      speak: "", //扬声器选择
+      call_in_now_d: null,
+      online: false,
+      callback: {
+        onRinging: function (d) {
+          // 来电
+          this.onRinging(d);
+        },
+        onCalling: function (d) {
+          // 外呼
+          this.onCalling(d);
+        },
+        onAnswer: function (d) {
+          // 通话中
+          this.onAnswer(d);
+        },
+        onHangup: function (d) {
+          // 挂机
+          this.onHangup(d);
+        },
+        onLogin: function () {
+          //登录回调
+          console.log("登录状态在线");
+          this.online = true;
+          document
+            .getElementById("off_status")
+            .setAttribute("hidden", "hidden");
+          document.getElementById("on_status").removeAttribute("hidden");
+        },
+        onLogout: function () {
+          //登出回调
+          console.log("登出状态离线回调");
+          this.online = false;
+          document.getElementById("on_status").setAttribute("hidden", "hidden");
+          document.getElementById("off_status").removeAttribute("hidden");
+        },
+      },
+    };
+  },
+  watch: {
+    curFbkyData: {
+      handler(newValue, oldValue) {
+        this.callHangupAll();
+        this.webRtcLogout();
+        console.log("数据更新:", newValue, "旧数据:", oldValue);
+        if (newValue.url) {
+          this.login = newValue.admin;
+          this.password = newValue.password;
+          this.socketUrl = newValue.url;
+          this.localIp = newValue.localIp;
+        }
+        setTimeout(() => {
+          this.initPerimeter();
+        }, 1000);
+      },
+      deep: true,
+    },
+    ringNumber: {
+      handler(newValue) {
+        this.callHangupAll();
+        if (this.callDisable) {
+          this.dial(0);
+        }
+        console.log("拨打号码:", newValue);
+      },
+      deep: true,
+    },
+    callDisable: {
+      handler(newValue) {
+        if (newValue) {
+          this.dial(0);
+          console.log("拨号", this.ringNumber);
+        } else {
+          this.callHangupAll();
+          console.log("挂断");
+        }
+      },
+      deep: true,
+    },
+    online: {
+      handler(newValue) {
+        if (newValue) {
+          this.sendTo('true');
+          console.log("传值:true");
+        } else {
+          this.sendTo('false');
+          console.log("传值:false");
+        }
+      },
+      deep: true,
+    },
+  },
+  created() {
+    this.initMediaDevices();
+    setTimeout(() => {
+      this.initPerimeter();
+    }, 500);
+  },
+  destroyed() {
+    this.callHangupAll();
+    setTimeout(() => {
+      this.webRtcLogout();
+    }, 500);
+  },
+  mounted() {},
+  methods: {
+    sendTo(m) {
+      this.$emit('onlineDis', m);
+    },
+    getVideoDiv() {
+      return document.getElementById("peerTag").value;
+    },
+    getValue(id) {
+      return document.getElementById(id).value;
+    },
+    setValue(id, value) {
+      document.getElementById(id).value = value;
+    },
+    //载入参数登录
+    initPerimeter() {
+      if (!this.login || !this.password || !this.socketUrl) {
+        alert("请填写必填参数");
+        return;
+      }
+      // 缓存配置
+      localStorage.verto_login = this.login; //分机账号
+      localStorage.verto_password = this.password; //分机密码
+      localStorage.verto_socketUrl = this.socketUrl; //webSocketURL
+      localStorage.verto_localIp = this.localIp;
+      localStorage.verto_autoReg = this.autoReg; //自动登录开关
+      localStorage.verto_autoAnswer = this.autoAnswer; //自动接听开关
+
+      rtcHelper.bootstrap(
+        this.login,
+        this.password,
+        this.socketUrl,
+        this.localIp,
+        this.getVideoDiv(),
+        "local_video",
+        this.callback,
+        this.mic,
+        this.speak,
+        this.cam
+      );
+      // console.log(
+      //   "配置载入参数",
+      //   this.login,
+      //   this.password,
+      //   this.socketUrl,
+      //   this.localIp,
+      //   this.getVideoDiv(),
+      //   "local_video",
+      //   this.callback,
+      //   this.mic,
+      //   this.speak,
+      //   this.cam
+      // );
+    },
+    //获取音视频设备
+    initMediaDevices() {
+      rtcHelper.getMediaDevices().then((result) => {
+        try {
+          let microphone = result.audioInputDevices; //麦克风
+          let camera = result.videoDevices; //摄像头+
+          let loudspeaker = result.audioOutputDevices; //扬声器
+          let microphoneStr = "";
+          let cameraStr = "";
+          let loudspeakerStr = "";
+          for (let i = 0; i < microphone.length; i++) {
+            microphoneStr +=
+              '<option value="' +
+              microphone[i].deviceId +
+              '">' +
+              microphone[i].label +
+              "</option>";
+          }
+          document.getElementById("audioInputDev").innerHTML = microphoneStr;
+          for (let i = 0; i < camera.length; i++) {
+            cameraStr +=
+              '<option value="' +
+              microphone[i].deviceId +
+              '">' +
+              camera[i].label +
+              "</option>";
+          }
+          document.getElementById("videoInputDev").innerHTML = cameraStr;
+          for (let i = 0; i < loudspeaker.length; i++) {
+            loudspeakerStr +=
+              '<option value="' +
+              microphone[i].deviceId +
+              '">' +
+              loudspeaker[i].label +
+              "</option>";
+          }
+          document.getElementById("audioOutputDev").innerHTML = loudspeakerStr;
+          if (microphone.length > 0) {
+            this.mic = microphone[0].deviceId;
+          }
+          if (camera.length > 0) {
+            this.cam = camera[0].deviceId;
+          }
+          if (loudspeaker.length > 0) {
+            this.speak = loudspeaker[0].deviceId;
+          }
+          console.log("音视频设备:", result, this.mic, this.cam, this.speak);
+        } catch (e) {
+          console.error(e);
+        }
+        // 自动登录
+        // if (
+        //   localStorage.verto_autoReg == "true" &&
+        //   localStorage.verto_login &&
+        //   localStorage.verto_password &&
+        //   localStorage.verto_socketUrl
+        // ) {
+        //   this.initPerimeter();
+        // }
+      });
+    },
+    //登录
+    webRtcLogin() {
+      try {
+        rtcHelper.rtcLogin();
+      } catch (e) {
+        console.error(e);
+      }
+    },
+    //登出
+    webRtcLogout() {
+      try {
+        rtcHelper.rtcLogout();
+      } catch (e) {
+        console.error(e);
+      }
+    },
+    // 拨号外呼
+    dial(type) {
+      console.log("拨号号码:", this.ringNumber);
+      let destinationNumber = this.ringNumber;
+      if (!destinationNumber) {
+        alert("没有输入被叫号码");
+        return;
+      }
+      if (type === 1) {
+        // 视频呼出
+        rtcHelper.rtcDial(destinationNumber, true);
+      } else {
+        // 语音呼出
+        rtcHelper.rtcDial(destinationNumber, false);
+      }
+    },
+    //历史记录
+    logRecords(callee, type) {
+      let log = "";
+      switch (type) {
+        case "ringing":
+          log = new Date().Format("yyyy-MM-dd HH:mm:ss") + " 呼入 " + callee;
+          break;
+        case "calling":
+          log = new Date().Format("yyyy-MM-dd HH:mm:ss") + " 呼出 " + callee;
+          break;
+        default:
+          break;
+      }
+      if (localStorage.verto_his_list) {
+        localStorage.verto_his_list += "," + log;
+      } else {
+        localStorage.verto_his_list = log;
+      }
+    },
+    // =================== 通话事件 start ====================
+    onRinging(d) {
+      let callee = d.cidString();
+      console.log("===========来电信息===========" + callee);
+      console.log("通话呼入事件", d);
+      // 判断是否自动接听
+      if (localStorage.verto_autoAnswer) {
+        console.log("自动接听");
+        if (d.params.wantVideo) {
+          // 选择是否有视频
+          let videoFlag = true;
+          rtcHelper.rtcAnswer(d, videoFlag);
+        } else {
+          rtcHelper.rtcAnswer(d, false);
+        }
+      } else {
+        document.getElementById("call_in_now").innerHTML = callee;
+        document.getElementById("call_in_now").setAttribute("callID", d.callID);
+        this.call_in_now_d = d;
+      }
+      document.getElementById("call_list").innerHTML +=
+        "<li callID='" +
+        d.callID +
+        "' @click='checkCalling(this)'>" +
+        callee +
+        " 呼入</li>";
+      // 缓存历史呼入记录
+      this.logRecords(callee, "ringing");
+    },
+    onCalling(d) {
+      let callee = d.cidString();
+      console.log("通话呼出事件", d);
+      // 呼出通话启动
+      document.getElementById("call_list").innerHTML +=
+        "<li callID='" +
+        d.callID +
+        "' @click='checkCalling(this)'>" +
+        callee +
+        " 呼出</li>";
+      // 缓存历史呼出记录
+      this.logRecords(callee, "calling");
+    },
+    onAnswer(d) {
+      // 通话中处理
+      console.log("通话中事件", d);
+    },
+    onHangup(d) {
+      // 挂机处理 -  接通列表处理
+      // console.log("通话挂机事件", d);
+    },
+    // =================== 通话事件 end ====================
+
+    // =================== 呼入处理 start ====================
+    // 呼入接听
+    callInAnswer(type) {
+      if (!this.call_in_now_d) {
+        alert("当前无通话呼入");
+        return;
+      }
+      if (type === 1) {
+        if (this.call_in_now_d.params.wantVideo) {
+          // 选择是否有视频
+          let videoFlag = true;
+          rtcHelper.rtcAnswer(this.call_in_now_d, videoFlag);
+        } else {
+          rtcHelper.rtcAnswer(this.call_in_now_d, false);
+        }
+      } else {
+        rtcHelper.rtcAnswer(this.call_in_now_d, false);
+      }
+      console.log("通话呼入");
+      document.getElementById("call_in_now").innerHTML = "";
+      this.call_in_now_d = null;
+    },
+
+    // 呼入挂断
+    callInHangup() {
+      if (!this.call_in_now_d) {
+        alert("当前无通话呼入");
+        return;
+      }
+      rtcHelper.rtcHangup(this.call_in_now_d.callID);
+      document.getElementById("call_in_now").innerHTML = "";
+      console.log("通话挂断");
+      this.call_in_now_d = null;
+    },
+
+    // =================== 呼入处理 end ====================
+
+    // =================== 通话功能 start ==================
+    checkCalling(e) {
+      let callID = e.getAttribute("callID");
+      console.log("设置", callID);
+      this.setValue("callID", callID);
+      this.getMuteState(callID);
+      this.getMuteVideoState(callID);
+    },
+
+    getMuteState(callID) {
+      if (rtcHelper.rtcGetMuteState(callID)) {
+        // 没有静音
+        console.log("非静音,本地声音状态打开");
+        document
+          .getElementById("mute_off_status")
+          .setAttribute("hidden", "hidden");
+        document.getElementById("mute_on_status").removeAttribute("hidden");
+      } else {
+        console.log("静音,本地声音状态关闭");
+        document.getElementById("mute_off_status").removeAttribute("hidden");
+        document
+          .getElementById("mute_on_status")
+          .setAttribute("hidden", "hidden");
+      }
+    },
+
+    getMuteVideoState(callID) {
+      if (rtcHelper.rtcGetMuteVideoState(callID)) {
+        // 没有静音
+        console.log("非静音,本地视频状态打开");
+        document
+          .getElementById("mute_video_off_status")
+          .setAttribute("hidden", "hidden");
+        document
+          .getElementById("mute_video_on_status")
+          .removeAttribute("hidden");
+      } else {
+        console.log("静音,本地视频状态关闭");
+        document
+          .getElementById("mute_video_off_status")
+          .removeAttribute("hidden");
+        document
+          .getElementById("mute_video_on_status")
+          .setAttribute("hidden", "hidden");
+      }
+    },
+
+    //保持或取消指定通话
+    callHoldUnhold(callID) {
+      if (callID) {
+        rtcHelper.rtcHoldUnhold(callID);
+      } else {
+        alert("未选择callID");
+      }
+    },
+    //关闭或打开通话本地声音
+    callMuteUnmute(callID) {
+      if (callID) {
+        rtcHelper.rtcMuteUnmute(callID);
+        this.getMuteState(callID);
+      } else {
+        alert("未选择callID");
+      }
+    },
+    //关闭或打开本地视频
+    callMuteUnmuteVideo(callID) {
+      if (callID) {
+        rtcHelper.rtcMuteUnmuteVideo(callID);
+        this.getMuteVideoState(callID);
+      } else {
+        alert("未选择callID");
+      }
+    },
+    //挂断指定callID通话
+    callHangup(callID) {
+      if (callID) {
+        rtcHelper.rtcHangup(callID);
+        alert("callID", callID);
+      } else {
+        alert("未选择callID");
+      }
+    },
+    //挂断所有通话
+    callHangupAll() {
+      rtcHelper.rtcHangupAll();
+    },
+    //向指定通话发送DTMF
+    callDtmf(callID, dtmfKey) {
+      if (callID) {
+        rtcHelper.rtcDtmf(callID, dtmfKey);
+      } else {
+        alert("未选择callID");
+      }
+    },
+    // =================== 通话功能 end ==================
+  },
+};
+</script>
+<style lang="less" scoped>
+.fbky-container {
+  width: 100%;
+  .websocket {
+    width: 100%;
+    height: 60%;
+    display: flex;
+    padding: 20px;
+    background-color: #f1f4f7;
+    .websocket_left {
+      width: 70%;
+      padding-right: 20px;
+      .set_case {
+        display: flex;
+        .set_call .set_name {
+          width: 80px;
+        }
+        .set_item {
+          margin-bottom: 15px;
+          display: flex;
+          align-items: center;
+        }
+        .call_left {
+          width: 50%;
+          display: flex;
+          padding-right: 20px;
+        }
+        .call_right {
+          width: 50%;
+          display: flex;
+        }
+      }
+      .video_box {
+        height: 200px;
+        display: flex;
+        .video_left,
+        .video_right {
+          width: 50%;
+        }
+        .video_left {
+          display: flex;
+          flex-direction: column;
+        }
+        .video_right {
+          display: flex;
+          flex-wrap: wrap;
+        }
+      }
+    }
+    .websocket_right {
+      width: 30%;
+      .set_box {
+        width: 100%;
+        background-color: #fff;
+        padding: 20px;
+        margin-bottom: 20px;
+      }
+    }
+  }
+}
+
+.set_box {
+  width: 100%;
+  background-color: #fff;
+  padding: 20px;
+  margin-bottom: 20px;
+}
+
+.set_item:last-child {
+  margin-bottom: 0;
+}
+.group_case {
+  justify-content: space-between;
+}
+
+.set_group {
+  display: flex;
+  align-items: center;
+}
+
+.set_slt,
+.set_ipt {
+  flex: auto;
+  height: 30px;
+  line-height: 30px;
+  border: 1px solid #d1d1d1;
+  outline: none;
+  border-radius: 3px;
+  padding-left: 10px;
+  background-color: #fff !important;
+}
+
+.btn {
+  padding: 6px 12px;
+  border-radius: 3px;
+  cursor: pointer;
+  outline: none !important;
+  font-size: 12px !important;
+}
+
+.btn:hover {
+  opacity: 0.8;
+}
+
+.blue_btn {
+  background-color: #1890ff;
+  border: 1px solid #1890ff;
+  color: #fff !important;
+}
+
+.cyan_btn {
+  background-color: #00bcd4;
+  border: 1px solid #00bcd4;
+  color: #fff !important;
+}
+
+.white_btn {
+  background-color: #fafafa;
+  border: 1px solid #d1d1d1;
+}
+
+.video_box {
+  display: flex;
+}
+
+.video_left,
+.video_right {
+  width: 50%;
+}
+
+.video_left {
+  display: flex;
+  flex-direction: column;
+}
+
+.video_right {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.video_item {
+  position: relative;
+  background-color: #fff;
+  border: 1px solid #d1d1d1;
+}
+
+.video_item1 {
+  width: 100%;
+  flex: auto;
+}
+
+.video_item2 {
+  width: 100%;
+}
+
+.video_item3 {
+  width: 50%;
+}
+
+.video_name {
+  position: absolute;
+  top: 5px;
+  left: 5px;
+}
+
+.video_tag {
+  width: 100%;
+  height: 100%;
+}
+
+.set_case {
+  display: flex;
+}
+
+.set_status {
+  color: #fff;
+  border-radius: 10px;
+  padding: 4px 10px;
+}
+
+.off_status {
+  background-color: #bbb;
+}
+
+.on_status {
+  background-color: #3fd672;
+}
+
+.must {
+  color: red;
+  font-size: 17px;
+  position: absolute;
+  left: -10px;
+  top: 0px;
+}
+
+.set_name {
+  position: relative;
+}
+
+.set_zhuce .set_name {
+  width: 140px;
+}
+
+.set_equipment .set_name {
+  width: 90px;
+}
+
+.margin {
+  margin-right: 20px;
+}
+
+.his_left {
+  width: 30%;
+  display: flex;
+}
+
+.his_right {
+  width: 70%;
+  display: flex;
+}
+
+.ipt_number {
+  flex: none;
+  width: 50%;
+}
+
+.call_box {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+  height: 100%;
+}
+
+.call_box .set_name {
+  margin-bottom: 12px;
+}
+
+.call_case {
+  display: flex;
+  height: 135px;
+  overflow: hidden auto;
+  border: 1px solid #d1d1d1;
+  width: 100%;
+}
+
+.his_case {
+  display: flex;
+  height: 182px;
+  overflow: hidden auto;
+  border: 1px solid #d1d1d1;
+  width: 100%;
+}
+
+#call_list {
+  flex: auto;
+}
+
+#call_list > li,
+#his_list > li {
+  height: 30px;
+  line-height: 30px;
+  padding: 0 20px;
+  cursor: pointer;
+}
+
+#call_list > li:hover,
+#his_list > li:hover {
+  background-color: #eee;
+}
+
+.set_his {
+  flex-direction: column;
+  align-items: flex-start;
+}
+
+.set_his .set_name {
+  margin-bottom: 15px;
+}
+
+#his_list {
+  width: 100%;
+}
+
+.set_speed {
+  flex-direction: column;
+  align-items: flex-start;
+}
+
+#speed {
+  margin-top: 20px;
+}
+
+.ipt_call {
+  flex: none;
+  width: 30%;
+  margin-right: 15px;
+}
+
+.check_box {
+  cursor: pointer;
+  width: 20%;
+}
+
+.check {
+  position: relative;
+  top: 2px;
+}
+
+.come_box {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+
+.set_first {
+  margin-top: 30px;
+}
+
+.group_right {
+  margin-left: 20px;
+}
+</style>

+ 159 - 62
src/views/components/dialog/SoundDialog.vue → src/views/components/dialog/SoundDialog/index.vue

@@ -7,21 +7,36 @@
     <div class="dialog_box">
       <!-- 内容 -->
       <div class="detail-table-box">
+        <!-- v-show="false" -->
+        <el-row v-show="false">
+          <fbky
+            @onlineDis:="onlineDisable"
+            :curFbkyData="webSocketParams"
+            :ringNumber="ringNumber"
+            :callDisable="callDisable"
+          />
+        </el-row>
         <el-row>
           <el-col :span="13">
             <div class="search-box">
               <div class="search-item">
                 <span class="search-label">场站:</span>
-                <el-cascader
-                  v-model="query.departmentId"
-                  :options="departmentOptions"
-                  :props="{ checkStrictly: true }"
-                  clearable
+                <el-select
+                  value-key="id"
+                  v-model="department"
+                  style="width: 110px"
                   size="mini"
+                  clearable
                   placeholder="请选择场站"
-                  style="width: 160px"
-                  @change="searchData()"
-                />
+                  @change="searchData($event)"
+                >
+                  <el-option
+                    v-for="item in departmentOptions"
+                    :key="item.id"
+                    :value="item"
+                    :label="item.name"
+                  ></el-option>
+                </el-select>
               </div>
               <div class="search-btn2" @click="openAll">
                 <el-button size="mini" type="success">全部打开</el-button>
@@ -29,17 +44,25 @@
               <div class="search-btn2" @click="closeAll">
                 <el-button size="mini" type="warning">全部关闭</el-button>
               </div>
-              <div class="search-btn2" @click="openBroadcast">
+              <!-- <div class="search-btn2" @click="openBroadcast">
                 <el-button size="mini" type="success">广播</el-button>
               </div>
               <div class="search-btn2" @click="closeBroadcast">
                 <el-button size="mini" type="danger">停止广播</el-button>
-              </div>
+              </div> -->
             </div>
           </el-col>
           <el-col :span="11">
             <div class="select">
-              <div class="select_title">已打开防爆扩音</div>
+              <div class="select_title">
+                <!-- 主机状态:
+                <el-tag type="" effect="dark" v-show="online">已连接</el-tag>
+                <el-tag type="info" effect="dark" v-show="!online">未连接</el-tag> -->
+                <span style="margin-left: 10px">已打开防爆扩音:</span>
+                <span style="margin-left: 10px">{{
+                  this.openningTile ? this.openningTile : "暂无"
+                }}</span>
+              </div>
             </div>
           </el-col>
         </el-row>
@@ -51,7 +74,7 @@
             />
           </el-col>
           <el-col class="fbky" :span="11">
-            <div class="select_list">
+            <!-- <div class="select_list">
               <el-tag
                 class="select-tag"
                 v-for="item in openningList"
@@ -63,17 +86,19 @@
               >
                 {{ item.label }}
               </el-tag>
-            </div>
+            </div> -->
             <div class="select">
               <div class="select_title">
-                防爆扩音现场监视
-                <el-select
+                防爆扩音现场监视:<span>{{
+                  this.cameraInfo.name ? this.cameraInfo.name : "暂无"
+                }}</span>
+                <!-- <el-select
                   v-model="cameraInfo"
                   style="width: 160px"
                   size="mini"
                   clearable
                   placeholder="请选择摄像头"
-                  @change="exchangeVideo()"
+                  @change="exchangeVideo($event)"
                 >
                   <el-option
                     v-for="item in cameraList"
@@ -81,10 +106,11 @@
                     :value="item"
                     :label="item.name"
                   ></el-option>
-                </el-select>
+                </el-select> -->
               </div>
             </div>
             <div class="select_video">
+              <!-- 通话视频标签 -->
               <div class="select_video_main">
                 <video-image-window
                   :cameraData="cameraInfo"
@@ -102,31 +128,50 @@
 import BaseTableList from "@/views/components/base/BaseTableList";
 import BaseDragBgDialog from "@/views/components/base/BaseDragBgDialog.vue";
 import VideoImageWindow from "@/views/components/dialog/VideoImageWindow.vue";
+import Fbky from "./Fbky.vue";
 import { dealAlarm } from "@/API/common";
 import { getDepartmentByPid } from "@/API/alarm";
 import { getElementList } from "@/API/visual";
+import { getCameraList } from "@/API/custom";
 import { mapGetters } from "vuex";
 export default {
   name: "soundDialog",
-  components: { BaseDragBgDialog, BaseTableList, VideoImageWindow },
+  components: { BaseDragBgDialog, BaseTableList, VideoImageWindow, Fbky },
   watch: {
     "soundDialog.show": {
       handler(newVal) {
         this.baseDialogConfig.show = newVal;
+        if (newVal) {
+          this.webSocketParams.id++;
+        }
       },
       // deep: true,
       immediate: true,
     },
     dataList: {
       handler(newValue, oldValue) {
-        this.filterKey = "";
-        this.tableConfig.tableData = newValue;
+        // this.filterKey = "";
+        this.filterInfo();
+      },
+      deep: true,
+    },
+    "department.id": {
+      handler(newValue, oldValue) {
+        // this.filterKey = "";
+        this.filterInfo();
+      },
+      deep: true,
+    },
+    online: {
+      handler(newValue) {
+        console.log("当前值:", newValue);
       },
       deep: true,
     },
   },
   data() {
     return {
+      online: false,
       BASE_URL,
       dataList: [
         {
@@ -134,12 +179,23 @@ export default {
           name: "",
         },
       ],
+      webSocketParams: {
+        id: 1,
+        admin: "8889",
+        password: "123456",
+        url: "wss://dispatcher:1443/webrtc",
+        // url: "wss://192.168.10.39:1443/webrtc",
+        localIp: "",
+      },
+      ringNumber: "809",
+      callDisable: false,
+      openningTile: "暂无",
       baseDialogConfig: {
         dialogId: "soundDialog",
         show: false,
         title: "防爆扩音",
-        width: 1250,
-        height: 640,
+        width: 1300,
+        height: 600,
         center: true,
         zIndex: 10,
       },
@@ -148,13 +204,14 @@ export default {
         height: 456,
         header: [
           { title: "名称", prop: "name", width: "" },
-          { title: "描述", prop: "desc", width: "" },
+          { title: "拨号", prop: "number", width: "" },
+          { title: "描述", prop: "description", width: "" },
           {
             title: "操作",
             prop: "operation",
-            width: "",
+            width: "200px",
             btns: [
-              { btnName: "打开", btnType: "open" },
+              { btnName: "呼叫", btnType: "open" },
               { btnName: "关闭", btnType: "close" },
             ],
           },
@@ -162,42 +219,49 @@ export default {
         tableData: [],
         rowClick: this.location,
       },
-      openningList: [
-        { type: "", label: "设备一" },
-        { type: "", label: "设备二" },
-        { type: "", label: "设备三" },
-        { type: "", label: "设备四" },
-        { type: "", label: "设备五" },
-        { type: "", label: "设备六" },
-        { type: "", label: "设备七" },
-        { type: "", label: "设备八" },
-        { type: "", label: "设备九" },
-        { type: "", label: "设备十" },
-      ],
+      openningList: [{ type: "", label: "设备一" }],
       cameraList: [{ id: "1", name: "摄像头1" }],
       cameraInfo: {
         id: "1",
       },
       departmentOptions: [],
-      query: {
-        departmentId: "",
+      department: {
+        id: "657316479015854080",
       },
     };
   },
   created() {
     this.initSoundList();
-    this.getDepartmentByPid();
+    this.getCameraList();
+    // this.getDepartmentByPid();
+    this.departmentOptions = GY_STATIONS.filter((e) => e.id !== "");
   },
   computed: {
     ...mapGetters(["soundDialog"]),
   },
   mounted() {},
   methods: {
+    onlineDisable(m) {
+      this.online = m;
+      console.log("接收数值", m, this.online);
+    },
+    async getCameraList() {
+      try {
+        const params = {
+          enable: true,
+        };
+        const res = await getCameraList(params);
+        this.cameraList = res.data.content;
+        // console.log("摄像头列表", this.cameraList);
+      } catch (err) {
+        console.log(err);
+      }
+    },
     async initSoundList() {
       try {
         const res = await getElementList({ id: "784748250065281024" });
-        this.dataList = res.data.content;
-        console.log("防爆扩音列表", this.dataList);
+        this.dataList = FBKYLIST;
+        // console.log("防爆扩音列表", res, this.dataList);
         // content.forEach((d) => {
         //   d.GPSPoints = this.transPosition(d.pointList);
         // });
@@ -228,23 +292,18 @@ export default {
     handleTableClick(data, btnType) {
       if (btnType === "open") {
         console.log("打开扩音", data);
+        this.openningTile = data.name;
+        this.ringNumber = data.number;
+        this.exchangeVideo(data.cameraID);
+        setTimeout(() => {
+          this.callDisable = true;
+        }, 200);
       }
       if (btnType === "close") {
         console.log("关闭扩音", data);
+        this.openningTile = "暂无";
+        this.callDisable = false;
       }
-      // const tableData = this.$parent.$parent.alarmLiveData.filter((item) => {
-      //   return item.Category == "100001" && item.ObjectID == data.id;
-      // });
-      // this.$store.dispatch("dialog/openLayerDetailDialog", {
-      //   id: data.id,
-      //   type: "rail",
-      //   name: "围栏",
-      //   detail: {
-      //     id: data.id,
-      //     name: data.name,
-      //     tableData,
-      //   },
-      // });
     },
     async getDepartmentByPid() {
       try {
@@ -266,14 +325,51 @@ export default {
         console.log(err);
       }
     },
-    searchData() {
-      this.pageConfig.pageNo = 1;
+    searchData(e) {
+      // this.pageConfig.pageNo = 1;
+      console.log(e);
+      if (e.webRTCUrl) {
+        this.webSocketParams.admin = e.admin;
+        this.webSocketParams.password = e.password;
+        this.webSocketParams.url = e.webRTCUrl;
+      } else {
+        this.webSocketParams.url = "";
+      }
       this.filterInfo();
     },
-    filterInfo() {},
-    exchangeVideo() {},
-    openAll() {},
-    closeAll() {},
+    filterInfo() {
+      if (this.department.id) {
+        const array = [];
+        for (let i = 0; i < this.dataList.length; i++) {
+          const e = this.dataList[i];
+          if (e.departmentId === this.department.id) {
+            array.push(e);
+          }
+        }
+        this.tableConfig.tableData = array;
+      }
+      // console.log("筛选列表", this.tableConfig.tableData);
+    },
+    exchangeVideo(id) {
+      for (let i = 0; i < this.cameraList.length; i++) {
+        const c = this.cameraList[i];
+        if (c.id === id) {
+          console.log("筛选摄像头", this.cameraInfo);
+          return (this.cameraInfo = c);
+        }
+      }
+    },
+    openAll() {
+      this.ringNumber = "99997";
+      this.callDisable = true;
+    },
+    closeAll() {
+      this.callDisable = false;
+      this.openningTile = "暂无";
+      this.cameraInfo = {
+        id: "1",
+      };
+    },
     openBroadcast() {},
     closeBroadcast() {},
     handleClose(item) {
@@ -287,6 +383,7 @@ export default {
       }
     },
   },
+  beforeDestroy() {},
 };
 </script>
 <style lang="less" scoped>
@@ -375,7 +472,7 @@ export default {
       }
     }
     .select_list {
-      height: 66px;
+      height: 30px;
       overflow: auto;
       max-height: 66px;
       .select-tag {

+ 2 - 1
src/views/components/dialog/VideoImageWindow copy.vue

@@ -272,7 +272,8 @@ export default {
     init(str) {
       // this.socketList[`ws_${this.cameraId}`];
       this.ws = new WebSocket(
-        "ws://" + window.location.host + BASE_URL + "/VideoOverWebSocket"
+        VUE_APP_BASE_WS() + "/VideoOverWebSocket"
+        // "ws://" + window.location.host + BASE_URL + "/VideoOverWebSocket"
       );
       this.ws.onmessage = (evt) => {
         if (typeof evt.data === "string") {

+ 1 - 1
src/views/components/dialog/VideoImageWindow.vue

@@ -131,7 +131,7 @@ export default {
     // 放大缩小
     init(str) {
       // this.socketList[`ws_${this.cameraId}`];
-      this.ws = new WebSocket('ws://' + window.location.host + BASE_URL + '/VideoOverWebSocket')
+      this.ws = new WebSocket('wss://' + window.location.host + BASE_URL + '/VideoOverWebSocket')
       this.ws.onmessage = evt => {
         if (typeof evt.data === 'string') {
           // console.log(JSON.parse(evt.data).Msg)

+ 8 - 2
src/views/components/emergency/CardDetailDialog.vue

@@ -11,8 +11,8 @@
     <div slot="title" class="dialog-title">
       <img :src="require('@/assets/imgs/logo_small.png')" alt="" />
       <div class="title-box">
-        <span class="title-text">国家管网集团北京管道有限公司</span>
-        <span class="title-text">天津输油气分公司静海作业区</span>
+        <span class="title-text">{{ info.group }}</span>
+        <span class="title-text">{{ info.company + info.curStation }}</span>
       </div>
     </div>
     <div class="list-container">
@@ -48,6 +48,11 @@ export default {
     return {
       show: false,
       detail: {},
+      info: {
+        group: "国家管网集团西南管道公司",
+        company: "贵阳输油气分公司",
+        curStation: "都匀作业区",
+      },
     };
   },
   watch: {
@@ -56,6 +61,7 @@ export default {
     },
   },
   mounted() {
+    this.info = HOME_DATA;
     this.$EventBus.$off("handleClickRow");
     this.$EventBus.$on("handleClickRow", (data) => {
       this.detail = data;

+ 1 - 0
src/views/components/emergency/CardListDialog.vue

@@ -43,6 +43,7 @@ export default {
       handler(newVal) {
         console.log(newVal);
         this.show = newVal.includes("应急处置卡");
+        this.getCartList();
       },
       deep: true,
     },

+ 153 - 28
src/views/components/emergency/ContactInfoDialog.vue

@@ -11,8 +11,8 @@
     <div slot="title" class="dialog-title">
       <img :src="require('@/assets/imgs/logo_small.png')" alt="" />
       <div class="title-box">
-        <span class="title-text">国家管网集团北京管道有限公司</span>
-        <span class="title-text">天津输油气分公司静海作业区</span>
+        <span class="title-text">{{ info.group }}</span>
+        <span class="title-text">{{ info.company + info.curStation }}</span>
       </div>
     </div>
     <div class="list-container">
@@ -28,11 +28,23 @@
         </thead>
         <tbody>
           <template v-for="item of contacts">
-            <tr class="list-item" v-for="(person, index) in item.contacts" :key="index">
-              <td class="sort" :rowspan="item.contacts.length" v-if="index === 0">
+            <tr
+              class="list-item"
+              v-for="(person, index) in item.contacts"
+              :key="index"
+            >
+              <td
+                class="sort"
+                :rowspan="item.contacts.length"
+                v-if="index === 0"
+              >
                 {{ item.sort }}
               </td>
-              <td class="company" :rowspan="item.contacts.length" v-if="index === 0">
+              <td
+                class="company"
+                :rowspan="item.contacts.length"
+                v-if="index === 0"
+              >
                 {{ item.unit }}
               </td>
               <td class="name">{{ person.name }}</td>
@@ -40,7 +52,9 @@
                 <div v-if="Array.isArray(person.phone)">
                   <template v-for="(p, pIndex) in person.phone">
                     {{ p }}
-                    <template v-if="pIndex < person.phone.length - 1"><br :key="p" /></template>
+                    <template v-if="pIndex < person.phone.length - 1"
+                      ><br :key="p"
+                    /></template>
                   </template>
                 </div>
               </td>
@@ -67,32 +81,132 @@ export default {
     return {
       show: false,
       rowNumber: 1,
+      info: {
+        group: "国家管网集团西南管道公司",
+        company: "贵阳输油气分公司",
+        curStation: "都匀作业区",
+      },
       contacts: [
-        { sort: "1", company: "国家管网调控中心", name: "应急值班电话", phone: "010-87981234" },
+        {
+          sort: "1",
+          company: "国家管网调控中心",
+          name: "应急值班电话",
+          phone: "010-87981234",
+        },
         {
           sort: "2",
           company: "公司应急指挥中心",
           name: "值班电话",
           phone: ["010-84884310", "13910592752"],
         },
-        { sort: "3", company: "天津输油气分公司", name: "陶志刚", phone: "13716833000" },
-        { sort: "4", company: "天津输油气分公司", name: "吴庆江", phone: "13601149487" },
-        { sort: "5", company: "天津输油气分公司", name: "刘乃刚", phone: "15830610158" },
-        { sort: "6", company: "天津输油气分公司", name: "赵宏振", phone: "13381228262" },
-        { sort: "7", company: "天津输油气分公司", name: "齐迎峰", phone: "13811255802" },
-        { sort: "8", company: "天津输油气分公司", name: "董长锁", phone: "13821371452" },
-        { sort: "9", company: "天津输油气分公司", name: "夏坤坤", phone: "18633793078" },
-        { sort: "10", company: "天津输油气分公司", name: "孙全军", phone: "13393033123" },
-        { sort: "11", company: "分公司值班室", name: "值班电话", phone: "18322404900" },
-        { sort: "12", company: "大港作业区", name: "值班电话", phone: "4633/13072030579" },
-        { sort: "13", company: "霸州作业区", name: "值班电话", phone: "4635/13230680366" },
-        { sort: "14", company: "河北华奥", name: "值班电话", phone: "0317-4129733" },
-        { sort: "15", company: "天津天汇", name: "值班电话", phone: "13388003887" },
-        { sort: "16", company: "津静昆仑", name: "值班电话", phone: "13866380546" },
-        { sort: "17", company: "静海区应急管理局", name: "值班电话", phone: "022-68692821" },
-        { sort: "18", company: "静海区公安分局", name: "值班电话", phone: "022-28942821" },
-        { sort: "19", company: "静海区消防支队", name: "值班电话", phone: "022-28942710" },
-        { sort: "20", company: "静海区医院", name: "值班电话", phone: "022-28942928" },
+        {
+          sort: "3",
+          company: "天津输油气分公司",
+          name: "陶志刚",
+          phone: "13716833000",
+        },
+        {
+          sort: "4",
+          company: "天津输油气分公司",
+          name: "吴庆江",
+          phone: "13601149487",
+        },
+        {
+          sort: "5",
+          company: "天津输油气分公司",
+          name: "刘乃刚",
+          phone: "15830610158",
+        },
+        {
+          sort: "6",
+          company: "天津输油气分公司",
+          name: "赵宏振",
+          phone: "13381228262",
+        },
+        {
+          sort: "7",
+          company: "天津输油气分公司",
+          name: "齐迎峰",
+          phone: "13811255802",
+        },
+        {
+          sort: "8",
+          company: "天津输油气分公司",
+          name: "董长锁",
+          phone: "13821371452",
+        },
+        {
+          sort: "9",
+          company: "天津输油气分公司",
+          name: "夏坤坤",
+          phone: "18633793078",
+        },
+        {
+          sort: "10",
+          company: "天津输油气分公司",
+          name: "孙全军",
+          phone: "13393033123",
+        },
+        {
+          sort: "11",
+          company: "分公司值班室",
+          name: "值班电话",
+          phone: "18322404900",
+        },
+        {
+          sort: "12",
+          company: "大港作业区",
+          name: "值班电话",
+          phone: "4633/13072030579",
+        },
+        {
+          sort: "13",
+          company: "霸州作业区",
+          name: "值班电话",
+          phone: "4635/13230680366",
+        },
+        {
+          sort: "14",
+          company: "河北华奥",
+          name: "值班电话",
+          phone: "0317-4129733",
+        },
+        {
+          sort: "15",
+          company: "天津天汇",
+          name: "值班电话",
+          phone: "13388003887",
+        },
+        {
+          sort: "16",
+          company: "津静昆仑",
+          name: "值班电话",
+          phone: "13866380546",
+        },
+        {
+          sort: "17",
+          company: "静海区应急管理局",
+          name: "值班电话",
+          phone: "022-68692821",
+        },
+        {
+          sort: "18",
+          company: "静海区公安分局",
+          name: "值班电话",
+          phone: "022-28942821",
+        },
+        {
+          sort: "19",
+          company: "静海区消防支队",
+          name: "值班电话",
+          phone: "022-28942710",
+        },
+        {
+          sort: "20",
+          company: "静海区医院",
+          name: "值班电话",
+          phone: "022-28942928",
+        },
       ],
     };
   },
@@ -103,11 +217,14 @@ export default {
     topNavActive: {
       handler(newVal) {
         this.show = newVal.includes("应急通讯录");
+        this.getContactList();
       },
       deep: true,
     },
   },
-  mounted() {},
+  mounted() {
+    this.info = HOME_DATA;
+  },
   created() {
     this.getContactList();
   },
@@ -139,7 +256,11 @@ export default {
     .el-dialog__header {
       height: 88px;
       padding: 0;
-      background-image: linear-gradient(180deg, rgba(0, 70, 140, 0.8) 0%, rgba(0, 121, 215, 0.8) 100%);
+      background-image: linear-gradient(
+        180deg,
+        rgba(0, 70, 140, 0.8) 0%,
+        rgba(0, 121, 215, 0.8) 100%
+      );
       border-radius: 10px 10px 0 0;
       .dialog-title {
         height: 100%;
@@ -210,7 +331,11 @@ export default {
     .el-dialog__footer {
       padding: 0;
       height: 48px;
-      background-image: linear-gradient(180deg, rgba(0, 70, 140, 0.8) 0%, rgba(0, 121, 215, 0.8) 100%);
+      background-image: linear-gradient(
+        180deg,
+        rgba(0, 70, 140, 0.8) 0%,
+        rgba(0, 121, 215, 0.8) 100%
+      );
       border-radius: 0 0 10px 10px;
       .dialog-footer {
         height: 100%;

+ 1 - 1
src/views/videoMonitor/components/videoContent.vue

@@ -52,7 +52,7 @@ export default {
   methods: {
     init(str) {
       // this.socketList[`ws_${this.cameraData.id}`];
-      const host = VUE_APP_BASE_WS() + '/VideoOverWebSocket'
+      const host = 'wss://' + window.location.host + BASE_URL + '/VideoOverWebSocket'
       this.ws = new WebSocket(host)
       this.ws.onmessage = evt => {
         if (typeof evt.data === 'string') {

+ 7 - 3
src/views/videoMonitor/index.vue

@@ -108,7 +108,7 @@ export default {
         const res = await getCameraList({
           pageIndex: 1,
           pageSize: 100,
-          listOrder: ['ip,asc'],
+          listOrder: ["ip,asc"],
           departmentId: this.$route.query.did, //按照部门筛选
           useType: this.$route.query.type, //按照用途类型筛选
         });
@@ -118,8 +118,12 @@ export default {
         //   // return true
         //   return !NO_SINGLE_CAMERA.includes(c?.name)
         // })
-        this.videoList = content;
-        // this.sortVideoList()
+        // this.videoList = content;
+        this.sortVideoList()
+        this.videoList = content.filter((c) => {
+          //过滤首页轮播显示
+          return c.homeCarouselEnable > 0;
+        });
       } catch (error) {
         console.log("getCameraList error", error);
       }

+ 1 - 1
src/views/videoMonitorType/components/videoContent.vue

@@ -52,7 +52,7 @@ export default {
   methods: {
     init(str) {
       // this.socketList[`ws_${this.cameraData.id}`];
-      const host = VUE_APP_BASE_WS() + '/VideoOverWebSocket'
+      const host = 'wss://' + window.location.host + BASE_URL + '/VideoOverWebSocket'
       this.ws = new WebSocket(host)
       this.ws.onmessage = evt => {
         if (typeof evt.data === 'string') {

+ 3 - 1
src/views/videoMonitorType/index.vue

@@ -162,7 +162,9 @@ export default {
         //   // return true
         //   return !NO_SINGLE_CAMERA.includes(c?.name)
         // })
-        this.videoList = content;
+        this.videoList = content.filter((c) => {//过滤首页轮播显示
+          return c.homeCarouselEnable > 0;
+        });
         // this.sortVideoList()
       } catch (error) {
         console.log("getCameraList error", error);

+ 4 - 4
vue.config.js

@@ -19,10 +19,10 @@ module.exports = {
       '/yapi': {
         // target: 'http://39.101.177.49:5013/', // 远程服务器-皞哥
         // target: 'http://127.0.0.1:18201/prod-api/', // 贵州现场
-        // target: 'http://11.100.46.218:8080/prod-api/', // 贵都匀现场
+        target: 'https://11.100.46.218:8080/prod-api/', // 贵都匀现场
         // target: 'http://11.100.46.220:8080/prod-api/', // 贵州现场
         // target: 'http://192.168.1.10:8080/prod-api/', // 贵州现场
-        target: 'http://192.168.18.219:22102/prod-api/', // 都匀转发
+        // target: 'http://192.168.18.219:22102/prod-api/', // 都匀转发
         // target: 'http://192.168.18.219:22100/prod-api/', // 托克托转发
         // target: 'http://192.168.195.134:8080/prod-api/', // 贵州现场
         // target: 'http://172.168.0.62:8080/prod-api/', // 托克托现场
@@ -40,12 +40,12 @@ module.exports = {
         // target: 'http://39.101.177.49:5013/model/', //模型服务器
         // target: 'http://127.0.0.1:18202/model/', //贵州现场
         // target: 'http://11.100.46.220:8081/model/', //都匀现场
-        // target: 'http://11.100.46.218:8081/model/', //都匀现场
+        target: 'https://11.100.46.218:8081/model/', //都匀现场
         // target: "http://192.168.70.11:8081/model/", // 静海现场
         // target: "http://localhost:8000/model/", // 济北综合站现场服务器
         // target: 'http://11.100.46.220:8081/model/', //贵阳模型服务器
         // target: 'http://192.168.1.10:8081/model/', //贵阳模型服务器
-        target: 'http://192.168.18.219:22101/model/', //托克托模型服务器转发
+        // target: 'http://192.168.18.219:22101/model/', //托克托模型服务器转发
         // target: 'http://192.168.18.219:22103/model/', //都匀模型服务器转发
         // target: 'http://192.168.195.134:8081/model/', //模型服务器
         // target: 'http://172.168.0.62:8081/model/', //托克托模型现场服务器