仿真ats重构-ATS触发计划车进路逻辑修改(计划时间前50s才选进路),添加冲突检测相关状态和逻辑

This commit is contained in:
walker-sheng 2021-07-19 16:01:09 +08:00
parent 0f141664f1
commit 9df1c00929
6 changed files with 49 additions and 12 deletions

View File

@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -32,22 +33,24 @@ public class AtsPlanTrainRouteSelectServiceImpl implements AtsRouteSelectService
} }
SimulationDataRepository repository = simulation.getRepository(); SimulationDataRepository repository = simulation.getRepository();
TripPlan tripPlan = repository.getTripPlan(trainInfo.getServiceNumber(), trainInfo.getTripNumber()); TripPlan tripPlan = repository.getTripPlan(trainInfo.getServiceNumber(), trainInfo.getTripNumber());
LocalDateTime systemTime = simulation.getSystemTime();
// 根据车次计划查找可触发进路列表 // 根据车次计划查找可触发进路列表
Object[] results = this.queryByStationPlan(repository, trainInfo, tripPlan); Object[] results = this.queryByStationPlan(repository, systemTime, trainInfo, tripPlan);
// 根据计划筛选需触发进路 // 根据计划筛选需触发进路
Route route = filterRoutes(repository, trainInfo, tripPlan, results); Route route = filterRoutes(repository, systemTime, trainInfo, tripPlan, results);
return route; return route;
} }
/** /**
* 先选取需要征用的进路再根据计划判断是否存在冲突的未完成计划 * 先选取需要征用的进路再根据计划判断是否存在冲突的未完成计划
* @param repository * @param repository
* @param systemTime
* @param trainInfo * @param trainInfo
* @param tripPlan * @param tripPlan
* @param results * @param results
* @return * @return
*/ */
private Route filterRoutes(SimulationDataRepository repository, private Route filterRoutes(SimulationDataRepository repository, LocalDateTime systemTime,
TrainInfo trainInfo, TripPlan tripPlan, Object[] results) { TrainInfo trainInfo, TripPlan tripPlan, Object[] results) {
if (results == null) { if (results == null) {
return null; return null;
@ -64,11 +67,28 @@ public class AtsPlanTrainRouteSelectServiceImpl implements AtsRouteSelectService
} }
log.debug(String.format("列车[%s]筛选出的进路为:[%s]", trainInfo.getGroupNumber(), route.getName())); log.debug(String.format("列车[%s]筛选出的进路为:[%s]", trainInfo.getGroupNumber(), route.getName()));
boolean conflict = this.checkConflict(repository, trainInfo, tripPlan, route, turnBack); boolean conflict = this.checkConflict(repository, trainInfo, tripPlan, route, turnBack);
if (route.isCheckConflict()) {
if (conflict) { if (conflict) {
route.setConflict(true); route.setConflict(true);
} else { } else {
route.setConflict(false); route.setConflict(false);
} }
}
// else {
// // 进路冲突看计划时间
// List<StationPlan> planList = tripPlan.getPlanList();
// LocalTime startTime = tripPlan.getStartTime();
// for (StationPlan stationPlan : planList) {
// if (stationPlan.getSection().getCode().equals(trainInfo.getPlanStandTrack())) {
// break;
// }
// startTime = stationPlan.getLeaveTime();
// }
// if (!systemTime.toLocalTime().plusSeconds(60).isAfter(startTime)) {
// log.debug(String.format("列车[%s]未到发车时间,不触发进路", trainInfo.getGroupNumber()));
// return null;
// }
// }
return route; return route;
} }
@ -252,7 +272,7 @@ public class AtsPlanTrainRouteSelectServiceImpl implements AtsRouteSelectService
/** /**
* @return (List<Route>)[0] 可触发的进路(Boolean)[1]是否需要折返 * @return (List<Route>)[0] 可触发的进路(Boolean)[1]是否需要折返
*/ */
private Object[] queryByStationPlan(SimulationDataRepository repository, TrainInfo trainInfo, TripPlan tripPlan) { private Object[] queryByStationPlan(SimulationDataRepository repository, LocalDateTime systemTime, TrainInfo trainInfo, TripPlan tripPlan) {
Route route = null; Route route = null;
Object[] result = new Object[3]; Object[] result = new Object[3];
result[1] = false; result[1] = false;
@ -262,6 +282,19 @@ public class AtsPlanTrainRouteSelectServiceImpl implements AtsRouteSelectService
if (trainInfo.getPlanStandTrack() == null) { // 列车下一计划存在 if (trainInfo.getPlanStandTrack() == null) { // 列车下一计划存在
return null; return null;
} }
// 计划时间
List<StationPlan> planList = tripPlan.getPlanList();
LocalTime startTime = tripPlan.getStartTime();
for (StationPlan stationPlan : planList) {
if (stationPlan.getSection().getCode().equals(trainInfo.getPlanStandTrack())) {
break;
}
startTime = stationPlan.getLeaveTime();
}
if (!systemTime.toLocalTime().plusSeconds(50).isAfter(startTime)) {
log.debug(String.format("列车[%s]未到发车时间,不触发进路", trainInfo.getGroupNumber()));
return null;
}
Section planTrack = repository.getByCode(trainInfo.getPlanStandTrack(), Section.class);//下一计划 Section planTrack = repository.getByCode(trainInfo.getPlanStandTrack(), Section.class);//下一计划
Section section = repository.getByCode(trainInfo.getPhysicalSection(), Section.class); // 列车所在区段 Section section = repository.getByCode(trainInfo.getPhysicalSection(), Section.class); // 列车所在区段
if (!planTrack.isSamePhysical(section.getCode())) { if (!planTrack.isSamePhysical(section.getCode())) {

View File

@ -53,7 +53,7 @@ public class AtsTriggerRouteService {
if (!route.isAtsControl()) { if (!route.isAtsControl()) {
return; return;
} }
if (route.isConflict()) { if (route.isConflict() && route.isCheckConflict()) {
return; return;
} }
this.ciApiService.settingRoute(simulation, route.getCode()); this.ciApiService.settingRoute(simulation, route.getCode());

View File

@ -261,7 +261,7 @@ public class VoiceCommandBO {
return null; return null;
} }
List<String> params = replyParamIndexes.stream().map(matcher::group).collect(Collectors.toList()); List<String> params = replyParamIndexes.stream().map(matcher::group).collect(Collectors.toList());
String[] strings = params.toArray(new String[]{}); Object[] strings = params.toArray(new Object[]{});
return String.format(reply, strings); return String.format(reply, strings);
} }

View File

@ -995,7 +995,7 @@ public class SimulationDataRepository {
if (route.isConflict()) { if (route.isConflict()) {
continue; continue;
} }
if (route.getStart().equals(theRoute.getStart()) || route.isConflictWith(theRoute)) { if (route.getStart().equals(theRoute.getStart())) {
return true; return true;
} }
} }

