#
luxiaotao1123
2024-10-24 768add6260e686fee5b21dd0e4260d9f289db21f
#
2个文件已修改
2个文件已添加
142 ■■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/Lane.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/RouteService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/RouteServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java
New file
@@ -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);
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/Lane.java
New file
@@ -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;
    }
}
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);
}
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());
    }
}