From 929e0a70374722c6005937dd58318c0806f9a289 Mon Sep 17 00:00:00 2001
From: husq <931347610@qq.com>
Date: Mon, 18 Sep 2023 16:31:23 +0800
Subject: [PATCH] 飞行器视频功能完善

---
 src/components/GMap.vue |  141 +++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 125 insertions(+), 16 deletions(-)

diff --git a/src/components/GMap.vue b/src/components/GMap.vue
index a7bd038..f112bd0 100644
--- a/src/components/GMap.vue
+++ b/src/components/GMap.vue
@@ -168,7 +168,7 @@
       </div>
     </div>
     <!-- 机场OSD -->
-    <div v-if="osdVisible.visible && osdVisible.is_dock" class="osd-panel fz12">
+    <div class="osd-panel fz12" v-if="osdVisible.visible && osdVisible.is_dock">
       <div class="fz16 pl5 pr5 flex-align-center flex-row flex-justify-between"
         style="border-bottom: 1px solid #515151; height: 10%;">
         <span>{{ osdVisible.gateway_callsign }}</span>
@@ -194,9 +194,12 @@
               :style="deviceInfo.dock.basic_osd?.mode_code === EDockModeCode.Disconnected ? 'color: red; font-weight: 700;' : 'color: rgb(25,190,107)'">
               {{ EDockModeText[deviceInfo.dock.basic_osd?.mode_code] }}</a-col>
             <!-- <a-col span="1">{{ hmsInfo[sn]?.length || 1 }}</a-col> -->
-            <a-col span="1" class="num">1</a-col>
-            <a-col span="13" style="background-color: #ff9900;width: 100%;padding-left:5px ;"> <span>{{ '机场配电柜门打开'
-            }}</span> </a-col>
+            <a-col span="1" class="num" v-if="hmsInfo[sn]">{{ hmsInfo[sn]?.length }}</a-col>
+            <a-col span="14" v-if="hmsInfo[sn] && hmsInfo[sn].length>0" style="width: 100%;padding-left:5px ;">
+              <a-tooltip :title="hmsInfo[sn][0].message_zh">
+              <div class="overflow">{{ hmsInfo[sn][0].message_zh }}</div>
+            </a-tooltip>
+            </a-col>
           </a-row>
           <a-row>
             <!-- <a-col span="12">
@@ -350,7 +353,7 @@
             </a-row> -->
           <a-row class="p5" justify="space-between">
             <a-col span="11">
-              <a-button :class="[showMonitor?'active-color':'unactive-color']" class="width-100" type="primary" size="small">
+              <a-button :class="[showMonitor?'active-color':'unactive-color']" class="width-100" type="primary" size="small" @click="openMonitor">
                 监控
               </a-button>
             </a-col>
@@ -367,6 +370,11 @@
           </DockControlPanel>
         </div>
       </div>
+      <a-row class="p5" v-if="showMonitor">
+        <!-- <a-spin :spinning="spinning"> -->
+          <Jessibuca v-if="airPortUrl" :videoUrl="airPortUrl" width="100%" height="200px" />
+        <!-- </a-spin> -->
+      </a-row>
       <!--  飞机-->
       <div class="flex-display">
         <div class="flex-column flex-align-stretch flex-justify-center" style="width: 60px;  background: #2d2d2d;">
@@ -605,9 +613,9 @@
             '' }}{{ deviceInfo.device.battery.remain_flight_time % 60 }}
         </div>
       </div>
-      <!-- 飞行指令 -->
+      <!-- 飞行指令
       <DroneControlPanel :sn="osdVisible.gateway_sn" :deviceInfo="deviceInfo" :payloads="osdVisible.payloads">
-      </DroneControlPanel>
+      </DroneControlPanel> -->
     </div>
   </div>
 </template>
@@ -632,6 +640,9 @@
 import { uuidv4 } from '/@/utils/uuid'
 import { gcj02towgs84, wgs84togcj02 } from '/@/vendors/coordtransform'
 import { deviceTsaUpdate } from '/@/hooks/use-g-map-tsa'
+import Jessibuca from '/@/components/Jessibuca/Jessibuca.vue'
+import { CURRENT_CONFIG as config } from '/@/api/http/config'
+import { getLiveCapacity, startLivestream } from '/@/api/manage'
 import {
   DeviceOsd, DeviceStatus, DockOsd, EGear, EModeCode, GatewayOsd, EDockModeCode, EDockModeText, EModeText,
   NetworkStateQualityEnum, NetworkStateTypeEnum, RainfallEnum, DroneInDockEnum
@@ -679,6 +690,11 @@
     const useMouseToolHook = useMouseTool()
     const useGMapManageHook = useGMapManage()
     const deviceTsaUpdateHook = deviceTsaUpdate()
+    interface SelectOption {
+  value: any,
+  label: string,
+  more?: any
+}
     const root = getRoot()
     // 监控显示
     const showMonitor = ref(false)
@@ -688,6 +704,21 @@
     const showFly = ref(false)
     const mouseMode = ref(false)
     const store = useMyStore()
+    // 机场直播地址
+    const airPortUrl = ref('')
+    // 设备列表
+    const droneList = ref()
+    // 设备相机
+    const cameraList = ref()
+    // 相机设备选择值
+    const cameraIndex = ref(0)
+    // 设备列表选择值
+    const droneIndex = ref(0)
+    // 视频列表选择值
+    const videoList = ref()
+    const videoIndex = ref(0)
+    // 机场加载值
+    // const spinning = ref(false)
     const state = reactive({
       currentType: '',
       coverIndex: 0
@@ -747,7 +778,74 @@
         return val
       }
     })
