|
|
@@ -15,8 +15,6 @@ import top.haijunit.train.utils.CalculatorUtil;
|
|
|
import top.haijunit.train.utils.NumberUtil;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.time.Duration;
|
|
|
-import java.time.LocalTime;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -63,40 +61,41 @@ public class TrainComputerService {
|
|
|
if (sectionOptional.isEmpty()) {
|
|
|
throw new IllegalArgumentException(String.format("没有找到当前列车的所在的区段, 区段Name: %s, offset: %s", train.getBlockNo(), train.getOffset()));
|
|
|
}
|
|
|
- List<SectionItem> list = this.getSectionByDistance(sectionList, train.getBlockId(), train.getOffset(), distance);
|
|
|
+ List<SectionItem> list = CollUtil.reverse(this.getSectionByDistance(sectionList, train.getBlockId(), train.getOffset(), distance));
|
|
|
log.info("列车预计行驶的区段:{}", list.stream().map(SectionItem::getSectionName).collect(Collectors.joining(",")));
|
|
|
// 停车标数据
|
|
|
HashMap<Long, SignStopEntity> stopSignalMap = selectionService.getStopSignalMap(list.stream().map(SectionItem::getSectionId).collect(Collectors.toList()));
|
|
|
SectionItem currentSection = sectionOptional.get();
|
|
|
- BigDecimal currentSectionOffset = train.getOffset();
|
|
|
- BigDecimal currentDistance = distance.abs();
|
|
|
- for (SectionItem sectionItem : list) {
|
|
|
- BigDecimal offsetDistance = NumberUtil.add(currentSectionOffset, NumberUtil.mul(sectionItem.getDirection().getFactor(), currentDistance));
|
|
|
- SignStopEntity stopSign = stopSignalMap.get(sectionItem.getSectionId());
|
|
|
- if (null != stopSign && NumberUtil.isIn(stopSign.getSelectionOff(), NumberUtil.min(currentSectionOffset, offsetDistance), NumberUtil.max(currentSectionOffset, offsetDistance))) {
|
|
|
- // 存在停车标
|
|
|
- train.setSpeed(BigDecimal.ZERO);
|
|
|
- train.setAcceleration(BigDecimal.ZERO);
|
|
|
- train.setBlockId(sectionItem.getSectionId());
|
|
|
- train.setBlockNo(sectionItem.getSectionName());
|
|
|
- train.setOffset(stopSign.getSelectionOff());
|
|
|
- train.setDirection(sectionItem.getDirection());
|
|
|
- train.setUpdateTimeMillis(nowMillis);
|
|
|
- return train;
|
|
|
+ BigDecimal currentAllOffset = NumberUtil.add(train.getOffset(), NumberUtil.mul(train.getDirection().getFactor(), distance.abs()));
|
|
|
+ if (list.size() > 1) {
|
|
|
+ for (int i = 1; i < list.size(); i++) {
|
|
|
+ SectionItem sectionItem = list.get(i);
|
|
|
+ SignStopEntity stopSign = stopSignalMap.get(sectionItem.getSectionId());
|
|
|
+ if (null != stopSign && NumberUtil.isIn(stopSign.getSelectionOff(), NumberUtil.min(BigDecimal.ZERO, currentAllOffset), NumberUtil.max(BigDecimal.ZERO, currentAllOffset))) {
|
|
|
+ // 存在停车标
|
|
|
+ train.setSpeed(BigDecimal.ZERO);
|
|
|
+ train.setAcceleration(BigDecimal.ZERO);
|
|
|
+ train.setBlockId(sectionItem.getSectionId());
|
|
|
+ train.setBlockNo(sectionItem.getSectionName());
|
|
|
+ train.setOffset(stopSign.getSelectionOff());
|
|
|
+ train.setDirection(sectionItem.getDirection());
|
|
|
+ train.setUpdateTimeMillis(nowMillis);
|
|
|
+ return train;
|
|
|
+ }
|
|
|
+ currentAllOffset = NumberUtil.sub(currentAllOffset, currentSection.getSectionLength());
|
|
|
+ currentSection = sectionItem;
|
|
|
}
|
|
|
- currentSection = sectionItem;
|
|
|
- currentDistance = NumberUtil.add(currentSectionOffset, NumberUtil.mul(sectionItem.getDirection().getFactor(), currentDistance)).abs();
|
|
|
- currentSectionOffset = BigDecimal.ZERO;
|
|
|
}
|
|
|
train.setSpeed(CalculatorUtil.velocity(train.getSpeed(), train.getAcceleration(), train.getUpdateTimeMillis(), nowMillis).abs());
|
|
|
+ train.setOffset(currentAllOffset.abs());
|
|
|
train.setBlockId(currentSection.getSectionId());
|
|
|
train.setBlockNo(currentSection.getSectionName());
|
|
|
- train.setOffset(currentDistance);
|
|
|
train.setDirection(currentSection.getDirection());
|
|
|
train.setUpdateTimeMillis(nowMillis);
|
|
|
}
|
|
|
// 计算MA
|
|
|
- BigDecimal distanceMa = this.getDistanceMa(sectionList, train.getBlockId(), train.getOffset());
|
|
|
+ List<BigDecimal> list = this.getDistanceMa(sectionList, train.getBlockId(), train.getOffset(), 0);
|
|
|
+ BigDecimal distanceMa = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
BigDecimal distanceLimit = CalculatorUtil.distanceStopLimit(train.getSpeed());
|
|
|
// log.info("列车信息:列车:{},速度:{},加速度:{}, 滑行距离:{}", trainItem.getTrainId(), trainItem.getSpeed(), trainItem.getAcceleration(), distance);
|
|
|
if (NumberUtil.isLessOrEqual(distanceMa, distanceLimit)) {
|
|
|
@@ -115,18 +114,25 @@ public class TrainComputerService {
|
|
|
return train;
|
|
|
}
|
|
|
|
|
|
- private BigDecimal getDistanceMa(List<SectionItem> list, Long sectionId, BigDecimal offset) {
|
|
|
- BigDecimal ma = BigDecimal.ZERO;
|
|
|
+ private List<BigDecimal> getDistanceMa(LinkedList<SectionItem> list, Long sectionId, BigDecimal offset, int count) {
|
|
|
+ List<BigDecimal> maList = new ArrayList<>();
|
|
|
+ if (count > 10) {
|
|
|
+ log.error("循环太多了-- 计算MA,当前count:{}", count);
|
|
|
+ }
|
|
|
Optional<SectionItem> sectionItem = list.stream().filter(item -> item.getSectionId().equals(sectionId)).findFirst();
|
|
|
if (sectionItem.isPresent()) {
|
|
|
SectionItem item = sectionItem.get();
|
|
|
- ma = ma.add(switch (item.getDirection()) {
|
|
|
+ maList.add(switch (item.getDirection()) {
|
|
|
case UP -> NumberUtil.equals(offset, BigDecimal.ZERO) ? item.getSectionLength().abs() : offset.abs();
|
|
|
case DOWN -> NumberUtil.sub(sectionItem.get().getSectionLength(), offset).abs();
|
|
|
});
|
|
|
- ma = ma.add(getDistanceMa(list, sectionItem.get().getSectionNextId(), BigDecimal.ZERO));
|
|
|
+ if (!list.getLast().getSectionId().equals(sectionId)) {
|
|
|
+ // list 是有序的,最后一个不需要再去找了,避免无限循环
|
|
|
+ List<BigDecimal> distanceMa = getDistanceMa(list, sectionItem.get().getSectionNextId(), BigDecimal.ZERO, count + 1);
|
|
|
+ maList.addAll(distanceMa);
|
|
|
+ }
|
|
|
}
|
|
|
- return ma;
|
|
|
+ return maList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -141,7 +147,9 @@ public class TrainComputerService {
|
|
|
private List<SectionItem> getSectionByDistance(LinkedList<SectionItem> list, Long sectionId, BigDecimal offset, BigDecimal distance) {
|
|
|
Optional<SectionItem> sectionOptional = StreamUtils.filter(list, item -> item.getSectionId().equals(sectionId)).stream().findFirst();
|
|
|
if (sectionOptional.isEmpty()) {
|
|
|
- throw new IllegalArgumentException(String.format("没有找到当前列车的所在的区段, 区段Id: %s, offset: %s", sectionId, offset));
|
|
|
+ log.error("没有找到当前列车的所在的区段, 区段Id: {}, offset: {}", sectionId, offset);
|
|
|
+ return new ArrayList<>();
|
|
|
+ // throw new IllegalArgumentException(String.format("没有找到当前列车的所在的区段, 区段Id: %s, offset: %s", sectionId, offset));
|
|
|
}
|
|
|
List<SectionItem> resultList = new ArrayList<>();
|
|
|
SectionItem sectionItem = sectionOptional.get();
|
|
|
@@ -152,10 +160,9 @@ public class TrainComputerService {
|
|
|
case UP -> offsetDistance.abs();
|
|
|
case DOWN -> NumberUtil.sub(offsetDistance, sectionItem.getSectionLength());
|
|
|
};
|
|
|
- return getSectionByDistance(list, sectionItem.getSectionNextId(), new BigDecimal("0.00"), distanceNext);
|
|
|
- } else {
|
|
|
- resultList.add(sectionItem);
|
|
|
- return CollUtil.reverse(resultList);
|
|
|
+ resultList.addAll(getSectionByDistance(list, sectionItem.getSectionNextId(), new BigDecimal("0.00"), distanceNext));
|
|
|
}
|
|
|
+ resultList.add(sectionItem);
|
|
|
+ return resultList;
|
|
|
}
|
|
|
}
|