|
|
@@ -8,9 +8,10 @@ import top.haijunit.common.utils.ErrorUtil;
|
|
|
import top.haijunit.common.utils.StreamUtils;
|
|
|
import top.haijunit.train.domain.constant.TrainConstant;
|
|
|
import top.haijunit.train.domain.entity.SignStopEntity;
|
|
|
-import top.haijunit.train.service.SelectionService;
|
|
|
+import top.haijunit.train.service.SectionService;
|
|
|
import top.haijunit.train.simulation.domain.SectionItem;
|
|
|
import top.haijunit.train.simulation.domain.TrainItem;
|
|
|
+import top.haijunit.train.simulation.domain.TrainTravel;
|
|
|
import top.haijunit.train.utils.CalculatorUtil;
|
|
|
import top.haijunit.train.utils.NumberUtil;
|
|
|
|
|
|
@@ -27,7 +28,7 @@ import java.util.stream.Collectors;
|
|
|
@Service
|
|
|
@RequiredArgsConstructor
|
|
|
public class TrainComputerService {
|
|
|
- private final SelectionService selectionService;
|
|
|
+ private final SectionService sectionService;
|
|
|
|
|
|
public void run(TrainItem trainItem) {
|
|
|
try {
|
|
|
@@ -61,39 +62,22 @@ public class TrainComputerService {
|
|
|
if (sectionOptional.isEmpty()) {
|
|
|
throw new IllegalArgumentException(String.format("没有找到当前列车的所在的区段, 区段Name: %s, offset: %s", train.getBlockNo(), train.getOffset()));
|
|
|
}
|
|
|
- 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 currentOffset = NumberUtil.add(train.getOffset(), NumberUtil.mul(train.getDirection().getFactor(), distance.abs())).abs();
|
|
|
- for (int i = 0; i < list.size(); i++) {
|
|
|
- SectionItem sectionItem = list.get(i);
|
|
|
- SignStopEntity stopSign = stopSignalMap.get(sectionItem.getSectionId());
|
|
|
- if (null != stopSign && train.getBlockId().equals(sectionItem.getSectionId())) {
|
|
|
- // 存在停车标
|
|
|
- if (NumberUtil.isGreater(stopSign.getSelectionOff(), train.getOffset()) && NumberUtil.isLessOrEqual(stopSign.getSelectionOff(), currentOffset)) {
|
|
|
- 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;
|
|
|
- }
|
|
|
+ HashMap<Long, SignStopEntity> stopSignalMap = sectionService.getStopSignalMap();
|
|
|
+ TrainTravel trainTravel = new TrainTravel(sectionList, stopSignalMap);
|
|
|
+ TrainTravel.TravelItem travel = trainTravel.travel(train.getBlockId(), train.getOffset(), distance);
|
|
|
+ if (null != travel) {
|
|
|
+ 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);
|
|
|
+ return train;
|
|
|
}
|
|
|
- if (i != list.size() - 1) {
|
|
|
- currentOffset = NumberUtil.sub(currentOffset, sectionItem.getSectionLength()).abs();
|
|
|
- }
|
|
|
- currentSection = sectionItem;
|
|
|
}
|
|
|
- train.setSpeed(CalculatorUtil.velocity(train.getSpeed(), train.getAcceleration(), train.getUpdateTimeMillis(), nowMillis).abs());
|
|
|
- train.setOffset(currentOffset);
|
|
|
- train.setBlockId(currentSection.getSectionId());
|
|
|
- train.setBlockNo(currentSection.getSectionName());
|
|
|
- train.setDirection(currentSection.getDirection());
|
|
|
- train.setUpdateTimeMillis(nowMillis);
|
|
|
} else {
|
|
|
// 停车后更新时间
|
|
|
train.setUpdateTimeMillis(nowMillis);
|