From faca63a304d7677d6576c8604894dc40ed0aebc9 Mon Sep 17 00:00:00 2001
From: husq <931347610@qq.com>
Date: Mon, 30 Oct 2023 20:59:45 +0800
Subject: [PATCH] 历史航线功能添加
---
src/components/common/sidebar.vue | 3
src/types/enums.ts | 1
src/hooks/use-cesium-tsa.ts | 4
src/api/wayline.ts | 24 ++++-
src/pages/page-web/projects/routeLine.vue | 166 +++++++++++++++++++++++++++++++++++++++++
src/router/index.ts | 5 +
6 files changed, 194 insertions(+), 9 deletions(-)
diff --git a/src/api/wayline.ts b/src/api/wayline.ts
index e4f7e25..31b3c69 100644
--- a/src/api/wayline.ts
+++ b/src/api/wayline.ts
@@ -76,17 +76,16 @@
rth_altitude: number // 相对机场返航高度 20 - 500
out_of_control_action: OutOfControlAction // 失控动作
-
- //重复频率类型
+ // 重复频率类型
rep_fre_type?:number
- //重复频率值
+ // 重复频率值
rep_fre_val?:number
// 重复规则值
rep_rule_val?:[]
rep_rule_type?:number
min_battery_capacity?:number
- //执行开始时间
+ // 执行开始时间
execute_start_time_arr:number[][]
}
// 新增计划
@@ -96,13 +95,12 @@
return result.data
}
-//新增计划,重复定时和连续执行走这个逻辑
+// 新增计划,重复定时和连续执行走这个逻辑
export const createPlanCondition = async function (workspaceId: string, plan: CreatePlan): Promise<IWorkspaceResponse<any>> {
const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/flight-tasks-condition`
const result = await request.post(url, plan)
return result.data
}
-
export interface Task {
job_id: string,
@@ -193,3 +191,17 @@
const result = await request.post(url)
return result.data
}
+
+// 历史轨迹记录
+export const getHistoryTrack = async function (workspaceId: string, page: number, page_size :number): Promise<IWorkspaceResponse<any>> {
+ const url = `/log/droneFlightLog/page?page=${page}&page_sie=${page_size}&workspaceId=${workspaceId}`
+ const result = await request.get(url)
+ return result.data
+}
+
+// 历史轨迹详情
+export const getHistoryDetail = async function (id: string): Promise<IWorkspaceResponse<any>> {
+ const url = `/log/droneFlightLog/infoListByFid?flightId=${id}`
+ const result = await request.get(url)
+ return result.data
+}
diff --git a/src/components/common/sidebar.vue b/src/components/common/sidebar.vue
index 433e2b1..d2c60d6 100644
--- a/src/components/common/sidebar.vue
+++ b/src/components/common/sidebar.vue
@@ -60,7 +60,8 @@
{ key: 3, label: '媒体库', path: '/' + ERouterName.MEDIA, icon: 'PictureOutlined' },
{ key: 4, label: '航线库', path: '/' + ERouterName.WAYLINE, icon: 'NodeIndexOutlined' },
{ key: 5, label: '计划库', path: '/' + ERouterName.TASK, icon: 'CalendarOutlined' },
- { key: 6, label: '设备', path: '/' + ERouterName.IMPLEMENT, icon: 'ClusterOutlined' }
+ { key: 6, label: '设备', path: '/' + ERouterName.IMPLEMENT, icon: 'ClusterOutlined' },
+ { key: 7, label: '历史航线', path: '/' + ERouterName.ROUTE_HISTORY, icon: 'NodeIndexOutlined' }
]
const store = useMyStore()
function selectedRoute (item: IOptions) {
diff --git a/src/hooks/use-cesium-tsa.ts b/src/hooks/use-cesium-tsa.ts
index 6f6d60d..057c3e7 100644
--- a/src/hooks/use-cesium-tsa.ts
+++ b/src/hooks/use-cesium-tsa.ts
@@ -191,9 +191,9 @@
}
}
// 飞行 flyto
- const flyTo = (pointOption: pointOption, time: number = 4) => {
+ const flyTo = (pointOption: pointOption, time: number = 4, height:number = 3000) => {
if (!pointOption.longitude && !pointOption.latitude) return
- const destination = Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude, 3000)
+ const destination = Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude, height)
const duration = time
viewer?.camera.flyTo({
destination,
diff --git a/src/pages/page-web/projects/routeLine.vue b/src/pages/page-web/projects/routeLine.vue
new file mode 100644
index 0000000..4b8f2df
--- /dev/null
+++ b/src/pages/page-web/projects/routeLine.vue
@@ -0,0 +1,166 @@
+<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>
diff --git a/src/router/index.ts b/src/router/index.ts
index c639123..a422907 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -123,6 +123,11 @@
name: ERouterName.IMPLEMENT,
component: () => import('/@/pages/page-web/projects/implement.vue')
},
+ {
+ path: '/' + ERouterName.ROUTE_HISTORY,
+ name: ERouterName.ROUTE_HISTORY,
+ component: () => import('/@/pages/page-web/projects/routeLine.vue')
+ },
],
meta: {
header: false
diff --git a/src/types/enums.ts b/src/types/enums.ts
index 73bd0a9..6b3cec1 100644
--- a/src/types/enums.ts
+++ b/src/types/enums.ts
@@ -25,6 +25,7 @@
PILOT_LIVESHARE = 'pilot-liveshare',
PILOT_BIND = 'pilot-bind',
IMPLEMENT = 'implement',
+ ROUTE_HISTORY = 'route-history',
}
export enum EStorageKey {
--
Gitblit v1.9.3