From 2b1f7a47394363e95deb4dfa0f1c67d41e747f7f Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 01 二月 2023 10:56:40 +0800
Subject: [PATCH] Merge branch 'wvp-28181-2.0' into fix-269

---
 web_src/src/components/map.vue |  393 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 393 insertions(+), 0 deletions(-)

diff --git a/web_src/src/components/map.vue b/web_src/src/components/map.vue
new file mode 100644
index 0000000..2aa17f6
--- /dev/null
+++ b/web_src/src/components/map.vue
@@ -0,0 +1,393 @@
+<template>
+    <div id="devicePosition" style="width: 100vw; height: 91vh;">
+      <el-container v-if="onOff" style="height: 91vh;" v-loading="isLoging">
+        <el-aside width="auto" style="background-color: #ffffff">
+          <DeviceTree ref="deviceTree" :clickEvent="clickEvent" :contextMenuEvent="contextmenuEventHandler" ></DeviceTree>
+        </el-aside>
+        <el-main style="height: 91vh; padding: 0">
+          <MapComponent ref="map"></MapComponent>
+        </el-main>
+      </el-container>
+      <div v-if="!onOff" style="width: 100%; height:100%; text-align: center; line-height: 5rem">
+        <p>鍦板浘鍔熻兘宸插叧闂�</p>
+      </div>
+      <div ref="infobox" v-if="channel != null " >
+        <div v-if="channel != null" class="infobox-content">
+          <el-descriptions class="margin-top" :title="channel.name" :column="1" :colon="true" size="mini" :labelStyle="labelStyle" >
+            <el-descriptions-item label="缂栧彿" >{{channel.channelId}}</el-descriptions-item>
+            <el-descriptions-item label="鍨嬪彿">{{channel.model}}</el-descriptions-item>
+            <el-descriptions-item label="缁忓害" >{{channel[longitudeStr]}}</el-descriptions-item>
+            <el-descriptions-item label="绾害" >{{channel[latitudeStr]}}</el-descriptions-item>
+            <el-descriptions-item label="鐢熶骇鍘傚晢">{{channel.manufacture}}</el-descriptions-item>
+            <el-descriptions-item label="琛屾斂鍖哄煙" >{{channel.civilCode}}</el-descriptions-item>
+            <el-descriptions-item label="璁惧褰掑睘" >{{channel.owner}}</el-descriptions-item>
+            <el-descriptions-item label="瀹夎鍦板潃" >{{channel.address == null?'鏈煡': channel.address}}</el-descriptions-item>
+            <el-descriptions-item label="浜戝彴绫诲瀷" >{{channel.ptztypeText}}</el-descriptions-item>
+            <el-descriptions-item label="鐘舵��">
+              <el-tag size="small" v-if="channel.status === 1">鍦ㄧ嚎</el-tag>
+              <el-tag size="small" type="info" v-if="channel.status === 0">绂荤嚎</el-tag>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div style="padding-top: 10px">
+            <el-button v-bind:disabled="device == null || device.online === 0" type="primary" size="small" title="鎾斁" icon="el-icon-video-play" @click="play(channel)"></el-button>
+            <el-button type="primary" size="small" title="缂栬緫浣嶇疆" icon="el-icon-edit" @click="edit(channel)"></el-button>
+            <el-button type="primary" size="small" title="杞ㄨ抗鏌ヨ" icon="el-icon-map-location" @click="getTrace(channel)"></el-button>
+          </div>
+          <span class="infobox-close el-icon-close" @click="closeInfoBox()"></span>
+        </div>
+      </div>
+      <devicePlayer ref="devicePlayer" ></devicePlayer>
+      <queryTrace ref="queryTrace" ></queryTrace>
+    </div>
+</template>
+
+<script>
+import MapComponent from "./common/MapComponent.vue";
+import DeviceService from "./service/DeviceService";
+import DeviceTree from "./common/DeviceTree";
+import channelMapInfobox from "./dialog/channelMapInfobox";
+import devicePlayer from './dialog/devicePlayer.vue'
+import queryTrace from './dialog/queryTrace.vue'
+
+export default {
+  name: "map",
+  components: {
+    MapComponent,
+    DeviceTree,
+    channelMapInfobox,
+    devicePlayer,
+    queryTrace,
+  },
+  data() {
+    return {
+      onOff: typeof window.mapParam !== "undefined" && window.mapParam.enable,
+      deviceService: new DeviceService(),
+      layer: null,
+      lineLayer: null,
+      channel: null,
+      device: null,
+      infoBoxId: null,
+      labelStyle: {
+        width: "56px"
+      },
+      isLoging: false,
+      longitudeStr: "longitude",
+      latitudeStr: "latitude",
+    };
+  },
+  created() {
+    if (this.$route.query.deviceId) {
+      console.log(this.$route.query.deviceId)
+      // this.$refs.deviceTree.openByDeivceId(this.$route.query.deivceId)
+      setTimeout(()=>{ // 寤惰繜浠ョ瓑寰呭湴鍥惧姞杞藉畬鎴� TODO 鍚庣画淇敼涓洪�氳繃鏄疄闄呰繖锛涚姸鎬佸姞鍥炶皟瀹屾垚
+        this.deviceService.getAllChannel(false, false, this.$route.query.deviceId, this.channelsHandler)
+      }, 1000)
+    }
+    if (window.mapParam.coordinateSystem == "GCJ-02") {
+      this.longitudeStr = "longitudeGcj02";
+      this.latitudeStr = "latitudeGcj02";
+    }else if (window.mapParam.coordinateSystem == "WGS84") {
+      this.longitudeStr = "longitudeWgs84";
+      this.latitudeStr = "latitudeWgs84";
+    }else {
+      this.longitudeStr = "longitude";
+      this.latitudeStr = "latitude";
+    }
+  },
+  destroyed() {
+
+  },
+  methods: {
+    clickEvent: function (device, data, isCatalog) {
+      this.device = device;
+      if (data.channelId && !isCatalog) {
+        // 鐐瑰嚮閫氶亾
+        if (data[this.longitudeStr] * data[this.latitudeStr] === 0) {
+          this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅');
+        } else {
+          if (this.layer != null) {
+            this.$refs.map.removeLayer(this.layer);
+          }
+          this.closeInfoBox()
+          this.layer = this.$refs.map.addLayer([{
+            position: [data[this.longitudeStr], data[this.latitudeStr]],
+            image: {
+              src: this.getImageByChannel(data),
+              anchor: [0.5, 1]
+            },
+            data: data
+          }], this.featureClickEvent)
+          this.$refs.map.panTo([data[this.longitudeStr], data[this.latitudeStr]], mapParam.maxZoom)
+        }
+      }
+    },
+    contextmenuEventHandler: function (device, event, data, isCatalog) {
+      console.log(device)
+      console.log(device.online)
+      this.device = device;
+      if (data.channelId && !isCatalog) {
+        // 鐐瑰嚮閫氶亾
+        this.$contextmenu({
+          items: [
+            {
+              label: "鎾斁",
+              icon: "el-icon-video-play",
+              disabled: device.online === 0,
+              onClick: () => {
+                this.play(data);
+              }
+            },
+            {
+              label: "缂栬緫浣嶇疆",
+              icon: "el-icon-edit",
+              disabled: false,
+              onClick: () => {
+                this.edit(data)
+              }
+            },
+            {
+              label: "杞ㄨ抗鏌ヨ",
+              icon: "el-icon-map-location",
+              disabled: false,
+              onClick: () => {
+                this.getTrace(data)
+              }
+            }
+          ],
+          event, // 榧犳爣浜嬩欢淇℃伅
+          customClass: "custom-class", // 鑷畾涔夎彍鍗� class
+          zIndex: 3000, // 鑿滃崟鏍峰紡 z-index
+        });
+      } else {
+        if (typeof data.channelId === "undefined") {
+          this.deviceOrSubChannelMenu(event, data)
+        }else {
+          // TODO 瀛愮洰褰曟殏鏃朵笉鏀寔鏌ヨ浠栦笅闈㈡墍鏈夎澶�, 鏀寔鏀寔鏌ヨ鐩村睘浜庤繖涓洰褰曠殑璁惧
+          this.deviceOrSubChannelMenu(event, data)
+        }
+
+      }
+
+    },
+    deviceOrSubChannelMenu: function (event, data) {
+      // 鐐瑰嚮璁惧
+      this.$contextmenu({
+        items: [
+          {
+            label: "瀹氫綅",
+            icon: "el-icon-s-promotion",
+            disabled: false,
+            onClick: () => {
+              if (!data.channelId) {
+                this.deviceService.getAllChannel(false, false, data.deviceId, this.channelsHandler)
+              }
+              if (data.channelId && data.subCount > 0) {
+                // 鐐瑰嚮瀛愮洰褰�
+                this.deviceService.getAllSubChannel(false, data.deviceId, data.channelId, this.channelsHandler)
+              }
+            }
+          },
+          {
+            label: "鏌ヨ杞ㄨ抗",
+            icon: "el-icon-map-location",
+            disabled: false,
+            onClick: () => {
+              this.getTrace(data)
+            }
+          }
+        ],
+        event, // 榧犳爣浜嬩欢淇℃伅
+        customClass: "custom-class", // 鑷畾涔夎彍鍗� class
+        zIndex: 3000, // 鑿滃崟鏍峰紡 z-index
+      });
+
+    },
+    channelsHandler: function (channels) {
+      console.log(2)
+      if (channels.length > 0) {
+        this.clean()
+        this.closeInfoBox()
+        let params = [];
+
+
+        for (let i = 0; i < channels.length; i++) {
+          let longitude = channels[i][this.longitudeStr];
+          let latitude = channels[i][this.latitudeStr];
+          if (longitude * latitude === 0) {
+            continue;
+          }
+          let item = {
+            position: [longitude, latitude],
+            image: {
+              src: this.getImageByChannel(channels[i]),
+              anchor: [0.5, 1]
+            },
+            data: channels[i]
+          }
+          params.push(item);
+        }
+        console.log(3)
+
+        this.layer = this.$refs.map.addLayer(params, this.featureClickEvent)
+        console.log(4)
+        if (params.length === 1) {
+          this.$refs.map.panTo([channels[0][this.longitudeStr], channels[0][this.latitudeStr]], mapParam.maxZoom)
+        } else if (params.length > 1) {
+          this.$refs.map.fit(this.layer)
+        } else {
+          this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅');
+        }
+      } else {
+        this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅');
+      }
+    },
+    getImageByChannel: function (channel) {
+      let src = "static/images/gis/camera.png"
+      switch (channel.ptztype) {
+        case 1:
+          if (channel.status === 1) {
+            src = "static/images/gis/camera1.png"
+          } else {
+            src = "static/images/gis/camera1-offline.png"
+          }
+          break;
+        case 2:
+          if (channel.status === 1) {
+            src = "static/images/gis/camera2.png"
+          } else {
+            src = "static/images/gis/camera2-offline.png"
+          }
+          break;
+        case 3:
+          if (channel.status === 1) {
+            src = "static/images/gis/camera3.png"
+          } else {
+            src = "static/images/gis/camera3-offline.png"
+          }
+          break;
+        default:
+          if (channel.status === 1) {
+            src = "static/images/gis/camera.png"
+          } else {
+            src = "static/images/gis/camera-offline.png"
+          }
+      }
+      return src;
+    },
+    featureClickEvent: function (channels) {
+      this.closeInfoBox()
+      if (channels.length > 0) {
+        this.channel = channels[0]
+      }
+      this.$nextTick(() => {
+        let position = [this.channel[this.longitudeStr], this.channel[this.latitudeStr]];
+        this.infoBoxId = this.$refs.map.openInfoBox(position, this.$refs.infobox, [0, -50])
+      })
+    },
+    closeInfoBox: function () {
+      if (this.infoBoxId != null) {
+        this.$refs.map.closeInfoBox(this.infoBoxId)
+      }
+    },
+    play: function (channel) {
+
+      let deviceId = channel.deviceId;
+      this.isLoging = true;
+      let channelId = channel.channelId;
+      console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId);
+      let that = this;
+      this.$axios({
+        method: 'get',
+        url: '/api/play/start/' + deviceId + '/' + channelId
+      }).then(function (res) {
+        that.isLoging = false;
+        if (res.data.code === 0) {
+          that.$refs.devicePlayer.openDialog("media", deviceId, channelId, {
+            streamInfo: res.data.data,
+            hasAudio: channel.hasAudio
+          });
+
+        } else {
+          that.$message.error(res.data.msg);
+        }
+      }).catch(function (e) {
+      });
+    },
+    edit: function (data) {
+      this.$message.warning('鏆備笉鏀寔');
+    },
+    getTrace: function (data) {
+      // this.$message.warning('鏆備笉鏀寔');
+      this.clean()
+      this.$refs.queryTrace.openDialog(data, (channelPositions) => {
+        console.log("getTrace")
+        console.log(channelPositions)
+        if (channelPositions.length === 0) {
+          this.$message.success('鏈煡璇㈠埌杞ㄨ抗淇℃伅');
+        } else {
+          let positions = [];
+          for (let i = 0; i < channelPositions.length; i++) {
+            if (channelPositions[i][this.longitudeStr] * channelPositions[i][this.latitudeStr] > 0) {
+              positions.push([channelPositions[i][this.longitudeStr], channelPositions[i][this.latitudeStr]])
+            }
+
+          }
+          if (positions.length === 0) {
+            this.$message.success('鏈煡璇㈠埌杞ㄨ抗淇℃伅');
+            return;
+          }
+          this.lineLayer = this.$refs.map.addLineLayer(positions)
+          this.$refs.map.fit(this.lineLayer)
+        }
+      })
+    },
+    clean: function (){
+      if (this.lineLayer != null) {
+        this.$refs.map.removeLayer(this.lineLayer)
+      }
+      if (this.infoBoxId != null) {
+        this.$refs.map.closeInfoBox(this.infoBoxId)
+      }
+      if (this.layer != null) {
+        this.$refs.map.removeLayer(this.layer)
+      }
+    }
+  },
+
+};
+</script>
+
+<style>
+.infobox-content{
+  width: 260px;
+  background-color: #FFFFFF;
+  padding: 10px;
+  border-radius: 10px;
+  border: 1px solid #e2e2e2;
+}
+
+.infobox-content::after {
+  position: absolute;
+  bottom: -11px;
+  left: 130px;
+  display: block;
+  content: "";
+  width: 16px;
+  height: 16px;
+  background: url('~@static/images/arrow.png') no-repeat center;
+}
+.infobox-close {
+  position: absolute;
+  right: 1rem;
+  top: 1rem;
+  color: #000000;
+  cursor:pointer
+}
+.el-descriptions__title {
+  font-size: 1rem;
+  font-weight: 700;
+  padding: 20px 20px 0px 23px;
+  text-align: center;
+  width: 100%;
+}
+</style>

--
Gitblit v1.8.0