-
+    // 打开监控权限
+    const openMonitor = () => {
+      showMonitor.value = !showMonitor.value
+      loadVideo()
+    }
+    // 加载该设备的视频信息
+    const loadVideo = async () => {
+      droneList.value = []
+      cameraList.value = []
+      videoList.value = []
+      droneIndex.value = 0
+      cameraIndex.value = 0
+      await getLiveCapacity({})
+        .then(res => {
+          if (res.code === 0) {
+            if (res.data === null) {
+              console.warn('warning: get live capacity is null!!!')
+              return
+            }
+            const resData: Array<[]> = res.data
+            const temp: Array<SelectOption> = []
+            if (resData) {
+              resData.forEach((ele: any) => {
+                temp.push({ label: ele.name, value: ele.sn, more: ele.cameras_list })
+              })
+              droneList.value = temp.filter(v => v.value === sn.value)
+              if (droneList.value[0].more.length <= 0) return
+              cameraList.value = droneList.value[droneIndex.value].more.map((v: { name: any; index: any; videos_list: any }) => {
+                return {
+                  label: v.name,
+                  value: v.index,
+                  more: v.videos_list
+                }
+              })
+              videoList.value = cameraList.value[cameraIndex.value].more.map((v) => {
+                return {
+                  label: v.type,
+                  value: v.index,
+                }
+              })
+              onStart()
+            }
+          }
+        })
+        .catch(error => {
+          // message.error(error)
+          console.error(error)
+        })
+    }
+    // 开始播放
+    const onStart = async () => {
+      const videoId = droneList.value[droneIndex.value].value + '/' + cameraList.value[cameraIndex.value].value + '/' + videoList.value[videoIndex.value].value
+      const streamId = droneList.value[droneIndex.value].value + '-' + cameraList.value[cameraIndex.value].value + '-' + videoList.value[videoIndex.value].value
+      console.log(videoId, 'videoId')
+      const liveURL = config.rtmpURL + streamId
+      await startLivestream({
+        url: liveURL,
+        video_id: videoId,
+        url_type: 1,
+        video_quality: 0
+      })
+        .then(res => {
+          if (res.code !== 0) return
+          console.log(res, 'res')
+          airPortUrl.value = res.data.url
+          console.log(airPortUrl.value, 'airPortUrl')
+        })
+    }
     watch(() => store.state.deviceStatusEvent,
       data => {
         if (Object.keys(data.deviceOnline).length !== 0) {
@@ -882,7 +980,7 @@
           break
       }
     }
-    async function postPinPositionResource (obj) {
+    async function postPinPositionResource (obj: { setExtData: (arg0: { id: string; name: any }) => void }) {
       const req = getPinPositionResource(obj)
       setLayers(req)
       const coordinates = req.resource.content.geometry.coordinates
@@ -893,7 +991,7 @@
       store.state.coverList.push(obj)
       // console.log(store.state.coverList)
     }
-    async function postPolylineResource (obj) {
+    async function postPolylineResource (obj: { setExtData: (arg0: { id: string; name: any }) => void }) {
       const req = getPolylineResource(obj)
       setLayers(req)
       updateCoordinates('gcj02-wgs84', req)
@@ -902,7 +1000,7 @@
       store.state.coverList.push(obj)
       // console.log(store.state.coverList)
     }
-    async function postPolygonResource (obj) {
+    async function postPolygonResource (obj: { setExtData: (arg0: { id: string; name: any }) => void }) {
       const req = getPoygonResource(obj)
       setLayers(req)
       updateCoordinates('gcj02-wgs84', req)
@@ -912,7 +1010,7 @@
       // console.log(store.state.coverList)
     }
 
-    function getPinPositionResource (obj) {
+    function getPinPositionResource (obj: { getPosition: () => any; _originOpts: { title: any } }) {
       const position = obj.getPosition()
       const resource = generatePointContent(position)
       const name = obj._originOpts.title
@@ -923,7 +1021,7 @@
         resource
       }
     }
-    function getPolylineResource (obj) {
+    function getPolylineResource (obj: { getPath: () => any; _opts: any }) {
       const path = obj.getPath()
       const resource = generateLineContent(path)
       const { name, id } = getBaseInfo(obj._opts)
@@ -933,7 +1031,7 @@
         resource
       }
     }
-    function getPoygonResource (obj) {
+    function getPoygonResource (obj: { getPath: () => any; _opts: any }) {
       const path = obj.getPath()
       const resource = generatePolyContent(path)
       const { name, id } = getBaseInfo(obj._opts)
@@ -943,7 +1041,7 @@
         resource
       }
     }
-    function getBaseInfo (obj) {
+    function getBaseInfo (obj: { title: any }) {
       const name = obj.title
       const id = uuidv4()
       return { name, id }
@@ -1047,7 +1145,9 @@
       sn,
       showMonitor,
       showOption,
-      showFly
+      showFly,
+      airPortUrl,
+      openMonitor,
     }
   }
 })
@@ -1103,6 +1203,15 @@
   border-radius: 2px;
   opacity: 0.8;
 }
+
+.overflow {
+  width: 100%;
+  overflow: hidden;
+  background-color: #ff9900;
+  // padding: 2px 5px;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
 .osd-info {
   margin: 15px 10px;
 }

--
Gitblit v1.9.3