【实训背景列车反序列化逻辑修改】

This commit is contained in:
weizhihong 2023-01-03 16:11:04 +08:00
parent 6385e89ce4
commit e32288027b

View File

@ -1,5 +1,6 @@
package club.joylink.rtss.simulation.cbtc.data.storage;
import club.joylink.rtss.simulation.cbtc.ATP.ground.MaService;
import club.joylink.rtss.simulation.cbtc.CI.data.StationDirection;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.build.RunPlanBuilder;
@ -14,14 +15,16 @@ import club.joylink.rtss.simulation.cbtc.data.storage.vo.StorageTrainInfo;
import club.joylink.rtss.simulation.cbtc.data.storage.vr.*;
import club.joylink.rtss.simulation.cbtc.data.vo.TrainInfo;
import club.joylink.rtss.simulation.cbtc.data.vr.*;
import club.joylink.rtss.simulation.cbtc.exception.SimulationException;
import club.joylink.rtss.simulation.cbtc.exception.SimulationExceptionType;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Collectors;
@Getter
@Setter
@ -426,11 +429,46 @@ public class StorageSimulationDataRepository {
}
// 使用中的列车恢复
if (Objects.nonNull(this.usedTrainList)) {
for (StorageVirtualRealityTrain train : this.usedTrainList) {
// 已经序列化的列车
List<String> alreadyRecoverTrainCode = new ArrayList<>(this.usedTrainList.size());
// 反序列化
Consumer<StorageVirtualRealityTrain> trainRecoverConsumer = train -> {
VirtualRealityDevice vrTrain = repository.getVRByCode(train.getGroupNumber());
train.recover2Simulation(vrTrain, simulation, repository);
repository.addOnlineTrain((VirtualRealityTrain) vrTrain);
alreadyRecoverTrainCode.add(train.getCode());
};
// 前方列车类型的列车
Queue<StorageVirtualRealityTrain> trainsQueue = new LinkedList<>();
// 序列化不是前方列车类型的列车
for (StorageVirtualRealityTrain train : this.usedTrainList) {
if (train.getMa2() != null && MaService.MaType.Front_Train.equals(train.getMa2().getType())) {
trainsQueue.add(train);
} else {
trainRecoverConsumer.accept(train);
}
}
// 循环次数防止死循环
int loopTimes = 0;
// 序列化前方列车类型的列车
while (!trainsQueue.isEmpty()) {
StorageVirtualRealityTrain train = trainsQueue.poll();
if (alreadyRecoverTrainCode.contains(train.getMa2().getDeviceCode())) { // 依赖列车已序列化
trainRecoverConsumer.accept(train);
loopTimes = 0;
} else if (loopTimes == 0) {
trainsQueue.add(train);
loopTimes ++;
} else {
break;
}
}
// 循环超过一次打印错误信息
if (loopTimes > 0) {
String trainCode = trainsQueue.stream().map(StorageVirtualRealityTrain::getCode).collect(Collectors.joining(","));
throw new SimulationException(SimulationExceptionType.Simulation_Map_Data_Error,String.format("问题列车【%s】", trainCode));
}
}
// 有状态的进路恢复
if (!CollectionUtils.isEmpty(this.settingRouteList)) {