From 42b15fc6d2468ebbc392bc2eacc1505dbc259594 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Wed, 29 Oct 2025 13:45:10 +0800
Subject: [PATCH] feat:全选显示

---
 src/api/layer/index.js                             |   28 +++++++++
 src/views/layerManagement/components/rightEdit.vue |   21 +++++--
 src/views/layerManagement/components/leftList.vue  |   36 +++++++-----
 src/views/layerManagement/index.vue                |   60 +++++++++++++------
 4 files changed, 103 insertions(+), 42 deletions(-)

diff --git a/src/api/layer/index.js b/src/api/layer/index.js
index eedead6..8b810cc 100644
--- a/src/api/layer/index.js
+++ b/src/api/layer/index.js
@@ -6,4 +6,30 @@
 		params,
 		
 	})
-  };
\ No newline at end of file
+  };
+//   电子围栏
+//   编辑
+export const deitFenceApi = data => {
+	return request({
+	  url:  `/drone-device-core/layer/api/v1/data`,
+	  method: 'put',
+	  data: data,
+	});
+  };
+
+// 删除
+export const deleteFenceApi = (id) => {
+	return request({
+	  url: `/drone-device-core/layer/api/v1/data?id=${id}`,
+	  method: 'delete',
+	});
+  };
+
+// 新增
+export const attachDownload = (data) => {
+	return request({
+		url: `/drone-device-core/layer/api/v1/data`,
+		method: 'post',
+		data
+	})
+}
\ No newline at end of file
diff --git a/src/views/layerManagement/components/leftList.vue b/src/views/layerManagement/components/leftList.vue
index 0c36462..ba1a79e 100644
--- a/src/views/layerManagement/components/leftList.vue
+++ b/src/views/layerManagement/components/leftList.vue
@@ -43,7 +43,7 @@
                 type="text"
                 @click="handleLocation(node)"
               ></el-button>
-              <el-button icon="el-icon-edit" type="text" @click="handleEdit(node)"></el-button>
+              <el-button icon="el-icon-edit" type="text" @click.stop="handleEdit(node)"></el-button>
               <el-button icon="el-icon-delete" type="text" @click="handleDelete(node)"></el-button>
             </div>
           </div>
@@ -56,7 +56,7 @@
 <script setup>
 import { treeDataApi } from '@/api/layer/index';
 import { inject, onMounted } from 'vue';
-const emit = defineEmits(['update:coverData']);
+const emit = defineEmits(['update:coverData', 'update:deitData']);
 const coverData = ref();
 const layerParams = inject('layerParams');
 const checkedKeys = ref([]); // 存储勾选的节点key
@@ -80,40 +80,45 @@
   try {
     const res = await treeDataApi();
     treeAllData.value = res.data.data;
-    console.log('接口获取数据', treeAllData.value);
+
     setupWatch();
   } catch (error) {
     console.error('获取数据失败:', error);
   }
 };
+
 const setupWatch = () => {
   watch(
     () => props.activeName,
     newVal => {
       const matchedCategory = treeAllData.value.find(item => item.name === newVal);
       treeData.value = matchedCategory.children;
+
+      if (treeData.value && treeData.value.length > 0) {
+        const folderNode = treeData.value[0];
+        // 赋值给 layerParams
+        layerParams.value.total_count = folderNode.total_count ?folderNode.total_count :0;
+        layerParams.value.total_area = folderNode.total_area ? folderNode.total_area :0;     
+      } 
     },
     { immediate: true }
   );
 };
