From cc1aacf766bc902001f460fdfce20a9ec2ea097d Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Wed, 09 Apr 2025 17:56:11 +0800
Subject: [PATCH] Merge branch 'master' of http://139.196.74.78:10010/r/drone/command-center-dashboard

---
 src/store/modules/common.js                                                                                                 |   12 
 src/views/Home/HomeLeft/OverviewNext.vue                                                                                    |    4 
 src/store/modules/home.js                                                                                                   |    5 
 src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetails.vue                                                     |   13 
 src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetailsDialog.vue                                               |  241 +++++++++++++++++++++
 src/views/Home/useMapAggregation/useMapAggregation.js                                                                       |  122 +++++-----
 src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue |    1 
 src/views/Home/Footer.vue                                                                                                   |   55 +++--
 src/views/Home/AINowFly.vue                                                                                                 |  179 ++++++++++++++++
 src/views/Home/Home.vue                                                                                                     |   25 +
 10 files changed, 549 insertions(+), 108 deletions(-)

diff --git a/src/store/modules/common.js b/src/store/modules/common.js
index 8e0a1ef..0b24cde 100644
--- a/src/store/modules/common.js
+++ b/src/store/modules/common.js
@@ -4,13 +4,15 @@
  * @LastEditors: shuishen 1109946754@qq.com
  * @LastEditTime: 2025-04-03 12:01:58
  * @FilePath: \command-center-dashboard\src\store\modules\common.js
- * @Description: 
- * 
- * Copyright (c) 2025 by shuishen, All Rights Reserved. 
+ * @Description:
+ *
+ * Copyright (c) 2025 by shuishen, All Rights Reserved.
  */
 import { setStore, getStore, removeStore } from 'utils/store'
 import website from '@/config/website'
+import cesiumOptions from '@/utils/cesium-tsa'
 
