From 8bfd657326eb9d4bd9b63920cfe3bd362cea4445 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Fri, 10 Oct 2025 20:59:07 +0800
Subject: [PATCH] Merge branch 'feature/v6.0/6.0.4' into prod
---
src/views/monitor/log/flightLog.vue | 258 +++++++++++++++++++++++++++++++++++++++------------
1 files changed, 195 insertions(+), 63 deletions(-)
diff --git a/src/views/monitor/log/flightLog.vue b/src/views/monitor/log/flightLog.vue
index ce69d6c..e762b6c 100644
--- a/src/views/monitor/log/flightLog.vue
+++ b/src/views/monitor/log/flightLog.vue
@@ -4,44 +4,44 @@
<div class="ztzf-search-mange">
<el-form :model="params" inline>
<div class="search-contain">
- <div>
- <el-form-item label="任务名称:">
- <el-input v-model="params.jobName" placeholder="请输入任务名称" clearable />
- </el-form-item>
- <el-form-item label="任务编号:">
- <el-input v-model="params.jobInfoNum" placeholder="请输入任务编号" clearable />
- </el-form-item>
- <el-form-item label="日期:">
- <el-date-picker
- v-model="rangTime"
- type="daterange"
- range-separator="至"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- clearable
- @change="changeselect"
- />
- </el-form-item>
- </div>
- <div class="btns">
- <el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
- <el-button @click="cancelSearch" :icon="Delete">清空</el-button>
- </div>
+ <!-- <div>-->
+ <el-form-item label="任务名称:">
+ <el-input v-model="params.jobName" placeholder="请输入任务名称" clearable />
+ </el-form-item>
+ <el-form-item label="任务编号:">
+ <el-input v-model="params.jobInfoNum" placeholder="请输入任务编号" clearable />
+ </el-form-item>
+ <el-form-item label="日期:">
+ <el-date-picker
+ v-model="rangTime"
+ type="daterange"
+ range-separator="至"
+ start-placeholder="开始日期"
+ end-placeholder="结束日期"
+ clearable
+ @change="changeselect"
+ />
+ </el-form-item>
+ <!-- </div>-->
+ <!-- <div class="btns">-->
+ <el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
+ <el-button @click="cancelSearch" :icon="Delete">清空</el-button>
+ <!-- </div>-->
</div>
</el-form>
</div>
<div class="mange-table">
-<!-- <el-tabs v-model="tabType" class="demo-tabs" @tab-click="handleTabClick">-->
-<!-- <el-tab-pane label="全部" name="全部"></el-tab-pane>-->
-<!-- <el-tab-pane label="我的收藏" name="收藏"></el-tab-pane>-->
-<!-- -->
-<!-- </el-tabs>-->
+ <!-- <el-tabs v-model="tabType" class="demo-tabs" @tab-click="handleTabClick">-->
+ <!-- <el-tab-pane label="全部" name="全部"></el-tab-pane>-->
+ <!-- <el-tab-pane label="我的收藏" name="收藏"></el-tab-pane>-->
+ <!-- -->
+ <!-- </el-tabs>-->
<el-table border :data="tableList" class="custom-header">
<el-table-column label="序号" type="index" width="60"></el-table-column>
<el-table-column prop="job_name" label="任务名称" align="center" show-overflow-tooltip></el-table-column>
<el-table-column prop="job_info_num" label="任务编号" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="title" label="飞行类型" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="device_name" label="无人机" align="center"></el-table-column>
+<!-- <el-table-column prop="title" label="飞行类型" align="center" show-overflow-tooltip></el-table-column>-->
+ <el-table-column prop="nickname" label="机巢名称" align="center"></el-table-column>
<el-table-column prop="start_time" label="开始时间" align="center">
<template #default="scope">
{{ timeFormatConvert(scope.row.start_time) }}
@@ -52,25 +52,27 @@
{{ timeFormatConvert(scope.row.end_time) }}
</template>
</el-table-column>
-<!-- <el-table-column prop="end_time" label="标签" align="center">-->
-<!-- <template #default="scope">-->
-<!-- <el-select v-model="scope.row.label_id" @change="handleUpdateLabel(scope.row)" clearable>-->
-<!-- <el-option-->
-<!-- v-for="item in tagList"-->
-<!-- :key="item.id"-->
-<!-- :label="item.label_name"-->
-<!-- :value="item.id"-->
-<!-- ></el-option>-->
-<!-- </el-select>-->
-<!-- </template>-->
-<!-- </el-table-column>-->
+ <el-table-column prop="create_name" label="创建人" align="center"></el-table-column>
+ <!-- <el-table-column prop="end_time" label="标签" align="center">-->
+ <!-- <template #default="scope">-->
+ <!-- <el-select v-model="scope.row.label_id" @change="handleUpdateLabel(scope.row)" clearable>-->
+ <!-- <el-option-->
+ <!-- v-for="item in tagList"-->
+ <!-- :key="item.id"-->
+ <!-- :label="item.label_name"-->
+ <!-- :value="item.id"-->
+ <!-- ></el-option>-->
+ <!-- </el-select>-->
+ <!-- </template>-->
+ <!-- </el-table-column>-->
<el-table-column label="操作" width="300" align="center">
<template #default="scope">
<el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button>
+ <el-button icon="el-icon-view" type="text" @click="handleLineTrajectory(scope.row)">轨迹</el-button>
<el-button icon="el-icon-delete" type="text" @click="handleDelete(scope.row)">删除</el-button>
-<!-- <el-button type="text" @click="handleStar(scope.row)">-->
-<!-- <el-icon><Star /></el-icon>-->
-<!-- {{ scope.row.is_favorite ? '取消收藏':'收藏' }}</el-button>-->
+ <!-- <el-button type="text" @click="handleStar(scope.row)">-->
+ <!-- <el-icon><Star /></el-icon>-->
+ <!-- {{ scope.row.is_favorite ? '取消收藏':'收藏' }}</el-button>-->
<el-button type="text" @click="handleExport(scope.row)"><el-icon><Download /></el-icon>导出</el-button>
</template>
</el-table-column>
@@ -84,33 +86,50 @@
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</div>
- <el-dialog class="ztzf-dialog" append-to-body v-model="isShowView" title="查看"
- :width="pxToRem(1000)" :close-on-click-modal="false" :destroy-on-close="true">
- <!-- <div class="content"> -->
+ <el-dialog class="ztzf-dialog-mange" append-to-body v-model="isShowView" title="查看" :width="pxToRem(1200)" :close-on-click-modal="false" :destroy-on-close="true">
<el-table border :data="tableDataDetails" height="466">
<el-table-column label="序号" type="index" width="60"></el-table-column>
<el-table-column prop="flight_type" label="飞行类型" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="latitude" label="经度" align="center"></el-table-column>
- <el-table-column prop="longitude" label="纬度" align="center"></el-table-column>
- <el-table-column prop="height" label="高度" align="center"></el-table-column>
- <el-table-column prop="elevation" label="海拔高度" align="center"></el-table-column>
+ <el-table-column prop="create_time" label="飞行时间" align="center" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="longitude" label="经度" align="center"></el-table-column>
+ <el-table-column prop="latitude" label="纬度" align="center"></el-table-column>
+ <el-table-column prop="height" label="绝对高度" align="center"></el-table-column>
+ <el-table-column prop="elevation" label="实时真高" align="center"></el-table-column>
</el-table>
- <div class="pagination" style="display: flex;justify-content: end;margin-top: 10px;">
- <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
- :page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="detailParams.current"
- v-model:page-size="detailParams.size" layout="total, sizes, prev, pager, next, jumper" :total="detailTotal"
- @size-change="handleSizeChangeDetails" @current-change="handleCurrentChangeDetails" />
- <!-- </div> -->
- </div>
+ <template #footer>
+ <div class="pagination dialog-footer" style="display: flex;justify-content: end;margin-top: 10px;">
+ <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
+ :page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="detailParams.current"
+ v-model:page-size="detailParams.size" layout="total, sizes, prev, pager, next, jumper" :total="detailTotal"
+ @size-change="handleSizeChangeDetails" @current-change="handleCurrentChangeDetails" />
+ </div>
+ </template>
+ </el-dialog>
+ <el-dialog class="ztzf-dialog-mange" append-to-body v-model="isShowFlyMapView" title="查看" :width="pxToRem(1000)" :close-on-click-modal="false" :destroy-on-close="true">
+ <div id="flyMap" class="ztzf-cesium"></div>
</el-dialog>
</template>
<script setup>
-import { getHistoryTrack, cancelStar, addStar, updateDroneFlight, droneFlightLogInfoPage } from '@/api/logs';
+import { getHistoryTrack, cancelStar, addStar, updateDroneFlight, deleteDroneFlight, droneFlightLogInfoPage } from '@/api/logs';
// import { flightLogPage } from '@/api/airspace/airspace';
import { downloadXls } from '@/utils/util';
import { exportBlob } from '@/api/common'
+import * as Cesium from 'cesium';
+import { PublicCesium } from '@/utils/cesium/publicCesium';
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus';
import { Delete, Search } from '@element-plus/icons-vue';
+import { ArrowLineMaterialProperty } from '@/utils/cesium/Material'
+import { flyVisual } from '@/utils/cesium/mapUtil'
+import rwqfdImg from '@/assets/images/signMachineNest/rwqfd.png'
+import endPointImg from '@/assets/images/EndPointicon.png'
+import { nextTick } from 'vue';
+
+let publicCesiumInstance = null;
+let viewer = null;
+const viewInstance = shallowRef(null);
+const homeViewer = shallowRef(null);
+
+let previewDataSource = null
const total = ref(0)
let rangTime = ref([])
@@ -128,6 +147,8 @@
let isShowView = ref(false)
+let isShowFlyMapView = ref(false)
+
let tabType = ref('全部')
function timeFormatConvert(time) {
@@ -142,8 +163,8 @@
startTime: '',
endTime: '',
isFavorite: tabType.value === '收藏' ? true : false,
- page: '1',
- page_size: '10',
+ page: 1,
+ page_size: 10,
jobName: '',
jobInfoNum: '',
}
@@ -181,12 +202,119 @@
function handleDetail(row) {
isShowView.value = true
detailParams.value.current = 1
+ detailParams.value.size = 10
detailParams.value.flightId = row.id
detailTotal.value = 0
droneFlightLogInfoPage(detailParams.value).then(res => {
tableDataDetails.value = res.data.data.records
detailTotal.value = res.data.data.total
})
+}
+// 地图
+const initMap = () => {
+ if (!document.getElementById('flyMap')) {
+ return;
+ }
+ publicCesiumInstance = new PublicCesium({
+ dom: 'flyMap',
+ flatMode: false,
+ terrain: true,
+ layerMode: 4,
+ contour: false,
+ });
+ homeViewer.value = publicCesiumInstance.getViewer();
+ viewer = publicCesiumInstance.getViewer();
+ viewInstance.value = publicCesiumInstance;
+ viewer.scene.globe.depthTestAgainstTerrain = true;
+ viewInstance.value.switchContour(true);
+};
+// 预览轨迹
+let arrowLineMaterialProperty = new ArrowLineMaterialProperty({
+ color: new Cesium.Color(128 / 255, 215 / 255, 255 / 255, 1),
+ directionColor: new Cesium.Color(1, 1, 1, 1),
+ outlineColor: new Cesium.Color(1, 1, 1, 1),
+ outlineWidth: 0,
+ speed: 5,
+})
+async function handleLineTrajectory(row) {
+ isShowFlyMapView.value = true;
+
+ // 确保地图容器已渲染
+ await nextTick();
+
+ // 确保地图初始化完成
+ // if (!viewer) {
+ // initMap();
+ // }
+ initMap();
+
+ detailParams.value.size = 9999
+ detailParams.value.current = 1
+ detailParams.value.flightId = row.id;
+ const res = await droneFlightLogInfoPage(detailParams.value);
+ tableDataDetails.value = res.data.data.records;
+
+ // 清除现有数据源(如果有)
+ if (previewDataSource) {
+ viewer.dataSources.remove(previewDataSource);
+ }
+
+ // 创建新数据源
+ previewDataSource = new Cesium.CustomDataSource('previewDataSource');
+ await viewer.dataSources.add(previewDataSource);
+
+ // 确保数据有效
+ const validPositions = tableDataDetails.value
+ .filter(i => i.longitude && i.latitude && i.height)
+ .map(i => Cesium.Cartesian3.fromDegrees(
+ Number(i.longitude),
+ Number(i.latitude),
+ Number(i.height)
+ ));
+
+ if (validPositions.length > 0) {
+ previewDataSource.entities.add({
+ polyline: {
+ width: 4,
+ positions: validPositions,
+ material: arrowLineMaterialProperty,
+ clampToGround: false,
+ },
+ });
+ // 起点
+ // previewDataSource.entities.add({
+ // position: validPositions[0],
+ // billboard: {
+ // image: rwqfdImg,
+ // width: 50,
+ // height: 50,
+ // },
+ // })
+ // 终点
+ // previewDataSource.entities.add({
+ // position: validPositions[validPositions.length - 1],
+ // billboard: {
+ // image: new Cesium.ConstantProperty(endPointImg),
+ // width: 30,
+ // height: 30,
+ // verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 底部对齐
+ // },
+ // })
+
+
+ flyVisual({
+ positionsData: tableDataDetails.value.map(i => [
+ Number(i.longitude),
+ Number(i.latitude),
+ Number(i.height)
+ ]),
+ viewer,
+ multiple: 4.6,
+ pitch: -60
+ });
+ } else {
+ console.warn('No valid positions data');
+ }
}
// 分页
function handleSizeChangeDetails(val) {
@@ -251,7 +379,7 @@
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
- updateDroneFlight({ is_deleted: 1, id: row.id }).then(res => {
+ deleteDroneFlight({ id: row.id }).then(res => {
ElMessage.success('删除成功')
getList()
})
@@ -390,4 +518,8 @@
}
}
}
+#flyMap {
+ height: 500px;
+ width: 100%;
+}
</style>
\ No newline at end of file
--
Gitblit v1.9.3