-
 const handleCheck = (checkedNodesData, checkedKeysData) => {
-const filteredNodes = checkedKeysData.checkedNodes.filter(node => node.level === 3);
+  const filteredNodes = checkedKeysData.checkedNodes.filter(node => node.level === 3);
   checkedNodes.value = checkedNodesData.checkedNodes;
- checkedKeys.value = filteredNodes.map(node => node.id);
+  checkedKeys.value = filteredNodes.map(node => node.id);
   coverData.value = filteredNodes;
   emit('update:coverData', coverData.value);
 };
 // 全选方法
 const selectAll = () => {
   if (treeRef.value) {
-  
-    const allFenceKeys = treeData.value.flatMap(folder => 
-      folder.children.map(fence => fence.id) // folder 是 level 2,children 是 level 3
+    const allFenceKeys = treeData.value.flatMap(
+      folder => folder.children.map(fence => fence.id) // folder 是 level 2,children 是 level 3
     );
-    
-    const allFenceNodes = treeData.value.flatMap(folder => folder.children);
 
+    const allFenceNodes = treeData.value.flatMap(folder => folder.children);
     if (checkedKeys.value.length === allFenceKeys.length) {
       // 取消全选:清空 keys 和数据
       treeRef.value.setCheckedKeys([]);
@@ -127,7 +132,6 @@
       checkedNodes.value = allFenceNodes; // 存储 level 3 数据
       coverData.value = allFenceNodes; // 同步 coverData
     }
-
     emit('update:coverData', coverData.value);
   }
 };
@@ -138,8 +142,11 @@
 
 // 编辑按钮事件
 const handleEdit = node => {
-  console.log('编辑操作,节点:', node.data);
-  emit('update:coverData', [node.data]);
+  checkedKeys.value = [];
+  checkedNodes.value = [];
+  coverData.value = [];
+    layerParams.value.editNest = true;
+  emit('update:deitData', node.data);
 };
 
 // 删除按钮事件
@@ -149,7 +156,6 @@
 // 新增围栏
 const addFence = () => {
   layerParams.value.addNest = true;
- 
 };
 // 新增文件夹
 const addFolder = () => {};
diff --git a/src/views/layerManagement/components/rightEdit.vue b/src/views/layerManagement/components/rightEdit.vue
index 828a4e7..c89c623 100644
--- a/src/views/layerManagement/components/rightEdit.vue
+++ b/src/views/layerManagement/components/rightEdit.vue
@@ -18,13 +18,13 @@
       <div class="itemRow">
         <div class="label">围栏名称</div>
         <div>
-          <el-input class="ztzf-input inputName" v-model="formData.name" placeholder="围栏名称" />
+          <el-input class="ztzf-input inputName" v-model="detailData.name" placeholder="围栏名称" />
         </div>
       </div>
       <div class="itemRow">
         <div class="label">围栏备注</div>
         <div>
-          <el-input v-model="formData.description" :rows="5" type="textarea" placeholder="请输入" />
+          <el-input v-model="detailData.description" :rows="5" type="textarea" placeholder="请输入" />
         </div>
       </div>
     </div>
@@ -32,21 +32,21 @@
       <div class="infpItem">
         <div class="itemData">
           <div class="title">围栏总数量</div>
-          <div class="num"><span>26</span>个</div>
+          <div class="num"><span>{{totalCount}}</span>个</div>
         </div>
         <div class="itemData">
           <div class="title">围栏总面积</div>
-          <div class="num"><span>1651561.4</span>m²</div>
+          <div class="num"><span>{{totalArea}}</span>m²</div>
         </div>
       </div>
       <div class="infpItem">
         <div class="itemData">
           <div class="title">创建时间</div>
-          <div class="num"><span>2025年10月22日</span></div>
+          <div class="num"><span>{{detailData.create_time}}</span></div>
         </div>
         <div class="itemData">
           <div class="title">创建人</div>
-          <div class="num"><span>张三</span></div>
+          <div class="num"><span>{{detailData.create_name}}</span></div>
         </div>
       </div>
     </div>
@@ -70,11 +70,20 @@
   control_end_time: '',
   geo_data: '{"type":"LineString","coordinates":[[113.30,23.15],[113.31,23.16],[113.32,23.15]]}',
 });
+const detailData = ref(null)
+detailData.value = layerParams.value.editDetailData
+const totalArea = layerParams.value.total_area
+const totalCount = layerParams.value.total_count
+console.log('layerParams',layerParams
+);
+
 const cancelHandel = () => {
   layerParams.value.addNest = false;
+  layerParams.value.editNest = false;
 };
 const submitHandle = () => {
   layerParams.value.addNest = false;
+  layerParams.value.editNest = false;
 };
 </script>
 
diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index ab59411..f1faebd 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -11,11 +11,12 @@
       <div class="mapContainer">
         <div id="layMap" class="ztzf-cesium"></div>
         <leftList
-          v-if="!layerParams.addNest"
+          v-if="!layerParams.addNest && !layerParams.editNest"
           @update:coverData="handleCoverDataUpdate"
+          @update:deitData="handleEdit"
           :activeName="activeName"
         ></leftList>
