|
|
@@ -60,12 +60,19 @@ public class TrainComputerService {
|
|
|
long nowMillis = System.currentTimeMillis();
|
|
|
// 1、距离上一个周期 列车运行的距离
|
|
|
BigDecimal distance = train.getDistance(nowMillis);
|
|
|
- long timeDifference = Math.abs(nowMillis - train.getUpdateTimeMillis());
|
|
|
+
|
|
|
+ long timeDifference = Math.abs(nowMillis - train.getStopTimeMillis());
|
|
|
if (NumberUtil.isLessOrEqual(distance, BigDecimal.ZERO) && timeDifference <= TrainConstant.STOP_TIME_SECOND * 1000) {
|
|
|
+ // 更新列车数据时间
|
|
|
+ train.setUpdateTimeMillis(nowMillis);
|
|
|
// 停车状态 时间不足30S
|
|
|
train.setOpenDoor(this.openOrCloseDoor(sectionList, train, timeDifference > (TrainConstant.STOP_TIME_SECOND - 2) * 1000 ? 0 : 1));
|
|
|
return train;
|
|
|
}
|
|
|
+ // 更新速度和时间
|
|
|
+ train.setSpeed(CalculatorUtil.velocity(train.getSpeed(), train.getAcceleration(), train.getUpdateTimeMillis(), nowMillis).abs());
|
|
|
+ // 更新列车数据时间
|
|
|
+ train.setUpdateTimeMillis(nowMillis);
|
|
|
if (NumberUtil.isGreater(distance, BigDecimal.ZERO)) {
|
|
|
Optional<SectionItem> sectionOptional = StreamUtils.filter(sectionList, item -> item.getSectionId().equals(train.getBlockId())).stream().findFirst();
|
|
|
if (sectionOptional.isEmpty()) {
|
|
|
@@ -74,25 +81,53 @@ public class TrainComputerService {
|
|
|
HashMap<Long, SignStopEntity> stopSignalMap = sectionService.getStopSignalMap();
|
|
|
TrainTravel trainTravel = new TrainTravel(sectionList, stopSignalMap);
|
|
|
TrainTravel.TravelItem travel = trainTravel.travel(train, distance);
|
|
|
- train.setSpeed(CalculatorUtil.velocity(train.getSpeed(), train.getAcceleration(), train.getUpdateTimeMillis(), nowMillis).abs());
|
|
|
train.setOffset(travel.getOffset());
|
|
|
train.setBlockId(travel.getSection().getSectionId());
|
|
|
train.setBlockNo(travel.getSection().getSectionName());
|
|
|
train.setDirection(travel.getSection().getDirection());
|
|
|
- train.setUpdateTimeMillis(nowMillis);
|
|
|
if (travel.isStop()) {
|
|
|
train.setSpeed(BigDecimal.ZERO);
|
|
|
train.setAcceleration(BigDecimal.ZERO);
|
|
|
+ train.setStopTimeMillis(nowMillis);
|
|
|
return train;
|
|
|
}
|
|
|
- if (travel.getSection().isTurnBack() && NumberUtil.isGreater(travel.getOffset(), train.getTrainLength())) {
|
|
|
+ if (travel.getSection().isTurnBack()) {
|
|
|
// 存在折返标识 并且 列车已经全部进入区段
|
|
|
- train.setOffset(BigDecimal.ZERO);
|
|
|
- train.setDirection(train.getDirection() == DirectionEnum.UP ? DirectionEnum.DOWN : DirectionEnum.UP);
|
|
|
+ switch (train.getDirection()) {
|
|
|
+ case UP -> {
|
|
|
+ if (NumberUtil.isLess(travel.getOffset(), travel.getSection().getSectionLength().subtract(train.getTrainLength()).max(BigDecimal.ZERO))) {
|
|
|
+ Optional<SectionItem> optional = StreamUtils.findFirst(sectionList, item -> item.getId().equals(travel.getSection().getNextId()));
|
|
|
+ if (optional.isPresent()) {
|
|
|
+ SectionItem sectionItem = optional.get();
|
|
|
+ train.setDirection(sectionItem.getDirection());
|
|
|
+ train.setBlockId(sectionItem.getSectionId());
|
|
|
+ train.setBlockNo(sectionItem.getSectionName());
|
|
|
+ train.setOffset(BigDecimal.ZERO);
|
|
|
+ } else {
|
|
|
+ train.setSpeed(BigDecimal.ZERO);
|
|
|
+ train.setAcceleration(BigDecimal.ZERO);
|
|
|
+ return train;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case DOWN -> {
|
|
|
+ if (NumberUtil.isGreater(travel.getOffset(), train.getTrainLength())) {
|
|
|
+ Optional<SectionItem> optional = StreamUtils.findFirst(sectionList, item -> item.getId().equals(travel.getSection().getNextId()));
|
|
|
+ if (optional.isPresent()) {
|
|
|
+ SectionItem sectionItem = optional.get();
|
|
|
+ train.setDirection(sectionItem.getDirection());
|
|
|
+ train.setBlockId(sectionItem.getSectionId());
|
|
|
+ train.setBlockNo(sectionItem.getSectionName());
|
|
|
+ train.setOffset(sectionItem.getSectionLength().subtract(new BigDecimal("1")));
|
|
|
+ } else {
|
|
|
+ train.setSpeed(BigDecimal.ZERO);
|
|
|
+ train.setAcceleration(BigDecimal.ZERO);
|
|
|
+ return train;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- } else {
|
|
|
- // 停车后更新时间
|
|
|
- train.setUpdateTimeMillis(nowMillis);
|
|
|
}
|
|
|
// 计算MA
|
|
|
BigDecimal distanceMa = this.getDistanceMa(sectionList, train);
|
|
|
@@ -116,17 +151,32 @@ public class TrainComputerService {
|
|
|
|
|
|
|
|
|
private BigDecimal getDistanceMa(LinkedList<SectionItem> list, TrainItem train) {
|
|
|
- Optional<SectionItem> sectionOptional = list.stream().filter(item -> {
|
|
|
- return item.getSectionId().equals(train.getBlockId()) && item.getDirection().equals(train.getDirection());
|
|
|
- }).findFirst();
|
|
|
- if (sectionOptional.isEmpty()) {
|
|
|
+ List<SectionItem> filter = StreamUtils.filter(list, item -> item.getSectionId().equals(train.getBlockId()));
|
|
|
+ if (CollUtil.isEmpty(filter)) {
|
|
|
return BigDecimal.ZERO;
|
|
|
}
|
|
|
- return getDistanceMa(list, sectionOptional.get(), train.getOffset(), BigDecimal.ZERO);
|
|
|
+ if (filter.size() > 1) {
|
|
|
+ Optional<SectionItem> optional = StreamUtils.findFirst(filter, item -> item.getDirection().equals(train.getDirection()));
|
|
|
+ if (optional.isPresent()) {
|
|
|
+ return getDistanceMa(list, optional.get(), train.getOffset(), BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return getDistanceMa(list, filter.get(0), train.getOffset(), BigDecimal.ZERO);
|
|
|
}
|
|
|
|
|
|
public BigDecimal getDistanceMa(Collection<SectionItem> list, SectionItem sectionItem, BigDecimal offset, BigDecimal distance) {
|
|
|
- // TODO 计算MA 区段的停车标、折返标志
|
|
|
+ // TODO 计算MA 、折返标志
|
|
|
+ // 区段的停车标
|
|
|
+ HashMap<Long, SignStopEntity> stopSignalMap = sectionService.getStopSignalMap();
|
|
|
+ if (CollUtil.isNotEmpty(stopSignalMap) && stopSignalMap.containsKey(sectionItem.getSectionId())) {
|
|
|
+ // 当前区段存在停车标
|
|
|
+ SignStopEntity stopEntity = stopSignalMap.get(sectionItem.getSectionId());
|
|
|
+ BigDecimal distanceStop = switch (stopEntity.getDirection()) {
|
|
|
+ case UP -> stopEntity.getSelectionOff().abs();
|
|
|
+ case DOWN -> NumberUtil.sub(sectionItem.getSectionLength().abs(), stopEntity.getSelectionOff().abs());
|
|
|
+ };
|
|
|
+ return NumberUtil.add(distance.abs(), distanceStop.abs(), 5);
|
|
|
+ }
|
|
|
BigDecimal sectionDistance = null == offset ? sectionItem.getSectionLength() : switch (sectionItem.getDirection()) {
|
|
|
case UP -> offset.abs();
|
|
|
case DOWN -> NumberUtil.sub(sectionItem.getSectionLength().abs(), offset.abs());
|
|
|
@@ -152,7 +202,7 @@ public class TrainComputerService {
|
|
|
trainData.set(CommandEnum.TRAIN_OPEN_DOOR.getStatusStr(), state);
|
|
|
TrainWebSocketUtils.sendMessage(CommandEnum.TRAIN_OPEN_DOOR, trainData);
|
|
|
// 站台屏蔽门开关门
|
|
|
- Optional<SectionItem> optional = sectionList.stream().filter(item -> item.getSectionId().equals(train.getTrainId())).findFirst();
|
|
|
+ Optional<SectionItem> optional = sectionList.stream().filter(item -> item.getSectionId().equals(train.getBlockId())).findFirst();
|
|
|
if (optional.isPresent()) {
|
|
|
List<PlatformDoorEntity> doorList = platformDoorRepository.findByStationIdAndDirection(optional.get().getStationId(), train.getDirection());
|
|
|
for (PlatformDoorEntity entity : doorList) {
|