车辆段逻辑

This commit is contained in:
Jade 2021-12-07 15:50:10 +08:00
parent cae20aba53
commit 645bfee559

View File

@ -37,7 +37,9 @@ public class DepotService {
private Map<Section, Queue<SchedulingTrainPlan>> stationListMap = new HashMap<>(); private Map<Section, Queue<SchedulingTrainPlan>> stationListMap = new HashMap<>();
private List<SchedulingTrainPlan> schedulingTrainPlanList = new LinkedList<>(); private List<SchedulingTrainPlan> outboundPlanList = new LinkedList<>();
private List<SchedulingTrainPlan> inboundPlanList = new LinkedList<>();
public void loadDepotTrain(Simulation simulation) { public void loadDepotTrain(Simulation simulation) {
if (!simulation.getRepository().getConfig().isHandleDepot()) { if (!simulation.getRepository().getConfig().isHandleDepot()) {
@ -65,11 +67,12 @@ public class DepotService {
} }
}); });
stationListMap.clear(); stationListMap.clear();
schedulingTrainPlanList.clear(); outboundPlanList.clear();
simulation.getRepository().getSchedulingTrainPlanList().stream(). simulation.getRepository().getSchedulingTrainPlanList().stream().
sorted(Comparator.comparing(schedulingTrainPlan -> schedulingTrainPlan.getOutDepotTrip().getStartTime().toSecondOfDay())) sorted(Comparator.comparing(schedulingTrainPlan -> schedulingTrainPlan.getOutDepotTrip().getStartTime().toSecondOfDay()))
.forEach(schedulingTrainPlan -> { .forEach(schedulingTrainPlan -> {
Queue<SchedulingTrainPlan> queue = stationListMap.computeIfAbsent(schedulingTrainPlan.getOutDepotTrip().getStartSection(), key -> new LinkedList<>()); Queue<SchedulingTrainPlan> queue = stationListMap
.computeIfAbsent(schedulingTrainPlan.getOutDepotTrip().getStartSection(), key -> new LinkedList<>());
queue.add(schedulingTrainPlan); queue.add(schedulingTrainPlan);
}); });
} }
@ -88,6 +91,7 @@ public class DepotService {
timeToDeparture(simulation); timeToDeparture(simulation);
settingRouteAndMoving(simulation); settingRouteAndMoving(simulation);
arriveTransferTrack(simulation); arriveTransferTrack(simulation);
backToParking(simulation);
} }
} }
@ -100,8 +104,10 @@ public class DepotService {
stationListMap.forEach((section, list) -> { stationListMap.forEach((section, list) -> {
SchedulingTrainPlan schedulingTrainPlan = list.peek(); SchedulingTrainPlan schedulingTrainPlan = list.peek();
if (schedulingTrainPlan.getOutDepotTrip().getStartTime().minusMinutes(20).isBefore(systemTime.toLocalTime())) { if (schedulingTrainPlan.getOutDepotTrip().getStartTime().minusMinutes(20).isBefore(systemTime.toLocalTime())) {
schedulingTrainPlanList.add(list.poll()); if (!outboundPlanList.contains(schedulingTrainPlan)) {
list.add(schedulingTrainPlan); outboundPlanList.add(schedulingTrainPlan);
list.add(list.poll());
}
} }
}); });
} }
@ -111,25 +117,11 @@ public class DepotService {
* @param simulation * @param simulation
*/ */
private void settingRouteAndMoving(Simulation simulation) { private void settingRouteAndMoving(Simulation simulation) {
for (SchedulingTrainPlan schedulingTrainPlan : schedulingTrainPlanList) { for (SchedulingTrainPlan schedulingTrainPlan : outboundPlanList) {
String groupNumber = schedulingTrainPlan.getGroupNumber(); moving(simulation, schedulingTrainPlan.getGroupNumber(), schedulingTrainPlan.getOutDepotTrip().getStartSection());
VirtualRealityTrain train = simulation.getRepository().getVRByCode(groupNumber, VirtualRealityTrain.class); }
List<RoutePath> routePaths = simulation.getRepository().queryRoutePathsByStart(train.getHeadPosition().getSection()); for (SchedulingTrainPlan schedulingTrainPlan : inboundPlanList) {
if (routePaths.isEmpty()) { moving(simulation, schedulingTrainPlan.getGroupNumber(), schedulingTrainPlan.getInDepotTrip().getEndSection());
continue;
}
RoutePath routePath = routePaths.get(0);
for (Route route : routePath.getRouteList()) {
if (route.isSetting()) {
continue;
}
if (route.isLock()) {
continue;
}
ciRouteService.setRoute(simulation, route);
}
Section lastSection = routePath.getLastSection();
train.setRobotTargetPosition(new SectionPosition(lastSection, lastSection.getStopPointByDirection(routePath.isRight())));
} }
} }
@ -138,14 +130,75 @@ public class DepotService {
* @param simulation * @param simulation
*/ */
private void arriveTransferTrack(Simulation simulation) { private void arriveTransferTrack(Simulation simulation) {
for (SchedulingTrainPlan schedulingTrainPlan : schedulingTrainPlanList) { for (SchedulingTrainPlan schedulingTrainPlan : outboundPlanList) {
String groupNumber = schedulingTrainPlan.getGroupNumber(); String groupNumber = schedulingTrainPlan.getGroupNumber();
VirtualRealityTrain train = simulation.getRepository().getVRByCode(groupNumber, VirtualRealityTrain.class); VirtualRealityTrain train = simulation.getRepository().getVRByCode(groupNumber, VirtualRealityTrain.class);
List<RoutePath> routePaths = simulation.getRepository().queryRoutePathsByStart(train.getHeadPosition().getSection()); if (train.isParkingAt()
if (train.isParkingAt() && train.getHeadPosition().getSection().equals(routePaths.get(0).getLastSection())) { && train.getHeadPosition().getSection().equals(schedulingTrainPlan.getOutDepotTrip().getStartSection())) {
// 到达 // 到达
schedulingTrainPlanList.remove(schedulingTrainPlan); outboundPlanList.remove(schedulingTrainPlan);
train.setServiceNumber(schedulingTrainPlan.getOutDepotTrip().getServiceNumber());
train.setTripNumber(schedulingTrainPlan.getOutDepotTrip().getTripNumber());
train.setCommunication(true);
}
}
for (SchedulingTrainPlan schedulingTrainPlan : inboundPlanList) {
String groupNumber = schedulingTrainPlan.getGroupNumber();
VirtualRealityTrain train = simulation.getRepository().getVRByCode(groupNumber, VirtualRealityTrain.class);
if (train.isParkingAt()
&& train.getHeadPosition().getSection().equals(schedulingTrainPlan.getInDepotTrip().getEndSection())) {
// 到达
inboundPlanList.remove(schedulingTrainPlan);
} }
} }
} }
/**
* 筛选入库
* @param simulation
*/
private void backToParking(Simulation simulation) {
for (VirtualRealityTrain train : simulation.getRepository().getOnlineTrainList()) {
if (!train.isParkingAt()) {
continue;
}
Section section = train.getHeadPosition().getSection();
if (!section.isTransferTrack()) {
continue;
}
for (SchedulingTrainPlan schedulingTrainPlan : stationListMap.get(section)) {
if (!schedulingTrainPlan.getInDepotTrip().getEndSection().equals(section)) {
continue;
}
if (!train.getGroupNumber().equals(schedulingTrainPlan.getGroupNumber())) {
continue;
}
if (!inboundPlanList.contains(schedulingTrainPlan)) {
train.initAsRM();
inboundPlanList.add(schedulingTrainPlan);
}
}
}
}
private void moving(Simulation simulation, String groupNumber, Section endSection) {
VirtualRealityTrain train = simulation.getRepository().getVRByCode(groupNumber, VirtualRealityTrain.class);
Section startSection = train.getHeadPosition().getSection();
List<RoutePath> routePaths = simulation.getRepository().queryRoutePaths(startSection, endSection);
if (routePaths == null || routePaths.isEmpty()) {
return;
}
RoutePath routePath = routePaths.get(0);
for (Route route : routePath.getRouteList()) {
if (route.isSetting()) {
continue;
}
if (route.isLock()) {
continue;
}
ciRouteService.setRoute(simulation, route);
}
Section lastSection = routePath.getEnd();
train.setRobotTargetPosition(new SectionPosition(lastSection, lastSection.getStopPointByDirection(routePath.isRight())));
}
} }