| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package top.haijunit.train.simulation.train;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.cache.annotation.Cacheable;
- import org.springframework.stereotype.Service;
- import top.haijunit.common.utils.StreamUtils;
- import top.haijunit.train.domain.constant.CacheNames;
- import top.haijunit.train.domain.constant.DirectionEnum;
- import top.haijunit.train.service.SectionService;
- import top.haijunit.train.simulation.domain.SectionItem;
- import top.haijunit.train.simulation.domain.TrainItem;
- import top.haijunit.train.utils.NumberUtil;
- import java.math.BigDecimal;
- /**
- * @author zhanghaijun
- * @date 2023/12/18 13:43
- * @description 仿真计算服务
- */
- @Slf4j
- @Service
- @RequiredArgsConstructor
- public class ComputerService {
- private final SectionService sectionService;
- public SectionItem getSectionItem(TrainItem train, BigDecimal distance) {
- return getSectionItem(train.getBlockId(), train.getDirection(), train.getOffset(), distance);
- }
- /**
- * 根据sectionId获取section
- *
- * @param sectionId 当前区段
- * @param offset 偏移量
- * @param distance 距离 可能是负数,计算车尾的位置
- * @return 前进指定距离后的所在区段
- */
- public SectionItem getSectionItem(Long sectionId, DirectionEnum direction, BigDecimal offset, BigDecimal distance) {
- SectionItem sectionItem = sectionService.getSectionItem(sectionId, direction);
- BigDecimal decimal = NumberUtil.add(offset, NumberUtil.mul(distance, sectionItem.getDirection().getFactor()));
- if (NumberUtil.isGreater(decimal, sectionItem.getSectionLength())) {
- String uId = switch (sectionItem.getDirection()) {
- case UP -> sectionItem.getPreId();
- case DOWN -> sectionItem.getNextId();
- };
- SectionItem item = sectionService.getSectionItem(uId);
- return getSectionItem(item.getSectionId(), item.getDirection(), new BigDecimal("0"), NumberUtil.sub(decimal, sectionItem.getSectionLength()));
- }
- return sectionItem;
- }
- @Deprecated
- public SectionItem getSectionItem(Long sectionId) {
- return StreamUtils.filter(sectionService.getAllSection(), item -> {
- return item.getSectionId().equals(sectionId);
- }).stream().findFirst().orElseThrow(() -> new IllegalArgumentException(String.format("不存在该区段,sectionId: %s", sectionId)));
- }
- }
|