husq
2023-09-27 2c2bc8614c8ea0ce386369eb4924da1e6aa052d1
src/components/GMap.vue
@@ -1,9 +1,10 @@
<template>
  <div class="g-map-wrapper">
    <!-- 地图区域 -->
    <div id="g-container" :style="{ width: '100%', height: '100%' }" />
    <!-- <div id="g-container" :style="{ width: '100%', height: '100%' }" /> -->
    <Cesium />
    <!-- 绘制面板 -->
    <div class="g-action-panel" :style="{ right: drawVisible ? '316px' : '16px' }">
    <!-- <div class="g-action-panel" :style="{ right: drawVisible ? '316px' : '16px' }">
      <div :class="state.currentType === 'pin' ? 'g-action-item selection' : 'g-action-item'" @click="draw('pin', true)">
        <a><a-image :src="pin" :preview="false" /></a>
      </div>
@@ -24,7 +25,7 @@
          <CloseOutlined />
        </a>
      </div>
    </div>
    </div> -->
    <!-- 飞机OSD -->
    <div v-if="osdVisible.visible && !osdVisible.is_dock" class="osd-panel fz12">
      <div class="pl5 pr5 flex-align-center flex-row flex-justify-between"
@@ -168,11 +169,12 @@
      </div>
    </div>
    <!-- 机场OSD -->
    <div class="osd-panel fz12" v-if="osdVisible.visible && osdVisible.is_dock">
    <!--  && osdVisible.is_dock -->
    <div class="osd-panel fz12" v-if="osdVisible.visible">
      <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>
        <span><a style="color: white;" @click="() => osdVisible.visible = false">
        <span><a style="color: white;" @click="closeOsdWindow">
            <CloseOutlined />
          </a></span>
      </div>
@@ -359,20 +361,20 @@
            </a-col>
            <a-col span="11">
              <a-button :class="[showOption?'active-color':'unactive-color']" class="width-100" type="primary" :disabled="dockControlPanelVisible" size="small"
                @click="setDockControlPanelVisible(true)">
                @click="openFlySetting">
                操作
              </a-button>
            </a-col>
          </a-row>
          <!-- 机场控制面板 -->
          <DockControlPanel v-if="dockControlPanelVisible" :sn="osdVisible.gateway_sn" :deviceInfo="deviceInfo"
            @close-control-panel="onCloseControlPanel">
            @close-control-panel="closeOperate">
          </DockControlPanel>
        </div>
      </div>
      <a-row class="p5" v-if="showMonitor" justify="center" align="middle">
        <!-- <a-spin :spinning="spinning"> -->
          <Jessibuca v-if="airPortUrl" :videoUrl="airPortUrl" width="100%" height="300px" />
          <Jessibuca v-if="airPortUrl" @timeout="airTimeout" :videoUrl="airPortUrl" width="100%" height="300px" />
        <!-- </a-spin> -->
      </a-row>
      <!--  飞机-->
@@ -398,10 +400,16 @@
          <a-row align="middle" justify="center">
            <a-col span="24"> <div v-if="deviceInfo.device?.mode_code == 14 || !deviceInfo.device" style="color:#494949;" class="flex-display flex-justify-center mt5 mb5">当前设备已关机,无法进行直播</div> </a-col>
          </a-row>
          <a-row align="middle" justify="center">
            <a-col span="24">
          <a-row class="p5" align="middle" justify="space-between">
            <a-col span="11">
              <a-button :disabled="deviceInfo.device?.mode_code == 14 || !deviceInfo.device?true:false" :class="[showAircraft?'active-color':'unactive-color']" class="width-100" type="primary"  size="small" @click="openAircra">
                飞行控制
              </a-button>
            </a-col>
            <a-col span="11">
              <a-button :class="[openDroneControl?'active-color':'unactive-color']" class="width-100" type="primary"  size="small"
                @click="openDeviceSetting">
                操作
              </a-button>
            </a-col>
          </a-row>
