武汉8号线

This commit is contained in:
tiger_zhou 2022-11-10 10:28:07 +08:00
parent a5a0b3f105
commit 3cd2f52f38
4 changed files with 336 additions and 120 deletions

View File

@ -6,7 +6,6 @@ import club.joylink.rtss.simulation.cbtc.constant.RunLevel;
import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository; import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository;
import club.joylink.rtss.simulation.cbtc.data.map.MapConfig; import club.joylink.rtss.simulation.cbtc.data.map.MapConfig;
import club.joylink.rtss.simulation.cbtc.data.map.Section; import club.joylink.rtss.simulation.cbtc.data.map.Section;
import club.joylink.rtss.simulation.cbtc.data.map.Stand;
import club.joylink.rtss.simulation.cbtc.data.map.Station; import club.joylink.rtss.simulation.cbtc.data.map.Station;
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.vo.TrainInfo; import club.joylink.rtss.simulation.cbtc.data.vo.TrainInfo;
@ -15,7 +14,6 @@ import club.joylink.rtss.vo.ws.TrainPosition;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
@ -36,6 +34,7 @@ public class NewAtsTrainLoadService {
stands = station.getRdStandList(); stands = station.getRdStandList();
}*/ }*/
VirtualRealityTrain.Door door = train.getDoor1(); VirtualRealityTrain.Door door = train.getDoor1();
train.setSpeed(tp.getSpeed());
if(tp.isRight()){ if(tp.isRight()){
door = train.getDoor2(); door = train.getDoor2();
} }
@ -55,14 +54,16 @@ public class NewAtsTrainLoadService {
door.setClose(tp.isCloseDoor()); door.setClose(tp.isCloseDoor());
train.setSpeed(99F); train.setSpeed(99F);
} }
} }
public void loadTripNumberTrain(Simulation simulation, TrainPosition tp,Section section) {
public VirtualRealityTrain loadTripNumberTrain(Simulation simulation, TrainPosition tp,Section section) {
SimulationDataRepository repository = simulation.getRepository(); SimulationDataRepository repository = simulation.getRepository();
Map<String,VirtualRealityTrain> trainMap = repository.getAllVrTrain().stream().collect(Collectors.toMap(VirtualRealityTrain::getGroupNumber,Function.identity())); Map<String,VirtualRealityTrain> trainMap = repository.getAllVrTrain().stream().collect(Collectors.toMap(VirtualRealityTrain::getGroupNumber,Function.identity()));
if(Objects.equals(false,trainMap.containsKey(tp.getGroupNum()))){ if(Objects.equals(false,trainMap.containsKey(tp.getGroupNum()))){
log.error("没有找到对应车组号 param:{}",tp); log.error("没有找到对应车组号 param:{}",tp);
return; return null;
} }
VirtualRealityTrain virtualRealityTrain = repository.queryOnlineTrainBy(tp.getGroupNum()); VirtualRealityTrain virtualRealityTrain = repository.queryOnlineTrainBy(tp.getGroupNum());
@ -77,6 +78,7 @@ public class NewAtsTrainLoadService {
virtualRealityTrain.setRunLevel(RunLevel.IL); virtualRealityTrain.setRunLevel(RunLevel.IL);
trainOnline(simulation, section, tp, virtualRealityTrain); trainOnline(simulation, section, tp, virtualRealityTrain);
} }
return virtualRealityTrain;
} }
@ -95,22 +97,16 @@ public class NewAtsTrainLoadService {
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertNotNull(section.isPhysical(), "列车需加载到物理区段上"); BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertNotNull(section.isPhysical(), "列车需加载到物理区段上");
//重叠检测 //重叠检测
SectionPosition headPosition = new SectionPosition(section, tp.getLocation() - section.getKmMin()); SectionPosition headPosition = new SectionPosition(section, tp.getLocation() - section.getKmMin());
// SectionPosition headPosition = new SectionPosition(section, section.getStopPointByDirection(right));
// SectionPosition tailPosition = CalculateService.calculateNextPositionByStartAndLen(headPosition, !right, train.getLen(), false);
// boolean willOverlap = vrTrainRunningService.willOverlap(simulation, headPosition, tailPosition);
// if(willOverlap){
// return;
// }
// BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertNotTrue(willOverlap, "列车重叠");
// 列车上线并构建ATS监控列车信息 // 列车上线并构建ATS监控列车信息
manualTrainOnlineAndSupervise(simulation, train, headPosition, right); manualTrainOnlineAndSupervise(simulation, train, headPosition, right,tp);
} }
/** /**
* 人工车上线并监控 * 人工车上线并监控
*/ */
private void manualTrainOnlineAndSupervise(Simulation simulation, VirtualRealityTrain train, SectionPosition headPosition, boolean right) { private void manualTrainOnlineAndSupervise(Simulation simulation, VirtualRealityTrain train, SectionPosition headPosition, boolean right,TrainPosition tp) {
train.initManualTrain(headPosition, right); train.initManualTrain(headPosition, right,tp);
SimulationDataRepository repository = simulation.getRepository(); SimulationDataRepository repository = simulation.getRepository();
//设置列车预选模式驾驶模式运行级别 //设置列车预选模式驾驶模式运行级别
if (!headPosition.getSection().anyZcWorking()) { if (!headPosition.getSection().anyZcWorking()) {
@ -130,4 +126,7 @@ public class NewAtsTrainLoadService {
repository.addTrainInfo(trainInfo); repository.addTrainInfo(trainInfo);
} }
} }
} }

