From 7c17ba534daa62fa35e14491aefde56901a88fd8 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Tue, 03 Feb 2026 14:15:39 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 applications/task-work-order/src/views/orderView/flyingHand/FlyingHandDialog.vue                     |    2 
 applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue                             |   48 ++++++++++++++++++++++-
 applications/drone-command/src/views/areaManage/sceneConfig/index.vue                                |    2 
 applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue                           |    9 ++++
 applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue |    3 -
 applications/drone-command/src/views/basicManage/deviceStock/DeviceTrackDiaLog.vue                   |    1 
 applications/task-work-order/src/views/orderView/appConfiguration/process/FlowConfigDialog.vue       |    4 +-
 7 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue b/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
index 3c51a03..342b43c 100644
--- a/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
+++ b/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
@@ -260,6 +260,7 @@
 import ellipseIcon from '@/assets/images/areaMap/ellipse.png'
 import bufferIcon from '@/assets/images/areaMap/buffer.png'
 import trashIcon from '@/assets/images/areaMap/trash.png'
+import equipmentIcon from '@/assets/images/dataCockpit/map/equipment.png'
 
 const initForm = () => ({
 	areaName: '', // 区域名称
@@ -314,6 +315,7 @@
 let viewEntity
 let shapeDisplaySource
 const deviceRangePrimitiveMap = new Map()
+const deviceIconEntityMap = new Map()
 const activeToolMode = ref('')
 const suppressDeviceFly = ref(false)
 const isDialogInitializing = ref(false)
@@ -437,6 +439,7 @@
 			hideTypePanel()
 			clearShapeDisplay()
 			clearDeviceRangePrimitives()
+			clearDeviceIconEntities()
 		}
 	}
 )
@@ -504,10 +507,20 @@
 	deviceRangePrimitiveMap.clear()
 }
 
+function clearDeviceIconEntities () {
+	if (!viewer || !deviceIconEntityMap.size) return
+	for (const entity of deviceIconEntityMap.values()) {
+		viewer.entities.remove(entity)
+	}
+	deviceIconEntityMap.clear()
+}
+
 function clearDeviceListState () {
 	deviceOptions.value = []
 	selectedDeviceRows.value = []
 	formData.value.deviceIds = ''
+	clearDeviceRangePrimitives()
+	clearDeviceIconEntities()
 	if (deviceTableRef.value) {
 		deviceTableRef.value.clearSelection()
 	}
@@ -599,8 +612,10 @@
 async function renderDeviceRangeSingle (device) {
 	if (!viewer) return
 	clearDeviceRangePrimitives()
+	clearDeviceIconEntities()
 	const position = getDeviceLngLat(device)
 	if (!position) return
+	addDeviceIconEntity(device, position)
 	const rangeMeters = normalizeDeviceRange(device.effectiveRangeKm)
 	const primitive = await createDeviceRangePrimitive(viewer, position, rangeMeters)
 	if (!primitive) return
@@ -620,6 +635,12 @@
 			deviceRangePrimitiveMap.delete(id)
 		}
 	}
