RouteItem.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package top.haijunit.train.simulation.domain;
  2. import lombok.Getter;
  3. import lombok.Setter;
  4. import top.haijunit.train.domain.constant.DirectionEnum;
  5. import top.haijunit.train.domain.constant.RouteStatusEnum;
  6. import top.haijunit.train.domain.constant.SwitchStateEnum;
  7. import top.haijunit.train.domain.entity.RouteEntity;
  8. import top.haijunit.train.domain.entity.SelectionEntity;
  9. import top.haijunit.train.domain.entity.SignalEntity;
  10. import top.haijunit.train.utils.NumberUtil;
  11. import java.io.Serializable;
  12. import java.math.BigDecimal;
  13. import java.util.LinkedList;
  14. import java.util.Map;
  15. import java.util.stream.Collectors;
  16. /**
  17. * @author zhanghaijun
  18. * @date 2023/12/3 01:42
  19. * @description 用于进路计算
  20. */
  21. @Getter
  22. @Setter
  23. public class RouteItem implements Serializable {
  24. // 进路Id
  25. private Long id;
  26. // 进路名称
  27. private String name;
  28. // 触发点位置
  29. private BigDecimal trigPosition;
  30. // 进路方向
  31. private DirectionEnum direction;
  32. // 进路状态
  33. private RouteStatusEnum routeStatus;
  34. // 下一条进路Id
  35. private Long nextId;
  36. // 区段
  37. private LinkedList<SelectionEntity> selectionList;
  38. // 信号灯
  39. private LinkedList<SignalEntity> signalList;
  40. // 道岔的预定状态
  41. private Map<Long, SwitchStateEnum> switchStateMap;
  42. public RouteItem(RouteEntity route, LinkedList<SelectionEntity> selectionList, LinkedList<SignalEntity> signalList) {
  43. this.id = route.getId();
  44. this.name = route.getName();
  45. this.trigPosition = route.getTrigPosition();
  46. this.direction = route.getDirection();
  47. this.routeStatus = RouteStatusEnum.IDLE;
  48. this.nextId = route.getNextId();
  49. this.switchStateMap = route.getSwitchMap();
  50. this.selectionList = selectionList;
  51. this.signalList = signalList;
  52. }
  53. /** 进路开始公里标 */
  54. public BigDecimal getHeadKilometer() {
  55. return this.getSelectionList().getFirst().getStartKilometer();
  56. }
  57. /** 进路结束公里标 */
  58. public BigDecimal getTailKilometer() {
  59. return this.getSelectionList().getLast().getEndKilometer();
  60. }
  61. public LinkedList<Long> getSelectionIds() {
  62. return this.getSelectionList().stream().map(SelectionEntity::getId).collect(Collectors.toCollection(LinkedList::new));
  63. }
  64. public LinkedList<String> getSelectionNames() {
  65. return this.getSelectionList().stream().map(SelectionEntity::getName).collect(Collectors.toCollection(LinkedList::new));
  66. }
  67. /**
  68. * @param kilometer 公里标
  69. * @param direction 方向
  70. * @return 公里标是否在当前进路中
  71. */
  72. public boolean isContain(BigDecimal kilometer, DirectionEnum direction) {
  73. if (this.getDirection() != direction) {
  74. return false;
  75. }
  76. return NumberUtil.isContain(kilometer, this.getHeadKilometer(), this.getTailKilometer());
  77. }
  78. /**
  79. * @param tailKilometer 公里标
  80. * @param direction 方向
  81. * @return 是否已经通过当前进路
  82. */
  83. public boolean isPass(BigDecimal headKilometer, BigDecimal tailKilometer, DirectionEnum direction) {
  84. if (!isContain(headKilometer, direction)) {
  85. return true;
  86. }
  87. if (!isContain(tailKilometer, direction)) {
  88. return true;
  89. }
  90. return switch (direction) {
  91. // 上行 车尾 < 进路的开始里程
  92. case UP -> NumberUtil.isLess(tailKilometer, this.getHeadKilometer());
  93. // 下行 车位 => 进路的结束里程
  94. case DOWN -> NumberUtil.isGreaterOrEqual(tailKilometer, this.getTailKilometer());
  95. };
  96. }
  97. // 是否触发下一个进路
  98. public boolean isTrigger(BigDecimal kilometer, DirectionEnum direction) {
  99. if (!isContain(kilometer, direction)) {
  100. // 车头不在进路中,直接返回false
  101. return false;
  102. }
  103. return switch (direction) {
  104. // 上行 进路开始公里数 <= 车头公里数 <= 触发点公里数
  105. case UP -> NumberUtil.isIn(kilometer, this.getHeadKilometer(), this.getTrigKilometer());
  106. // 下行 触发点公里数 <= 车头公里数 <= 进路结束公里数
  107. case DOWN -> NumberUtil.isIn(kilometer, this.getTrigKilometer(), this.getTailKilometer());
  108. };
  109. }
  110. public BigDecimal getTrigKilometer() {
  111. return this.getHeadKilometer().add(this.getTrigPosition());
  112. }
  113. // 是否包含道岔
  114. public boolean isEmptySwitch() {
  115. return this.getSwitchStateMap().isEmpty();
  116. }
  117. // 改变状态
  118. public void setStatus(RouteStatusEnum status) {
  119. this.routeStatus = status;
  120. }
  121. }