From 768add6260e686fee5b21dd0e4260d9f289db21f Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期四, 24 十月 2024 15:28:30 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/RouteService.java          |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java         |   93 +++++++++++++++++++++++++++++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/RouteServiceImpl.java |   22 +++++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/Lane.java                      |   25 ++++++++
 4 files changed, 142 insertions(+), 0 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java
new file mode 100644
index 0000000..3e2db2d
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java
@@ -0,0 +1,93 @@
+package com.zy.acs.manager.core;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.utils.GsonUtils;
+import com.zy.acs.framework.common.R;
+import com.zy.acs.framework.common.SnowflakeIdWorker;
+import com.zy.acs.manager.core.domain.Lane;
+import com.zy.acs.manager.manager.entity.Code;
+import com.zy.acs.manager.manager.entity.Route;
+import com.zy.acs.manager.manager.service.CodeService;
+import com.zy.acs.manager.manager.service.RouteService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Created by vincent on 10/24/2024
+ */
+@RestController
+@RequestMapping("/test")
+public class DispatcherTestController {
+
+    @Autowired
+    private CodeService codeService;
+    @Autowired
+    private RouteService routeService;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
+
+    @GetMapping("/dfs")
+    public R dfs() {
+        List<Lane> lanes = new ArrayList<>();
+        List<Code> codeList = codeService.list(new LambdaQueryWrapper<Code>().eq(Code::getStatus, 1));
+        Map<String, List<String>> adjacencyCodeMap = new HashMap<>();
+        for (Code code : codeList) {
+            List<Long> adjacencyNode = routeService.getAdjacencyNode(code.getId());
+            adjacencyCodeMap.put(code.getData(), adjacencyNode.stream().map(node -> {
+                return codeService.getById(node).getData();
+            }).collect(Collectors.toList()));
+        }
+        Set<String> visited = new HashSet<>();
+
+        for (String codeData : codeList.stream().map(Code::getData).collect(Collectors.toList())) {
+            if (!visited.contains(codeData)) {
+                Lane lane = new Lane(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
+                dfsCalc(codeData, null, lane, visited, adjacencyCodeMap);
+                lanes.add(lane);
+            }
+        }
+        System.out.println(GsonUtils.toJson(lanes));
+        return R.ok().add(lanes);
+    }
+
+
+    private void dfsCalc(String code, String parent, Lane lane, Set<String> visited, Map<String, List<String>> adjacencyCodeMap) {
+        visited.add(code);
+        lane.getCodes().add(code);
+
+        List<String> neighbors = adjacencyCodeMap.get(code);
+        if (neighbors == null || neighbors.isEmpty()) {
+            return;
+        }
+
+        for (String neighbor : neighbors) {
+            if (parent != null && neighbor.equals(parent)) {
+                continue;
+            }
+            if (!visited.contains(neighbor) && isSameDirection(code, neighbor, parent)) {
+                dfsCalc(neighbor, code, lane, visited, adjacencyCodeMap);
+            }
+        }
+    }
+
+    public boolean isSameDirection(String code, String neighbor, String parent) {
+        if (parent == null) {
+            return true;
+        }
+        double direction1 = calculateDirection(codeService.selectByData(parent) , codeService.selectByData(code));
+        double direction2 = calculateDirection(codeService.selectByData(code), codeService.selectByData(neighbor));
+        return direction1 == direction2;
+    }
+
+    public double calculateDirection(Code from, Code to) {
+        double deltaX = to.getX() - from.getX();
+        double deltaY = to.getY() - from.getY();
+        return Math.atan2(deltaY, deltaX);
+    }
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/Lane.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/Lane.java
new file mode 100644
index 0000000..1f40536
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/Lane.java
@@ -0,0 +1,25 @@
+package com.zy.acs.manager.core.domain;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by vincent on 10/24/2024
+ */
+@Data
+public class Lane {
+
+    private String laneId;
+
+    private List<String> codes = new ArrayList<>();
+
+    public Lane() {
+    }
+
+    public Lane(String laneId) {
+        this.laneId = laneId;
+    }
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/RouteService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/RouteService.java
index 886ca06..0438403 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/RouteService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/RouteService.java
@@ -16,4 +16,6 @@
 
     Route findByCodeOfBoth(Long startCode, Long endCode);
 
+    List<Long> getAdjacencyNode(Long codeId);
+
 }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/RouteServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/RouteServiceImpl.java
index 048ff7a..009aba4 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/RouteServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/RouteServiceImpl.java
@@ -13,6 +13,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service("routeService")
 public class RouteServiceImpl extends ServiceImpl<RouteMapper, Route> implements RouteService {
@@ -74,4 +75,25 @@
         return route;
     }
 
+    @Override
+    public List<Long> getAdjacencyNode(Long codeId) {
+
+        List<Long> result = new ArrayList<>();
+
+        result.addAll(this.list(new LambdaQueryWrapper<Route>()
+                .eq(Route::getStartCode, codeId)
+                .in(Route::getDirection, 0, 1)
+                .eq(Route::getStatus, 1)
+        ).stream().map(Route::getEndCode).distinct().collect(Collectors.toList()));
+
+        result.addAll(this.list(new LambdaQueryWrapper<Route>()
+                .eq(Route::getEndCode, codeId)
+                .in(Route::getDirection, 0, 2)
+                .eq(Route::getStatus, 1)
+        ).stream().map(Route::getStartCode).distinct().collect(Collectors.toList()));
+
+
+        return result.stream().distinct().collect(Collectors.toList());
+    }
+
 }

--
Gitblit v1.9.1