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