Browse Source

火灾状态弹窗调整,火灾图层增加,火灾图标右键堆叠选择,

fan 4 months ago
parent
commit
3ccfb43084

BIN
public/imgs/footerNavigation/icon_YT_nor@2x.png


BIN
public/imgs/footerNavigation/icon_YT_sel@2x.png


+ 10 - 4
public/js/config.js

@@ -143,8 +143,8 @@ const MQTT_CONFIG = {
 }
 //后台管理根路径
 const ISMSAdminWeb = {
-  // path: "http://172.168.0.62:8080/#/",
-  path: `http://192.168.195.136:8080/#/`,
+  path: "http://172.168.0.62:8080/#/",
+  // path: `http://192.168.195.136:8080/#/`,
   // path: `http://${window.location.hostname}:8080/#/`,
 }
 
@@ -639,17 +639,23 @@ const GY_JGYT_CONFIG = [
           {
             id: '786542179467141120',
             name: '激光检测1',
-            ndTag: 'DY_Leak_PTZ_Concn',
+            ndTag: 'JGYT1_ND',
           },
           {
             id: '786542180738015232',
             name: '激光检测2',
-            ndTag: 'DY_Leak_PTZ_Concn',
+            ndTag: 'JGYT2_ND',
           },
         ],
       },]
   }]
 