View File

@ -1,38 +1,24 @@
package club.joylink.rtss.simulation.cbtc.ATS.service; package club.joylink.rtss.simulation.cbtc.ATS.service;
import club.joylink.rtss.constants.MapPrdTypeEnum;
import club.joylink.rtss.simulation.SimulationManager;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.build.SimulationBuildParams;
import club.joylink.rtss.simulation.cbtc.data.map.Section;
import club.joylink.rtss.simulation.cbtc.data.map.Station;
import club.joylink.rtss.util.JsonUtils; import club.joylink.rtss.util.JsonUtils;
import club.joylink.rtss.vo.client.SocketMessageVO; import club.joylink.rtss.vo.client.SocketMessageVO;
import club.joylink.rtss.vo.client.WebSocketMessageType; import club.joylink.rtss.vo.client.WebSocketMessageType;
import club.joylink.rtss.vo.client.factory.SocketMessageFactory; import club.joylink.rtss.vo.client.factory.SocketMessageFactory;
import club.joylink.rtss.vo.ws.TrainPosition; import club.joylink.rtss.vo.ws.TrainPosition;
import club.joylink.rtss.websocket.StompMessageService; import club.joylink.rtss.websocket.StompMessageService;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service @Service
@Slf4j @Slf4j
public class TrainPositionService { public class TrainPositionService {
@Resource @Resource
private NewAtsTrainLoadService newAtsTrainLoadService; TrainPositionTimeOverService timeOverService;
@Resource
private SimulationManager simulationManager;
@Resource
StompMessageService messageService;
/** /**
@ -44,91 +30,11 @@ public class TrainPositionService {
public void initTrainOrUpdate(String mapName,String json){ public void initTrainOrUpdate(String mapName,String json){
TrainPosition tp = JsonUtils.read(json, TrainPosition.class); TrainPosition tp = JsonUtils.read(json, TrainPosition.class);
tp.setReceiveTime(System.currentTimeMillis()); tp.setReceiveTime(System.currentTimeMillis());
// log.info(tp.toString()); log.info(json);
List<Simulation> simulationList = this.findSimulationList(mapName); // SocketMessageVO<TrainPosition> vo = SocketMessageFactory.buildBasic(WebSocketMessageType.YJDDZH_TRAIN_POSITION,tp);
if(Objects.equals(true, CollectionUtils.isEmpty(simulationList))){ // this.messageService.send(vo);
log.error("未找到对应的类型的仿真,无法渲染列车位置 param:{}",json); this.timeOverService.addTrainAccept(mapName,tp);
return;
}
// boolean d = true;
SocketMessageVO<TrainPosition> vo = SocketMessageFactory.buildBasic(WebSocketMessageType.YJDDZH_TRAIN_POSITION,tp);
this.messageService.send(vo);
for (Simulation sim : simulationList) {
List<Section> sectionList = findDirectionAllSection(sim,tp.getRoadType());
Section section = this.findSecion(sectionList,tp);
// if(d){
// tp.setSectionCode(section.getCode());
// log.info(tp.toString());
// d = false;
// }
if(Objects.isNull(section)){
log.error("未找到对应的区段 param:{}",json);
return;
}
log.info(tp.toString());
this.newAtsTrainLoadService.loadTripNumberTrain(sim,tp,section);
}
} }
/**
* 根据传入的参数 定位对应的所在的区段
* @param sectionList
* @param tp
* @return
*/
private Section findSecion(List<Section> sectionList,TrainPosition tp){
// int i = 0;
// Section findSection;
for (Section section : sectionList) {
if(tp.isRight()){
if(tp.getLocation() <= section.getKmMax()){
return section;
}
}else{
if(tp.getLocation() <= section.getKmMax() && tp.getLocation() >= section.getKmMin()){
return section;
}
}
// i++;
}
return null;
}
/**
* 根据车辆方向获取对应的区段并升序排序
* @param sim
* @param roadType
* @return
*/
private synchronized List<Section> findDirectionAllSection(Simulation sim,Section.SectionRoadType roadType){
String key = sim.getId() + "-" + roadType.name();
List<Section> list = simulationManager.getSectionDir(key);
if(Objects.equals(true,CollectionUtils.isEmpty(list))){
list = sim.getRepository().getSectionList();
list = list.stream().filter(d->d.getRoadType() == roadType && Objects.nonNull(d.getKmMin()))
.sorted(Comparator.comparing(Section::getKmMin)).collect(Collectors.toList());
simulationManager.putSectionDirCache(key,list);
}
return list;
}
/**
* 获取对应线路的仿真并且地图类型为 MapPrdTypeEnum.YJDDZH
* @param mapName
* @return
*/
private List<Simulation> findSimulationList(String mapName){
return this.simulationManager.getSimulationList().stream().filter(d->{
if(d instanceof Simulation){
Simulation sim = (Simulation) d;
SimulationBuildParams params = sim.getBuildParams();
return Objects.equals(mapName,params.getMap().getName()) && params.getProdType() == MapPrdTypeEnum.YJDDZH;
}
return false;
}).map(d->(Simulation) d).collect(Collectors.toList());
}
} }

