| New file |
| | |
| | | <template> |
| | | <div class="project-wayline-wrapper height-100"> |
| | | <a-spin :spinning="loading" :delay="300" tip="加载中" size="large"> |
| | | <div style="height: 50px; line-height: 50px; border-bottom: 1px solid #4f4f4f; font-weight: 450;"> |
| | | <a-row> |
| | | <a-col :span="1"></a-col> |
| | | <a-col :span="15">历史航线</a-col> |
| | | </a-row> |
| | | </div> |
| | | <div :style="{ height : height + 'px'}" class="scrollbar"> |
| | | <div id="data" class="height-100 uranus-scrollbar" v-if="routeLine.length !== 0" @scroll="onScroll"> |
| | | <div v-for="wayline in routeLine" :key="wayline.id"> |
| | | <div class="wayline-panel" style="padding-top: 5px;" @click="selectRoute(wayline)"> |
| | | <div class="title"> |
| | | <a-tooltip :title="wayline.title"> |
| | | <div class="pr10">{{ wayline.title }}</div> |
| | | </a-tooltip> |
| | | <div class="ml10"></div> |
| | | <a-tooltip :title="wayline.device_name"> |
| | | <div class="ml5 pr10">{{ wayline.device_name }}</div> |
| | | </a-tooltip> |
| | | <div class="fz20"></div> |
| | | </div> |
| | | <div class="ml10 mt5" style="color: hsla(0,0%,100%,0.65);"> |
| | | </div> |
| | | <div class="mt5 ml10" style="color: hsla(0,0%,100%,0.35);"> |
| | | <span class="mr10">开始时间: {{ convertTimestampToDate(wayline.start_time) }}</span> |
| | | </div> |
| | | <div class="mt5 ml10" style="color: hsla(0,0%,100%,0.35);"> |
| | | <span class="mr10">结束时间: {{ convertTimestampToDate(wayline.end_time) }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div v-else> |
| | | <a-empty :image-style="{ height: '60px', marginTop: '60px' }" /> |
| | | </div> |
| | | </div> |
| | | </a-spin> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import { reactive } from '@vue/reactivity' |
| | | import { message } from 'ant-design-vue' |
| | | import { onMounted, ref } from 'vue' |
| | | import { getHistoryTrack, getHistoryDetail } from '/@/api/wayline' |
| | | import { ELocalStorageKey } from '/@/types' |
| | | import { useMyStore } from '/@/store' |
| | | import { IPage } from '/@/api/http/type' |
| | | import * as Cesium from 'cesium' |
| | | import { convertTimestampToDate } from '/@/utils/time' |
| | | import { cesiumOperation } from '/@/hooks/use-cesium-tsa' |
| | | |
| | | const loading = ref(false) |
| | | const { appContext } = getCurrentInstance() |
| | | const store = useMyStore() |
| | | const pagination :IPage = { |
| | | page: 1, |
| | | total: -1, |
| | | page_size: 10 |
| | | } |
| | | const waylinesData = reactive({ |
| | | data: [] |
| | | }) |
| | | const routeLine = ref([]) |
| | | const workspaceId = computed(() => store.state.common.projectId || localStorage.getItem(ELocalStorageKey.WorkspaceId)) |
| | | const canRefresh = ref(true) |
| | | const height = ref() |
| | | const { removeById, addPolyline, getEntityById, flyTo } = cesiumOperation() |
| | | |
| | | onMounted(() => { |
| | | const parent = document.getElementsByClassName('scrollbar').item(0)?.parentNode as HTMLDivElement |
| | | height.value = document.body.clientHeight - parent.firstElementChild!.clientHeight |
| | | getHistoryWay() |
| | | |
| | | // const key = setInterval(() => { |
| | | // const data = document.getElementById('data')?.lastElementChild as HTMLDivElement |
| | | // if (pagination.total === 0 || Math.ceil(pagination.total / pagination.page_size) <= pagination.page || height.value <= data?.clientHeight + data?.offsetTop) { |
| | | // clearInterval(key) |
| | | // return |
| | | // } |
| | | // pagination.page++ |
| | | // getWaylines() |
| | | // }, 1000) |
| | | console.log(workspaceId.value) |
| | | }) |
| | | |
| | | async function getHistoryWay () { |
| | | const res = await getHistoryTrack(workspaceId.value, pagination.page, pagination.page_size) |
| | | if (res.code !== 0) return |
| | | routeLine.value = [...routeLine.value, ...res.data.list] |
| | | pagination.total = res.data.pagination.total |
| | | pagination.page = res.data.pagination.page |
| | | } |
| | | |
| | | async function selectRoute (wayline) { |
| | | // 判断是否有历史航线的id实体 |
| | | const entity = getEntityById('drone_route_history') |
| | | if (entity) { |
| | | removeById('drone_route_history') |
| | | } |
| | | // 航线经纬度存储数组 |
| | | let routeLine = [] |
| | | const res = await getHistoryDetail(wayline.id) |
| | | if (res.code !== 0) return |
| | | res.data.forEach(v => { |
| | | routeLine.push(v.longitude) |
| | | routeLine.push(v.latitude) |
| | | }) |
| | | const pointOption = { |
| | | longitude: routeLine[0], |
| | | latitude: routeLine[1] |
| | | } |
| | | routeLine = Cesium.Cartesian3.fromDegreesArray(routeLine) |
| | | // 无人机历史路线轨迹 |
| | | const routeTrajectory = { |
| | | longitude: 115.85666327144976, |
| | | latitude: 28.62452712442823, |
| | | id: 'drone_route_history', |
| | | polyline: { |
| | | width: 5, |
| | | positions: routeLine, |
| | | material: Cesium.Color.BLUE |
| | | }, |
| | | } |
| | | addPolyline(routeTrajectory) |
| | | // 飞向第一个坐标点 |
| | | flyTo(pointOption, 4, 1000) |
| | | } |
| | | function onScroll (e: any) { |
| | | const element = e.srcElement |
| | | if (element.scrollTop + element.clientHeight >= element.scrollHeight - 5 && Math.ceil(pagination.total / pagination.page_size) > pagination.page && canRefresh.value) { |
| | | pagination.page++ |
| | | getHistoryWay() |
| | | } |
| | | } |
| | | |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .wayline-panel { |
| | | background: #3c3c3c; |
| | | margin-left: auto; |
| | | margin-right: auto; |
| | | margin-top: 10px; |
| | | height: 90px; |
| | | width: 95%; |
| | | font-size: 13px; |
| | | border-radius: 2px; |
| | | cursor: pointer; |
| | | .title { |
| | | display: flex; |
| | | flex-direction: row; |
| | | align-items: center; |
| | | height: 30px; |
| | | font-weight: bold; |
| | | margin: 0px 10px 0 10px; |
| | | } |
| | | } |
| | | .uranus-scrollbar { |
| | | overflow: auto; |
| | | scrollbar-width: thin; |
| | | scrollbar-color: #c5c8cc transparent; |
| | | } |
| | | </style> |