-        <rightEdit v-if="layerParams.addNest"></rightEdit>
+        <rightEdit v-if="layerParams.addNest || layerParams.editNest"></rightEdit>
       </div>
     </div>
   </basic-container>
@@ -33,6 +34,8 @@
 import { provide } from 'vue';
 const activeName = ref('电子围栏');
 const activeType = ref('0');
+// 当前面位置信息
+let curPolygonPosition = []
 const tabData = ref([
   {
     name: '电子围栏',
@@ -49,6 +52,10 @@
 ]);
 const layerParams = ref({
   addNest: false,
+  editNest:false,
+  editDetailData:null,
+  total_count:0,
+  total_area:0,
 });
 provide('layerParams', layerParams);
 const handleClick = tab => {
@@ -62,7 +69,6 @@
   try {
     const geoData = JSON.parse(geoDataStr);
     let coordinates = [];
-
 
     if (geoData.type === 'Polygon') {
       // Polygon 坐标格式:[[[lng, lat], ...]] → 取第一个多边形的顶点
@@ -88,10 +94,19 @@
 };
 let tbJwdList = [];
 const selectDataList = ref([]);
-
+// 编辑区域
+const handleEdit = val => {
+  console.log('编辑数据', val);
+  layerParams.value.editDetailData = val
+  drawPolygonExample.editThePatch(true);
+  const positions = parseGeoDataToPositions(val.geo_data, val.altitude);
+  if (positions.length < 3) return; // 少于3个点无法构成多边形
+  drawPolygonExample.initPolygon(viewer, positions, true);
+};
+// 点击显示区域
 const handleCoverDataUpdate = data => {
   selectDataList.value = data;
-  console.log('获取的', selectDataList.value);
+
   if (selectDataList.value.length > 0) {
     loadDataToMap(selectDataList.value);
   } else {
@@ -104,13 +119,12 @@
   // 存储所有有效坐标,用于后续定位
   tbJwdList = [];
   dataList.forEach(item => {
-    
     const positions = parseGeoDataToPositions(item.geo_data, item.altitude);
     if (positions.length < 3) {
       console.warn(`数据 ${item.name} 坐标点不足,无法绘制`);
       return;
     }
-    console.log('positions', positions);
+
     tbJwdList.push(...positions);
     //  转换为 Cesium 所需的 [lng, lat, lng, lat, ...] 扁平数组格式
     let degreesArray = [];
@@ -215,23 +229,29 @@
   // drawPolygonExample.initHandler(viewer);
 };
 
-// 处理绘制完成后的多边形坐标(示例)
+// 编辑/绘制
 const loadPlanarRoute = async (positions = null, save = false) => {
-  if (!positions || positions.length < 3) return;
-  // console.log('绘制的多边形顶点坐标(Cartesian3):', positions);
-  //坐标转换
-  const cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions);
-  const latLngPositions = cartographics.map(cartographic => ({
-    lng: Cesium.Math.toDegrees(cartographic.longitude),
-    lat: Cesium.Math.toDegrees(cartographic.latitude),
-    height: cartographic.height || 0,
-  }));
-  // console.log('转换后的经纬度坐标:', latLngPositions);
+  if (positions){
+    curPolygonPosition = positions.map(item => {
+			let cartographic = Cesium.Cartographic.fromCartesian(item)
+			let lng = Cesium.Math.toDegrees(cartographic.longitude) // 经度
+			let lat = Cesium.Math.toDegrees(cartographic.latitude) // 纬度
+			let height = Cesium.Math.toDegrees(cartographic.height) //高度
+			return {
+				lng: _.round(lng, 6),
+				lat: _.round(lat, 6),
+				height: _.round(height, 6),
+			}
+		})
+  }
+  let polygon = curPolygonPosition.map(item => [item?.lng, item?.lat])
+	polygon.push([curPolygonPosition[0]?.lng, curPolygonPosition[0]?.lat])
+  console.log('绘制的多边形顶点坐标(Cartesian3):', polygon);
+  
+  console.log('转换后的经纬度坐标:', curPolygonPosition);
 };
-
 const throttleLoadPlanarRoute = throttle(loadPlanarRoute, 200);
 drawPolygonExample.subscribe('getPolygonPositions', data => {
-  console.log('绘制的数据', data);
   throttleLoadPlanarRoute(data);
 });
 

--
Gitblit v1.9.3