View File

@ -0,0 +1,134 @@
package club.joylink.rtss.simulation.cbtc.ATS.service;
import club.joylink.rtss.simulation.SimulationManager;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants;
import club.joylink.rtss.simulation.cbtc.constant.SimulationModule;
import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository;
import club.joylink.rtss.simulation.cbtc.data.map.Section;
import club.joylink.rtss.simulation.cbtc.data.status.TrainStatus;
import club.joylink.rtss.vo.ws.TrainPosition;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Service
@Slf4j
public class TrainPositionTimeOverService {
@Resource
private SimulationManager simulationManager;
@Resource
NewAtsTrainLoadService newAtsTrainLoadService;
@Value("${yjddzh.receiveTimeOver:60}")
private Integer receiveTimeOver;
private static final Map<String, TrainPosition> TRAIN_POSITION_MAP = new ConcurrentHashMap<>();
private static final Map<String,List<String>> TRAIN_SIMULATION_EXIST_MAP = new ConcurrentHashMap<>();
private static synchronized boolean checkExist(String key,Simulation simulation){
List<String> list = TRAIN_SIMULATION_EXIST_MAP.get(key);
if(CollectionUtils.isEmpty(list)){
list = new ArrayList<>();
list.add(simulation.getId());
TRAIN_SIMULATION_EXIST_MAP.put(key,list);
return true;
}else if(list.contains(simulation.getId())){
return false;
}else{
list.add(simulation.getId());
return true;
}
}
public void addTrainAccept(String mapName ,TrainPosition train){
String key = String.format("%s,%s",mapName,train.getGroupNum());
TRAIN_POSITION_MAP.put(key,train);
TRAIN_SIMULATION_EXIST_MAP.remove(key);
}
/**
* 根据车辆方向获取对应的区段并升序排序
* @param sim
* @param roadType
* @return
*/
private synchronized List<Section> findDirectionAllSection(Simulation sim, Section.SectionRoadType roadType){
String key = sim.getId() + "-" + roadType.name();
List<Section> list = simulationManager.getSectionDir(key);
if(Objects.equals(true, CollectionUtils.isEmpty(list))){
list = sim.getRepository().getSectionList();
list = list.stream().filter(d->d.getRoadType() == roadType && Objects.nonNull(d.getKmMin()))
.sorted(Comparator.comparing(Section::getKmMin)).collect(Collectors.toList());
simulationManager.putSectionDirCache(key,list);
}
return list;
}
/**
* 根据传入的参数 定位对应的所在的区段
* @param sectionList
* @param tp
* @return
*/
private Section findSecion(List<Section> sectionList,TrainPosition tp){
for (Section section : sectionList) {
if(tp.isRight()){
if(tp.getLocation() <= section.getKmMax()){
return section;
}
}else{
if(tp.getLocation() <= section.getKmMax() && tp.getLocation() >= section.getKmMin()){
return section;
}
}
}
return null;
}
private void trainInitOrUpdate(Simulation simulation){
String mapName = simulation.getBuildParams().getMap().getName();
for (Map.Entry<String,TrainPosition> entry: TRAIN_POSITION_MAP.entrySet()) {
String key = entry.getKey();
TrainPosition tp = entry.getValue();
if(!StringUtils.startsWithIgnoreCase(key,mapName)){
continue;
}
if(tp.receiveTimeOver(this.receiveTimeOver)){
if(Objects.isNull(tp.getGroupNum())){
log.error("错误的数据:" + tp);
continue;
}
if(checkExist(key,simulation)){
SimulationDataRepository repository = simulation.getRepository();
TrainStatus ts = new TrainStatus(tp.getGroupNum());
ts.setGroupNumber(tp.getGroupNum());
repository.addDeviceInfo(ts);
repository.deleteSuperviseTrain(tp.getGroupNum());
repository.deleteOnlineTrain(tp.getGroupNum());
}
continue;
}
List<Section> sectionList = findDirectionAllSection(simulation,tp.getRoadType());
Section section = this.findSecion(sectionList,tp);
if(Objects.isNull(section)){
log.error("未找到对应的区段 param:{}",tp);
continue;
}
this.newAtsTrainLoadService.loadTripNumberTrain(simulation,tp,section);
}
}
public void run(Simulation simulation){
simulation.addJob(SimulationModule.YJDDZH.name(), () -> trainInitOrUpdate(simulation), SimulationConstants.YJDDZH_LOGIC_LOOP_RATE);
}
}

