ComputerService.java 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package top.haijunit.train.simulation.train;
  2. import lombok.RequiredArgsConstructor;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.cache.annotation.Cacheable;
  5. import org.springframework.stereotype.Service;
  6. import top.haijunit.common.utils.StreamUtils;
  7. import top.haijunit.train.domain.constant.CacheNames;
  8. import top.haijunit.train.domain.constant.DirectionEnum;
  9. import top.haijunit.train.service.SectionService;
  10. import top.haijunit.train.simulation.domain.SectionItem;
  11. import top.haijunit.train.simulation.domain.TrainItem;
  12. import top.haijunit.train.utils.NumberUtil;
  13. import java.math.BigDecimal;
  14. /**
  15. * @author zhanghaijun
  16. * @date 2023/12/18 13:43
  17. * @description 仿真计算服务
  18. */
  19. @Slf4j
  20. @Service
  21. @RequiredArgsConstructor
  22. public class ComputerService {
  23. private final SectionService sectionService;
  24. public SectionItem getSectionItem(TrainItem train, BigDecimal distance) {
  25. return getSectionItem(train.getBlockId(), train.getDirection(), train.getOffset(), distance);
  26. }
  27. /**
  28. * 根据sectionId获取section
  29. *
  30. * @param sectionId 当前区段
  31. * @param offset 偏移量
  32. * @param distance 距离 可能是负数,计算车尾的位置
  33. * @return 前进指定距离后的所在区段
  34. */
  35. public SectionItem getSectionItem(Long sectionId, DirectionEnum direction, BigDecimal offset, BigDecimal distance) {
  36. SectionItem sectionItem = sectionService.getSectionItem(sectionId, direction);
  37. BigDecimal decimal = NumberUtil.add(offset, NumberUtil.mul(distance, sectionItem.getDirection().getFactor()));
  38. if (NumberUtil.isGreater(decimal, sectionItem.getSectionLength())) {
  39. String uId = switch (sectionItem.getDirection()) {
  40. case UP -> sectionItem.getPreId();
  41. case DOWN -> sectionItem.getNextId();
  42. };
  43. SectionItem item = sectionService.getSectionItem(uId);
  44. return getSectionItem(item.getSectionId(), item.getDirection(), new BigDecimal("0"), NumberUtil.sub(decimal, sectionItem.getSectionLength()));
  45. }
  46. return sectionItem;
  47. }
  48. @Deprecated
  49. public SectionItem getSectionItem(Long sectionId) {
  50. return StreamUtils.filter(sectionService.getAllSection(), item -> {
  51. return item.getSectionId().equals(sectionId);
  52. }).stream().findFirst().orElseThrow(() -> new IllegalArgumentException(String.format("不存在该区段,sectionId: %s", sectionId)));
  53. }
  54. }