From ea73b6fb3ad0b34e4d856321afecae5ada1091fe Mon Sep 17 00:00:00 2001
From: rain <167982779@qq.com>
Date: Wed, 14 Aug 2024 16:24:44 +0800
Subject: [PATCH] 任务下发、更新、取消,优化图斑逻辑

---
 src/main/java/com/dji/sample/droneairport/model/dto/Airport.java      |   15 +++++
 src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java  |   19 ++++--
 src/main/java/com/dji/sample/droneairport/model/dto/AirportTasks.java |   15 +++++
 src/main/java/com/dji/sample/droneairport/utils/TaskAllocator.java    |   99 +++++++++++++++++++++++++++++++++
 4 files changed, 141 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/dji/sample/droneairport/model/dto/Airport.java b/src/main/java/com/dji/sample/droneairport/model/dto/Airport.java
new file mode 100644
index 0000000..9c49b6d
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/model/dto/Airport.java
@@ -0,0 +1,15 @@
+package com.dji.sample.droneairport.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Airport {
+    public String workspaceId;
+    private String dockSn;
+    private double lat;
+    private double lon;
+}
diff --git a/src/main/java/com/dji/sample/droneairport/model/dto/AirportTasks.java b/src/main/java/com/dji/sample/droneairport/model/dto/AirportTasks.java
new file mode 100644
index 0000000..ff3647b
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/model/dto/AirportTasks.java
@@ -0,0 +1,15 @@
+package com.dji.sample.droneairport.model.dto;
+
+import com.dji.sample.patches.model.entity.LotInfo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AirportTasks {
+    private Airport airport;
+    private List<LotInfo> tasks;
+}
diff --git a/src/main/java/com/dji/sample/droneairport/utils/TaskAllocator.java b/src/main/java/com/dji/sample/droneairport/utils/TaskAllocator.java
new file mode 100644
index 0000000..b3386d9
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/utils/TaskAllocator.java
@@ -0,0 +1,99 @@
+package com.dji.sample.droneairport.utils;
+
+import com.dji.sample.droneairport.model.dto.Airport;
+import com.dji.sample.droneairport.model.dto.AirportTasks;
+import com.dji.sample.patches.model.entity.LotInfo;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.io.WKTReader;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TaskAllocator {
+
+    private static final GeometryFactory geometryFactory = new GeometryFactory();
+
+    // 计算机场到多边形的最短距离
+    public static double calculateDistanceToPolygon(double airportLat, double airportLon, Geometry polygon) {
+        Coordinate airportCoord = new Coordinate(airportLon, airportLat);
+        return polygon.distance(geometryFactory.createPoint(airportCoord));
+    }
+
+    // 为每个图斑面分配任务
+    public static List<AirportTasks> assignTasks(List<Airport> airports, List<LotInfo> lotInfos) throws Exception {
+        // 创建集合用于存储每个机场的任务
+        List<AirportTasks> airportTasksList = new ArrayList<>();
+        for (Airport airport : airports) {
+            airportTasksList.add(new AirportTasks(airport, new ArrayList<>()));
+        }
+
+        WKTReader reader = new WKTReader(geometryFactory);
+
+        // 存储每个图斑面分配的机场信息
+        List<String> polygonAssignments = new ArrayList<>();
+
+        for (LotInfo lotInfo : lotInfos) {
+            String polygonWKT = lotInfo.getDkfw();
+            if (polygonWKT == null || polygonWKT.trim().isEmpty()) {
+                polygonAssignments.add("Polygon data is missing for LotInfo ID: " + lotInfo.getId());
+                continue;
+            }
+
+            Geometry polygon = reader.read(polygonWKT);
+            double minDistance = Double.MAX_VALUE;
+            int closestAirportIndex = -1;
+
+            for (int i = 0; i < airports.size(); i++) {
+                Airport airport = airports.get(i);
+                double distanceToAirport = calculateDistanceToPolygon(airport.getLat(), airport.getLon(), polygon);
+
+                if (distanceToAirport < minDistance) {
+                    minDistance = distanceToAirport;
+                    closestAirportIndex = i;
+                }
+            }
+
+            if (closestAirportIndex != -1) {
+                AirportTasks airportTasks = airportTasksList.get(closestAirportIndex);
+                airportTasks.getTasks().add(lotInfo);
+                Airport closestAirport = airports.get(closestAirportIndex);
+                polygonAssignments.add("Polygon: " + polygonWKT + " assigned to Airport at (" + closestAirport.getLat() + ", " + closestAirport.getLon() + ")");
+            } else {
+                polygonAssignments.add("Polygon: " + polygonWKT + " has no available airport");
+            }
+        }
+        return airportTasksList;
+    }
+    public static void main(String[] args) {
+        // 创建测试数据
+        List<Airport> airports = new ArrayList<>();
+        airports.add(new Airport("4a574db8-4ad3-48f7-9f16-3edbcd8056e1","",28.62452712442823, 115.85666327144976)); // 机场1
+        airports.add(new Airport("8520933f-31cd-4681-a262-57fe4d79b8b6","",28.630851, 115.856088)); // 机场2
+        airports.add(new Airport("607e0666-d748-4504-a459-09774286dc8b","",28.623514, 115.865406)); // 机场3
+        airports.add(new Airport("e3dea0f5-37f2-4d79-ae58-490af3228069","",25.8917271933111, 116.02094292569765)); // 机场4
+
+        List<LotInfo> lotInfos = new ArrayList<>();
+        lotInfos.add(new LotInfo(1, "", "bsm1", "dklx1", "xzqdm1", "xmc1", "dkbh1", "dkmc1", 10.0, "sfbhzdk1", 28.63450370457647, 115.84499139166738, "bz1", "kzxx1", "MULTIPOLYGON(((115.84499139166738 28.63450370457647,115.84416828981072 28.634958404355842,115.84485338292909 28.63573150645547,115.84571474781323 28.63530320347431,115.84499139166738 28.63450370457647)))", "sjlx1", 1, "taskName1", "taskId1", 1, 1, 0, "userName1", System.currentTimeMillis(), System.currentTimeMillis()));
+        lotInfos.add(new LotInfo(2, "", "bsm2", "dklx2", "xzqdm2", "xmc2", "dkbh2", "dkmc2", 20.0, "sfbhzdk2", 28.63698795307923, 115.85921771312906, "bz2", "kzxx2", "MULTIPOLYGON(((115.85921771312906 28.63698795307923,115.85833969201798 28.635860088562403,115.85719041235207 28.63655251171517,115.8580684334633 28.637666099465918,115.85921771312906 28.63698795307923)))", "sjlx2", 0, "taskName2", "taskId2", 0, 1, 0, "userName2", System.currentTimeMillis(), System.currentTimeMillis()));
+        // 添加更多 LotInfo 实例
+
+        try {
+            // 调用 assignTasks 方法
+            List<AirportTasks> result = TaskAllocator.assignTasks(airports, lotInfos);
+
+            // 打印结果
+            for (AirportTasks airportTasks : result) {
+                Airport airport = airportTasks.getAirport();
+                System.out.println("任务分配给机场 (" + airport.getLat() + ", " + airport.getLon() + "):");
+                for (LotInfo lotInfo : airportTasks.getTasks()) {
+                    System.out.println("LotInfo ID: " + lotInfo.getId() + ", dkfw: " + lotInfo.getDkfw());
+                }
+                System.out.println();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
index c406384..68f1197 100644
--- a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
+++ b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
@@ -715,6 +715,10 @@
 
         // 如果所有 fileName 都包含 '~' 或者都不包含 '~',将 is_add 字段改为 1
         if (allContainTilde || noneContainTilde) {
+            mediaFiles.forEach(file -> {
+                file.setIsadd(1);
+                updateMediaById(file.getId(), file);
+            });
             return;
         }
 
@@ -1081,7 +1085,7 @@
     }
 
     public void updateById(Integer id, MediaFileNailEntity entity) {
-        entity.setIsadd(1);
+//        entity.setIsadd(1);
         UpdateWrapper<MediaFileNailEntity> updateWrapper = new UpdateWrapper<>();
         updateWrapper.eq("id", id);
         nailMapper.update(entity, updateWrapper);
@@ -1095,18 +1099,19 @@
 
 
     public void updateMediaById(Integer id, MediaFileEntity entity) {
+        entity.setIsadd(1);
         UpdateWrapper<MediaFileEntity> updateWrapper = new UpdateWrapper<>();
         updateWrapper.eq("id", id);
         mapper.update(entity, updateWrapper);
     }
 
     public void getNoaddFile() {
-        List<MediaFileNailEntity> markEntities = nailMapper.selectList(
-                new LambdaQueryWrapper<MediaFileNailEntity>().eq(MediaFileNailEntity::getIsadd, 0));
-        for (MediaFileNailEntity mark : markEntities) {
-            updateNailMediaFileNames(mark.getJobId());
-            updateMediaFileNames(mark.getJobId());
-            updateMediaZipFileNames(mark.getJobId());
+        List<MediaFileEntity> mediaEntities = mapper.selectList(
+                new LambdaQueryWrapper<MediaFileEntity>().eq(MediaFileEntity::getIsadd, 0));
+        for (MediaFileEntity media : mediaEntities) {
+//            updateNailMediaFileNames(media.getJobId());
+            updateMediaFileNames(media.getJobId());
+//            updateMediaZipFileNames(media.getJobId());
         }
     }
 

--
Gitblit v1.9.3