guoshilong
2023-10-18 53bcb7e5dffa071d2c6593f5db7f0b6e4e2f8dfe
src/components/GMap.vue
@@ -300,8 +300,8 @@
                </a-col>
                <a-col span="2"></a-col>
                <a-col span="8">
                  <a-button :class="[showOption ? 'active-color' : 'unactive-color']" class="width-100" type="primary"
                    :disabled="dockControlPanelVisible" size="small" @click="openFlySetting">
                  <a-button :class="[airPortOption ? 'active-color' : 'unactive-color']" class="width-100" type="primary"
                     size="small" @click="openFlySetting">
                    操作
                  </a-button>
                </a-col>
@@ -436,20 +436,19 @@
          <a-tooltip :title="osdVisible.model">
            <div style="width: 90%;" class="flex-column flex-align-center flex-justify-center">
              <span><a-image :src="M30" :preview="false" /></span>
              <span>M30</span>
              <span>{{ DEVICE_NAME[`${osdVisible.device_domain}-${osdVisible.device_type}-${osdVisible.device_sub_type}`] }}</span>
            </div>
          </a-tooltip>
        </div>
        <div class="osd flex-1">
          <a-row class="mr-20" align="middle">
            <a-col span="9"
              :style="!deviceInfo.device || deviceInfo.device?.mode_code === EModeCode.Disconnected ? 'color: red; font-weight: 700;' : 'color: rgb(25,190,107)'">
              {{ !deviceInfo.device ? EModeText[EModeCode.Disconnected] : EModeText[deviceInfo.device?.mode_code]
              :style="deviceInfo.device && deviceInfo.device?.mode_code !== EModeCode.Disconnected ? 'color: rgb(25,190,107)' : deviceInfo.dock.basic_osd?.drone_in_dock === 1? 'color: rgb(25,190,107)' : 'color: red; font-weight: 700;' ">
              <!-- DroneInDockEnum[deviceInfo.dock.basic_osd?.drone_in_dock] -->
              {{ deviceInfo.device ? EModeText[deviceInfo.device?.mode_code] : (deviceInfo.dock.basic_osd?.drone_in_dock === 1) ? '舱内关机' : EModeText[EModeCode.Disconnected]
              }}</a-col>
            <a-col span="15">
              <a-select :showArrow="false" v-model:value="aircraSelected" :bordered="false" :options="aircraftList"
                :placeholder="aircraftList.length == 0 || deviceInfo.device?.mode_code == 14 || !deviceInfo.device ? 'N/A' : '请选择'" :disabled="aircraftList.length == 0 ? true : false"
                size="small" style="width:100%;background-color: #5d5f61;color: #fff;" @change="selectChange"></a-select>
              <div style="width:100%;padding:0 5px;background-color: #5d5f61;color: #fff;font-size: 10px;">{{deviceInfo.device?.mode_code == 14 || !deviceInfo.device ? 'N/A' : '当前正常'}}</div>
            </a-col>
          </a-row>
          <a-row align="middle" justify="center">
@@ -458,18 +457,33 @@
                class="flex-display flex-justify-center mt5 mb5">当前设备已关机,无法进行直播</div>
            </a-col>
          </a-row>
          <a-row class="p5" align="middle" justify="space-between">
          <a-row class="p5" v-if="deviceInfo.device?.mode_code != 14 && deviceInfo.device"  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 :class="[aircrafIndex === 0 ? 'active-color' : 'unactive-color']" class="width-100" type="primary" size="small"
                @click="openAircra(0)">
                飞行相机
              </a-button>
            </a-col>
            <a-col span="11">
              <a-button :class="[aircrafIndex === 1 ? 'active-color' : 'unactive-color']" class="width-100" type="primary"
                size="small" @click="openAircra(1)">
                M30T相机
              </a-button>
            </a-col>
          </a-row>
          <a-row class="p5" align="middle" justify="space-between">
            <a-col span="24">
              <!-- <a-button v-if="controlStatus != ''" :class="[openDroneControl ? 'active-color' : 'unactive-color']" class="width-100" type="primary"
                size="small" @click="openDeviceSetting">
                飞行控制(<DesktopOutlined v-if="controlStatus === 'A'" /> <RobotFilled v-else />{{  controlStatus === 'A' ? 'A控' : 'B控'}})
              </a-button>
              <a-button v-else :class="[openDroneControl ? 'active-color' : 'unactive-color']" class="width-100" type="primary"
                size="small" @click="openDeviceSetting">
                飞行控制
              </a-button> -->
              <a-button :class="[openDroneControl ? 'active-color' : 'unactive-color']" class="width-100" type="primary"
                size="small" @click="openDeviceSetting">
                操作
                飞行控制
              </a-button>
            </a-col>
          </a-row>
@@ -607,7 +621,7 @@
              </a-tooltip>
            </a-col>
          </a-row> -->
        <!-- <a-row align="middle">
        <a-row align="middle">
          <a-col span="6" class="flex-row flex-align-center flex-justify-start">
            <a-tooltip title="飞行模式">
              <span>
@@ -663,7 +677,7 @@
                deviceInfo.device?.vertical_speed.toFixed(2) + ' m/s' }}</span>
            </a-tooltip>
          </a-col>
        </a-row> -->
        </a-row>
      </div>
      <!-- 飞行控制 -->
      <!-- <div class="fly-control flex-display">
