南铁院岔心设置计轴故障/预复位

This commit is contained in:
joylink_zhangsai 2021-03-12 17:44:50 +08:00
parent f9f7564a0f
commit 30a1685935
9 changed files with 206 additions and 129 deletions

View File

@ -64,7 +64,10 @@ public class SimulationV1Controller {
public String simulation(Long mapId, String prdType,
@ApiIgnore @RequestAttribute(name = AuthenticateInterceptor.LOGIN_INFO_KEY)
LoginUserInfoVO loginUserInfoVO) {
return this.groupSimulationService.simulation(mapId, prdType, loginUserInfoVO);
String simulation = this.groupSimulationService.simulation(mapId, prdType, loginUserInfoVO);
long end = System.currentTimeMillis();
System.out.println(end);
return simulation;
}
@ApiOperation(value = "创建实训仿真")

View File

@ -203,6 +203,7 @@ public class DraftMapService implements IDraftMapService {
@Override
public void saveMapElsDetail(Long id, String shapeData) {
DraftMapWithBLOBs draftMap = draftMapDAO.selectByPrimaryKey(id);
System.out.println(shapeData);
MapGraphDataNewVO graphDataNewVO = JsonUtils.read(shapeData, MapGraphDataNewVO.class);
this.handleSectionData(graphDataNewVO);
draftMap.setGraphData(JsonUtils.writeValueAsString(graphDataNewVO));
@ -226,8 +227,7 @@ public class DraftMapService implements IDraftMapService {
section.setDestinationCode(null);
section.setDestinationCodePoint(null);
}
if (Objects.equals(section.getType(), BusinessConsts.Section.SectionType.Type04) ||
Objects.equals(section.getType(), BusinessConsts.Section.SectionType.Type05)) {
if (Objects.equals(section.getType(), BusinessConsts.Section.SectionType.Type04)) {
section.setParentCode(null);
}
}

View File

@ -624,18 +624,15 @@ public class CiApiServiceImpl implements CiApiService {
*/
private VirtualRealitySectionAxleCounter getAxleCounterAndCheck4Reset(Simulation simulation, String sectionCode) {
Section section = simulation.getRepository().getByCode(sectionCode, Section.class);
Section chooseSection = section;
if (!section.isAxleCounter()) {
section = section.getParent();
}
Section axleSection = section.findAxleCounterSection();
//条件检查
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(section != null && section.isAxleCounter(),
chooseSection.debugStr() + "不是计轴区段");
VirtualRealitySectionAxleCounter virtualAxleCounter = section.getVirtualAxleCounter();
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(virtualAxleCounter.isOccupy(), chooseSection.debugStr() + "计轴未占用,无需预复位");
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(axleSection != null && axleSection.isAxleCounter(),
section.debugStr() + "不是计轴区段也不归属于任何计轴区段");
VirtualRealitySectionAxleCounter virtualAxleCounter = axleSection.getVirtualAxleCounter();
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(virtualAxleCounter.isOccupy(), section.debugStr() + "计轴未占用,无需预复位");
if (simulation.getRepository().getConfig().isStationPreResetBeforeAxlePreReset()) {
Station station = section.getStation();
BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertNotNull(station, chooseSection.debugStr() + "没有所属车站");
Station station = axleSection.getStation();
BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertNotNull(station, section.debugStr() + "没有所属车站");
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(station.isPreReset(), station.debugStr() + "需处于预复位状态");
}
return virtualAxleCounter;

View File

@ -299,6 +299,7 @@ public class GroupSimulationServiceImpl implements GroupSimulationService {
Simulation simulation = this.create(loginUserInfoVO, mapId,
prdType,
Simulation.FunctionalType.SIMULATION);
if (Objects.equals(MapPrdTypeEnum.BIG_SCREEN, prdType)) {
// 大屏仿真直接按计划行车
RunAsPlanParam param = new RunAsPlanParam();

View File

@ -34,6 +34,7 @@ public class InterlockBuilder2 {
// ------------侧防end-------------
// ------------延续保护start-------------
long overlapStart = System.currentTimeMillis();
List<MapOverlapVO> overlapList = logicData.getOverlapList();
for (MapOverlapVO mapOverlapVO : overlapList) {
RouteOverlap routeOverlap = new RouteOverlap(mapOverlapVO.getCode(), mapOverlapVO.getName());
@ -99,6 +100,7 @@ public class InterlockBuilder2 {
}
}
}
log.debug("构建延续保护耗时:" + (System.currentTimeMillis() - overlapStart));
// ------------延续保护end-------------
// 接近区段
List<MapSignalApproachSectionVO> signalApproachSectionList = logicData.getSignalApproachSectionList();
@ -128,6 +130,7 @@ public class InterlockBuilder2 {
}
}
// ------------进路start-------------
long routeStart = System.currentTimeMillis();
List<MapRouteNewVO> routeList = logicData.getRouteList();
for (MapRouteNewVO mapRouteVO : routeList) {
Route route = new Route(mapRouteVO.getCode(), mapRouteVO.getName());
@ -245,6 +248,7 @@ public class InterlockBuilder2 {
}
}
}
log.debug("构建进路耗时:" + (System.currentTimeMillis() - routeStart));
// 敌对进路关系构建
for (MapRouteNewVO mapRouteVO : routeList) {
Route route = (Route) elementMap.get(mapRouteVO.getCode());
@ -485,6 +489,7 @@ public class InterlockBuilder2 {
}
private static Map<String, RouteFls> checkAndBuildRouteFls(List<MapRouteFlankProtectionNewVO> flankProtectionList, Map<String, MapElement> elementMap) {
long start = System.currentTimeMillis();
Map<String, RouteFls> map = new HashMap<>();
for (MapRouteFlankProtectionNewVO fpVO : flankProtectionList) {
RouteFls routeFls = new RouteFls(fpVO.getCode(), new SwitchElement((Switch) elementMap.get(fpVO.getSource().getSwitchCode()), fpVO.getSource().isNormal()));
@ -494,6 +499,7 @@ public class InterlockBuilder2 {
routeFls.setLevel2List(level2List);
map.put(routeFls.getCode(), routeFls);
}
log.debug("构建侧防耗时:" + (System.currentTimeMillis() - start));
return map;
}
@ -861,6 +867,8 @@ public class InterlockBuilder2 {
private static void buildRoutePathFromStationRunLevel(List<StationRunLevel> stationRunLevelList,
SimulationBuilder.SimulationDeviceBuildResult buildResult,
List<String> errMsgList) {
long start = System.currentTimeMillis();
log.debug("构建进路路径开始:" + start);
if (CollectionUtils.isEmpty(stationRunLevelList)) {
return;
}
@ -877,6 +885,7 @@ public class InterlockBuilder2 {
routePathMap.put(routePaths.get(0).getKey(), routePaths);
}
}
log.debug("构建进路路径耗时:" + (System.currentTimeMillis() - start));
}
// /**
@ -1291,6 +1300,8 @@ public class InterlockBuilder2 {
}
private static void checkBetweenRouteSameDirectionSignal(Map<String, MapElement> elementMap, List<String> errMsgList) {
long start = System.currentTimeMillis();
log.debug("构建自动折返进路开始");
if (!CollectionUtils.isEmpty(errMsgList)) { // 数据中本身存在错误不检查
return;
}
@ -1323,5 +1334,6 @@ public class InterlockBuilder2 {
}
}
}
log.debug("构建自动折返进路耗时:" + (System.currentTimeMillis() - start));
}
}

View File

@ -42,110 +42,7 @@ public class MapDeviceBuilder {
buildStation(graphData, elementMap, errMsgList);
// 区段
List<MapSectionNewVO> sectionList = graphData.getSectionList();
Map<String, Section> desCodeSectionMap = new HashMap<>();
for (MapSectionNewVO sectionVO : sectionList) {
Section section = new Section(sectionVO.getCode(), sectionVO.getName());
if (Objects.nonNull(elementMap.get(section.getCode()))) {
errMsgList.add(String.format("编码为[%s]的区段不唯一", section.getCode()));
}
elementMap.put(section.getCode(), section);
section.setRoadType(sectionVO.getRoadType());
section.setPhysical(isPhysicalSection(sectionVO.getType()));
section.setAxleCounter(isAxleCounterSection(sectionVO.getType()));
section.setCross(isCross(sectionVO.getType()));
// 计轴区段和道岔区段校验实际长度
if (isPhysicalSection(sectionVO.getType()) &&
(Objects.isNull(sectionVO.getLengthFact()) ||
sectionVO.getLengthFact() <= 0 ||
Float.isInfinite(sectionVO.getLengthFact()) ||
Float.isNaN(sectionVO.getLengthFact()))) {
errMsgList.add(String.format("区段[%s(%s)]实际距离未设置或不为正数", sectionVO.getName(), sectionVO.getCode()));
} else if (isPhysicalSection(sectionVO.getType())) {
section.setLen(sectionVO.getLengthFact());
}
if (Objects.equals(sectionVO.getType(), BusinessConsts.Section.SectionType.Type02)) { // 逻辑区段
Float startOffset = sectionVO.getLogicSectionStartOffset();
Float endOffset = sectionVO.getLogicSectionEndOffset();
section.setLen(sectionVO.getLengthFact());
if ((Objects.isNull(sectionVO.getLengthFact()) || sectionVO.getLengthFact() <= 0) &&
(Objects.isNull(startOffset) || Objects.isNull(endOffset))) {
errMsgList.add(String.format("逻辑区段[%s(%s)]既没有设置实际长度且所在物理区段起始/终止偏移量也未设置",
section.getName(), section.getCode()));
} else {
float max = Math.max(startOffset, endOffset);
float min = Math.min(startOffset, endOffset);
section.setMaxOffset(max);
section.setMinOffset(min);
}
}
// 所属设备集中站
Station deviceStation = (Station) elementMap.get(sectionVO.getStationCode());
if (Objects.isNull(deviceStation)) {
errMsgList.add(String.format("区段[%s(%s)]未关联设备集中站或设备集中站不存在", section.getName(), section.getCode()));
} else {
section.setDeviceStation(deviceStation);
}
section.setStandTrack(sectionVO.isStandTrack());
section.setTurnBackTrack(sectionVO.isReentryTrack());
section.setFirstTurnBack(sectionVO.isFirstTurnBack());
section.setTransferTrack(sectionVO.isTransferTrack());
if (section.isTransferTrack()) {
if (section.isTurnBackTrack() || section.isStandTrack()) {
errMsgList.add(String.format("区段[%s(%s)]是转换轨,就不能再设置为站台轨或折返轨",
section.getName(), section.getCode()));
}
}
// 是站台轨/折返轨/转换轨校验左右停车点
if ((section.isStandTrack() || section.isTransferTrack() || section.isTurnBackTrack())
&&
(Objects.isNull(sectionVO.getLeftStopPointOffset()) ||
Objects.isNull(sectionVO.getRightStopPointOffset()) ||
(0 == sectionVO.getLeftStopPointOffset().floatValue() &&
0 == sectionVO.getRightStopPointOffset().floatValue()))) {
errMsgList.add(String.format("区段[%s(%s)]是站台轨/折返轨/转换轨却未设置左右停车点偏移量或左右停车点偏移量都为0", sectionVO.getName(), sectionVO.getCode()));
} else {
section.setStopPointLeft(sectionVO.getLeftStopPointOffset());
section.setStopPointRight(sectionVO.getRightStopPointOffset());
}
// 转换轨/折返轨构建关联车站,站台轨在后面处理站台逻辑里做了
if (section.isStandTrack() || section.isTransferTrack() || section.isTurnBackTrack()) {
if (!StringUtils.hasText(sectionVO.getBelongStation())) {
errMsgList.add(String.format("区段[%s(%s)]是站台轨或转换轨或折返轨,却未设置关联车站",
sectionVO.getName(), sectionVO.getCode()));
} else {
//归属车站
Station station = (Station) elementMap.get(sectionVO.getBelongStation());
if (Objects.isNull(station)) {
errMsgList.add(String.format("折返轨/转换轨/站台轨区段[%s(%s)]关联的车站[(%s)]不存在", section.getName(), section.getCode(), sectionVO.getBelongStation()));
} else {
section.setStation(station);
if (section.isTransferTrack()) {
station.addTransferTrack(section);
}
if (section.isTurnBackTrack()) {
station.addTurnBackSection(section);
}
}
}
}
section.setDestinationCode(sectionVO.getDestinationCode());
if (StringUtils.hasText(sectionVO.getDestinationCode())) {
Section section1 = desCodeSectionMap.get(sectionVO.getDestinationCode());
if (Objects.nonNull(section1)) {
errMsgList.add(String.format("区段[%s(%s)]和区段[%s(%s)]目的地码相同[%s],目的地码必须唯一",
section.getName(), section.getCode(),
section1.getName(), section1.getCode(),
sectionVO.getDestinationCode()));
}
desCodeSectionMap.put(sectionVO.getDestinationCode(), section);
}
// 如果区段是计轴区段构建区段虚拟真实计轴器
if (section.isAxleCounter()) {
VirtualRealitySectionAxleCounter axleCounter = new VirtualRealitySectionAxleCounter(section.getCode(), section.getName());
section.setVirtualAxleCounter(axleCounter);
deviceMap.put(axleCounter.getCode(), axleCounter);
}
}
buildSections(elementMap, deviceMap, errMsgList, sectionList);
// 道岔
List<MapSwitchVO> switchList = graphData.getSwitchList();
switchList.forEach(switchVO -> {
@ -200,10 +97,11 @@ public class MapDeviceBuilder {
sectionList.forEach(sectionVO -> {
Section section = (Section) elementMap.get(sectionVO.getCode());
if (Objects.equals(BusinessConsts.Section.SectionType.Type02, sectionVO.getType()) ||
Objects.equals(BusinessConsts.Section.SectionType.Type03, sectionVO.getType())) { // 逻辑区段/道岔区段
Objects.equals(BusinessConsts.Section.SectionType.Type03, sectionVO.getType()) ||
isCross(sectionVO.getType())) { // 逻辑区段/道岔区段/岔心
Section parent = (Section) elementMap.get(sectionVO.getParentCode());
if (Objects.isNull(parent)) {
errMsgList.add(String.format("逻辑区段/道岔区段[%s(%s)]没用关联(道岔)计轴区段或关联的(道岔)计轴区段不存在",
errMsgList.add(String.format("逻辑区段/道岔区段/岔心[%s(%s)]没用关联(道岔)计轴区段或关联的(道岔)计轴区段不存在",
section.getName(), section.getCode()));
} else {
parent.addLogicSection(section);
@ -256,8 +154,8 @@ public class MapDeviceBuilder {
if (Objects.isNull(physicalSectionOfCross)) {
errMsgList.add(String.format("岔心[%s(%s)]关联的物理区段[(%s)]不存在",
section.getName(), section.getCode(), s));
} else if (!physicalSectionOfCross.isAxleCounterSection()) {
errMsgList.add(String.format("岔心[%s(%s)]关联的区段[%s(%s)]不是一般计轴物理区段",
} else if (!physicalSectionOfCross.isPhysical()) {
errMsgList.add(String.format("岔心[%s(%s)]关联的区段[%s(%s)]不是物理区段",
section.getName(), section.getCode(), physicalSectionOfCross.getName(), s));
}
});
@ -846,6 +744,117 @@ public class MapDeviceBuilder {
buildResponderDataRef(graphData, elementMap, errMsgList, mapDataBuildResult.getSectionRespondersMap());
}
/**
* 构建区段数据
*/
private static void buildSections(Map<String, MapElement> elementMap, Map<String, VirtualRealityDevice> deviceMap,
List<String> errMsgList, List<MapSectionNewVO> sectionList) {
Map<String, Section> desCodeSectionMap = new HashMap<>();
for (MapSectionNewVO sectionVO : sectionList) {
Section section = new Section(sectionVO.getCode(), sectionVO.getName());
if (Objects.nonNull(elementMap.get(section.getCode()))) {
errMsgList.add(String.format("编码为[%s]的区段不唯一", section.getCode()));
}
elementMap.put(section.getCode(), section);
section.setRoadType(sectionVO.getRoadType());
section.setPhysical(isPhysicalSection(sectionVO.getType()));
section.setAxleCounter(isAxleCounterSection(sectionVO, sectionList));
section.setCross(isCross(sectionVO.getType()));
// 计轴区段和道岔区段校验实际长度
if (isPhysicalSection(sectionVO.getType()) &&
(Objects.isNull(sectionVO.getLengthFact()) ||
sectionVO.getLengthFact() <= 0 ||
Float.isInfinite(sectionVO.getLengthFact()) ||
Float.isNaN(sectionVO.getLengthFact()))) {
errMsgList.add(String.format("区段[%s(%s)]实际距离未设置或不为正数", sectionVO.getName(), sectionVO.getCode()));
} else if (isPhysicalSection(sectionVO.getType())) {
section.setLen(sectionVO.getLengthFact());
}
if (Objects.equals(sectionVO.getType(), BusinessConsts.Section.SectionType.Type02)) { // 逻辑区段
Float startOffset = sectionVO.getLogicSectionStartOffset();
Float endOffset = sectionVO.getLogicSectionEndOffset();
section.setLen(sectionVO.getLengthFact());
if ((Objects.isNull(sectionVO.getLengthFact()) || sectionVO.getLengthFact() <= 0) &&
(Objects.isNull(startOffset) || Objects.isNull(endOffset))) {
errMsgList.add(String.format("逻辑区段[%s(%s)]既没有设置实际长度且所在物理区段起始/终止偏移量也未设置",
section.getName(), section.getCode()));
} else {
float max = Math.max(startOffset, endOffset);
float min = Math.min(startOffset, endOffset);
section.setMaxOffset(max);
section.setMinOffset(min);
}
}
// 所属设备集中站
Station deviceStation = (Station) elementMap.get(sectionVO.getStationCode());
if (Objects.isNull(deviceStation)) {
errMsgList.add(String.format("区段[%s(%s)]未关联设备集中站或设备集中站不存在", section.getName(), section.getCode()));
} else {
section.setDeviceStation(deviceStation);
}
section.setStandTrack(sectionVO.isStandTrack());
section.setTurnBackTrack(sectionVO.isReentryTrack());
section.setFirstTurnBack(sectionVO.isFirstTurnBack());
section.setTransferTrack(sectionVO.isTransferTrack());
if (section.isTransferTrack()) {
if (section.isTurnBackTrack() || section.isStandTrack()) {
errMsgList.add(String.format("区段[%s(%s)]是转换轨,就不能再设置为站台轨或折返轨",
section.getName(), section.getCode()));
}
}
// 是站台轨/折返轨/转换轨校验左右停车点
if ((section.isStandTrack() || section.isTransferTrack() || section.isTurnBackTrack())
&&
(Objects.isNull(sectionVO.getLeftStopPointOffset()) ||
Objects.isNull(sectionVO.getRightStopPointOffset()) ||
(0 == sectionVO.getLeftStopPointOffset().floatValue() &&
0 == sectionVO.getRightStopPointOffset().floatValue()))) {
errMsgList.add(String.format("区段[%s(%s)]是站台轨/折返轨/转换轨却未设置左右停车点偏移量或左右停车点偏移量都为0", sectionVO.getName(), sectionVO.getCode()));
} else {
section.setStopPointLeft(sectionVO.getLeftStopPointOffset());
section.setStopPointRight(sectionVO.getRightStopPointOffset());
}
// 转换轨/折返轨构建关联车站,站台轨在后面处理站台逻辑里做了
if (section.isStandTrack() || section.isTransferTrack() || section.isTurnBackTrack()) {
if (!StringUtils.hasText(sectionVO.getBelongStation())) {
errMsgList.add(String.format("区段[%s(%s)]是站台轨或转换轨或折返轨,却未设置关联车站",
sectionVO.getName(), sectionVO.getCode()));
} else {
//归属车站
Station station = (Station) elementMap.get(sectionVO.getBelongStation());
if (Objects.isNull(station)) {
errMsgList.add(String.format("折返轨/转换轨/站台轨区段[%s(%s)]关联的车站[(%s)]不存在", section.getName(), section.getCode(), sectionVO.getBelongStation()));
} else {
section.setStation(station);
if (section.isTransferTrack()) {
station.addTransferTrack(section);
}
if (section.isTurnBackTrack()) {
station.addTurnBackSection(section);
}
}
}
}
section.setDestinationCode(sectionVO.getDestinationCode());
if (StringUtils.hasText(sectionVO.getDestinationCode())) {
Section section1 = desCodeSectionMap.get(sectionVO.getDestinationCode());
if (Objects.nonNull(section1)) {
errMsgList.add(String.format("区段[%s(%s)]和区段[%s(%s)]目的地码相同[%s],目的地码必须唯一",
section.getName(), section.getCode(),
section1.getName(), section1.getCode(),
sectionVO.getDestinationCode()));
}
desCodeSectionMap.put(sectionVO.getDestinationCode(), section);
}
// 如果区段是计轴区段构建区段虚拟真实计轴器
if (section.isAxleCounter()) {
VirtualRealitySectionAxleCounter axleCounter = new VirtualRealitySectionAxleCounter(section.getCode(), section.getName());
section.setVirtualAxleCounter(axleCounter);
deviceMap.put(axleCounter.getCode(), axleCounter);
}
}
}
private static void buildSignal(MapGraphDataNewVO graphData, Map<String, MapElement> elementMap, Map<String, VirtualRealityDevice> deviceMap, List<String> errMsgList) {
List<MapSignalNewVO> signalList = graphData.getSignalList();
@ -1186,8 +1195,16 @@ public class MapDeviceBuilder {
return Objects.equals(type, BusinessConsts.Section.SectionType.Type01) || Objects.equals(type, BusinessConsts.Section.SectionType.Type03);
}
private static boolean isAxleCounterSection(String type) {
return Objects.equals(type, BusinessConsts.Section.SectionType.Type01) || Objects.equals(type, BusinessConsts.Section.SectionType.Type04);
private static boolean isAxleCounterSection(MapSectionNewVO sectionVO, List<MapSectionNewVO> sectionList) {
String type = sectionVO.getType();
if (Objects.equals(type, BusinessConsts.Section.SectionType.Type04))
return true;
if (Objects.equals(type, BusinessConsts.Section.SectionType.Type01)) {
String parentCode = sectionVO.getParentCode();
return sectionList.stream().noneMatch(section -> isCross(section.getType()) && section.getCode().equals(parentCode));
} else {
return false;
}
}
private static boolean isCross(String type) {

View File

@ -88,7 +88,7 @@ public class Section extends MayOutOfOrderDevice {
private Section parent;
/**
* 岔心关联的计轴区段道岔计轴区段关联的道岔区段物理区段关联的逻辑区段
* 岔心关联的物理区段道岔计轴区段关联的道岔区段岔心物理区段关联的逻辑区段
*/
private List<Section> logicList;
@ -740,6 +740,10 @@ public class Section extends MayOutOfOrderDevice {
aSwitch.getC().setNctOccupied(true);
}
}
Section cross = queryCross();
if (cross != null) {
cross.crossJudgeInvalid();
}
} else if (!CollectionUtils.isEmpty(this.logicList)) {
for (Section logic : this.logicList) {
logic.setNctOccupied(true);
@ -778,6 +782,21 @@ public class Section extends MayOutOfOrderDevice {
// }
}
/**
* 岔心判断失效
*/
private void crossJudgeInvalid(){
if (!this.cross)
return;
this.logicList.forEach(logic->{
Section leftSection = logic.getLeftSection();
boolean leftSectionNctOccupied = leftSection.isNctOccupied() && leftSection.getParent().equals(this.parent);
Section rightSection = logic.getRightSection();
boolean rightSectionNctOccupied = rightSection.isNctOccupied() && rightSection.getParent().equals(this.parent);
logic.setNctOccupied(leftSectionNctOccupied || rightSectionNctOccupied);
});
}
/**
* 判定为有效
*/
@ -806,6 +825,13 @@ public class Section extends MayOutOfOrderDevice {
}
}
/**
* 查询道岔计轴区段关联的岔心
*/
private Section queryCross() {
return this.logicList.stream().filter(Section::isCross).limit(1).findAny().orElse(null);
}
/**
* 确认计轴有效
*/
@ -952,12 +978,25 @@ public class Section extends MayOutOfOrderDevice {
if (switchTrack) {
return false;
}
if (virtualAxleCounter == null) {
if (parent != null)
return parent.isPreReset();
Section axleCounterSection = findAxleCounterSection();
if (axleCounterSection != null) {
return axleCounterSection.getVirtualAxleCounter().isPreReset() && this.isNctOccupied();
} else{
return false;
}
}
/**
* 查找计轴区段
* @return
*/
public Section findAxleCounterSection() {
if (this.isAxleCounter()) {
return this;
} else if (parent != null) {
return parent.findAxleCounterSection();
} else {
return virtualAxleCounter.isPreReset();
return null;
}
}

View File

@ -128,6 +128,9 @@ public class VRTrainRunningService {
if (!headAxleCounterSectionNew.isAxleCounter()) {
headAxleCounterSectionNew = headAxleCounterSectionNew.getParent();
}
if (!headAxleCounterSectionNew.isAxleCounter()) { //当是物理区段-岔心-道岔计轴区段三层结构的时候需要多这次判断
headAxleCounterSectionNew = headAxleCounterSectionNew.getParent();
}
if (headAxleCounterSectionNew != null && headAxleCounterSectionNew.isAxleCounter()) { //新的区段是计轴区段
Section headSectionOld = headPosition.getSection();
if (!headAxleCounterSectionNew.equals(headSectionOld) && !headAxleCounterSectionNew.equals(headSectionOld.getParent())) { //新计轴区段和老区段不一样

View File

@ -167,9 +167,14 @@ public class MapSectionNewVO {
/**
* 岔心关联计轴区段列表
*/
@ApiModelProperty(value = "岔心关联计轴区段列表")
@ApiModelProperty(value = "岔心关联物理区段列表")
List<String> relateSectionList;
/**
* 道岔计轴区段关联的岔心区段
*/
String relCrossSection;
/**
* 是否站台轨
*/