+const { loadLAYER } = cesiumOptions()
 const common = {
   state: {
     language: getStore({ name: 'language' }) || 'zh-cn',
@@ -34,6 +36,10 @@
     },
   },
   mutations: {
+    setMapSetting: (state, data) => {
+      state.mapSetting = data
+      loadLAYER()
+    },
     SET_LANGUAGE: (state, language) => {
       state.language = language
       setStore({
diff --git a/src/store/modules/home.js b/src/store/modules/home.js
index 0c96d8c..e39501a 100644
--- a/src/store/modules/home.js
+++ b/src/store/modules/home.js
@@ -1,17 +1,16 @@
-import { set } from 'lodash'
 import { EDeviceTypeName } from '@/utils/staticData/enums'
 import { getStore, setStore } from '@/utils/store'
 
 const home = {
   state: {
-    machineNestDetail: false, // 机巢详情
+    machineNestDetail: false, // 机巢长列表
+		isEventOverviewDetail: false,//是事件概述详情
 		// 用户行政区划中心点
 		userAreaPosition: getStore({ name: 'userAreaPosition' }) || {},
 		// 用户切换后行政区划中心点
 		currentAreaPosition:getStore({ name: 'currentAreaPosition' }) || {},
     singleUavHome: {},
 		footActiveIndex: 0,
-		isEventOverviewDetail: false,//是事件概述详情
     singleTotal: {}, // 统计单个机巢数据
     // 项目id
     selectedWorkSpaceId: window.localStorage.getItem('bs_workspace_id'),
diff --git a/src/views/Home/AINowFly.vue b/src/views/Home/AINowFly.vue
new file mode 100644
index 0000000..b4f4d3e
--- /dev/null
+++ b/src/views/Home/AINowFly.vue
@@ -0,0 +1,179 @@
+<template>
+	<div class="AINowFly">
+		<div>智引即飞</div>
+		<div>
+			任务名称
+			<el-input type="text" v-model="params.taskName" />
+		</div>
+		<div>
+			关联算法:
+			<el-select v-model="params.ai_types" placeholder="请选择">
+				<el-option v-for="item in taskAlgorithm" :key="item.id" :label="item.dictValue" :value="item.dictKey" />
+			</el-select>
+		</div>
+		<div>
+			地址:
+			<el-input type="text" v-model="params.dz" />
+		</div>
+		<el-table :data="list">
+			<el-table-column type="index" label="序号" />
+			<el-table-column prop="nickname" label="机巢名称" />
+			<el-table-column prop="minute" label="预计飞行时长(分钟)" />
+			<el-table-column prop="exe_distance" label="预计飞行距离(m)" />
+		</el-table>
+	</div>
+</template>
+<script setup>
+import { getMultipleDictionary } from '@/api/system/dictbiz'
+import * as Cesium from 'cesium'
+import { getFlyingNestBy } from '@/api/home/task'
+import { cartesian3Convert } from '@/utils/cesium/mapUtil'
+import { Cartesian3 } from 'cesium'
+import uavImg from '@/assets/images/home/useUavHome/uavImg.png'
+import ImageTrailMaterial from '@/utils/cesium/ImageTrailMaterial'
+import lineImg from '@/assets/images/arrow-right-blue.png'
+import _ from 'lodash'
+import { ElMessage } from 'element-plus'
+
+const params = ref({
+	taskName: '',
+	ai_types: '',
+	dz: '',
+})
+let handler = null
+const taskAlgorithm = ref([])
+
+let viewer
+const list = ref([])
+let eventPoint = {}
+
+const renderingLine = () => {
+	const { longitude, latitude } = eventPoint
+	list.value.forEach((item, index) => {
+		const start = Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude))
+		const end = Cartesian3.fromDegrees(Number(longitude), Number(latitude))
+		const positionsList = [start, end]
+		// 线
+		viewer.entities.add({
+			id: `AINow-line-${index}`,
+			polyline: {
+				width: 4,
+				positions: positionsList,
+				material: new ImageTrailMaterial({
+					color: { alpha: 1, blue: 1, green: 1, red: 1 },
+					speed: 20,
+					image: lineImg,
+					repeat: { x: Math.floor(40), y: 1 },
+				}),
+				clampToGround: false,
+			},
+		})
+		// 点
+		viewer.entities.add({
+			id: `AINow-point-${index}`,
+			position: start,
+			label: {
+				text: item.nickname,
+				font: '12pt Source Han Sans CN',
+				fillColor: Cesium.Color.WHITE,
+				outlineColor: Cesium.Color.BLACK,
+				outlineWidth: 2,
+				style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+				verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+				pixelOffset: new Cesium.Cartesian2(0, -9),
+			},
+			billboard: {
+				image: new Cesium.ConstantProperty(uavImg),
+				width: 24,
+				height: 24,
+			},
+			properties: {
+				customData: {
+					data: item,
+				},
+			},
+		})
+	})
+}
+
+const removeEntities = () => {
+	const entitiesIDs = viewer.entities.values.map(i => i.id)
+	entitiesIDs.forEach(item => {
+		item.includes('AINow-') && viewer.entities.removeById(item)
+	})
+}
+
+// 单击事件
+const singleClickEvent = click => {
+	removeEntities()
+	const earthPosition = viewer.scene.pickPosition(click.position)
+	viewer.entities.add({
+		position: earthPosition,
+		id: `AINow-event-0`,
+		point: {
+			pixelSize: 10,
+			color: Cesium.Color.RED,
+			outlineColor: Cesium.Color.WHITE,
+			outlineWidth: 2,
+		},
+	})
+	const { longitude, latitude } = cartesian3Convert(earthPosition, viewer)
+	eventPoint = { longitude, latitude }
+	getFJList()
+}
+
+// 请求字典字段
+const requestDictionary = () => {
+	getMultipleDictionary('SF').then(res => {
+		if (res.code !== 0) {
+			taskAlgorithm.value = res.data.data['SF']
+		}
+	})
+}
+
+// 获取飞机列表
+const getFJList = async () => {
+	const params = { ...eventPoint, page: 1, limit: 9999, type: 1 }
+	const res = await getFlyingNestBy(params)
+	list.value = (res.data?.data || []).map(item => ({
+		...item,
+		minute: _.round(item.estimated_arrival_time / 60, 0),
+	}))
+	if (!list.value.length) ElMessage.warning('附近暂无可用无人机')
+	renderingLine()
+}
+
+const initMap = () => {
+	handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
+	handler.setInputAction(singleClickEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK)
+}
+
+const removeAll = () => {
+	removeEntities()
+	handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
+	handler?.destroy()
+	handler = null
+}
+
+onBeforeUnmount(() => {
+	removeAll()
+})
+
+onMounted(() => {
+	requestDictionary()
+	viewer = window.$viewer
+	initMap()
+})
+</script>
+<style scoped lang="scss">
+.AINowFly {
+	position: absolute;
+	top: 200px;
+	right: 0;
+	width: 400px;
+	height: 700px;
+	background: white;
+	color: black;
+	font-size: 20px;
+}
+</style>
diff --git a/src/views/Home/Footer.vue b/src/views/Home/Footer.vue
index 8c9d4d4..33baaf6 100644
--- a/src/views/Home/Footer.vue
+++ b/src/views/Home/Footer.vue
@@ -1,15 +1,20 @@
 <template>
 	<div class="footer">
 		<img
-			v-for="item in list"
+			v-for="(item,index) in list.filter(i => !i.disable)"
 			:class="item.className"
 			:src="item.active ? item.activeImg : item.img"
 			alt=""
-			@click="imgClick(item)"
+			@click="footAction(item,index)"
 		/>
 	</div>
 	<div class="intelligent-introduction-flying">
-		<img class="orthophoto" src="@/assets/images/intelligent-introduction-flying.png" alt="" />
+		<img
+			class="orthophoto"
+			src="@/assets/images/intelligent-introduction-flying.png"
+			alt=""
+			@click="footAction(list[5],5)"
+		/>
 	</div>
 </template>
 
@@ -27,6 +32,10 @@
 
 import { useMapAggregation } from '@/views/Home/useMapAggregation/useMapAggregation'
 import { useStore } from 'vuex'
+import func from '@/utils/func'
+
+const store = useStore()
+const footActiveIndex = computed(() => store.state.home.footActiveIndex)
 
 // 机巢聚合
 const { init, removeAll } = useMapAggregation('device')
@@ -35,7 +44,7 @@
 
 const list = ref([
 	{
-		name: 'event1',
+		name: 'jc',
 		img: img1,
 		activeImg: activeImg1,
 		active: true,
@@ -44,7 +53,7 @@
 		removeAll: removeAll,
 	},
 	{
-		name: 'event2',
+		name: 'sj',
 		img: img2,
 		activeImg: activeImg2,
 		active: false,
@@ -52,27 +61,28 @@
 		init: eventInit,
 		removeAll: eventRemove,
 	},
-	{ name: 'event3', img: img3, activeImg: activeImg3, active: false, className: 'panorama' },
-	{ name: 'event4', img: img4, activeImg: activeImg4, active: false, className: 'threeD' },
-	{ name: 'event5', img: img5, activeImg: activeImg5, active: false, className: 'orthophoto' },
+	{ name: 'qj', img: img3, activeImg: activeImg3, active: false, className: 'panorama' },
+	{ name: 'sw', img: img4, activeImg: activeImg4, active: false, className: 'threeD' },
+	{ name: 'zs', img: img5, activeImg: activeImg5, active: false, className: 'orthophoto' },
+	{ name: 'zyjf', active: false, disable: true },
 ])
-const store = useStore()
-const imgClick = (toItem,index) => {
-	index !== undefined && store.commit('setFootActiveIndex',index)
-	const fromItem = list.value.find(item => item.active)
-	if (fromItem.name === toItem.name) return
+
+const footAction = (toItem, index) => {
+	const fromItem = list.value.find(item => item.active)  //上一个激活item
+	if (fromItem.name === toItem?.name) return  //是重复点击
+	index !== undefined && store.commit('setFootActiveIndex', index) //是按钮点击得动作
 	fromItem?.removeAll?.()
-	nextTick(() => {
-		toItem?.init?.()
-	})
-	list.value = list.value.map(item => ({ ...item, active: item.name === toItem.name }))
+	nextTick(() => toItem?.init?.())
+	list.value = list.value.map(item => ({ ...item, active: item.name === toItem?.name }))
 }
 
-const footActiveIndex = computed(() => store.state.home.footActiveIndex)
-watch(footActiveIndex, val => {
-	console.log(6666666)
-	imgClick(list.value[val])
-},{deep:true})
+watch(
+	footActiveIndex,
+	val => {
+		footAction(list.value[val])
+	},
+	{ deep: true }
+)
 
 // 销毁前钩子
 onBeforeUnmount(() => {
@@ -128,6 +138,7 @@
 	bottom: 23px;
 
 	img {
+		cursor: pointer;
 		width: 146px;
 		height: 54px;
 	}
diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
index cb9d703..d9b14cb 100644
--- a/src/views/Home/Home.vue
+++ b/src/views/Home/Home.vue
@@ -1,15 +1,17 @@
 <template>
-	<template v-if="singleUavHome?.device_sn">
-		<SignMachineNest />
-	</template>
+	<!--		单个机巢页面-->
+	<SignMachineNest v-if="singleUavHome?.device_sn" />
+	<!--		事件概述详细信息页面-->
+	<EventOverviewDetail v-else-if="isEventOverviewDetail" />
+
+	<AINowFly v-else-if="isAINowFly" />
+	<!--			首页默认的页面-->
 	<template v-else>
-		<EventOverviewDetail v-if="isEventOverviewDetail" />
-		<template v-else>
-			<SearchBox />
-			<HomeLeft />
-			<HomeRight />
-		</template>
+		<HomeLeft />
+		<HomeRight />
 	</template>
+
+	<SearchBox />
 	<RSide />
 	<Footer />
 </template>
@@ -25,16 +27,19 @@
 import { onMounted } from 'vue'
 import cesiumOperation from '@/utils/cesium-tsa'
 import EventOverviewDetail from '@/views/Home/EventOverviewDetail/EventOverviewDetail.vue'
+import AINowFly from '@/views/Home/AINowFly.vue'
 
 const store = useStore()
 const { _init, viewerDestory } = cesiumOperation()
 
 const singleUavHome = computed(() => store.state.home.singleUavHome)
 const isEventOverviewDetail = computed(() => store.state.home.isEventOverviewDetail)
+const isAINowFly = computed(() => store.state.home.footActiveIndex === 5)
 
 onUnmounted(() => {
 	store.commit('setSingleUavHome', null)
-	console.log('home销毁')
+	store.commit('setIsEventOverviewDetail', false)
+	store.commit('setFootActiveIndex', 0)
 	viewerDestory()
 })
 
diff --git a/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetails.vue b/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetails.vue
index d24f168..1a5a818 100644
--- a/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetails.vue
+++ b/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetails.vue
@@ -20,6 +20,7 @@
 		<CommonDateTime :style="{ top: pxToRem(19) }" v-model="newTime" @change="getData" />
 		<div class="chart-container" ref="chartRef"></div>
 	</div>
+	<InspectionRaskDetailsDialog v-model:show="isShowDetailsDialog"></InspectionRaskDetailsDialog>
 </template>
 
 <script setup>
@@ -29,7 +30,7 @@
 import CommonDateTime from '@/components/CommonDateTime.vue'
 import { getJobNumBar, getJobStatistics, getTotalJobNum } from '@/api/home'
 import dayjs from 'dayjs'
-
+import InspectionRaskDetailsDialog from '@/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetailsDialog.vue'
 const currenDate = dayjs().format('YYYY-MM-DD')
 const newTime = ref([currenDate, currenDate])
 const list = ref([
@@ -103,9 +104,12 @@
 		},
 	},
 }
-
+// 是否展示巡检任务详情
+const isShowDetailsDialog = ref(false)
 const detailsFun = () => {
-	console.log('details')
+console.log(isShowDetailsDialog.value)
+	isShowDetailsDialog.value = true
+	
 }
 
 let chart = null
@@ -166,8 +170,7 @@
 	opacity: 0.85;
 
 	.inspection-num {
-		background: url('@/assets/images/home/homeLeft/inspection-num.png') no-repeat center / 100%
-			100%;
+		background: url('@/assets/images/home/homeLeft/inspection-num.png') no-repeat center / 100% 100%;
 		width: 360px;
 		height: 118px;
 		position: relative;
diff --git a/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetailsDialog.vue b/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetailsDialog.vue
index 705b366..0a9c5a6 100644
--- a/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetailsDialog.vue
+++ b/src/views/Home/HomeLeft/InspectionRaskDetails/InspectionRaskDetailsDialog.vue
@@ -1,9 +1,248 @@
+ <!--  巡检任务情况-详情 -->
 <template>
-
+	<el-dialog
+		v-model="isShowDetailsDialog"
+		title="巡检任务详情"
+		:width="pxToRem(1000)"
+		:close-on-click-modal="false"
+		:destroy-on-close="true"
+	>
+		<!-- 搜索 -->
+		<el-form :model="searchForm" inline>
+			<div class="search-row">
+				<el-form-item>
+					<el-input v-model="searchForm.key_word" placeholder="请输入任务/机巢名称" clearable />
+				</el-form-item>
+				<el-form-item label="关联算法">
+					<el-select v-model="searchForm.ai_types" placeholder="请选择">
+						<el-option v-for="item in taskAlgorithm" :key="item.id" :label="item.dictValue" :value="item.dictKey" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="任务状态">
+					<el-select v-model="searchForm.status" placeholder="请选择" clearable>
+						<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
+					</el-select>
+				</el-form-item>
+			</div>
+			<div class="search-row">
+				<el-form-item label="选择机巢">
+					<el-select v-model="searchForm.device_sn" placeholder="请选择">
+						<el-option
+							v-for="item in deviceList"
+							:label="item.nickname"
+							:value="item.device_sn"
+							:key="item.device_sn"
+						/>
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-date-picker
+						v-model="dateRange"
+						type="daterange"
+						range-separator="至"
+						start-placeholder="开始日期"
+						end-placeholder="结束日期"
+						value-format="YYYY-MM-DD"
+						@change="changeselect"
+					/>
+				</el-form-item>
+				<el-form-item>
+					<el-button @click="handleReset">重置</el-button>
+					<el-button type="primary" @click="handleSearch">查询</el-button>
+				</el-form-item>
+			</div>
+		</el-form>
+		<!-- 表格 -->
+		<el-table :data="taskDetailData" style="width: 100%">
+			<el-table-column label="序号" width="60">
+				<template #default="scope">
+					{{ (taskDetailParams.page - 1) * taskDetailParams.limit + scope.$index + 1 }}
+				</template>
+			</el-table-column>
+			<el-table-column prop="job_info_num" label="任务编号" />
+			<el-table-column prop="name" label="任务名称" />
+			<el-table-column prop="device_names" label="所属机巢" />
+			<el-table-column prop="ai_type_str" label="关联算法" />
+			<el-table-column prop="status" label="任务状态" />
+			<el-table-column prop="industry_type_str" label="任务类型" />
+			<el-table-column prop="begin_time" label="任务时间" />
+			<el-table-column prop="name" label="关联事件" />
+			<el-table-column label="操作"> <el-button link type="primary" size="small">查看</el-button></el-table-column>
+		</el-table>
+		<!-- 分页 -->
+		<div class="pagination">
+			<el-pagination
+				v-model:current-page="pageParams.page"
+				v-model:page-size="pageParams.limit"
+				:page-sizes="[10, 20, 30, 50]"
+				background
+				:disabled="disabled"
+				layout="total, sizes, prev, pager, next, jumper"
+				:total="total"
+				@size-change="handleSizeChange"
+				@current-change="handleCurrentChange"
+			/>
+		</div>
+	</el-dialog>
 </template>
 <script setup>
+import { pxToRem } from '@/utils/rem'
+import { jobList } from '@/api/home/task'
+import { getDictionary } from '@/api/system/dict'
+import { selectDevicePage } from '@/api/home/machineNest'
+import { getMultipleDictionary } from '@/api/system/dictbiz'
+const isShowDetailsDialog = defineModel('show')
+const dateRange = ref('')
+const searchForm = reactive({
+	key_word: '', // 模糊搜索关键词(匹配名称/昵称/设备sn)
+	ai_types: [], // 算法类型
+	device_sn: '', // 设备编号
+	end_date: null, // 结束时间
+	start_date: null, // 开始时间
+	status: '', // 作业状态
+})
+const statusOptions = [
+	{ label: '待执行', value: 1 },
+	{ label: '执行中', value: 2 },
+	{ label: '已完成', value: 3 },
+	{ label: '已取消', value: 4 },
+	{ label: '执行失败', value: 5 },
+]
+// 设备页面参数
+const devicePageParams = ref({
+	current: 1,
+	size: 10,
+	total: 0,
+	nickname: '',
+})
+const deviceList = ref([])
+// 表格
+const taskDetailData = ref([])
+// 表格参数
+const taskDetailParams = reactive({
+	page: 1,
+	limit: 10,
+	searchParams: {},
+})
+// 分页
+const total = ref(0)
+// 分页参数
+let pageParams = reactive({
+	page: 1,
+	limit: 10,
+})
+// 日期选择
+const changeselect = () => {
+	searchForm.start_date = dateRange.value.length ? `${dateRange.value[0]} 00:00:00` : null
+	searchForm.end_date = dateRange.value.length ? `${dateRange.value[1]} 00:00:00` : null
+}
 
+// 重置
+const handleReset = () => {
+	dateRange.value = null
+	Object.keys(searchForm).forEach(key => {
+		if (key == 'start_date' || key == 'end_date') {
+			searchForm[key] = null
+		} else if (key == 'ai_types') {
+			searchForm[key] = []
+		} else {
+			searchForm[key] = ''
+		}
+	})
+
+	handleSearch()
+}
+// 查询
+const handleSearch = () => {
+	taskDetailParams.page = 1
+	taskDetailParams.limit = 10
+	taskDetailParams.searchParams = searchForm
+	console.log('taskDetailParams.value', taskDetailParams)
+	getJobList()
+}
+// 分页大小改变
+const handleSizeChange = val => {
+	pageParams.limit = val
+	getJobList()
+}
+// 页码改变
+const handleCurrentChange = val => {
+	pageParams.page = val
+	getJobList()
+}
+// 获取任务列表
+const getJobList = () => {
+	jobList(taskDetailParams).then(res => {
+		if (res.data.code !== 0) return
+		taskDetailData.value = res.data.data.records
+		total.value = res.data.data.total
+	})
+}
+// 机巢列表数据
+const getDeviceList = async () => {
+	const res = await selectDevicePage({ current: 1, size: 99999, type: 1 })
+	deviceList.value = res.data?.data?.records || []
+}
+// 关联算法
+
+let taskBusiness = ref([])
+let taskAlgorithm = ref([])
+// 请求字典字段
+const requestDictionary = () => {
+	getMultipleDictionary('SF,HYLB').then(res => {
+		if (res.code !== 0) {
+			// 处理数据
+			taskAlgorithm.value = res.data.data['SF']
+			taskBusiness.value = res.data.data['HYLB']
+		}
+	})
+}
+const algorithmChange = val => {
+	searchForm.ai_types = val
+}
+onMounted(() => {
+	requestDictionary()
+	getJobList()
+	getDeviceList()
+})
 </script>
 <style scoped lang="scss">
+.search-row {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	.el-form-item {
+		flex: 1;
+	}
+}
+:deep(.el-form) {
+	.el-form-item {
+		margin-bottom: 0;
+		margin-right: 20px;
+		.el-form-item__label {
+			color: #fff;
+		}
 
+		.el-input,
+		.el-select,
+		.el-date-editor {
+			width: 200px;
+			--el-input-bg-color: transparent;
+			--el-input-border-color: rgba(255, 255, 255, 0.3);
+			--el-input-text-color: #fff;
+			--el-input-placeholder-color: rgba(255, 255, 255, 0.5);
+		}
+	}
+}
+
+:deep() {
+	.el-date-editor.el-input,
+	.el-date-editor.el-input__wrapper {
+		height: var(--el-input-height, var(--el-component-size));
+		width: 0 !important;
+	}
+}
+.pagination {
+	margin-top: 20px;
+}
 </style>
diff --git a/src/views/Home/HomeLeft/OverviewNext.vue b/src/views/Home/HomeLeft/OverviewNext.vue
index 60e2327..c1cef1c 100644
--- a/src/views/Home/HomeLeft/OverviewNext.vue
+++ b/src/views/Home/HomeLeft/OverviewNext.vue
@@ -1,6 +1,6 @@
 <!-- 机巢概况 -->
 <template>
-  <common-title :style="{ marginLeft: pxToRem(14) }" @details="detailsFun"></common-title>
+  <common-title title="机巢概况" :style="{ marginLeft: pxToRem(14) }" @details="detailsFun"></common-title>
   <div class="overview-next">
     <MachineNestTotal @searchNickName="handleSearch" />
     <div class="table-list">
@@ -114,7 +114,7 @@
   border-radius: 0px 0px 0px 0px;
   opacity: 0.85;
   margin-bottom: 10px;
-  
+
   .table-list {
     font-family: Source Han Sans CN, Source Han Sans CN;
     margin: 16px;
diff --git a/src/views/Home/useMapAggregation/useMapAggregation.js b/src/views/Home/useMapAggregation/useMapAggregation.js
index 7d92182..53ccd4a 100644
--- a/src/views/Home/useMapAggregation/useMapAggregation.js
+++ b/src/views/Home/useMapAggregation/useMapAggregation.js
@@ -199,17 +199,17 @@
     scalingJudgment.forEach(item => item.show && (item.outline = outlineGJson))
     const [longitude, latitude] = outlineGJson.features[0].properties.centroid
     const height = scalingJudgment[(hierarchy.length - 3) * (-1)].height
-    setCenterPosition({longitude, latitude,height})
+    setCenterPosition({ longitude, latitude, height })
     flyTo({ longitude, latitude }, 0, height)
   }
 
-  const userAreaPosition = computed(() => store.state.home.userAreaPosition);
+  const userAreaPosition = computed(() => store.state.home.userAreaPosition)
 
   const setCenterPosition = (position) => {
     store.commit('setCurrentAreaPosition', position)
-		if (!userAreaPosition.value.longitude){
-			store.commit('setUserAreaPosition', position)
-		}
+    if (!userAreaPosition.value.longitude) {
+      store.commit('setUserAreaPosition', position)
+    }
   }
 
 
@@ -235,7 +235,6 @@
         id: `aggregation-splashed-${index}`,
         position: Cesium.Cartesian3.fromDegrees(item.longitude, item.latitude),
         label: {
-          // 随机整数
           text: item.nickname,
           font: '12pt Source Han Sans CN',
           fillColor: Cesium.Color.WHITE,
@@ -262,28 +261,24 @@
   // 渲染轮廓
   const renderOutline = item => {
     item.outline &&
-    Cesium.GeoJsonDataSource.load(item.outline).then(dataSource => {
-      viewer.dataSources.add(dataSource)
-      const entities = dataSource.entities.values
-      entities.forEach(entity => {
-        // 隐藏多边形填充
-        entity.polygon.material = Cesium.Color.TRANSPARENT
-        entity.polygon.outline = false // 关闭原生轮廓
-        // 创建独立折线作为轮廓
-        const positions = entity.polygon.hierarchy.getValue().positions
-        viewer.entities.add({
-          polyline: {
-            positions: positions,
-            width: 5, // 直接设置宽度
-            material: new Cesium.PolylineGlowMaterialProperty({
-              glowPower: 0.5,
-              color: Cesium.Color.AQUA,
-            }),
-            clampToGround: true, // 贴地显示
-          },
+      Cesium.GeoJsonDataSource.load(item.outline).then(dataSource => {
+        const entities = dataSource.entities.values
+        entities.forEach((entity, index) => {
+          // 创建独立折线作为轮廓
+          const positions = entity.polygon.hierarchy.getValue().positions
+          viewer.entities.add({
+            id: `aggregation-outline-${index}`,
+            polyline: {
+              positions: positions,
+              width: 5, // 直接设置宽度
+              material: new Cesium.PolylineGlowMaterialProperty({
+                glowPower: 0.5,
+                color: Cesium.Color.AQUA,
+              }),
+            },
+          })
         })
       })
-    })
   }
 
   // 聚合机巢
@@ -301,7 +296,7 @@
     // 遍历特征并添加实体
     featuresList.forEach((feature, index) => {
       if (!feature.position) return
-      const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1])
+      const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1], 12000)
       viewer.entities.add({
         position: position,
         id: `aggregation-name-${index}`,
@@ -348,10 +343,12 @@
       return arrColor[++index % arrColor.length]
     }
 
-    // 加载新的 GeoJSON 数据
+    // 加载边界
     Cesium.GeoJsonDataSource.load(item.gJson).then(dataSource => {
+      console.log(dataSource, item.gJson)
+
       viewer.dataSources.add(dataSource)
-      item.dataSource = dataSource // 保存数据源以便后续删除
+      item.BJDataSource = dataSource // 保存数据源以便后续删除
       // 获取数据源中的实体
       const entities = dataSource.entities.values
 
@@ -362,18 +359,14 @@
           alphaPower: 1.3
         })
 
-        entity.polygon.extrudedHeight = (entity.propertyNames.length || 1) * 500
+        entity.polygon.extrudedHeight = (entity.properties.childrenNum._value || 1) * 500
 
         entity.polygon.material = material
         entity.polygon.outline = false // 显示边框
       })
 
       needFly && viewer.flyTo(dataSource, {
-        offset: new Cesium.HeadingPitchRange(
-          0, // heading: 0 (朝向不变)
-          Cesium.Math.toRadians(-60), // pitch: -90° (垂直向下)
-          0 // range: 0 (默认距离)
-        ),
+        offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-60), 0),
         duration: 0.5,
       })
       needFly = false
@@ -410,30 +403,33 @@
   // 左键单机事件
   const singleMachineEvent = async click => {
     const pickedObject = viewer.scene.pick(click.position)
-    if (Cesium.defined(pickedObject) && pickedObject.id) {
-      const entity = pickedObject.id
-      currentEntity = entity
-      positionC3 = entity?.position?._value
-      if (!positionC3) return
-      removeLabel()
-      const customData = entity.properties.customData._value.data
-      console.log('customData', customData)
-      switch (customData.type) {
-        case 'deviceAggregation':
-          viewer.scene.postRender.addEventListener(labelBoxRender)
-          break
-        // todo 待对接
-        case 'device':
-          store.commit('setSingleUavHome', { id: '123' })
-          break
-        case 'eventAggregation':
-          break
-        case 'event':
-          viewer.scene.postRender.addEventListener(labelBoxRender)
-          break
-        default:
-          break
-      }
+    if (!(Cesium.defined(pickedObject) && pickedObject.id)) return
+    const entity = pickedObject.id
+    currentEntity = entity
+    const entityPosition = entity?.position?._value
+    if (!entityPosition) return
+    if (entityPosition) {
+      positionC3 = entityPosition
+    }
+    removeLabel()
+    const customData = entity?.properties?.customData?._value?.data
+    if (!customData) return
+    console.log('customData', customData)
+    switch (customData.type) {
+      case 'deviceAggregation':
+        viewer.scene.postRender.addEventListener(labelBoxRender)
+        break
+      // todo 待对接
+      case 'device':
+        store.commit('setSingleUavHome', { id: '123' })
+        break
+      case 'eventAggregation':
+        break
+      case 'event':
+        viewer.scene.postRender.addEventListener(labelBoxRender)
+        break
+      default:
+        break
     }
   }
 
@@ -446,8 +442,12 @@
 
   // 移除 点 和 gjson 实体
   const removeEntities = () => {
-    viewer.dataSources?.removeAll(true)
-    // viewer.entities?.removeAll();
+    // dataSources移除
+    scalingJudgment.forEach(item => {
+      item.BJDataSource && viewer.dataSources.remove(item.BJDataSource)
+      item.BJDataSource = null
+    })
+    // entities移除
     const entitiesIDs = viewer.entities.values.map(i => i.id)
     entitiesIDs.forEach(item => {
       item.includes('aggregation-') && viewer.entities.removeById(item)
diff --git a/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue b/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
index cef055c..a4df43e 100644
--- a/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
+++ b/src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetailsMap.vue
@@ -9,7 +9,6 @@
 import ImageTrailMaterial from '@/utils/cesium/ImageTrailMaterial'
 import lineImg from '@/assets/images/arrow-right-blue.png'
 import uavImg from '@/assets/images/home/useUavHome/uavImg.png'
-import { getCenterPoint } from '@/utils/cesium/mapUtil'
 
 const props = defineProps(['detailsData'])
 

--
Gitblit v1.9.3