@@ -721,14 +735,15 @@
import { getLiveCapacity, startLivestream, stopLivestream } from '/@/api/manage'
import {
  DeviceOsd, DeviceStatus, DockOsd, EGear, EModeCode, GatewayOsd, EDockModeCode, EDockModeText, EModeText,
  NetworkStateQualityEnum, NetworkStateTypeEnum, RainfallEnum, DroneInDockEnum
  NetworkStateQualityEnum, NetworkStateTypeEnum, RainfallEnum, DroneInDockEnum, DEVICE_NAME
} from '/@/types/device'
import pin from '/@/assets/icons/pin-2d8cf0.svg'
import M30 from '/@/assets/icons/m30.png'
import {
  BorderOutlined, LineOutlined, CloseOutlined, ControlOutlined, TrademarkOutlined, ArrowDownOutlined,
  ThunderboltOutlined, SignalFilled, GlobalOutlined, HistoryOutlined, CloudUploadOutlined, RocketOutlined,
  FieldTimeOutlined, CloudOutlined, CloudFilled, FolderOpenOutlined, RobotFilled, ArrowUpOutlined, CarryOutOutlined
  FieldTimeOutlined, CloudOutlined, CloudFilled, FolderOpenOutlined, RobotFilled, ArrowUpOutlined, CarryOutOutlined,
  DesktopOutlined
} from '@ant-design/icons-vue'
import { EDeviceTypeName } from '../types'
import DockControlPanel from './g-map/DockControlPanel.vue'
@@ -758,7 +773,8 @@
    DockControlPanel,
    DroneControlPanel,
    CarryOutOutlined,
    RocketOutlined
    RocketOutlined,
    DesktopOutlined
  },
  name: 'GMap',
  props: {},
@@ -776,12 +792,11 @@
    const root = getRoot()
    // 监控显示
    const showMonitor = ref(false)
    // 操作显示
    const showOption = ref(false)
    const mouseMode = ref(false)
    const store = useMyStore()
    // 机场直播地址
    const airPortUrl = ref('')
    const airPortOption = ref(false)
    // 设备列表
    const droneList = ref()
    // 设备相机
@@ -799,7 +814,8 @@
    const showAircraft = ref(false)
    // 飞机视频列表
    const aircraftList = ref([])
    const aircraSelected = ref('')
    const aircraSelected = ref(undefined)
    const aircrafIndex = ref(-1)
    const state = reactive({
      currentType: '',
      coverIndex: 0
@@ -861,6 +877,13 @@
    // 关闭窗口
    const closeOsdWindow = () => {
      store.commit('SET_OSD_VISIBLE_INFO', false)
      showAircraft.value = false
      aircrafIndex.value = -1
      aircraftUrl.value = ''
      showMonitor.value = false
      airPortUrl.value = ''
      airPortOption.value = false
      showMonitor.value = false
    }
    // 打开监控权限
@@ -869,16 +892,25 @@
      if (showMonitor.value) {
        loadVideo()
      } else {
        onClose()
        airPortUrl.value = ''
        // onClose()
      }
    }
    // 打开飞机监控
    const openAircra = () => {
    const openAircra = (type: number) => {
      showAircraft.value = !showAircraft.value
      if (showAircraft.value) {
        loadDroneVideo()
      if (type === aircrafIndex.value) {
        showAircraft.value = false
        aircrafIndex.value = -1
      } else {
        closeFly()
        showAircraft.value = true
        aircrafIndex.value = type
      }
      if (showAircraft.value) {
        loadDroneVideo(type)
      } else {
        aircraftUrl.value = ''
        // closeFly()
      }
    }
    // 加载该设备的视频信息
@@ -926,11 +958,13 @@
          }
        })
        .catch(error => {
          showMonitor.value = false
          airPortUrl.value = ''
          message.error(error)
        })
    }
    // 加载无人机的视频信息
    const loadDroneVideo = async () => {
    const loadDroneVideo = async (index: number) => {
      aircraftList.value = []
      await getLiveCapacity({ id: store.state.common.projectId })
        .then(res => {
@@ -939,7 +973,6 @@
              console.warn('warning: get live capacity is null!!!')
              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 (drone) {
@@ -955,7 +988,7 @@
                  vadeosList: v.videos_list
                }
              })
              aircraSelected.value = aircraftList.value[0].value
              aircraSelected.value = aircraftList.value[index].value
              flyOnStart()
            } else {
              showAircraft.value = false
@@ -964,6 +997,8 @@
          }
        })
        .catch(error => {
          showAircraft.value = false
          aircrafIndex.value = -1
          message.error(error)
        })
    }
