| | |
| | | <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> |
| | |
| | | <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" |
| | |
| | | </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> |
| | |
| | | </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> |
| | | <!-- 飞机--> |
| | |
| | | <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> |
| | |
| | | <!-- 飞机直播 --> |
| | | <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> |
| | | <!-- 飞机图标信息 --> |
| | |
| | | </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> |
| | |
| | | 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, |
| | |
| | | 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() |
| | | // 机场直播地址 |
| | |
| | | // 视频列表选择值 |
| | | const videoList = ref() |
| | | const videoIndex = ref(0) |
| | | // 机场加载值 |
| | | |
| | | // 飞机视频播放地址 |
| | | const aircraftUrl = ref('') |
| | |
| | | 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 |
| | | }) |
| | |
| | | return val |
| | | } |
| | | }) |
| | | |
| | | // 关闭窗口 |
| | | const closeOsdWindow = () => { |
| | | store.commit('SET_OSD_VISIBLE_INFO', false) |
| | | } |
| | | |
| | | // 打开监控权限 |
| | | const openMonitor = () => { |
| | | showMonitor.value = !showMonitor.value |
| | |
| | | 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) |
| | | // 设备直播处理 |
| | |
| | | // 加载无人机的视频信息 |
| | | const loadDroneVideo = async () => { |
| | | aircraftList.value = [] |
| | | await getLiveCapacity({}) |
| | | await getLiveCapacity({ id: store.state.common.projectId }) |
| | | .then(res => { |
| | | if (res.code === 0) { |
| | | if (res.data === 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 (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('该无人机暂无直播设备开启') |
| | | } |
| | | } |
| | | }) |
| | |
| | | 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 |
| | |
| | | } |
| | | // 飞行设备关闭 |
| | | 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 = {} |
| | | } |
| | | }, |
| | |
| | | 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 => { |
| | |
| | | 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 }) { |
| | |
| | | sn, |
| | | showMonitor, |
| | | showOption, |
| | | showFly, |
| | | airPortUrl, |
| | | openMonitor, |
| | | droneIndex, |
| | |
| | | aircraftUrl, |
| | | aircraftList, |
| | | aircraSelected, |
| | | selectChange |
| | | selectChange, |
| | | closeOperate, |
| | | closeOsdWindow, |
| | | openDroneControl, |
| | | openFlySetting, |
| | | openDeviceSetting, |
| | | airTimeout, |
| | | flyTimeout |
| | | } |
| | | } |
| | | }) |
| | |
| | | position: absolute; |
| | | min-height: 2px; |
| | | border-radius: 2px; |
| | | }</style> |
| | | } |
| | | </style> |