| | |
| | | </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> |
| | |
| | | :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"> |
| | |
| | | </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> |
| | |
| | | </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;"> |
| | |
| | | '' }}{{ deviceInfo.device.battery.remain_flight_time % 60 }} |
| | | </div> |
| | | </div> |
| | | <!-- 飞行指令 --> |
| | | <!-- 飞行指令 |
| | | <DroneControlPanel :sn="osdVisible.gateway_sn" :deviceInfo="deviceInfo" :payloads="osdVisible.payloads"> |
| | | </DroneControlPanel> |
| | | </DroneControlPanel> --> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | 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 |
| | |
| | | const useMouseToolHook = useMouseTool() |
| | | const useGMapManageHook = useGMapManage() |
| | | const deviceTsaUpdateHook = deviceTsaUpdate() |
| | | interface SelectOption { |
| | | value: any, |
| | | label: string, |
| | | more?: any |
| | | } |
| | | const root = getRoot() |
| | | // 监控显示 |
| | | const showMonitor = ref(false) |
| | |
| | | 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 |
| | |
| | | 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) { |
| | |
| | | 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 |
| | |
| | | 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) |
| | |
| | | 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) |
| | |
| | | // 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 |
| | |
| | | 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) |
| | |
| | | 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) |
| | |
| | | resource |
| | | } |
| | | } |
| | | function getBaseInfo (obj) { |
| | | function getBaseInfo (obj: { title: any }) { |
| | | const name = obj.title |
| | | const id = uuidv4() |
| | | return { name, id } |
| | |
| | | sn, |
| | | showMonitor, |
| | | showOption, |
| | | showFly |
| | | showFly, |
| | | airPortUrl, |
| | | openMonitor, |
| | | } |
| | | } |
| | | }) |
| | |
| | | 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; |
| | | } |