Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
walker-sheng 2021-05-26 18:28:53 +08:00
commit d656a5071b
6 changed files with 129 additions and 79 deletions

View File

@ -21,6 +21,7 @@ import club.joylink.rtss.simulation.cbtc.onboard.ATP.ATPService;
import club.joylink.rtss.simulation.cbtc.onboard.ATP.OnboardAtpApiService; import club.joylink.rtss.simulation.cbtc.onboard.ATP.OnboardAtpApiService;
import club.joylink.rtss.vo.client.map.newmap.MapStationRunLevelVO; import club.joylink.rtss.vo.client.map.newmap.MapStationRunLevelVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.threads.StopPooledThreadException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -303,36 +304,36 @@ public class AtsTrainService {
BusinessExceptionAssertEnum.INVALID_OPERATION.assertNotNull(path, BusinessExceptionAssertEnum.INVALID_OPERATION.assertNotNull(path,
String.format("列车[%s]无法到达目的地码[%s]对应区段[%s]", groupNumber, destinationCode, destinationSection.getCode())); String.format("列车[%s]无法到达目的地码[%s]对应区段[%s]", groupNumber, destinationCode, destinationSection.getCode()));
supervisedTrain.setHeadPath(path); supervisedTrain.setHeadPath(path);
//根据找到的路径更新目标区段--- // //根据找到的路径更新目标区段---
Section nextTarget = null; // Section nextTarget = null;
int index = path.indexOf(headSection); // int index = path.indexOf(headSection);
if (index == -1) // if (index == -1)
break; // break;
for (int i = index; i < path.size(); i++) { // for (int i = index; i < path.size(); i++) {
Section section = path.get(i); // Section section = path.get(i);
if (section.isSpecialSection() // if (section.isSpecialSection()
&& supervisedTrain.isNotArriveAt(repository, new SectionPosition(section, section.getStopPointByDirection(right)))) { // && supervisedTrain.isNotArriveAt(repository, new SectionPosition(section, section.getStopPointByDirection(right)))) {
List<RoutePath> routePaths = repository.queryRoutePathsByEnd(section); // List<RoutePath> routePaths = repository.queryRoutePathsByEnd(section);
if (routePaths.stream().anyMatch(rp -> rp.containsSection(headSection))) { // if (routePaths.stream().anyMatch(rp -> rp.containsSection(headSection))) {
nextTarget = section; // nextTarget = section;
break; // break;
} // }
} // }
} // }
if (nextTarget == null) { // if (nextTarget == null) {
nextTarget = path.get(path.size() - 1); // nextTarget = path.get(path.size() - 1);
} // }
if (nextTarget.getCode().equals(estimatedArriveStandTrack)) { // if (nextTarget.getCode().equals(estimatedArriveStandTrack)) {
break; // break;
} // }
MapStationRunLevelVO runLevel = simulation.getBuildParams().getMap().getRunLevelByStartAndEndSection(estimatedArriveStandTrack, nextTarget.getCode()); // MapStationRunLevelVO runLevel = simulation.getBuildParams().getMap().getRunLevelByStartAndEndSection(estimatedArriveStandTrack, nextTarget.getCode());
int runningTime = 0; // int runningTime = 0;
if (runLevel != null) { // if (runLevel != null) {
runningTime = runLevel.getL3(); // runningTime = runLevel.getL3();
} // }
supervisedTrain.updateEstimatedArriveInfo(nextTarget, simulation.getSystemTime().plusSeconds(runningTime).toLocalTime()); // supervisedTrain.updateEstimatedArriveInfo(nextTarget, simulation.getSystemTime().plusSeconds(runningTime).toLocalTime());
this.onboardAtpApiService.updateNextStation(simulation, supervisedTrain.getGroupNumber(), // this.onboardAtpApiService.updateNextStation(simulation, supervisedTrain.getGroupNumber(),
nextTarget.getStation().getCode(), nextTarget.getCode(), runningTime, true); // nextTarget.getStation().getCode(), nextTarget.getCode(), runningTime, true);
break; break;
default: default:
throw new SimulationException(SimulationExceptionType.System_Fault, String.format("无法识别的目的地码类型[%s]", destinationCodeDefinition.getType())); throw new SimulationException(SimulationExceptionType.System_Fault, String.format("无法识别的目的地码类型[%s]", destinationCodeDefinition.getType()));
@ -630,19 +631,19 @@ public class AtsTrainService {
} }
break; break;
} }
if (nextTarget != null) { // if (nextTarget != null) {
if (nextTarget.getCode().equals(estimatedArriveStandTrack)) { // if (nextTarget.getCode().equals(estimatedArriveStandTrack)) {
return; // return;
} // }
SectionPosition stopPosition = new SectionPosition(nextTarget, nextTarget.getStopPointByDirection(trainRight)); // SectionPosition stopPosition = new SectionPosition(nextTarget, nextTarget.getStopPointByDirection(trainRight));
Float distance = CalculateService.calculateDistance(headPosition, stopPosition, trainRight); // Float distance = CalculateService.calculateDistance(headPosition, stopPosition, trainRight);
if (distance != null) { // if (distance != null) {
runningTime = (int) (distance / (45 / 3.6)); // runningTime = (int) (distance / (45 / 3.6));
} // }
train.updateEstimatedArriveInfo(nextTarget, simulation.getSystemTime().plusSeconds(runningTime).toLocalTime()); // train.updateEstimatedArriveInfo(nextTarget, simulation.getSystemTime().plusSeconds(runningTime).toLocalTime());
this.onboardAtpApiService.updateNextStation(simulation, train.getGroupNumber(), // this.onboardAtpApiService.updateNextStation(simulation, train.getGroupNumber(),
nextTarget.getStation().getCode(), nextTarget.getCode(), runningTime, true); // nextTarget.getStation().getCode(), nextTarget.getCode(), runningTime, true);
} // }
} else { //没有目的地码定义数据 } else { //没有目的地码定义数据
Section prePassed = null; Section prePassed = null;
List<Routing> routingList = repository.queryRoutingByDestCode(destinationCode); List<Routing> routingList = repository.queryRoutingByDestCode(destinationCode);
@ -667,39 +668,64 @@ public class AtsTrainService {
break; break;
} }
} }
if (Objects.nonNull(nextTarget)) { // if (Objects.nonNull(nextTarget)) {
if (Objects.nonNull(prePassed)) { // if (Objects.nonNull(prePassed)) {
MapStationRunLevelVO runLevel = simulation.getBuildParams().getMap().getRunLevelByStartAndEndSection(prePassed.getCode(), nextTarget.getCode()); // MapStationRunLevelVO runLevel = simulation.getBuildParams().getMap().getRunLevelByStartAndEndSection(prePassed.getCode(), nextTarget.getCode());
if (Objects.nonNull(runLevel)) { // if (Objects.nonNull(runLevel)) {
runningTime = runLevel.getL3(); // runningTime = runLevel.getL3();
// }
// }
// if (!Objects.equals(estimatedArriveStandTrack, nextTarget.getCode())) {
// boolean isPark = true;
// if (repository.getConfig().isNoParkingServiceNumber(train.getServiceNumber())) {
// isPark = false;
// } else if (repository.getConfig().isParkingServiceNumber(train.getServiceNumber())) {
// isPark = true;
// }
// train.updateEstimatedArriveInfo(nextTarget, LocalTime.now().plusSeconds(runningTime));
// //默认
// this.onboardAtpApiService.updateNextStation(simulation, train.getGroupNumber(),
// nextTarget.getStation().getCode(), nextTarget.getCode(), runningTime, isPark);
// }
// }
} }
// else {
// nextTarget = this.queryNextTargetByStartSectionAndRoutings(simulation, routingList, headSection);
// if (Objects.nonNull(nextTarget) && !Objects.equals(estimatedArriveStandTrack, nextTarget.getCode())) {
// if (Objects.equals(train.getActualLeaveStandTrack(), nextTarget.getCode())) {
// log.warn(String.format("列车[%s]刚离开的站台,不更新", train.getGroupNumber()));
// return;
// }
// train.updateEstimatedArriveInfo(nextTarget, train.getEstimatedArriveTime());
// this.onboardAtpApiService.updateNextSection(simulation,
// train.getGroupNumber(), nextTarget.getCode());
// }
// }
}
if (nextTarget != null) {
if (nextTarget.getCode().equals(estimatedArriveStandTrack)) {
return;
} }
if (!Objects.equals(estimatedArriveStandTrack, nextTarget.getCode())) {
boolean isPark = true; boolean isPark = true;
if (repository.getConfig().isNoParkingServiceNumber(train.getServiceNumber())) { if (repository.getConfig().isNoParkingServiceNumber(train.getServiceNumber())) {
isPark = false; isPark = false;
} else if (repository.getConfig().isParkingServiceNumber(train.getServiceNumber())) {
isPark = true;
} }
train.updateEstimatedArriveInfo(nextTarget, LocalTime.now().plusSeconds(runningTime)); if (!nextTarget.isAheadOf(headSection, trainRight)) {
//默认 atpService.turnDirectionImmediately(repository.getOnlineTrainBy(train.getGroupNumber()));
}
SectionPosition stopPosition = new SectionPosition(nextTarget, nextTarget.getStopPointByDirection(trainRight));
Float distance = CalculateService.calculateDistance(headPosition, stopPosition, trainRight);
if (distance == null) {
distance = CalculateService.calculateDistance(headPosition, stopPosition, !trainRight);
}
if (distance != null) {
runningTime = (int) (distance / (45 / 3.6));
}
train.updateEstimatedArriveInfo(nextTarget, simulation.getSystemTime().plusSeconds(runningTime).toLocalTime());
this.onboardAtpApiService.updateNextStation(simulation, train.getGroupNumber(), this.onboardAtpApiService.updateNextStation(simulation, train.getGroupNumber(),
nextTarget.getStation().getCode(), nextTarget.getCode(), runningTime, isPark); nextTarget.getStation().getCode(), nextTarget.getCode(), runningTime, isPark);
} }
}
} else {
nextTarget = this.queryNextTargetByStartSectionAndRoutings(simulation, routingList, headSection);
if (Objects.nonNull(nextTarget) && !Objects.equals(estimatedArriveStandTrack, nextTarget.getCode())) {
if (Objects.equals(train.getActualLeaveStandTrack(), nextTarget.getCode())) {
log.warn(String.format("列车[%s]刚离开的站台,不更新", train.getGroupNumber()));
return;
}
train.updateEstimatedArriveInfo(nextTarget, train.getEstimatedArriveTime());
this.onboardAtpApiService.updateNextSection(simulation,
train.getGroupNumber(), nextTarget.getCode());
}
}
}
break; break;
} }
} }