@@ -410,7 +418,7 @@
      <!-- 飞机直播 -->
      <a-row class="p5" v-if="showAircraft">
        <!-- <a-spin :spinning="spinning"> -->
          <Jessibuca v-if="aircraftUrl" :videoUrl="aircraftUrl" width="100%" height="300px" />
          <Jessibuca v-if="aircraftUrl" @timeout="flyTimeout" :videoUrl="aircraftUrl" width="100%" height="300px" />
        <!-- </a-spin> -->
      </a-row>
      <!-- 飞机图标信息 -->
@@ -620,7 +628,7 @@
        </div>
      </div>
      <!-- 飞行指令 -->
      <DroneControlPanel :sn="osdVisible.gateway_sn" :deviceInfo="deviceInfo" :payloads="osdVisible.payloads">
      <DroneControlPanel v-model="openDroneControl" :sn="osdVisible.gateway_sn" :deviceInfo="deviceInfo" :payloads="osdVisible.payloads">
      </DroneControlPanel>
    </div>
  </div>
@@ -666,7 +674,7 @@
import { useDockControl } from './g-map/use-dock-control'
import DroneControlPanel from './g-map/DroneControlPanel.vue'
import { useConnectMqtt } from './g-map/use-connect-mqtt'
import Cesium from './cesiumMap/cesium.vue'
export default defineComponent({
  components: {
    BorderOutlined,
@@ -702,13 +710,13 @@
  label: string,
  more?: any
}
    // 打开飞行控制
    const openDroneControl = ref(false)
    const root = getRoot()
    // 监控显示
    const showMonitor = ref(false)
    // 操作显示
    const showOption = ref(false)
    // 飞行控制显示
    const showFly = ref(false)
    const mouseMode = ref(false)
    const store = useMyStore()
    // 机场直播地址
@@ -724,7 +732,6 @@
    // 视频列表选择值
    const videoList = ref()
    const videoIndex = ref(0)
    // 机场加载值
    // 飞机视频播放地址
    const aircraftUrl = ref('')
@@ -779,9 +786,7 @@
    const drawVisible = computed(() => {
      return store.state.drawVisible
    })
    const osdVisible = computed(() => {
      return store.state.osdVisible
    })
    const osdVisible = computed(() => JSON.parse(JSON.stringify(store.state.osdVisible)))
    const sn = computed(() => {
      return store.state.hmsInfoDetailSn
    })
@@ -791,6 +796,12 @@
        return val
      }
    })
    // 关闭窗口
    const closeOsdWindow = () => {
      store.commit('SET_OSD_VISIBLE_INFO', false)
    }
    // 打开监控权限
    const openMonitor = () => {
      showMonitor.value = !showMonitor.value
@@ -816,19 +827,18 @@
      videoList.value = []
      droneIndex.value = 0
      cameraIndex.value = 0
      await getLiveCapacity({})
      await getLiveCapacity({ id: store.state.common.projectId })
        .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 airport = res.data.find(v => v.sn === sn.value)
            const temp: Array<SelectOption> = []
            if (resData) {
              resData.forEach((ele: any) => {
                temp.push({ label: ele.name, value: ele.sn, more: ele.cameras_list })
              })
            if (airport) {
              temp.push({ label: airport.name, value: airport.sn, more: airport.cameras_list })
              // 设备列表
              droneList.value = temp.filter(v => v.value === sn.value)
              // 设备直播处理
@@ -861,7 +871,7 @@
    // 加载无人机的视频信息
    const loadDroneVideo = async () => {
      aircraftList.value = []
      await getLiveCapacity({})
      await getLiveCapacity({ id: store.state.common.projectId })
        .then(res => {
          if (res.code === 0) {
            if (res.data === null) {
@@ -869,29 +879,26 @@
              return
            }
            const resData: Array<[]> = res.data
            const drone = res.data.find(v => v.sn === deviceInfo.dock.basic_osd.sub_device?.device_sn)
            const temp: Array<SelectOption> = []
            if (resData) {
              resData.forEach((ele: any) => {
                temp.push({ label: ele.name, value: ele.sn, more: ele.cameras_list })
            if (drone) {
              temp.push({ label: drone.name, value: drone.sn, more: drone.cameras_list })
            } // 无人机列表
            const airList = temp.filter(v => v.value === deviceInfo.dock.basic_osd?.sub_device?.device_sn)
            // 无人机设备处理
            if (airList[0].more && airList[0].more.length > 0) {
              aircraftList.value = airList[0].more.map(v => {
                return {
                  label: v.name,
                  value: v.index,
                  vadeosList: v.videos_list
                }
              })
              // 无人机列表
              const airList = temp.filter(v => v.value === deviceInfo.dock.basic_osd?.sub_device?.device_sn)
              // 无人机设备处理
              if (airList[0].more && airList[0].more.length > 0) {
                aircraftList.value = airList[0].more.map(v => {
                  return {
                    label: v.name,
                    value: v.index,
                    vadeosList: v.videos_list
                  }
                })
                aircraSelected.value = aircraftList.value[0].value
                console.log(aircraftList.value, 'aircraftList.value')
                flyOnStart()
              } else {
                showAircraft.value = false
                message.error('该无人机暂无直播设备开启')
              }
              aircraSelected.value = aircraftList.value[0].value
              flyOnStart()
            } else {
              showAircraft.value = false
              message.error('该无人机暂无直播设备开启')
            }
          }
        })
@@ -899,8 +906,24 @@
          message.error(error)
        })
    }
    // 机场视频超时说明可能直播被关闭需要重新开启直播
    const airTimeout = () => {
      try {
        onStart()
      } catch (e) {
        onClose()
      }
    }
    const flyTimeout = () => {
      try {
        flyOnStart()
      } catch (e) {
        closeFly()
      }
    }
    // 设备开始播放
    const onStart = async () => {
      airPortUrl.value = ''
      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
      const liveURL = config.rtmpURL + streamId
@@ -953,29 +976,39 @@
    }
    // 飞行设备关闭
    const closeFly = async () => {
      const videoId = deviceInfo.dock.basic_osd?.sub_device?.device_sn + '/' + aircraSelected.value + '/' + 'normal-0'
      aircraftList.value.forEach(item => {
        const videoId = deviceInfo.dock.basic_osd?.sub_device?.device_sn + '/' + item.value + '/' + 'normal-0'
        stopLivestream({
          video_id: videoId
        }).then(res => {
          if (res.code === 0) {
            aircraftUrl.value = ''
          }
        }).catch(e => {
          console.log(e, 'errrrrrrrrrrrrrr')
        })
      })
      // const videoId = deviceInfo.dock.basic_osd?.sub_device?.device_sn + '/' + aircraSelected.value + '/' + 'normal-0'
      aircraftList.value = []
      aircraSelected.value = ''
      stopLivestream({
        video_id: videoId
      }).then(res => {
        if (res.code === 0) {
          aircraftUrl.value = ''
        }
      })
    }
    // 打开机场操作
    const openFlySetting = () => {
      openDroneControl.value = false
      setDockControlPanelVisible(true)
    }
    // 打开无人机操作
    const openDeviceSetting = () => {
      setDockControlPanelVisible(false)
      openDroneControl.value = !openDroneControl.value
    }
    watch(() => store.state.deviceStatusEvent,
      data => {
        if (Object.keys(data.deviceOnline).length !== 0) {
          deviceTsaUpdateHook.initMarker(data.deviceOnline.domain, data.deviceOnline.device_callsign, data.deviceOnline.sn)
          // deviceTsaUpdateHook.initMarker(data.deviceOnline.domain, data.deviceOnline.device_callsign, data.deviceOnline.sn)
          store.state.deviceStatusEvent.deviceOnline = {} as DeviceStatus
        }
        if (Object.keys(data.deviceOffline).length !== 0) {
          deviceTsaUpdateHook.removeMarker(data.deviceOffline.sn)
          if ((data.deviceOffline.sn === osdVisible.value.sn) || (osdVisible.value.is_dock && data.deviceOffline.sn === osdVisible.value.gateway_sn)) {
            osdVisible.value.visible = false
            store.commit('SET_OSD_VISIBLE_INFO', osdVisible)
          }
          store.state.deviceStatusEvent.deviceOffline = {}
        }
      },
@@ -983,31 +1016,42 @@
        deep: true
      }
    )
    watch(() => store.state.deviceState, data => {
      if (data.currentType === EDeviceTypeName.Gateway && data.gatewayInfo[data.currentSn]) {
        deviceTsaUpdateHook.moveTo(data.currentSn, data.gatewayInfo[data.currentSn].longitude, data.gatewayInfo[data.currentSn].latitude)
        if (osdVisible.value.visible && osdVisible.value.gateway_sn !== '') {
          deviceInfo.gateway = data.gatewayInfo[osdVisible.value.gateway_sn]
        }
      }
      if (data.currentType === EDeviceTypeName.Aircraft && data.deviceInfo[data.currentSn]) {
        deviceTsaUpdateHook.moveTo(data.currentSn, data.deviceInfo[data.currentSn].longitude, data.deviceInfo[data.currentSn].latitude)
        if (osdVisible.value.visible && osdVisible.value.sn !== '') {
          deviceInfo.device = data.deviceInfo[osdVisible.value.sn]
        }
      }
      if (data.currentType === EDeviceTypeName.Dock && data.dockInfo[data.currentSn]) {
        deviceTsaUpdateHook.initMarker(EDeviceTypeName.Dock, [EDeviceTypeName.Dock], data.currentSn, data.dockInfo[data.currentSn].basic_osd?.longitude, data.dockInfo[data.currentSn].basic_osd?.latitude)
        if (osdVisible.value.visible && osdVisible.value.is_dock && osdVisible.value.gateway_sn !== '') {
          deviceInfo.dock = data.dockInfo[osdVisible.value.gateway_sn]
          deviceInfo.device = data.deviceInfo[deviceInfo.dock.basic_osd.sub_device?.device_sn ?? osdVisible.value.sn]
        }
      }
    }, {
      deep: true
      deep: true,
    })
    watch(() => osdVisible.value, (data, oldData) => {
      showMonitor.value = false
      aircraftUrl.value = ''
      showAircraft.value = false
      aircraftList.value = []
      aircraSelected.value = ''
      airPortUrl.value = ''
      droneList.value = []
      if (deviceInfo.dock.basic_osd?.mode_code === 2) {
        onCloseControlPanel(oldData.gateway_sn)
      } else {
        setDockControlPanelVisible(false)
      }
    }, {
      deep: true,
    })
    watch(
      () => store.state.wsEvent,
      newData => {
@@ -1074,13 +1118,20 @@
      setDockControlPanelVisible,
      onCloseControlPanel,
    } = useDockControl()
    // 关闭设备控制方法
    const closeOperate = (sn:string) => {
      if (deviceInfo.dock.basic_osd?.mode_code === 2) {
        onCloseControlPanel(sn)
      } else {
        setDockControlPanelVisible(false)
      }
    }
    // 连接或断开drc
    useConnectMqtt()
    onMounted(() => {
      const app = getApp()
      useGMapManageHook.globalPropertiesConfig(app)
      // const app = getApp()
      // useGMapManageHook.globalPropertiesConfig(app)
    })
    function getDrawCallback ({ obj }) {
@@ -1263,7 +1314,6 @@
      sn,
      showMonitor,
      showOption,
      showFly,
      airPortUrl,
      openMonitor,
      droneIndex,
@@ -1272,7 +1322,14 @@
      aircraftUrl,
      aircraftList,
      aircraSelected,
      selectChange
      selectChange,
      closeOperate,
      closeOsdWindow,
      openDroneControl,
      openFlySetting,
      openDeviceSetting,
      airTimeout,
      flyTimeout
    }
  }
})
@@ -1399,4 +1456,5 @@
  position: absolute;
  min-height: 2px;
  border-radius: 2px;
}</style>
}
</style>