|
|
@@ -5,13 +5,12 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import top.haijunit.train.domain.constant.RouteStatusEnum;
|
|
|
import top.haijunit.train.domain.constant.SignalStateEnum;
|
|
|
-import top.haijunit.train.domain.constant.SwitchStateEnum;
|
|
|
import top.haijunit.train.domain.entity.RouteEntity;
|
|
|
-import top.haijunit.train.domain.repository.RouteRepository;
|
|
|
+import top.haijunit.train.service.RouteService;
|
|
|
+import top.haijunit.train.service.SwitchService;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.Collection;
|
|
|
-import java.util.List;
|
|
|
+import java.util.LinkedList;
|
|
|
|
|
|
/**
|
|
|
* @author zhanghaijun
|
|
|
@@ -23,56 +22,49 @@ import java.util.List;
|
|
|
@RequiredArgsConstructor
|
|
|
public class TrainComputerService {
|
|
|
|
|
|
- private final RouteRepository routeRepository;
|
|
|
+ private final SwitchService switchService;
|
|
|
+ private final RouteService routeService;
|
|
|
|
|
|
- public void routeCompute() {
|
|
|
- Collection<TrainItem> trainItems = TrainSimulationHolder.getTrainItem();
|
|
|
- List<RouteEntity> routeList = routeRepository.findAll();
|
|
|
- // 1、数据库初始化,所以进路状态都是空闲状态
|
|
|
- // 2、遍历所有车辆,车辆是否占用此进路,占用则改变状态为占用
|
|
|
- // 3、遍历所有车辆,判断是否在MA范围内,标识状态为锁定
|
|
|
- // 4、遍历所有车辆,判断是否需要触发进路,触发则改变状态为锁定
|
|
|
- for (RouteEntity route : routeList) {
|
|
|
- for (TrainItem train : trainItems) {
|
|
|
- // TODO 假设向前走100米
|
|
|
- BigDecimal nextPrePosition = train.getKilometer().add(new BigDecimal(100));
|
|
|
- if (!route.isTrigger(train.getKilometer(), nextPrePosition)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- // a)检查进路当前是否为出清/空闲状态,否则返回触发失败;
|
|
|
- if (!route.getRouteStatus().equals(RouteStatusEnum.IDLE)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (!route.getSwitchList().isEmpty()) {
|
|
|
- // b)检查进路中道岔状态是否与进路要求的状态一致
|
|
|
- if (!route.getSwitchStateList().stream().allMatch(switchState -> switchState.equals(SwitchStateEnum.REVERSE))) {
|
|
|
- // 切换道岔状态
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- // c)出清(如果包括道岔,道岔已就位),将进路至于锁闭状态
|
|
|
- RouteEntity nextRoute = nextRoute(route.getId());
|
|
|
- if (null == nextRoute) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- nextRoute.setRouteStatus(RouteStatusEnum.LOCK);
|
|
|
- // d)将进路的信号状态置为红色
|
|
|
- nextRoute.setSignalState(String.valueOf(SignalStateEnum.RED_YELLOW.getCode()));
|
|
|
- }
|
|
|
+ public void routeCompute(TrainItem train) {
|
|
|
+ LinkedList<RouteEntity> routeList = TrainSimulationHolder.getRouteList(train.getId());
|
|
|
+ // 1、是否触发进路计算
|
|
|
+ // 2、寻找下一跳进路
|
|
|
+ // 3、下一条进路是否为空闲
|
|
|
+ // 4、下一条进路是否包括道岔,道岔状态是否正确
|
|
|
+ // 5、将下一条进路状态置为锁定状态
|
|
|
+ // 6、释放车尾已过的进路
|
|
|
+ // TODO 假设向前走100米
|
|
|
+ BigDecimal nextPrePosition = train.getKilometer().add(new BigDecimal(100));
|
|
|
+ RouteEntity routeTrigger = routeService.isTrigger(train.getKilometer(), nextPrePosition);
|
|
|
+ if (null == routeTrigger) {
|
|
|
+ // 没有触发进路
|
|
|
+ return;
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- private RouteEntity nextRoute(Long id) {
|
|
|
- List<RouteEntity> 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);
|
|
|
- }
|
|
|
+ // 找到下一个进路
|
|
|
+ RouteEntity nextRoute = routeService.getNextRoute(routeTrigger.getId());
|
|
|
+ if (null == nextRoute) {
|
|
|
+ // 没有找到下一个进路
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // a)检查进路当前是否为出清/空闲状态,否则返回触发失败;
|
|
|
+ if (!TrainSimulationHolder.isRouteIdle(nextRoute.getId())) {
|
|
|
+ // 下一跳进路为非出清状态
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!routeTrigger.getSwitchList().isEmpty()) {
|
|
|
+ // b)检查进路中道岔状态是否与进路要求的状态一致
|
|
|
+ boolean changed = switchService.changeSwitchState(routeTrigger.getSwitchMap());
|
|
|
+ if (changed) {
|
|
|
+ // TODo 切换道岔需要时间
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
- return null;
|
|
|
+ // c)出清(如果包括道岔,道岔已就位),将进路至于锁闭状态
|
|
|
+ nextRoute.setRouteStatus(RouteStatusEnum.LOCK);
|
|
|
+ // d)将进路的信号状态置为红色
|
|
|
+ nextRoute.setSignalState(String.valueOf(SignalStateEnum.RED_YELLOW.getCode()));
|
|
|
+ routeList.addLast(nextRoute);
|
|
|
+ // TODO 释放车尾已过的进路
|
|
|
+
|
|
|
}
|
|
|
}
|