View File

@ -43,11 +43,11 @@ public class RouteService {
if (Objects.nonNull(failMessage)) { if (Objects.nonNull(failMessage)) {
return failMessage; return failMessage;
} }
// 区间运行方向检查 // // 区间运行方向检查
failMessage = this.directionRodCheck(simulation, route); // failMessage = this.directionRodCheck(simulation, route);
if (Objects.nonNull(failMessage)) { // if (Objects.nonNull(failMessage)) {
return failMessage; // return failMessage;
} // }
// 共用道岔的冲突进路检查 // 共用道岔的冲突进路检查
failMessage = this.switchUseCheck(simulation, route); failMessage = this.switchUseCheck(simulation, route);
if (Objects.nonNull(failMessage)) { if (Objects.nonNull(failMessage)) {

View File

@ -24,6 +24,7 @@ import club.joylink.rtss.simulation.cbtc.ATS.operation.AtsOperationDispatcher;
import club.joylink.rtss.simulation.cbtc.ATS.service.AtsTrainLoadService; import club.joylink.rtss.simulation.cbtc.ATS.service.AtsTrainLoadService;
import club.joylink.rtss.simulation.cbtc.build.SimulationBuildParams; import club.joylink.rtss.simulation.cbtc.build.SimulationBuildParams;
import club.joylink.rtss.simulation.cbtc.command.CommandBO; import club.joylink.rtss.simulation.cbtc.command.CommandBO;
import club.joylink.rtss.simulation.cbtc.command.CommandExecuteService;
import club.joylink.rtss.simulation.cbtc.command.CommandInitiateVO; import club.joylink.rtss.simulation.cbtc.command.CommandInitiateVO;
import club.joylink.rtss.simulation.cbtc.communication.vo.fault.DeviceFaultInfo; import club.joylink.rtss.simulation.cbtc.communication.vo.fault.DeviceFaultInfo;
import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants; import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants;
@ -138,6 +139,8 @@ public class GroupSimulationServiceImpl implements GroupSimulationService {
private IRunPlanRunlevelService iRunPlanRunlevelService; private IRunPlanRunlevelService iRunPlanRunlevelService;
@Autowired @Autowired
private IRunPlanParktimeService iRunPlanParktimeService; private IRunPlanParktimeService iRunPlanParktimeService;
@Autowired
private CommandExecuteService commandExecuteService;
// /** // /**
// * 创建仿真并进行缓存 // * 创建仿真并进行缓存
// * // *
@ -931,6 +934,7 @@ public class GroupSimulationServiceImpl implements GroupSimulationService {
} }
CommandBO commandBO = new CommandBO(initiateVO.getCommandType(), member, targetMember, initiateVO.getParams(), steps); CommandBO commandBO = new CommandBO(initiateVO.getCommandType(), member, targetMember, initiateVO.getParams(), steps);
targetMember.setCommand(commandBO); targetMember.setCommand(commandBO);
commandExecuteService.addJobs(simulation);
} }
@Override @Override

View File

@ -645,5 +645,6 @@ public class Simulation extends club.joylink.rtss.simulation.Simulation<Simulati
String controlDevice = "controlDevice"; String controlDevice = "controlDevice";
String queryDeviceStatus = "queryDeviceStatus"; String queryDeviceStatus = "queryDeviceStatus";
String UpdateDeviceStatusByCollection = "UpdateDeviceStatusByCollection"; String UpdateDeviceStatusByCollection = "UpdateDeviceStatusByCollection";
String commandExecuteRun = "commandExecuteRun";
} }
} }