View File

@ -1,46 +1,223 @@
package club.joylink.rtss.simulation.cbtc.work; package club.joylink.rtss.simulation.cbtc.work;
import club.joylink.rtss.entity.Ibp;
import club.joylink.rtss.services.ICommandService;
import club.joylink.rtss.services.IMapService;
import club.joylink.rtss.services.iscs.IscsDeviceService;
import club.joylink.rtss.services.iscs.IscsSystemResourcesService;
import club.joylink.rtss.services.publishData.IbpService;
import club.joylink.rtss.simulation.cbtc.ATS.ATSLogicLoop;
import club.joylink.rtss.simulation.cbtc.ATS.ATSMessageCollectAndDispatcher;
import club.joylink.rtss.simulation.cbtc.CI.CiLogic;
import club.joylink.rtss.simulation.cbtc.DeviceStatusService;
import club.joylink.rtss.simulation.cbtc.Simulation; import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.SimulationIdGenerator;
import club.joylink.rtss.simulation.cbtc.build.SimulationBuildParams;
import club.joylink.rtss.simulation.cbtc.build.SimulationBuilder;
import club.joylink.rtss.simulation.cbtc.build.UserConfigDataBuilder;
import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants;
import club.joylink.rtss.simulation.cbtc.depot.DepotService;
import club.joylink.rtss.simulation.cbtc.device.virtual.VRDeviceLogicLoop;
import club.joylink.rtss.simulation.cbtc.member.SimulationUser;
import club.joylink.rtss.simulation.cbtc.vo.SimulationWorkParamVO; import club.joylink.rtss.simulation.cbtc.vo.SimulationWorkParamVO;
import club.joylink.rtss.simulation.rt.iscs.IscsStatusPublisher;
import club.joylink.rtss.simulation.rt.pis.PisStatusPublisher;
import club.joylink.rtss.vo.LoginUserInfoVO; import club.joylink.rtss.vo.LoginUserInfoVO;
import club.joylink.rtss.vo.client.CommandDefinitionVO;
import club.joylink.rtss.vo.client.iscs.device.IscsDeviceVO;
import club.joylink.rtss.vo.client.iscs.systemRes.IscsSystemResourcesQueryVO;
import club.joylink.rtss.vo.client.iscs.systemRes.IscsSystemResourcesVO;
import club.joylink.rtss.vo.client.runplan.RunPlanVO;
import club.joylink.rtss.vo.client.runplan.user.RunPlanParkingTimeVO;
import club.joylink.rtss.vo.client.runplan.user.RunPlanRunlevelVO;
import club.joylink.rtss.vo.client.schedulingNew.SchedulingPlanNewVO;
import club.joylink.rtss.vo.client.simulationv1.RunAsPlanParam; import club.joylink.rtss.vo.client.simulationv1.RunAsPlanParam;
import club.joylink.rtss.vo.map.MapVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
@Slf4j @Slf4j
@Service @Service
public class EmergencySimulationWorkServiceImpl implements SimulationWorkService { public class EmergencySimulationWorkServiceImpl implements SimulationWorkService {
@Autowired
private IMapService iMapService;
@Autowired
private ICommandService iCommandService;
@Autowired
private IbpService ibpService;
@Autowired
private IscsDeviceService iscsDeviceService;
@Autowired
private IscsSystemResourcesService iscsSystemResourcesService;
@Autowired
private DepotService depotService;
@Autowired
private SimulationWorkServiceManager simulationWorkServiceManager;
@Autowired
private ATSLogicLoop atsLogicLoop;
@Autowired
private ATSMessageCollectAndDispatcher atsMessageCollectAndDispatcher;
@Autowired
private VRDeviceLogicLoop vrDeviceLogicLoop;
@Autowired
private CiLogic ciLogic;
@Autowired
private DeviceStatusService deviceStatusService;
@Override @Override
public Simulation.Type getType() { public Simulation.Type getType() {
return Simulation.Type.EMERGENCY; return Simulation.Type.EMERGENCY;
} }
private SimulationBuildParams prepareSimulationParams(long mapId, SimulationWorkParamVO workParamVO, LoginUserInfoVO loginUserInfoVO) {
// 获取地图数据
MapVO mapVO = iMapService.getMapDetail(mapId);
// List<RunPlanRunlevelVO> runLevelList = this.prepareRunLevelData(loginUserInfoVO, mapId);
// List<RunPlanParkingTimeVO> parkTimeList = this.prepareParkTimeData(loginUserInfoVO, mapId);
// 获取操作定义数据
List<CommandDefinitionVO> operationDefinitionList = iCommandService
.queryDefinitionsByLineCode(mapVO.getLineCode());
SimulationBuildParams.SimulationBuildParamsBuilder builder = SimulationBuildParams.builder();
// 都有的属性构造
builder.loginUserInfo(loginUserInfoVO)
.workParamVO(workParamVO)
.createTime(LocalDateTime.now())
.map(mapVO)
// .userRunLevelList(runLevelList)
// .userParkTimeList(parkTimeList)
.operationDefinitionList(operationDefinitionList);
//运行图选择性构造
/* LocalDate runPlanDate = SimulationConstants.getRunPlanDate();
RunPlanVO runPlanVO = findRunPlan(workParamVO, loginUserInfoVO.getAccountVO().getId(), mapId);
if (Objects.nonNull(runPlanVO)) {
runPlanVO.setRunDate(runPlanDate);
builder.runPlan(runPlanVO);
SchedulingPlanNewVO schedulingPlanNewVO;
if (loginUserInfoVO.isProjectDeviceLogin()) { // 如果是项目设备登录找通用日期的派班计划
schedulingPlanNewVO = schedulingService.queryCommonSchedulingPlanOfDay(mapId, runPlanDate);
} else {
schedulingPlanNewVO = schedulingService
.querySchedulingPlanUserFirst(loginUserInfoVO.getAccountVO().getId(), runPlanVO.getId(), runPlanDate);
}
builder.schedulingPlan(schedulingPlanNewVO);
}*/
return builder.build();
}
@Override @Override
public Simulation create(long mapId, SimulationWorkParamVO workParamVO, LoginUserInfoVO loginUserInfoVO) { public Simulation create(long mapId, SimulationWorkParamVO workParamVO, LoginUserInfoVO loginUserInfoVO) {
return null; checkParam(workParamVO);
SimulationBuildParams params = prepareSimulationParams(mapId, workParamVO, loginUserInfoVO);
String group = SimulationIdGenerator.generateGroup(loginUserInfoVO.getAccountVO().getId(), mapId);
Simulation simulation = new Simulation(group);
simulation.setBuildParams(params);
return simulation;
} }
@Override @Override
public void loadData(Simulation simulation) { public void loadData(Simulation simulation) {
SimulationBuildParams params = simulation.getBuildParams();
// ibp数据
List<Ibp> ibps = ibpService.queryEntities(params.getMap().getId());
params.getMap().setIbpList(ibps);
// iscs设备
List<IscsDeviceVO> iscsDevices = iscsDeviceService.getListByMapId(params.getMap().getId());
params.getMap().setIscsDeviceList(iscsDevices);
// iscs资源
IscsSystemResourcesQueryVO queryVO = new IscsSystemResourcesQueryVO();
queryVO.setMapId(params.getMap().getId());
List<IscsSystemResourcesVO> resourceList = iscsSystemResourcesService.criteriaQuery(queryVO);
params.getMap().setIscsSystemResourceList(resourceList);
// 加载地图数据
loadMapData(simulation);
// 车辆段
depotService.loadDepotTrain(simulation);
// 添加仿真用户
SimulationUser simulationUser = new SimulationUser(simulation, params.getLoginUserInfo());
simulation.addSimulationUser(simulationUser);
// 添加仿真成员
simulationWorkServiceManager.buildMember(simulation);
} }
private void loadMapData(Simulation simulation) {
SimulationBuildParams buildParams = simulation.getBuildParams();
simulation.setBuildParams(buildParams);
if (Objects.nonNull(buildParams.getLoginUserInfo())) {
simulation.setCreatorId(buildParams.getLoginUserInfo().getAccountVO().getIdStr());
simulation.setProject(buildParams.getLoginUserInfo().getProject());
simulation.setProjectVO(buildParams.getLoginUserInfo().getProjectInfo());
}
// 线路配置参数
simulation.getRepository().setConfig(SimulationBuilder.buildConfig(buildParams.getMap().getConfigVO(),
buildParams.getMap().getGraphDataNew().getMapFunctionConfig()));
simulation.getRepository().getConfig()
.setRouteLikeHa1(buildParams.getMap().getGraphDataNew().getGenerateConfig().isLikeHa1());
simulation.getRepository().getConfig()
.setOverlapSettingByTrigger(buildParams.getMap().getGraphDataNew().getGenerateConfig().isOverlapSettingByTrigger());
simulation.getRepository().getConfig()
.setSharingECStations(buildParams.getMap().getGraphDataNew().getGenerateConfig().getSharingECStations());
simulation.getRepository().getConfig()
.setHandleDepot(buildParams.getMap().getGraphDataNew().getGenerateConfig().isHandleDepot());
// 地图数据构建
SimulationBuilder.SimulationDeviceBuildResult mapDataBuildResult = SimulationBuilder.checkAndBuildMapData(buildParams.getMap());
// ibp数据构建
SimulationBuilder.buildIbpData(mapDataBuildResult, buildParams.getMap().getIbpList());
// iscs设备构建
SimulationBuilder.buildIscsDevices(mapDataBuildResult, buildParams.getMap().getIscsDeviceList());
simulation.getRepository().setDeviceMap(mapDataBuildResult.getDeviceMap());
simulation.getRepository().setSectionArriveNearMap(mapDataBuildResult.getSectionArriveNearMap());
simulation.getRepository().setVrDeviceMap(mapDataBuildResult.getVrDeviceMap());
simulation.getRepository().setRoutePathMap(mapDataBuildResult.getRoutePathMap());
simulation.getRepository().setDestinationMap(mapDataBuildResult.getDestinationMap());
simulation.getRepository().setRoutingList(mapDataBuildResult.getRoutingList());
simulation.getRepository().getCatenaryMap().putAll(mapDataBuildResult.getCatenaryMap());
simulation.getRepository().getSectionRespondersMap().putAll(mapDataBuildResult.getSectionRespondersMap());
simulation.getRepository().setParkingTracksMap(mapDataBuildResult.getParkingTracksMap());
UserConfigDataBuilder.buildRunLevel(simulation.getRepository(), buildParams.getUserRunLevelList(),
buildParams.getMap(), mapDataBuildResult.getErrMsgList());
UserConfigDataBuilder.buildParkTime(simulation.getRepository(), buildParams.getUserParkTimeList(),
buildParams.getMap(), mapDataBuildResult.getErrMsgList());
if (!CollectionUtils.isEmpty(mapDataBuildResult.getErrMsgList())) { // 存在数据异常
mapDataBuildResult.getErrMsgList().forEach(errMsg -> log.warn(String.format("地图数据异常:%s", errMsg)));
simulation.setMapDataError(true);
simulation.addDataErrMsgs(mapDataBuildResult.getErrMsgList());
}
// 加载ISCS资源
// SimulationBuilder.loadIscsResources(simulation, buildParams.getMap().getIscsSystemResourceList());
// 加载运行图
// SimulationBuilder.checkAndLoadRunPlan(simulation, buildParams.getRunPlan());
// 加载派班计划
// SimulationBuilder.checkAndLoadSchedulingPlan(simulation, buildParams.getSchedulingPlan());
// 加载车辆段route path
// SimulationBuilder.loadDepotInOutRoutePath(simulation);
}
@Override @Override
public void addJobs(Simulation simulation) { public void addJobs(Simulation simulation) {
atsLogicLoop.addJobsForTrainPosition(simulation);
atsMessageCollectAndDispatcher.addJobs(simulation);
vrDeviceLogicLoop.addJobsForTrainPosition(simulation);
ciLogic.addJobsForTrainPosition(simulation);
// timeOverService.run(simulation);
} }
@Override @Override
public void addMessagePublisher(Simulation simulation) { public void addMessagePublisher(Simulation simulation) {
simulation.addMessagePublisher(new IscsStatusPublisher(simulation));
simulation.addMessagePublisher(new PisStatusPublisher(simulation));
} }
@Override @Override
public void init(Simulation simulation) { public void init(Simulation simulation) {
deviceStatusService.init(simulation);
} }
@Override @Override