+const TKT_PERSON_NUMS = {
+  total: 4,
+  person: 4,
+  register: 4,
+  Worker: 4,
+}
 /**
  * mqtt地址
  * 判断是否被iframe嵌套

+ 8 - 0
src/API/positioning.js

@@ -1,6 +1,14 @@
 // 定位系统相关接口
 import $http from '@/utils/request'
 
+// 获取门禁信息
+export const getAccessInfo = data =>
+  $http({
+    method: 'POST',
+    url: '/AccessControl/Config/GetEntity',
+    data,
+    notShowLoading: true,
+  })
 // 获取实时定位标签
 export const getPositioningJson = data =>
   $http({

+ 1 - 1
src/API/visual.js

@@ -16,7 +16,7 @@ export const getElementList = (data) =>
     data,
     notShowLoading: true,
   });
-
+ 
 export const getMenuList = (data) =>
   $http({
     method: "post",

+ 4 - 2
src/utils/index.js

@@ -43,8 +43,10 @@ export function _locate(xDist, yDist, c = { x: 108.4416707584088, y: 22.86248482
   // console.log(c, xDist, yDist);
   // console.log(c)
   const radius = 6378137 //坐标系球的半径  WGS84是6378137
-  let xOffset = 0 //x偏移量 单位mm  -7400;// -2700 tkt  -700 duyun   tkt2  0
-  let yOffset = 1000 //y偏移量 单位mm   1800;// 2000 tkt  1600 duyun  tkt2 1000 
+  let xOffset = -2700 //x偏移量 单位mm  -7400;// -2700 tkt  -700 duyun   tkt2  0
+  let yOffset = 2000 //y偏移量 单位mm   1800;// 2000 tkt  1600 duyun  tkt2 1000 
+  // let xOffset = 0 //x偏移量 单位mm  -7400;// -2700 tkt  -700 duyun   tkt2  0
+  // let yOffset = 1000 //y偏移量 单位mm   1800;// 2000 tkt  1600 duyun  tkt2 1000 
   //console.log("before", xDist, yDist)
   xDist = +xDist + xOffset
   yDist = +yDist + yOffset

+ 3 - 0
src/views/Home.vue

@@ -8,6 +8,7 @@
     <router-view ref="routerView" />
     <!-- 底部背景 -->
     <div class="footer" v-show="hasToken && !fullScreen"></div>
+    <base-footer v-show="hasToken && !fullScreen" />
     <!-- 应急选项卡列表 -->
     <!-- <card-list-dialog /> -->
     <!-- 应急选项卡详情 -->
@@ -52,6 +53,7 @@
 <script>
 // import BaseHeader from '@/views/components/baseHeader/index'
 import BaseHeader from "@/views/components/baseHeader/left.vue";
+import BaseFooter from "@/views/components/baseFooter/FooterNavigation.vue";
 import CardListDialog from "@/views/components/emergency/CardListDialog";
 import CardDetailDialog from "@/views/components/emergency/CardDetailDialog";
 import ContactInfoDialog from "@/views/components/emergency/ContactInfoDialog";
@@ -74,6 +76,7 @@ export default {
   },
   components: {
     BaseHeader, //头部组件
+    BaseFooter, //底部组件
     CardListDialog,
     CardDetailDialog,
     ContactInfoDialog,

+ 6 - 3
src/views/basePage/components/dialog/AlarmMapDialog.vue

@@ -67,7 +67,10 @@
               }}
             </span>
           </div>
-          <div class="perimeter-btn">
+          <div
+            class="perimeter-btn"
+            v-if="dialogConfig.dialogMsg.data.alarmType > 0"
+          >
             <el-button class="handle-btn" @click="handleCancelFireAlarm">
               报警消除
             </el-button>
@@ -247,8 +250,8 @@ export default {
     },
   },
   mounted() {
-    this.alarmType === "perimeter" &&
-      document.getElementById("mapAlarmAudio").play();
+    // this.alarmType === "perimeter" &&
+    //   document.getElementById("mapAlarmAudio").play();
     // console.log(this.dialogConfig);
   },
   methods: {

+ 79 - 0
src/views/basePage/components/dialog/OverlapFireDialog.vue

@@ -0,0 +1,79 @@
+<template>
+  <div
+    class="overlapFireDialog"
+    :style="{
+      left: position.x,
+      top: position.y,
+      width: '260px',
+    }"
+  >
+    <div
+      class="personName"
+      v-for="item in fires"
+      :key="item.id"
+      :style="{
+        fontWeight: item.alarm ? 'bold' : 'normal',
+        color: item.alarm ? 'red' : 'white',
+      }"
+      @click="handleClick(item)"
+    >
+      {{ item.name }}
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "OverlapFireDialog",
+  props: {
+    fires: {
+      type: Array,
+    },
+    position: {
+      type: Object,
+      default() {
+        return {
+          x: "0px",
+          y: "0px",
+        };
+      },
+    },
+  },
+  methods: {
+    handleClick(item) {
+      this.$emit("selectOverlapFire", item);
+      this.$emit("closeOverlapDialog");
+    },
+    handleClose() {
+      this.$emit("closeOverlapDialog");
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.overlapFireDialog {
+  z-index: 1101;
+  position: absolute;
+  padding: 5px;
+  // background-image: linear-gradient(48deg, rgba(0, 37, 45, 0.65) 0%, rgba(0, 106, 116, 0.65) 100%);
+  background-color: rgba(0, 70, 155, 0.6);
+  border: 1px solid #5bd6ff;
+  text-align: center;
+  .personName {
+    text-align: center;
+    line-height: 25px;
+    pointer-events: initial;
+    opacity: 1;
+    width: 240px;
+    height: 25px;
+    display: inline-block;
+  }
+  .personName:hover {
+    cursor: pointer;
+    background: rgba(0, 225, 219, 0.7);
+    // border: 1px solid rgba(8, 255, 175, 0.53);
+    // box-shadow: inset 0 0 6px 0 rgba(0, 0, 0, 0.6);
+  }
+}
+</style>

+ 1 - 0
src/views/basePage/components/dialog/index.js

@@ -13,6 +13,7 @@ export { default as VideoImageWindow } from "../videoWindow/VideoImageWindow.vue
 export { default as TooltipDialog } from "./TooltipDialog.vue";
 export { default as OverlapPersonDialog } from "./OverlapPersonDialog.vue";
 export { default as OverlapCameraDialog } from "./OverlapCameraDialog.vue";
+export { default as OverlapFireDialog } from "./OverlapFireDialog.vue";
 export { default as BuildingPersonDialog } from "./BuildingPersonDialog.vue";
 
 export { default as AlarmMapDialog } from "./AlarmMapDialog.vue";

+ 7 - 3
src/views/basePage/components/layerControl/index.vue

@@ -221,7 +221,7 @@ export default {
     },
     switchConfig: {
       handler(newVal) {
-        console.log("Infomation",newVal);
+        console.log("Infomation", newVal);
       },
     },
     switchConfigShow: {
@@ -452,10 +452,14 @@ export default {
           buildId: this.buildInfo?.positioningBuildId,
           riskLevelArray: ["306001", "306002", "306003", "306004"],
         });
-        // console.log(res);
+        console.log("FXQYInfomation", res);
         let tempdata = res.data.content;
         let fxqyList = new Array();
-
+        if (show) {
+          this.fxqyData = fxqyList;
+        } else {
+          this.fxqyData = [];
+        }
         //遍历区域
         tempdata.forEach((a, i) => {
           //遍历围栏

+ 31 - 4
src/views/basePage/components/layerControl/layerDetail/fxqy.vue

@@ -2,19 +2,31 @@
   <div>
     <div class="detail-search-box">
       <div class="search-item">
-        <el-input v-model="filterKey" placeholder="风险区域名称" @keyup.enter.native="query">
-          <el-button slot="append" icon="el-icon-search" @click="query"></el-button>
+        <el-input
+          v-model="filterKey"
+          placeholder="风险区域名称"
+          @keyup.enter.native="query"
+        >
+          <el-button
+            slot="append"
+            icon="el-icon-search"
+            @click="query"
+          ></el-button>
         </el-input>
       </div>
     </div>
     <div class="detail-table-box">
-      <base-table-list :tableConfig="tableConfig" @handleClick="handleTableClick" />
+      <base-table-list
+        :tableConfig="tableConfig"
+        @handleClick="handleTableClick"
+      />
     </div>
   </div>
 </template>
 
 <script>
 import BaseTableList from "@/views/components/base/BaseTableList";
+import { getFXQYList, getFXQYDetail } from "@/API/custom";
 
 export default {
   name: "normal",
@@ -47,7 +59,7 @@ export default {
           },
         ],
         tableData: [],
-        rowClick: this.location,
+        // rowClick: this.location,
       },
     };
   },
@@ -77,6 +89,21 @@ export default {
     location(item) {
       this.$emit("locationEntity", item.id);
     },
+    async getFXQYDetail(data) {
+      try {
+        this.$store.dispatch("home/setFXQYDetail", data);
+      } catch (err) {
+        console.log(err);
+      }
+    },
+    async getFXQYList() {
+      try {
+        let res = await getFXQYList();
+        this.originData = res.data.content;
+      } catch (err) {
+        console.log(err);
+      }
+    },
   },
   mounted() {
     this.tableConfig.tableData = this.data;

+ 11 - 8
src/views/basePage/index.vue

@@ -60,6 +60,13 @@
       @closeOverlapDialog="handleCloseOverlapDialog"
       @selectOverlapCamera="handleSelectOverlapCamera"
     />
+    <overlap-fire-dialog
+      v-if="overlapFire.show"
+      :fires="overlapFire.overlapFires"
+      :position="overlapFire.position"
+      @closeOverlapDialog="handleCloseOverlapDialog"
+      @selectOverlapFire="handleSelectOverlapFire"
+    />
     <building-person-dialog
       v-if="buildingPersonWindow.show"
       :buildingPerson="buildingPersonWindow.data"
@@ -169,6 +176,7 @@ import {
   PersonDialog,
   OverlapPersonDialog,
   OverlapCameraDialog,
+  OverlapFireDialog,
   ChemicalDetailDialog,
   YuanDetailDialog,
   BuildingPersonDialog,
@@ -221,6 +229,7 @@ export default {
     BuildingPersonDialog,
     TooltipDialog,
     OverlapCameraDialog,
+    OverlapFireDialog,
     OneKeyAlarmDialog,
     ModelViewToolbarDialog,
     AlarmMapDialog,
@@ -275,16 +284,10 @@ export default {
                   if (key === "jgyt") {
                     position = [+val.longitude, +val.latitude, +val.height];
                   } else if (key === "fire") {
-                    console.log(
-                      "火灾报警弹窗数据信息",
-                      this.mapDialogConfig[key]
-                    );
+                    console.log("火灾弹窗数据信息", this.mapDialogConfig[key]);
                     position = val.alarmPosition;
                   } else if (key === "perimeter") {
-                    console.log(
-                      "周界弹窗数据信息",
-                      this.mapDialogConfig[key]
-                    );
+                    console.log("周界弹窗数据信息", this.mapDialogConfig[key]);
                     position = [...val.alarmPosition, 4];
                     if (val.segmentName) {
                       val.name = val.name + val.segmentName;

+ 6 - 2
src/views/basePage/mixins/LoadLayer/fire.js

@@ -15,7 +15,11 @@ export default {
   computed: {
     ...mapGetters(['buildId', 'buildInfo', 'mapMode', 'switchConfig']),
     fireTagsShow() {
-      return this.switchConfig.find(e => e?.type && e.type === 'fire')?.show
+      if (this.mapMode.value === '3d') {
+        return this.switchConfig.find(e => e?.type && e.type === 'fire')?.show
+      } else {
+        return false
+      }
     },
   },
   watch: {
@@ -42,7 +46,7 @@ export default {
         type: "fire",
         label: "火灾",
         name: "火灾",
-        show: this.fireTagsShow,
+        show: true,
         selected: false,
         elements: this.fireTagsData,
       });

+ 1 - 0
src/views/basePage/mixins/LoadLayer/person.js

@@ -464,6 +464,7 @@ export default {
     handleCloseOverlapDialog() {
       this.overlapWindow.show = false
       this.overlapCamera.show = false
+      this.overlapFire.show = false
     },
     //从重叠人员中选择一个人
     handleSelectOverlapPerson(data) {

+ 178 - 57
src/views/basePage/mixins/MapEvent.js

@@ -27,7 +27,15 @@ export default {
       tooltipDialogArr: [],
       alwaysShowDialogArr: [],
       overlapCamera: {
-        overlapCameras: [], //重叠人员的显示
+        overlapCameras: [], //重叠摄像头的显示
+        show: false,
+        position: {
+          x: '0px',
+          y: '0px',
+        },
+      },
+      overlapFire: {
+        overlapFires: [], //重叠火灾报警器的显示
         show: false,
         position: {
           x: '0px',
@@ -38,7 +46,7 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['mapPopupConfig', 'modelList', 'rtTag']),
+    ...mapGetters(['mapPopupConfig', 'modelList', 'rtTag', 'buildInfo']),
   },
   watch: {
     mapPopupConfig(newVal) {
@@ -92,7 +100,7 @@ export default {
                 ? pickObj.id.properties._type._value
                 : ''
               : ''
-            console.log(type)
+            console.log(type, pickObj.id)
             const data = pickObj.id.properties
               ? pickObj.id.properties._details
                 ? pickObj.id.properties._details._value
@@ -167,10 +175,9 @@ export default {
               })
             } else if (type === 'fbky') {
               console.log("数据内容fbky:----------------", data);
-
               // this.$store.dispatch('dialog/openLayerDetailDialog', {
               //   id: data.id,
-              //   type: 'fxqy',
+              //   type: 'fbky',
               //   detail: { ...data },
               // })
             } else if (type === '集气站' || type === '汇管' || type === '井管' || type === '站间管' || type === '井') {
@@ -184,6 +191,71 @@ export default {
               console.log(trackPointDetails)
             } else if (type === 'building') {
               this.showModelToolTip(pickObj.id.code, pickObj.id.name, pickObj, obj)
+            } else if (type === 'layer_perimeter') {
+              const data = pickObj.id.properties ? pickObj.id.properties.segment._value : ''
+              if (this.mapDialogConfig.perimeter.some(item => item.dialogMsg?.data?.id == data.id)) {
+                this.mapDialogConfig.perimeter = this.mapDialogConfig.perimeter.filter(
+                  item => item.dialogMsg?.data?.id != data.id
+                )
+              }
+              this.mapDialogConfig.perimeter.push({
+                show: false,
+                dialogMsg: { data, position: [longitude, latitude, height] },
+              })
+              console.log("周界信息", this.mapDialogConfig.perimeter)
+              for (let d of this.mapDialogConfig.perimeter) {
+                ; (() => {
+                  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: d.dialogMsg?.position,
+                      dialogid: 'perimeter_' + d.dialogMsg?.data?.id,
+                      p1: 132,
+                      p2: 236,
+                    })
+                  }, 0)
+                })()
+              }
+
+            } else if (type === 'layer_fire') {
+              // if (this.mapDialogConfig.fire.some(item => item.dialogMsg?.data?.id == data.id)) {
+              //   this.mapDialogConfig.fire = this.mapDialogConfig.fire.filter(
+              //     item => item.dialogMsg?.data?.id != data.id
+              //   )
+              // }
+              const fireInfo = pickObj.id.properties._details._value
+              const gpsAlarmPoint = this.transPosition([{ x: fireInfo.location.x, y: fireInfo.location.y, z: fireInfo.height }])
+              console.log('坐标点转化', gpsAlarmPoint);
+              fireInfo.alarmType = -1
+              this.mapDialogConfig.fire = []
+              console.log("无报警", this.mapDialogConfig.fire);
+              this.mapDialogConfig.fire.push({
+                show: false,
+                dialogMsg: { data: fireInfo, position: [gpsAlarmPoint[0][0], gpsAlarmPoint[0][1], gpsAlarmPoint[0][2]] },
+              })
+              for (let d of this.mapDialogConfig.fire) {
+                ; (() => {
+                  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: 'fire_' + d.dialogMsg?.data?.id,
+                      p1: 140,
+                      p2: 236,
+                    })
+                  }, 0)
+                })()
+              }
             } else if (type === 'layer_jgyt_Point') {
               if (this.mapDialogConfig.jgyt.some(item => item.dialogMsg?.data?.id == data.id)) {
                 this.mapDialogConfig.jgyt = this.mapDialogConfig.jgyt.filter(
@@ -360,7 +432,7 @@ export default {
 
         if (cDefined(pickObj)) {
           if (pickObj.id && pickObj.id instanceof Entity) {
-            console.log(pickObj)
+            // console.log("鼠标位置信息", pickObj)
             const type = pickObj.id.properties ? pickObj.id.properties._type._value : ''
             if (type === 'person') {
               this.overlapWindow.overlapPersons = [] //先清空
@@ -408,59 +480,69 @@ export default {
                 this.overlapCamera.position.y = movement.position.y + 'px'
               }
             }
-            if (type === 'layer_perimeter') {
-              const data = pickObj.id.properties ? pickObj.id.properties.segment._value : ''
-              if (this.mapDialogConfig.perimeter.some(item => item.dialogMsg?.data?.id == data.id)) {
-                this.mapDialogConfig.perimeter = this.mapDialogConfig.perimeter.filter(
-                  item => item.dialogMsg?.data?.id != data.id
-                )
-              }
-              this.mapDialogConfig.perimeter.push({
-                show: false,
-                dialogMsg: { data, position: [longitude, latitude, height] },
-              })
-              console.log(this.mapDialogConfig.perimeter)
-              for (let d of this.mapDialogConfig.perimeter) {
-                ; (() => {
-                  setTimeout(() => {
-                    d.show = true
-                    this.$store.dispatch('home/setMapPopupConfig', {
-                      isShow: true,
-                      type: 'point',
-                      position: d.dialogMsg?.position,
-                      dialogid: 'perimeter_' + d.dialogMsg?.data?.id,
-                      p1: 132,
-                      p2: 236,
-                    })
-                  }, 0)
-                })()
-              }
-            }
             if (type === 'layer_fire') {
-              if (this.mapDialogConfig.fire.some(item => item.dialogMsg?.data?.id == data.id)) {
-                this.mapDialogConfig.fire = this.mapDialogConfig.fire.filter(
-                  item => item.dialogMsg?.data?.id != data.id
-                )
-              }
-              this.mapDialogConfig.fire.push({
-                show: false,
-                dialogMsg: { data, position: [longitude, latitude, height] },
-              })
-              for (let d of this.mapDialogConfig.fire) {
-                ; (() => {
-                  setTimeout(() => {
-                    d.show = true
-                    this.$store.dispatch('dialog/openVideoDialog', d.dialogMsg.data.cameraID)
-                    this.$store.dispatch('home/setMapPopupConfig', {
-                      isShow: true,
-                      type: 'point',
-                      position: d.dialogMsg?.data?.alarmPosition,
-                      dialogid: 'fire_' + d.dialogMsg?.data?.id,
-                      p1: 150,
-                      p2: 236,
+              //右键重叠火灾图标列表选择
+              this.overlapFire.overlapFires = [] //先清空
+              console.log(SceneTransforms.wgs84ToWindowCoordinates(scene, pickObj.primitive._position))
+              const multiObjs = scene.drillPick(movement.position)
+              console.log("鼠标位置Fire Entity信息", multiObjs)
+
+              multiObjs.forEach((v, i, a) => {
+                if (v.id && v.id instanceof Entity) {
+                  const vtype = v.id.properties ? v.id.properties._type._value : ''
+                  if (vtype === 'layer_fire') {
+                    //console.log(v.id);
+                    const fire = v.id.properties.details._value
+                    this.overlapFire.overlapFires.push({
+                      id: v.id.id,
+                      name: v.id.properties.details._value.name,
+                      fire,
                     })
-                  }, 0)
-                })()
+                  }
+                }
+              })
+              console.log(this.overlapFire.overlapFires)
+              // if (this.overlapFire.overlapFires.length == 1) {
+              //   console.log(123);
+              //   const fireInfo = this.overlapFire.overlapFires[0].fire
+              //   const gpsAlarmPoint = this.transPosition([{ x: fireInfo.location.x, y: fireInfo.location.y, z: fireInfo.height }])
+              //   console.log('坐标点转化', gpsAlarmPoint);
+              //   fireInfo.alarmType = -1
+              //   // if (this.mapDialogConfig.fire.some(item => item.dialogMsg?.data?.id == data.id)) {
+              //   //   this.mapDialogConfig.fire = this.mapDialogConfig.fire.filter(
+              //   //     item => item.dialogMsg?.data?.id != data.id
+              //   //   )
+              //   // }
+              //   this.mapDialogConfig.fire = []
+              //   console.log("无报警", this.mapDialogConfig.fire);
+              //   this.mapDialogConfig.fire.push({
+              //     show: false,
+              //     dialogMsg: { data: fireInfo, position: [gpsAlarmPoint[0][0], gpsAlarmPoint[0][1], gpsAlarmPoint[0][2]] },
+              //   })
+              //   for (let d of this.mapDialogConfig.fire) {
+              //     ; (() => {
+              //       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: 'fire_' + d.dialogMsg?.data?.id,
+              //           p1: 150,
+              //           p2: 236,
+              //         })
+              //       }, 0)
+              //     })()
+              //   }
+              // }
+              if (this.overlapFire.overlapFires.length > 1) {
+                //说明有重叠,需要打开提示窗口
+                this.overlapFire.show = true
+                this.overlapFire.position.x = movement.position.x + 'px'
+                this.overlapFire.position.y = movement.position.y + 'px'
               }
             }
             if (type === 'layer_station') {
@@ -481,6 +563,45 @@ export default {
     handleSelectOverlapCamera(data) {
       this.$store.dispatch('dialog/openVideoDialog', data.id)
     },
+    //从重叠火灾报警器中选出一个
+    handleSelectOverlapFire(data) {
+      // console.log("66666666666666666666666666", data);
+      const gpsAlarmPoint = this.transPosition([{ x: data.fire.location.x, y: data.fire.location.y, z: data.fire.height }])
+
+      this.mapDialogConfig.fire = []
+      data.alarmType = -1
+      this.mapDialogConfig.fire.push({
+        show: false,
+        dialogMsg: { data, position: [gpsAlarmPoint[0][0], gpsAlarmPoint[0][1], gpsAlarmPoint[0][2]] },
+      })
+
+      for (let d of this.mapDialogConfig.fire) {
+        ; (() => {
+          setTimeout(() => {
+            d.show = true
+            if (data.fire.cameras?.length) {
+              this.$store.dispatch('dialog/openVideoDialog', data.fire.cameras[0].cameraId)//绑定摄像头弹窗
+            }
+            this.$store.dispatch('home/setMapPopupConfig', {
+              isShow: true,
+              type: 'point',
+              position: [gpsAlarmPoint[0][0], gpsAlarmPoint[0][1], gpsAlarmPoint[0][2]],
+              dialogid: 'fire_' + data.fire.id,
+              p1: 150,
+              p2: 236,
+            })
+          }, 0)
+        })()
+      }
+    },
+    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
+      }, [])
+    },
     //工作票的附加的区域绘制
     async getWFConfig(obj) {
       try {

+ 72 - 48
src/views/basePage/panels/PersonStatistics.vue

@@ -3,57 +3,61 @@
     <base-title title="进出人员" />
     <div class="page_content">
       <div class="person_title">人员信息</div>
-      <div class="person_num_box" v-if="personList.length">
+      <div class="person_num_box">
         <vue-seamless
           :data="personList"
           class="seamless-warp"
           :class-option="scrollOption"
           ref="seamlessScroll"
+          :key="seamLessTimeKey"
         >
-          <div class="item" v-for="item of personList" :key="item.id">
-            <div class="left">
-              <img
-                src="~@/assets/imgs/stationMap/img_无照片.png"
-                @click="openPersonInfo"
-              />
-            </div>
-            <div class="divider"></div>
-            <div class="right">
-              <div class="position">{{ item.type }}</div>
-              <div class="rymain">
-                <div class="row">
-                  <div style="width: 40%">
-                    <span>姓名:</span>
-                    <span class="val">{{ item.name }}</span>
-                  </div>
-                  <div>
-                    <span>电话号码:</span>
-                    <span class="val" style="color: #00e0ff">{{
-                      item.phone
-                    }}</span>
+          <div v-if="personList.length">
+            <div class="item" v-for="item of personList" :key="item.id">
+              <div class="left">
+                <img
+                  src="~@/assets/imgs/stationMap/img_无照片.png"
+                  @click="openPersonInfo"
+                />
+              </div>
+              <div class="divider"></div>
+              <div class="right">
+                <div class="position">{{ item.type }}</div>
+                <div class="rymain">
+                  <div class="row">
+                    <div style="width: 40%">
+                      <span>姓名:</span>
+                      <span class="val">{{ item.name }}</span>
+                    </div>
+                    <div>
+                      <span>电话号码:</span>
+                      <span class="val" style="color: #00e0ff">{{
+                        item.phone
+                      }}</span>
+                    </div>
                   </div>
-                </div>
-                <div class="row">
-                  <div>
-                    <span>人员类型:</span>
-                    <span class="val">{{ item.personType }}</span>
+                  <div class="row">
+                    <div>
+                      <span>人员类型:</span>
+                      <span class="val">{{ item.personType }}</span>
+                    </div>
                   </div>
-                </div>
-                <div class="row">
-                  <div>
-                    <span>岗位名称:</span>
-                    <span class="val">{{ item.posi }}</span>
+                  <div class="row">
+                    <div>
+                      <span>岗位名称:</span>
+                      <span class="val">{{ item.posi }}</span>
+                    </div>
                   </div>
-                </div>
-                <div class="row">
-                  <div>
-                    <span>所属单位:</span>
-                    <span class="val">{{ item.comp }}</span>
+                  <div class="row">
+                    <div>
+                      <span>所属单位:</span>
+                      <span class="val">{{ item.comp }}</span>
+                    </div>
                   </div>
                 </div>
               </div>
             </div>
           </div>
+          <div v-else>暂无数据</div>
         </vue-seamless>
       </div>
       <div class="person_type_box">
@@ -110,7 +114,7 @@
 <script>
 import BaseTitle from "./BaseTitle.vue";
 import VueSeamless from "vue-seamless-scroll";
-import { getPersonTypeList } from "@/API/positioning";
+import { getPersonTypeList, getAccessInfo } from "@/API/positioning";
 
 export default {
   name: "PersonStatistics",
@@ -118,6 +122,7 @@ export default {
   data() {
     return {
       total: 4,
+      seamLessTimeKey: new Date().getTime(),
       personTypeCount: [
         {
           name: "员工",
@@ -158,6 +163,7 @@ export default {
         limitMoveNum: 2,
         singleHeight: 173,
         waitTime: 5000,
+        openWatch: true,
       },
       personList: [
         {
@@ -207,21 +213,38 @@ export default {
       ],
     };
   },
-
+  created() {
+    this.openPersonInfo();
+  },
   mounted() {
-    this.getPersonTypeList();
+    // this.getPersonTypeList();
     // this.startMqtt();
   },
   methods: {
-    openPersonInfo() {
-
+    async openPersonInfo() {
+      try {
+        const res = await getAccessInfo({ id: "789185626355277824" });
+        const data = res.data;
+        console.log("门禁信息", data);
+        if (data.remark) {
+          const c = data.remark.split(":");
+          if (c.length == 3) {
+            this.personTypeCount[0].value = c[0];
+            this.personTypeCount[1].value = c[1];
+            this.personTypeCount[2].value = c[2];
+            this.total = Number(c[0]) + Number(c[1]) + Number(c[2]);
+          }
+        }
+      } catch (err) {
+        console.log(err);
+      }
     },
     openPersonList() {
-      this.$store.dispatch("globalConfig/setPersonListDialog", {
-        show: true,
-        dialogMsg: this.personList,
-        type: "All",
-      });
+      // this.$store.dispatch("globalConfig/setPersonListDialog", {
+      //   show: true,
+      //   dialogMsg: this.personList,
+      //   type: "All",
+      // });
     },
     async getPersonTypeList() {
       try {
@@ -351,7 +374,7 @@ export default {
       }
       .seamless-warp {
         .item {
-          margin-top: 10px;
+          margin-top: 9px;
           height: 48%;
           display: flex;
           position: relative;
@@ -370,6 +393,7 @@ export default {
           }
           .right {
             width: 70%;
+            min-height: 163px;
             position: relative;
             .position {
               font-family: 优设标题黑;

+ 1 - 1
src/views/components/baseFooter/FooterNavigation.vue

@@ -119,7 +119,7 @@ export default {
       try {
         const p = {};
         const res = await getFooterNavigationList(p);
-        console.log(res.data);
+        console.log("底部菜单",res.data);
         res.data.content.forEach((item, index) => {
           const btn = {
             id: item.id,

+ 4 - 2
src/views/components/baseHeader/left.vue

@@ -223,7 +223,7 @@ export default {
       handler(newVal) {
         this.alarmCount = newVal;
       },
-      deep: true, 
+      deep: true,
     },
     mapMode: {
       handler(val, oldVal) {
@@ -290,7 +290,9 @@ export default {
       setTimeout(() => {
         this.$store.dispatch("globalConfig/setAlarmAudio", {
           show: true,
-          alarmType: "all",
+          // alarmType: "all",
+          // alarmType: "024001",
+          alarmType: "024003",
         });
         this.$store.dispatch("dialog/addRiskDialog", {
           dialogId: "risk_",

+ 7 - 3
src/views/components/dialog/AlarmAudioDialog.vue

@@ -41,6 +41,9 @@ export default {
   watch: {
     dialogConfig: {
       handler(val) {
+        //关闭声音
+        document.getElementById("mapAlarmAudio").pause();
+        document.getElementById("mapAlarmAudio").load();
         console.log("报警声音是否启动:", val);
         if (val.show && document.getElementById("mapAlarmAudio")) {
           if (val.alarmType) {
@@ -71,9 +74,10 @@ export default {
                 break;
             }
           }
-          document.getElementById("mapAlarmAudio").play();
-          console.log("报警声音",document.getElementById("mapAlarmAudio"));
-
+          setTimeout(() => {
+            document.getElementById("mapAlarmAudio").play();
+            console.log("报警声音", document.getElementById("mapAlarmAudio"));
+          }, 200);
           setTimeout(() => {
             document.getElementById("mapAlarmAudio").pause();
             document.getElementById("mapAlarmAudio").load();

+ 17 - 10
src/views/components/dialog/PersonListDialog.vue

@@ -9,12 +9,14 @@
       <!-- 内容 -->
       <div class="dialog_content_box">
         <div class="person-box">
-          <el-row v-if="personList.length">
+          <el-row class="person-box-row">
             <el-col :span="4">
               <div class="person-type-title">本作业区员工</div>
-              <div class="person-type-value">{{ personList.length }}人</div>
+              <div class="person-type-value">
+                {{ personList.length ? personList.length : 0 }}人
+              </div>
             </el-col>
-            <el-col :span="20">
+            <el-col :span="20" v-if="personList.length">
               <div class="person-info">
                 <span v-for="(item, index) in personList" :key="index">
                   <div class="person-info-pic">
@@ -28,13 +30,15 @@
               </div>
             </el-col>
           </el-row>
-          <el-row v-if="workerList.length">
+          <el-row class="person-box-row">
             <el-col :span="4">
               <div class="person-type-title">外来施工员工</div>
-              <div class="person-type-value">{{ workerList.length }}人</div>
+              <div class="person-type-value">
+                {{ workerList.length ? workerList.length : 0 }}人
+              </div>
             </el-col>
             <el-col :span="20">
-              <div class="person-info">
+              <div class="person-info" v-if="workerList.length">
                 <span v-for="(item, index) in workerList" :key="index">
                   <div class="person-info-pic">
                     <img
@@ -47,13 +51,15 @@
               </div>
             </el-col>
           </el-row>
-          <el-row v-if="registerList.length">
+          <el-row class="person-box-row">
             <el-col :span="4">
               <div class="person-type-title">外来访客人员</div>
-              <div class="person-type-value">{{ registerList.length }}人</div>
+              <div class="person-type-value">
+                {{ registerList.length ? registerList.length : 0 }}人
+              </div>
             </el-col>
             <el-col :span="20">
-              <div class="person-info">
+              <div class="person-info" v-if="registerList.length">
                 <span v-for="(item, index) in registerList" :key="index">
                   <div class="person-info-pic">
                     <img
@@ -183,7 +189,8 @@ export default {
     color: #fff;
     font-size: large;
     .person-box {
-      .el-row {
+      .person-box-row {
+        min-height: 204px;
         width: 96%;
         padding-top: 8px;
         border-bottom: 1.5px dotted #2d6fd3;

+ 2 - 2
src/views/stationMapTKT/index.vue

@@ -211,7 +211,7 @@ export default {
   }
   .left_panel {
     pointer-events: auto;
-    width: 470px;
+    width: 430px;
     height: calc(100% - 150px);
     left: 30px;
     top: 110px;
@@ -221,7 +221,7 @@ export default {
   }
   .right_panel {
     pointer-events: auto;
-    width: 470px;
+    width: 430px;
     height: calc(100% - 150px);
     right: 30px;
     top: 110px;

+ 65 - 47
src/views/videoMonitor/components/StationSelect.vue

@@ -3,7 +3,10 @@
     <div class="search-box">
       <el-input v-model="stationName" placeholder="请输入查询内容" />
       <div class="search-btn">
-        <img :src="require('@/assets/imgs/video/icon_sousuo_sel@2x.png')" alt="" />
+        <img
+          :src="require('@/assets/imgs/video/icon_sousuo_sel@2x.png')"
+          alt=""
+        />
       </div>
     </div>
     <div class="viewType_box">
@@ -21,15 +24,16 @@
         default-expand-all
         @node-click="handleNodeClick"
         :filter-node-method="filterNode"
-        ref="tree"></el-tree>
+        ref="tree"
+      ></el-tree>
     </div>
   </div>
 </template>
 
 <script>
-import { uniqBy } from 'lodash-es'
+import { uniqBy } from "lodash-es";
 export default {
-  name: 'StationSelect',
+  name: "StationSelect",
   props: {
     videoList: {
       type: Array,
@@ -38,75 +42,89 @@ export default {
   },
   data() {
     return {
-      stationName: '',
+      stationName: "",
       defaultProps: {
-        children: 'children',
-        label: 'label',
-        id: 'id',
+        children: "children",
+        label: "label",
+        id: "id",
       },
-      type: '1',
-    }
+      type: "1",
+    };
   },
   computed: {
     videoTreeData() {
-      if (!this.videoList?.length) return []
-      if (this.type === '1') {
-        const stations = this.videoList.map(item => ({ id: item.department, label: item.departmentName }))
-        const level_1 = uniqBy(stations, 'id') // 去重
-        return level_1.map(item => {
+      if (!this.videoList?.length) return [];
+      if (this.type === "1") {
+        const stations = this.videoList.map((item) => ({
+          id: item.departmentId,
+          label: item.departmentName,
+        }));
+        const level_1 = uniqBy(stations, "id"); // 去重
+        return level_1.map((item) => {
           return {
             ...item,
             children: this.videoList
-              .filter(t1 => t1.department === item.id)
-              .map(t2 => {
-                return { id: t2.id, label: t2.name, departmentId: t2.department }
+              .filter((t1) => t1.departmentId === item.id)
+              .map((t2) => {
+                return {
+                  id: t2.id,
+                  label: t2.name,
+                  departmentId: t2.departmentId,
+                };
               }),
-          }
-        })
-      } else if (this.type === '2') {
-        const types = this.videoList.map(item => ({ id: item.useType, label: item.useTypeStr }))
-        const type_1 = uniqBy(types, 'id').sort((a, b) => +a.id - +b.id) // 去重
-        return type_1.map(item => {
+          };
+        });
+      } else if (this.type === "2") {
+        const types = this.videoList.map((item) => ({
+          id: item.useType,
+          label: item.useTypeStr,
+        }));
+        const type_1 = uniqBy(types, "id").sort((a, b) => +a.id - +b.id); // 去重
+        return type_1.map((item) => {
           return {
             ...item,
             children: this.videoList
-              .filter(t1 => t1.useType === item.id)
-              .map(t2 => {
-                return { id: t2.id, label: t2.name, departmentId: t2.department }
+              .filter((t1) => t1.useType === item.id)
+              .map((t2) => {
+                return {
+                  id: t2.id,
+                  label: t2.name,
+                  departmentId: t2.departmentId,
+                };
               }),
-          }
-        })
+          };
+        });
       }
-      return []
+      return [];
     },
   },
   watch: {
     stationName(val) {
       this.$nextTick(() => {
-        this.$refs.tree.filter(val)
-      })
+        this.$refs.tree.filter(val);
+      });
     },
   },
   methods: {
     handleNodeClick(data, node) {
-      console.log(data)
-      if (node.level === 1) return
-      this.$emit('selectNode', data)
+      console.log(data);
+      if (node.level === 1) return;
+      this.$emit("selectNode", data);
     },
     filterNode(value, data) {
-      if (!value) return true
-      return data.label.indexOf(value) !== -1
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
     },
     setTreeValue(id) {
       this.$nextTick(() => {
-        this.$refs.tree.setCurrentKey(id)
-      })
+        this.$refs.tree.setCurrentKey(id);
+      });
     },
     changeViewType() {
-      this.$parent.sortVideoList(this.type)
+      this.$parent.sortVideoList(this.type);
     },
   },
-}
+};
 </script>
 <style lang="less" scoped>
 .stationSelect-container {
@@ -178,8 +196,8 @@ export default {
       }
       //有子节点 且未展开
       /deep/ .el-icon-caret-right:before {
-        background: url('~@/assets/imgs/video/unfold.png') no-repeat 0 0;
-        content: '';
+        background: url("~@/assets/imgs/video/unfold.png") no-repeat 0 0;
+        content: "";
         display: block;
         width: 16px;
         height: 16px;
@@ -188,8 +206,8 @@ export default {
       }
       //有子节点 且已展开
       /deep/ .el-tree-node__expand-icon.expanded.el-icon-caret-right:before {
-        background: url('~@/assets/imgs/video/fold.png') no-repeat 0 0;
-        content: '';
+        background: url("~@/assets/imgs/video/fold.png") no-repeat 0 0;
+        content: "";
         display: block;
         width: 16px;
         height: 16px;
@@ -198,8 +216,8 @@ export default {
       }
       //没有子节点
       /deep/.el-tree-node__expand-icon.is-leaf::before {
-        background: url('~@/assets/imgs/video/camera.png') no-repeat 0 0;
-        content: '';
+        background: url("~@/assets/imgs/video/camera.png") no-repeat 0 0;
+        content: "";
         display: block;
         width: 16px;
         height: 16px;

+ 2 - 1
src/views/videoMonitor/index.vue

@@ -108,7 +108,8 @@ export default {
         const res = await getCameraList({
           pageIndex: 1,
           pageSize: 100,
-          department: this.$route.query.did, //按照部门筛选
+          listOrder: ['ip,asc'],
+          departmentId: this.$route.query.did, //按照部门筛选
           useType: this.$route.query.type, //按照用途类型筛选
         });
         const content = res.data?.content || [];