@@ -972,14 +1007,16 @@
      try {
        onStart()
      } catch (e) {
        onClose()
        airPortUrl.value = ''
        // onClose()
      }
    }
    const flyTimeout = () => {
      try {
        flyOnStart()
      } catch (e) {
        closeFly()
        aircraftUrl.value = ''
        // closeFly()
      }
    }
    // 设备开始播放
@@ -998,13 +1035,6 @@
          if (res.code !== 0) return
          airPortUrl.value = res.data.url
        })
    }
    // 下拉框选择变化
    const selectChange = async (e) => {
      // await closeFly()
      // setTimeout(async () => {
      await flyOnStart()
      // }, 500)
    }
    // 关闭设备直播
    const onClose = async () => {
@@ -1056,13 +1086,21 @@
    // 打开机场操作
    const openFlySetting = () => {
      openDroneControl.value = false
      setDockControlPanelVisible(true)
      airPortOption.value = !airPortOption.value
      if (airPortOption.value) {
        setDockControlPanelVisible(true)
      } else {
        setDockControlPanelVisible(false)
      }
    }
    // 打开无人机操作
    const openDeviceSetting = () => {
      setDockControlPanelVisible(false)
      airPortOption.value = false
      openDroneControl.value = !openDroneControl.value
    }
    // 飞行控制状态
    const controlStatus = computed(() => store.state.common.droneControlSource)
    watch(() => store.state.deviceStatusEvent,
      data => {
        if (Object.keys(data.deviceOnline).length !== 0) {
@@ -1102,7 +1140,7 @@
      aircraftUrl.value = ''
      showAircraft.value = false
      aircraftList.value = []
      aircraSelected.value = ''
      aircraSelected.value = undefined
      airPortUrl.value = ''
      droneList.value = []
      if (deviceInfo.dock.basic_osd?.mode_code === 2) {
@@ -1181,6 +1219,7 @@
    } = useDockControl()
    // 关闭设备控制方法
    const closeOperate = (sn: string) => {
      airPortOption.value = false
      if (deviceInfo.dock.basic_osd?.mode_code === 2) {
        onCloseControlPanel(sn)
      } else {
@@ -1363,6 +1402,7 @@
      str,
      EDockModeCode,
      EDockModeText,
      DEVICE_NAME,
      EModeText,
      dockControlPanelVisible,
      setDockControlPanelVisible,
@@ -1374,7 +1414,6 @@
      hmsInfo,
      sn,
      showMonitor,
      showOption,
      airPortUrl,
      openMonitor,
      droneIndex,
@@ -1383,14 +1422,16 @@
      aircraftUrl,
      aircraftList,
      aircraSelected,
      selectChange,
      closeOperate,
      closeOsdWindow,
      openDroneControl,
      openFlySetting,
      openDeviceSetting,
      airTimeout,
      flyTimeout
      flyTimeout,
      aircrafIndex,
      airPortOption,
      controlStatus
    }
  }
})
@@ -1434,6 +1475,9 @@
      display: none;
    }
  }
  &:deep(.ant-btn > .anticon + span, .ant-btn > span + .anticon, .ant-btn > .anticon + span, .ant-btn > span + .anticon) {
    margin-left: 5px !important;
  }
}
.osd-panel {
@@ -1441,10 +1485,10 @@
  left: 10px;
  top: 10px;
  width: 480px;
  background: #000;
  background-color: #232323;
  color: #fff;
  border-radius: 2px;
  opacity: 0.8;
  // opacity: 0.8;
}
.overflow {