View File

@ -2,12 +2,14 @@ package club.joylink.rtss.simulation.cbtc.command;
import club.joylink.rtss.simulation.cbtc.ATS.operation.AtsOperationDispatcher; import club.joylink.rtss.simulation.cbtc.ATS.operation.AtsOperationDispatcher;
import club.joylink.rtss.simulation.cbtc.Simulation; import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityTrain; import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityTrain;
import club.joylink.rtss.simulation.cbtc.member.SimulationMember; import club.joylink.rtss.simulation.cbtc.member.SimulationMember;
import club.joylink.rtss.simulation.cbtc.onboard.ATP.OnboardAtpApiService; import club.joylink.rtss.simulation.cbtc.onboard.ATP.OnboardAtpApiService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -25,6 +27,8 @@ public class CommandExecuteService {
public void run(Simulation simulation) { public void run(Simulation simulation) {
List<SimulationMember> haveCommandMember = List<SimulationMember> haveCommandMember =
simulation.getSimulationMembers().stream().filter(member -> member.getCommand() != null).collect(Collectors.toList()); simulation.getSimulationMembers().stream().filter(member -> member.getCommand() != null).collect(Collectors.toList());
if (CollectionUtils.isEmpty(haveCommandMember))
removeJobs(simulation);
for (SimulationMember member : haveCommandMember) { for (SimulationMember member : haveCommandMember) {
CommandBO command = member.getCommand(); CommandBO command = member.getCommand();
if (!member.isRobot()) { if (!member.isRobot()) {
@ -59,4 +63,12 @@ public class CommandExecuteService {
} }
} }
} }
public void addJobs(Simulation simulation) {
simulation.addJobIfAbsent(Simulation.JobName.commandExecuteRun, () -> this.run(simulation), SimulationConstants.COMMAND_EXECUTE_RATE);
}
public void removeJobs(Simulation simulation) {
simulation.removeJob(Simulation.JobName.commandExecuteRun);
}
} }

View File

@ -1,5 +1,6 @@
package club.joylink.rtss.simulation.cbtc.data.map; package club.joylink.rtss.simulation.cbtc.data.map;
import club.joylink.rtss.simulation.cbtc.data.CalculateService;
import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition; import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySectionAxleCounter; import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySectionAxleCounter;
import club.joylink.rtss.simulation.cbtc.exception.SimulationException; import club.joylink.rtss.simulation.cbtc.exception.SimulationException;
@ -998,6 +999,12 @@ public class Section extends MayOutOfOrderDevice {
} }
} }
public boolean isAheadOf(Section other, boolean right) {
if (this.equals(other))
return false;
return CalculateService.isTargetSectionOnDirectionExist(other, right, this);
}
public enum SectionRoadType { public enum SectionRoadType {
/** /**
* 左行线 * 左行线