新仿真逻辑——CI联锁系统逻辑开发

This commit is contained in:
walker-sheng 2021-04-02 11:22:40 +08:00
parent 7027712908
commit a3465dc020
10 changed files with 160 additions and 18 deletions

View File

@ -1,10 +1,11 @@
package club.joylink.rtss.simulation.rt.CIL; package club.joylink.rtss.simulation.rt.CIL;
import club.joylink.rtss.simulation.rt.CIL.bo.CilRepository; import club.joylink.rtss.simulation.rt.CIL.bo.*;
import club.joylink.rtss.simulation.rt.CIL.bo.CilRoute;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
@Component @Component
public class CilRouteLogicService { public class CilRouteLogicService {
@ -13,7 +14,7 @@ public class CilRouteLogicService {
for (CilRoute cilRoute : supervisedRouteList) { for (CilRoute cilRoute : supervisedRouteList) {
switch (cilRoute.getStage()) { switch (cilRoute.getStage()) {
case CilRoute.STAGE_SETTING: case CilRoute.STAGE_SETTING:
this.settingProgress(cilRoute); this.settingProgress(cilRoute, cilRepository.getConfig());
break; break;
case CilRoute.STAGE_WATCH: case CilRoute.STAGE_WATCH:
this.watchRoute(cilRoute); this.watchRoute(cilRoute);
@ -22,10 +23,46 @@ public class CilRouteLogicService {
} }
} }
private void settingProgress(CilRoute cilRoute) { private void settingProgress(CilRoute cilRoute, CilConfig config) {
if (config.isLockFirst()) {
// 预先锁闭进路区段
this.lockRouteSections(cilRoute);
}
} }
private void lockRouteSections(CilRoute cilRoute) {
CilRoutePathElement pathElement = cilRoute.getPathElement();
Set<String> handledSwitchSet = new HashSet<>();
List<CilSection> sectionList = pathElement.getSectionList();
for (CilSection cilSection : sectionList) {
CilSwitch belongSwitch = cilSection.getBelongSwitch();
if (belongSwitch != null) {
if (!handledSwitchSet.contains(belongSwitch.getId())) {
handledSwitchSet.add(belongSwitch.getId());
belongSwitch.getA().lockByRoute(cilRoute);
if (belongSwitch.isNormalPosition()) {
belongSwitch.getB().lockByRoute(cilRoute);
} else if (belongSwitch.isReversePosition()) {
belongSwitch.getC().lockByRoute(cilRoute);
} else {
belongSwitch.getB().lockByRoute(cilRoute);
belongSwitch.getC().lockByRoute(cilRoute);
}
}
continue;
}
List<CilSection> relateList = cilSection.getRelateList();
if (relateList.isEmpty()) {
cilSection.lockByRoute(cilRoute);
} else {
for (CilSection section : relateList) {
section.lockByRoute(cilRoute);
}
}
}
}
/** /**
* 进路监控 * 进路监控
* @param cilRoute * @param cilRoute

View File

@ -0,0 +1,9 @@
package club.joylink.rtss.simulation.rt.CIL.bo;
import lombok.Getter;
@Getter
public class CilConfig {
boolean lockFirst;
}

View File

@ -11,6 +11,8 @@ import java.util.Map;
public class CilRepository extends SimulationRepository { public class CilRepository extends SimulationRepository {
public static final String NAME = "CIL"; public static final String NAME = "CIL";
CilConfig config;
Map<String, CilSection> sectionMap; Map<String, CilSection> sectionMap;
Map<String, CilSwitch> switchMap; Map<String, CilSwitch> switchMap;
Map<String, CilSignal> signalMap; Map<String, CilSignal> signalMap;
@ -47,6 +49,10 @@ public class CilRepository extends SimulationRepository {
} }
public CilConfig getConfig() {
return config;
}
public CilSection getSectionById(String id) { public CilSection getSectionById(String id) {
CilSection cilSection = this.sectionMap.get(id); CilSection cilSection = this.sectionMap.get(id);
BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertNotNull(cilSection); BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertNotNull(cilSection);

View File

@ -5,11 +5,9 @@ import club.joylink.rtss.vo.client.map.MapSwitchVO;
import club.joylink.rtss.vo.client.map.MapVO; import club.joylink.rtss.vo.client.map.MapVO;
import club.joylink.rtss.vo.client.map.newmap.*; import club.joylink.rtss.vo.client.map.newmap.*;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class CilRepositoryBuilder { public class CilRepositoryBuilder {
@ -29,16 +27,57 @@ public class CilRepositoryBuilder {
buildRoutes(logicDataNew.getRouteList(), cilRepository.routeMap, cilRepository); buildRoutes(logicDataNew.getRouteList(), cilRepository.routeMap, cilRepository);
buildSectionRelations(graphDataNew.getSectionList(), cilRepository); buildSectionRelations(graphDataNew.getSectionList(), cilRepository);
buildSwitchSectionRelations(graphDataNew.getSwitchList(), cilRepository);
return cilRepository; return cilRepository;
} }
private static void buildSectionRelations(List<MapSectionNewVO> sectionList, CilRepository cilRepository) { private static void buildSectionRelations(List<MapSectionNewVO> sectionList, CilRepository cilRepository) {
Map<String, CilSection> sectionMap = cilRepository.sectionMap; Map<String, CilSection> sectionMap = cilRepository.sectionMap;
for (MapSectionNewVO sectionNewVO : sectionList) { for (MapSectionNewVO sectionNewVO : sectionList) {
List<String> relateSectionList = sectionNewVO.getRelateSectionList(); if (sectionNewVO.getType() == "05") {
if (!CollectionUtils.isEmpty(relateSectionList)) { continue;
} }
if (StringUtils.hasText(sectionNewVO.getParentCode())) {
CilSection parent = sectionMap.get(sectionNewVO.getParentCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(parent,
String.format("区段[%s]parentCode[%s]未找到对应父区段",sectionNewVO.getCode(), sectionNewVO.getParentCode()));
CilSection section = sectionMap.get(sectionNewVO.getCode());
parent.addRelateSection(section);
}
}
for (MapSectionNewVO sectionNewVO : sectionList) {
if (sectionNewVO.getType() == "01") {
// 排序逻辑区段
CilSection section = sectionMap.get(sectionNewVO.getCode());
if (!section.relateList.isEmpty()) {
section.relateList.sort(Comparator.comparing(CilSection::getName));
ArrayList<CilSection> reverseList = new ArrayList<>(section.relateList);
if (sectionNewVO.isLogicSectionNameSort()) {
Collections.reverse(reverseList);
} else {
Collections.reverse(section.relateList);
}
section.reverseList = reverseList;
}
}
}
}
private static void buildSwitchSectionRelations(List<MapSwitchVO> switchList, CilRepository cilRepository) {
Map<String, CilSwitch> switchMap = cilRepository.switchMap;
Map<String, CilSection> sectionMap = cilRepository.sectionMap;
for (MapSwitchVO mapSwitchVO : switchList) {
CilSwitch cilSwitch = switchMap.get(mapSwitchVO.getCode());
CilSection a = sectionMap.get(mapSwitchVO.getSectionACode());
CilSection b = sectionMap.get(mapSwitchVO.getSectionBCode());
CilSection c = sectionMap.get(mapSwitchVO.getSectionCCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(a,
String.format("道岔[%s]关联code为[%s]的a区段不存在",cilSwitch.getId(), mapSwitchVO.getSectionACode()));
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(b,
String.format("道岔[%s]关联code为[%s]的a区段不存在",cilSwitch.getId(), mapSwitchVO.getSectionBCode()));
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(c,
String.format("道岔[%s]关联code为[%s]的a区段不存在",cilSwitch.getId(), mapSwitchVO.getSectionCCode()));
cilSwitch.setSections(a, b, c);
} }
} }

View File

@ -1,7 +1,10 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import lombok.Getter;
import java.util.List; import java.util.List;
@Getter
public class CilRoutePathElement { public class CilRoutePathElement {
boolean right; boolean right;

View File

@ -1,23 +1,44 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import java.util.List; import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Getter
public class CilSection extends CilDevice { public class CilSection extends CilDevice {
CilSection parent; CilSection parent;
List<CilSection> logicList; List<CilSection> relateList = new ArrayList<>();
List<CilSection> reverseList = new ArrayList<>();
CilSwitch belongSwitch; CilSwitch belongSwitch;
CilSignal leftSignal; CilSignal leftSignal;
CilSignal rightSignal; CilSignal rightSignal;
boolean axcOccupy; boolean axcOccupy;
String routeId; // 锁闭进路的id
boolean rl; // 进路锁闭
boolean lr; // 进路锁闭方向true-右向false-左向
public CilSection(String id, String name) { public CilSection(String id, String name) {
super(id, name); super(id, name);
} }
public void addRelateSection(CilSection section) {
this.relateList.add(section);
section.parent = this;
}
public void updateAxcOccupyState(boolean occupy) { public void updateAxcOccupyState(boolean occupy) {
this.axcOccupy = occupy; this.axcOccupy = occupy;
} }
public void lockByRoute(CilRoute cilRoute) {
if (!Objects.equals(cilRoute.getId(), this.routeId)) {
this.routeId = cilRoute.getId();
this.rl = true;
this.lr = cilRoute.start.isRight();
}
}
} }

View File

@ -1,7 +1,14 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import lombok.Getter;
@Getter
public class CilSwitch extends CilDevice { public class CilSwitch extends CilDevice {
CilSection a;
CilSection b;
CilSection c;
int position; int position;
public static final int LOST = 0; // 失表 public static final int LOST = 0; // 失表
public static final int NORMAL = 1; // 定位 public static final int NORMAL = 1; // 定位
@ -21,4 +28,21 @@ public class CilSwitch extends CilDevice {
public void updatePosition(int state) { public void updatePosition(int state) {
this.position = state; this.position = state;
} }
public boolean isNormalPosition() {
return NORMAL == this.position;
}
public boolean isReversePosition() {
return REVERSE == this.position;
}
public void setSections(CilSection a, CilSection b, CilSection c) {
this.a = a;
this.b = b;
this.c = c;
a.belongSwitch = this;
b.belongSwitch = this;
c.belongSwitch = this;
}
} }

View File

@ -1,7 +1,10 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import lombok.Getter;
import java.util.Objects; import java.util.Objects;
@Getter
public class CilSwitchPosition { public class CilSwitchPosition {
CilSwitch cilSwitch; CilSwitch cilSwitch;

View File

@ -35,9 +35,9 @@ public class SrSwitch extends SrDevice {
this.a = a; this.a = a;
this.b = b; this.b = b;
this.c = c; this.c = c;
a.setSrSwitch(this); a.srSwitch = this;
b.setSrSwitch(this); b.srSwitch = this;
c.setSrSwitch(this); c.srSwitch = this;
if (this.a.leftTrack == null && this.a.rightTrack == null) { if (this.a.leftTrack == null && this.a.rightTrack == null) {
throw new IllegalStateException("道岔a区段两端都没有关联的区段"); throw new IllegalStateException("道岔a区段两端都没有关联的区段");
} }

View File

@ -67,7 +67,7 @@ public class SrTrack extends SrDevice implements Debug {
rightFlank.setLeftTrack(this); rightFlank.setLeftTrack(this);
} }
public void setSrSwitch(SrSwitch srSwitch) { void setSrSwitch(SrSwitch srSwitch) {
this.srSwitch = srSwitch; this.srSwitch = srSwitch;
} }