package top.haijunit.train.service; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import top.haijunit.common.utils.StreamUtils; import top.haijunit.train.domain.constant.DirectionEnum; import top.haijunit.train.domain.entity.RouteEntity; import top.haijunit.train.domain.entity.SelectionEntity; import top.haijunit.train.domain.repository.RouteRepository; import top.haijunit.train.domain.repository.SelectionRepository; import top.haijunit.train.simulation.TrainItem; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Function; /** * @author zhanghaijun * @date 2023/11/29 06:54 * @description [一句话描述该类的功能] */ @Slf4j @Service @RequiredArgsConstructor public class RouteService { private final RouteRepository routeRepository; private final SelectionRepository selectionRepository; public RouteEntity getNextRoute(RouteEntity route) { return routeRepository.findById(route.getNextId()).orElse(null); } public RouteEntity getNextRoute(Long id) { List routeList = routeRepository.findAll(); for (int i = 0; i < routeList.size(); i++) { if (routeList.get(i).getId().equals(id)) { if (i == routeList.size() - 1) { return routeList.get(0); } else { return routeList.get(i + 1); } } } return null; } public RouteEntity getCurrentRoute(TrainItem train) { Map selectionMap = StreamUtils.toMap(selectionRepository.findAll(), SelectionEntity::getId, Function.identity()); for (RouteEntity route : routeRepository.findAll()) { ArrayList list = route.getSelectionList(); SelectionEntity start = selectionMap.get(list.get(0)); SelectionEntity end = selectionMap.get(list.get(list.size() - 1)); if (null == start || null == end) { continue; } if (train.getDirection() == DirectionEnum.UP && start.getStartKilometer().compareTo(train.getKilometer()) <= 0 && end.getStartKilometer().add(end.getSelectionLength()).compareTo(train.getKilometer()) > 0) { return route; } if (train.getDirection() == DirectionEnum.DOWN && start.getStartKilometer().compareTo(train.getKilometer()) >= 0 && end.getStartKilometer().add(end.getSelectionLength()).compareTo(train.getKilometer()) < 0) { return route; } } return null; } }