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