From 98bef7b292914db7be5d6cc291599a3462c23eed Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Thu, 29 Jan 2026 18:19:00 +0800
Subject: [PATCH] feat:区域绘制处理调整

---
 applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue |   62 +++++++++++++++++-------------
 1 files changed, 35 insertions(+), 27 deletions(-)

diff --git a/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue b/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
index 30dc05c..c079e8e 100644
--- a/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
+++ b/applications/drone-command/src/views/areaManage/partition/FormDiaLog.vue
@@ -14,7 +14,8 @@
 					<div class="panel-body">
 						<span class="panel-label">区域类型</span>
 						<el-select class="command-select" popper-class="command-select-popper" v-model="activeAreaType"
-							placeholder="请选择" @change="handleAreaTypeChange">
+							placeholder="请选择" :disabled="currentShapeType === 'buffer'" collapse-tags :multiple="currentShapeType === 'buffer'"
+							@change="handleAreaTypeChange">
 							<el-option v-for="item in dictObj.areaType" :key="item.dictKey" :label="item.dictValue"
 								:value="item.dictKey" />
 						</el-select>
@@ -93,9 +94,9 @@
 					<div class="command-table-container">
 						<div class="command-table-content">
 							<el-table class="command-table" :data="shapeList" row-key="id">
-								<el-table-column prop="areaType" label="类型">
+								<el-table-column prop="areaType" label="区域类型">
 									<template v-slot="{ row }">
-										{{ getDictLabel(row.areaType, dictObj.areaType) }}
+										{{ resolveShapeAreaTypeLabel(row) }}
 									</template>
 								</el-table-column>
 								<el-table-column prop="drawType" label="绘制类型">
@@ -164,9 +165,9 @@
 					<div class="shape-table-container">
 						<div class="shape-table-title">绘制区域列表</div>
 						<el-table class="command-table" :data="shapeList" row-key="id" height="auto">
-							<el-table-column prop="areaType" label="类型">
+							<el-table-column prop="areaType" label="区域类型">
 								<template v-slot="{ row }">
-									{{ getDictLabel(row.areaType, dictObj.areaType) }}
+									{{ resolveShapeAreaTypeLabel(row) }}
 								</template>
 							</el-table-column>
 							<el-table-column prop="drawType" label="绘制类型">
@@ -283,6 +284,7 @@
 	ellipse: '椭圆',
 	buffer: '缓冲圆',
 }
+const bufferAreaTypeValue = '1,2,3'
 const showTypePanel = ref(false)
 const suppressTypePanelOnce = ref(false)
 const areaTypeStyleMap = {
@@ -767,6 +769,9 @@
 			activeAreaType.value = detectAreaType
 		}
 	}
+	if (currentShapeType.value === 'buffer') {
+		activeAreaType.value = bufferAreaTypeValue.split(',')
+	}
 	if (!suppressTypePanelOnce.value) {
 		showTypePanelAtCurrent()
 	}