View File

@ -130,7 +130,9 @@ public class Route extends MapNamedElement {
/** 进路将要或上一次为哪辆列车排列 */ /** 进路将要或上一次为哪辆列车排列 */
private TrainInfo train; private TrainInfo train;
/** */ /** 检查冲突功能是否开启 */
private boolean checkConflict;
/** 是否冲突 */
private boolean conflict; private boolean conflict;
@Override @Override
@ -148,6 +150,7 @@ public class Route extends MapNamedElement {
this.normalUnlock = false; this.normalUnlock = false;
this.unlockedSection = null; this.unlockedSection = null;
this.train = null; this.train = null;
this.checkConflict = false;
this.conflict = false; this.conflict = false;
} }

View File

@ -1,5 +1,6 @@
package club.joylink.rtss.simulation.cbtc.data.support; package club.joylink.rtss.simulation.cbtc.data.support;
import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants;
import club.joylink.rtss.simulation.cbtc.data.CalculateService; import club.joylink.rtss.simulation.cbtc.data.CalculateService;
import club.joylink.rtss.simulation.cbtc.data.map.MapNamedElement; import club.joylink.rtss.simulation.cbtc.data.map.MapNamedElement;
import club.joylink.rtss.simulation.cbtc.data.map.Section; import club.joylink.rtss.simulation.cbtc.data.map.Section;