+	for (const [id, entity] of deviceIconEntityMap.entries()) {
+		if (!nextIds.has(id)) {
+			viewer.entities.remove(entity)
+			deviceIconEntityMap.delete(id)
+		}
+	}
 	const pendingRows = selectedRows.filter(row => {
 		const id = String(row?.id)
 		return id && !deviceRangePrimitiveMap.has(id)
@@ -628,14 +649,17 @@
 	const primitives = await Promise.all(
 		pendingRows.map(async row => {
 			const position = getDeviceLngLat(row)
-			if (!position) return { row, primitive: null }
+			if (!position) return { row, primitive: null, position: null }
 			const rangeMeters = normalizeDeviceRange(row.effectiveRangeKm)
 			const primitive = await createDeviceRangePrimitive(viewer, position, rangeMeters)
-			return { row, primitive }
+			return { row, primitive, position }
 		})
 	)
 	if (renderToken !== deviceRangeRenderToken) return
-	primitives.forEach(({ row, primitive }) => {
+	primitives.forEach(({ row, primitive, position }) => {
+		if (position) {
+			addDeviceIconEntity(row, position)
+		}
 		if (!primitive) return
 		const id = String(row?.id)
 		if (!nextIds.has(id)) return
@@ -665,6 +689,23 @@
 function clearShapeDisplay () {
 	if (!shapeDisplaySource) return
 	shapeDisplaySource.entities.removeAll()
+}
+
+function addDeviceIconEntity (device, position) {
+	if (!viewer || !position) return
+	const id = String(device?.id ?? '')
+	if (!id || deviceIconEntityMap.has(id)) return
+	const entity = viewer.entities.add({
+		position: Cesium.Cartesian3.fromDegrees(position.lng, position.lat, position.height || 0),
+		billboard: {
+			image: equipmentIcon,
+			width: 28,
+			height: 38,
+			verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+			heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+		},
+	})
+	deviceIconEntityMap.set(id, entity)
 }
 
 function normalizeShapePoint (point) {
@@ -1357,6 +1398,7 @@
 	initMap()
 	clearShapeDisplay()
 	clearDeviceRangePrimitives()
+	clearDeviceIconEntities()
 	viewEntity && viewer?.entities?.remove(viewEntity)
 	viewEntity = null
 	clearActiveTool()
diff --git a/applications/drone-command/src/views/areaManage/sceneConfig/index.vue b/applications/drone-command/src/views/areaManage/sceneConfig/index.vue
index 7ef87d3..e0bca9e 100644
--- a/applications/drone-command/src/views/areaManage/sceneConfig/index.vue
+++ b/applications/drone-command/src/views/areaManage/sceneConfig/index.vue
@@ -54,7 +54,7 @@
 					</el-table-column>
 					<el-table-column prop="areaCount" show-overflow-tooltip label="区域数量" />
 					<el-table-column prop="counterDeviceCount" show-overflow-tooltip label="反制设备数量" />
-					<el-table-column prop="detectDeviceCount" show-overflow-tooltip label="探测设备数量" />
+					<el-table-column prop="detectDeviceCount" show-overflow-tooltip label="侦测设备数量" />
 					<el-table-column label="操作" class-name="operation-btns">
 						<template v-slot="{ row }">
 							<el-link @click="openForm('view', row)">查看</el-link>
diff --git a/applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue b/applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue
index 1ee59fc..1afc927 100644
--- a/applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue
+++ b/applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue
@@ -107,6 +107,7 @@
 							start-placeholder="开始时间"
 							end-placeholder="结束时间"
 							value-format="YYYY-MM-DD HH:mm:ss"
+							:disabled-date="disablePastDate"
 							clearable
 						/>
 					</el-form-item>
@@ -201,6 +202,12 @@
 let mapTooltip
 let publicCesium
 const tooltipEventKey = 'scene-manage-point-tip'
+const disablePastDate = date => {
+	if (!date) return false
+	const todayStart = new Date()
+	todayStart.setHours(0, 0, 0, 0)
+	return date.getTime() < todayStart.getTime()
+}
 
 // 表单验证规则
 const rules = {
@@ -526,6 +533,8 @@
 	const list = res?.data?.data ?? []
 	areaList.value = await ensureAreaExtList(list)
 	renderSceneAreas()
+	await nextTick()
+	fitViewToSceneAreas()
 }
 
 async function getSceneConfigList() {
diff --git a/applications/drone-command/src/views/basicManage/deviceStock/DeviceTrackDiaLog.vue b/applications/drone-command/src/views/basicManage/deviceStock/DeviceTrackDiaLog.vue
index 13edcb7..423e502 100644
--- a/applications/drone-command/src/views/basicManage/deviceStock/DeviceTrackDiaLog.vue
+++ b/applications/drone-command/src/views/basicManage/deviceStock/DeviceTrackDiaLog.vue
@@ -140,6 +140,7 @@
 		const payload = {
 			...formData.value,
 			outTarget: selected?.label ?? formData.value.outTarget,
+			outTargetCode: formData.value.outTarget
 		}
 		await fwDeviceTrackSubmitApi(payload)
 		saveOperationLog({
diff --git a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
index 9243617..4deb756 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
@@ -343,9 +343,6 @@
 		const radius = Math.max(rangeMeters, 1000)
 		const sphere = new Cesium.BoundingSphere(center, radius)
 
-		console.log(viewer, longitude, latitude, radius)
-
-
 		viewer.camera.flyToBoundingSphere(sphere, {
 			duration: 0,
 			offset: new Cesium.HeadingPitchRange(viewer.camera.heading, Cesium.Math.toRadians(-90), radius * 1.8),
diff --git a/applications/task-work-order/src/views/orderView/appConfiguration/process/FlowConfigDialog.vue b/applications/task-work-order/src/views/orderView/appConfiguration/process/FlowConfigDialog.vue
index 911d3b7..e81d14a 100644
--- a/applications/task-work-order/src/views/orderView/appConfiguration/process/FlowConfigDialog.vue
+++ b/applications/task-work-order/src/views/orderView/appConfiguration/process/FlowConfigDialog.vue
@@ -27,8 +27,8 @@
 		<template #footer>
 			<span class="avue-dialog__footer">
 				<el-button @click="handleNutflowClose(() => {}, true)">取 消</el-button>
-				<el-button v-if="nutflowOption.step === 1" type="success" @click="handleStep(1)">下 一 步</el-button>
-				<el-button v-if="nutflowOption.step === 2" type="success" @click="handleStep(-1)">上 一 步</el-button>
+				<el-button color="#4C34FF" v-if="nutflowOption.step === 1" type="success" @click="handleStep(1)">下 一 步</el-button>
+				<el-button color="#4C34FF" v-if="nutflowOption.step === 2" type="success" @click="handleStep(-1)">上 一 步</el-button>
 				<el-button v-if="nutflowOption.step === 2" type="primary" @click="handleSubmitModel">确 定</el-button>
 			</span>
 		</template>
diff --git a/applications/task-work-order/src/views/orderView/flyingHand/FlyingHandDialog.vue b/applications/task-work-order/src/views/orderView/flyingHand/FlyingHandDialog.vue
index a5b9bdb..1f1580c 100644
--- a/applications/task-work-order/src/views/orderView/flyingHand/FlyingHandDialog.vue
+++ b/applications/task-work-order/src/views/orderView/flyingHand/FlyingHandDialog.vue
@@ -59,7 +59,7 @@
 			ref="formRef"
 			:model="formData"
 			:rules="rules"
-			class="gd-form"
+			class="gd-dialog-form"
 			label-width="160px"
 			v-else
 		>

--
Gitblit v1.9.3