@@ -807,7 +812,7 @@
 	}
 	const shapePayload = {
 		id: activeShapeId.value,
-		areaType: activeAreaType.value,
+		areaType: currentShapeType.value === 'buffer' ? bufferAreaTypeValue : activeAreaType.value,
 		drawType: currentShapeType.value,
 		points: ['ellipse', 'buffer'].includes(currentShapeType.value) && controlPoints.length
 			? controlPoints
@@ -834,6 +839,13 @@
 	return Array.isArray(dictObj?.value?.areaType)
 		? dictObj.value.areaType
 		: dictObj?.areaType
+}
+
+function resolveShapeAreaTypeLabel (shape) {
+	if (shape?.drawType === 'buffer') {
+		return '侦测区/报警区/重点管制区'
+	}
+	return getDictLabel(shape?.areaType, resolveAreaTypeOptions())
 }
 
 function parseGeomJson (geomJson) {
@@ -864,10 +876,13 @@
 	shapeList.value = extList.map((item, index) => {
 		const isShapePayload = item?.drawType || item?.points
 		if (isShapePayload) {
+			const areaType = item?.drawType === 'buffer'
+				? bufferAreaTypeValue
+				: (item?.areaType ?? '')
 			return {
 				id: item?.id || `shape_${Date.now()}_${index}_${Math.random().toString(16).slice(2, 6)}`,
 				extId: item?.extId ?? item?.id,
-				areaType: item?.areaType ?? '',
+				areaType,
 				drawType: item?.drawType ?? 'polygon',
 				points: Array.isArray(item?.points) ? item.points : [],
 				displayPoints: Array.isArray(item?.displayPoints) ? item.displayPoints : null,
@@ -876,7 +891,9 @@
 		}
 		const parsed = parseGeomJson(item?.geomJson) || {}
 		const drawType = parsed?.drawType || 'polygon'
-		const areaType = item?.areaTypeKey ?? parsed?.areaType ?? ''
+		const areaType = drawType === 'buffer'
+			? bufferAreaTypeValue
+			: (item?.areaTypeKey ?? parsed?.areaType ?? '')
 		const points = Array.isArray(parsed?.points) ? parsed.points : []
 		const displayPoints = Array.isArray(parsed?.displayPoints) ? parsed.displayPoints : null
 		const meta = parsed?.meta ?? null
@@ -890,7 +907,9 @@
 			meta,
 		}
 	})
-	activeAreaType.value = shapeList.value[0]?.areaType ?? ''
+	activeAreaType.value = shapeList.value[0]?.drawType === 'buffer'
+		? bufferAreaTypeValue.split(',')
+		: (shapeList.value[0]?.areaType ?? '')
 	currentShapeType.value = shapeList.value[0]?.drawType ?? 'polygon'
 }
 
@@ -924,9 +943,8 @@
 }
 
 function updateActiveShapeAreaType (value) {
-	if (currentShapeType.value !== 'buffer') {
-		activeTool?.setStyle?.(getAreaTypeStyle(value))
-	}
+	if (currentShapeType.value === 'buffer') return
+	activeTool?.setStyle?.(getAreaTypeStyle(value))
 	if (!activeShapeId.value) return
 	const targetIndex = shapeList.value.findIndex(item => item.id === activeShapeId.value)
 	if (targetIndex === -1) return
@@ -972,21 +990,11 @@
 	viewEntity = null
 	hideTypePanel()
 	renderShapeList()
-	if (dialogMode.value === 'edit' && pointList.length >= 3) {
-		const editPoints = _.cloneDeep(pointList)
-		if (editPoints.length > 1) {
-			const first = editPoints[0]
-			const last = editPoints[editPoints.length - 1]
-			if (first.longitude === last.longitude && first.latitude === last.latitude) {
-				editPoints.pop()
-			}
-		}
-		activeShapeId.value = activeShapeId.value || (shapeList.value[0]?.id ?? null)
-		startEdit(type, editPoints)
-		return
-	}
+	pointList = []
 	const defaultAreaType = getDetectAreaTypeKey()
-	if (defaultAreaType) {
+	if (type === 'buffer') {
+		activeAreaType.value = bufferAreaTypeValue
+	} else if (defaultAreaType) {
 		activeAreaType.value = defaultAreaType
 	}
 	activeShapeId.value = null
@@ -1011,7 +1019,7 @@
 	if (activeToolMode.value === 'edit' && activeShapeId.value === row.id) return
 	activeShapeId.value = row.id
 	currentShapeType.value = row.drawType
-	activeAreaType.value = row.areaType
+	activeAreaType.value = row.drawType === 'buffer' ? bufferAreaTypeValue.split(',') : row.areaType
 	const displayPoints = getShapeDisplayPoints(row)
 	pointList = _.cloneDeep(displayPoints)
 	clearActiveTool()

--
Gitblit v1.9.3