zhanghaijun лет назад: 2
Родитель
Сommit
f8364efea9
23 измененных файлов с 229 добавлено и 110 удалено
  1. 5 0
      train-server/README.md
  2. 2 2
      train-server/src/main/java/top/haijunit/train/domain/constant/TrainConstant.java
  3. 2 2
      train-server/src/main/java/top/haijunit/train/domain/constant/DirectionConverter.java
  4. 26 0
      train-server/src/main/java/top/haijunit/train/domain/convert/LocalDateToDateConverter.java
  5. 26 0
      train-server/src/main/java/top/haijunit/train/domain/convert/LocalDateToTimestampConverter.java
  6. 2 1
      train-server/src/main/java/top/haijunit/train/domain/constant/RouteStatusConverter.java
  7. 2 1
      train-server/src/main/java/top/haijunit/train/domain/constant/SignalStateConverter.java
  8. 2 1
      train-server/src/main/java/top/haijunit/train/domain/constant/SwitchStateConverter.java
  9. 11 2
      train-server/src/main/java/top/haijunit/train/domain/entity/RouteEntity.java
  10. 6 2
      train-server/src/main/java/top/haijunit/train/domain/entity/SelectionEntity.java
  11. 1 4
      train-server/src/main/java/top/haijunit/train/domain/entity/SignStopEntity.java
  12. 6 4
      train-server/src/main/java/top/haijunit/train/domain/entity/SwitchEntity.java
  13. 30 3
      train-server/src/main/java/top/haijunit/train/service/RouteService.java
  14. 8 5
      train-server/src/main/java/top/haijunit/train/service/SwitchService.java
  15. 23 26
      train-server/src/main/java/top/haijunit/train/simulation/RouteComputerService.java
  16. 1 7
      train-server/src/main/java/top/haijunit/train/simulation/TrainComputerService.java
  17. 3 0
      train-server/src/main/java/top/haijunit/train/simulation/TrainItem.java
  18. 20 1
      train-server/src/main/java/top/haijunit/train/simulation/TrainSimulationHolder.java
  19. 3 0
      train-server/src/main/resources/db/changelog/db-server-train.xml
  20. 9 9
      train-server/src/main/resources/db/changelog/db_route.txt
  21. 38 38
      train-server/src/main/resources/db/changelog/db_selection.txt
  22. 2 2
      train-web/src/pages/train/controller/DrawTrack.ts
  23. 1 0
      train-web/src/types/train.d.ts

+ 5 - 0
train-server/README.md

@@ -1,3 +1,8 @@
+## 列车运行计算
+
+1、占用、 列车 车头 过了信号灯 变成红色
+2、列车 车尾离开 进路 型号等 空闲状态
+
 ## 共享数据+锁
 
 ```java

+ 2 - 2
train-server/src/main/java/top/haijunit/train/domain/constant/TrainConstant.java

@@ -18,7 +18,7 @@ public interface TrainConstant {
     // 惰行减速度固定为-0.05 m/s2
     BigDecimal SLOW_DOWN_LIMIT = new BigDecimal("-0.05");
     // 列车停站时间统一为30s
-    BigDecimal STOP_TIME_SECOND = new BigDecimal(30);
+    long STOP_TIME_SECOND = 30;
     // 道岔转换要维持3S
-    BigDecimal SWITCH_CHANGE_TIME_SECOND = new BigDecimal(3);
+    long SWITCH_CHANGE_TIME_SECOND = 3;
 }

+ 2 - 2
train-server/src/main/java/top/haijunit/train/domain/constant/DirectionConverter.java

@@ -1,8 +1,8 @@
-package top.haijunit.train.domain.constant;
+package top.haijunit.train.domain.convert;
 
 import jakarta.persistence.AttributeConverter;
 import jakarta.persistence.Converter;
-import top.haijunit.train.socket.CommandEnum;
+import top.haijunit.train.domain.constant.DirectionEnum;
 
 import java.util.Optional;
 

+ 26 - 0
train-server/src/main/java/top/haijunit/train/domain/convert/LocalDateToDateConverter.java

@@ -0,0 +1,26 @@
+package top.haijunit.train.domain.convert;
+
+import jakarta.persistence.AttributeConverter;
+import jakarta.persistence.Converter;
+
+import java.sql.Date;
+import java.time.LocalDate;
+
+/**
+ * @author zhanghaijun
+ * @date 2023/12/1 16:26
+ * @description [一句话描述该类的功能]
+ */
+@Converter(autoApply = true)
+public class LocalDateToDateConverter implements AttributeConverter<LocalDate, Date> {
+
+    @Override
+    public Date convertToDatabaseColumn(LocalDate localDate) {
+        return (localDate == null ? null : Date.valueOf(localDate));
+    }
+
+    @Override
+    public LocalDate convertToEntityAttribute(Date date) {
+        return (date == null ? null : date.toLocalDate());
+    }
+}

+ 26 - 0
train-server/src/main/java/top/haijunit/train/domain/convert/LocalDateToTimestampConverter.java

@@ -0,0 +1,26 @@
+package top.haijunit.train.domain.convert;
+
+import jakarta.persistence.AttributeConverter;
+import jakarta.persistence.Converter;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+
+/**
+ * @author zhanghaijun
+ * @date 2023/12/1 16:28
+ * @description [一句话描述该类的功能]
+ */
+@Converter(autoApply = true)
+public class LocalDateToTimestampConverter implements AttributeConverter<LocalDateTime, Timestamp> {
+
+    @Override
+    public Timestamp convertToDatabaseColumn(LocalDateTime localDateTime) {
+        return (localDateTime == null ? null : Timestamp.valueOf(localDateTime));
+    }
+
+    @Override
+    public LocalDateTime convertToEntityAttribute(Timestamp timestamp) {
+        return (timestamp == null ? null : timestamp.toLocalDateTime());
+    }
+}

+ 2 - 1
train-server/src/main/java/top/haijunit/train/domain/constant/RouteStatusConverter.java

@@ -1,7 +1,8 @@
-package top.haijunit.train.domain.constant;
+package top.haijunit.train.domain.convert;
 
 import jakarta.persistence.AttributeConverter;
 import jakarta.persistence.Converter;
+import top.haijunit.train.domain.constant.RouteStatusEnum;
 
 import java.util.Optional;
 

+ 2 - 1
train-server/src/main/java/top/haijunit/train/domain/constant/SignalStateConverter.java

@@ -1,7 +1,8 @@
-package top.haijunit.train.domain.constant;
+package top.haijunit.train.domain.convert;
 
 import jakarta.persistence.AttributeConverter;
 import jakarta.persistence.Converter;
+import top.haijunit.train.domain.constant.SignalStateEnum;
 
 import java.util.Optional;
 

+ 2 - 1
train-server/src/main/java/top/haijunit/train/domain/constant/SwitchStateConverter.java

@@ -1,7 +1,8 @@
-package top.haijunit.train.domain.constant;
+package top.haijunit.train.domain.convert;
 
 import jakarta.persistence.AttributeConverter;
 import jakarta.persistence.Converter;
+import top.haijunit.train.domain.constant.SwitchStateEnum;
 
 import java.util.Optional;
 

+ 11 - 2
train-server/src/main/java/top/haijunit/train/domain/entity/RouteEntity.java

@@ -51,6 +51,8 @@ public class RouteEntity implements Serializable {
     private DirectionEnum direction;
     // 进路状态
     private RouteStatusEnum routeStatus;
+    // 下一条进路Id
+    private Long nextId;
 
     public ArrayList<Long> getSelectionList() {
         if (StrUtil.isBlank(this.getSeleIds())) {
@@ -108,7 +110,14 @@ public class RouteEntity implements Serializable {
     }
 
     /** 是否触发进路 */
-    public boolean isTrigger(BigDecimal kilometer, BigDecimal nextPrePosition) {
-        return kilometer.compareTo(this.getTrigPosition()) >= 0 && kilometer.compareTo(nextPrePosition) < 0;
+    public boolean isTrigger(BigDecimal kilometer, DirectionEnum direction) {
+        switch (direction) {
+            case UP:
+                return kilometer.compareTo(this.getTrigPosition()) <= 0;
+            case DOWN:
+                return kilometer.compareTo(this.getTrigPosition()) >= 0;
+            default:
+                return false;
+        }
     }
 }

+ 6 - 2
train-server/src/main/java/top/haijunit/train/domain/entity/SelectionEntity.java

@@ -1,13 +1,15 @@
 package top.haijunit.train.domain.entity;
 
-import jakarta.persistence.*;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
 import lombok.Data;
 import top.haijunit.train.domain.constant.DirectionEnum;
 import top.haijunit.train.domain.constant.RouteStatusEnum;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.util.List;
 
 /**
  * @author zhang
@@ -39,6 +41,8 @@ public class SelectionEntity implements Serializable {
     private Long stationId;
     // 区段状态
     private RouteStatusEnum status;
+    // 是否是道岔
+    private boolean isSwitch;
 
     // @OneToMany
     // @JoinColumn(name = "selection_id")

+ 1 - 4
train-server/src/main/java/top/haijunit/train/domain/entity/SignStopEntity.java

@@ -1,9 +1,6 @@
 package top.haijunit.train.domain.entity;
 
-import jakarta.persistence.Entity;
-import jakarta.persistence.GeneratedValue;
-import jakarta.persistence.GenerationType;
-import jakarta.persistence.Id;
+import jakarta.persistence.*;
 import lombok.Data;
 import top.haijunit.train.domain.constant.DirectionEnum;
 

+ 6 - 4
train-server/src/main/java/top/haijunit/train/domain/entity/SwitchEntity.java

@@ -1,13 +1,15 @@
 package top.haijunit.train.domain.entity;
 
-import jakarta.persistence.*;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
 import lombok.Data;
 import top.haijunit.train.domain.constant.SwitchStateEnum;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalTime;
-import java.util.Date;
+import java.time.LocalDateTime;
 
 /**
  * @author zhang
@@ -40,7 +42,7 @@ public class SwitchEntity implements Serializable {
     private Long stationId;
 
     // 道岔状态的更新时间
-    private Date updateStateTime;
+    private LocalDateTime updateStateTime;
     // 道岔的状态
     private SwitchStateEnum switchState;
 }

+ 30 - 3
train-server/src/main/java/top/haijunit/train/service/RouteService.java

@@ -3,11 +3,18 @@ package top.haijunit.train.service;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import top.haijunit.common.utils.StreamUtils;
+import top.haijunit.train.domain.constant.DirectionEnum;
 import top.haijunit.train.domain.entity.RouteEntity;
+import top.haijunit.train.domain.entity.SelectionEntity;
 import top.haijunit.train.domain.repository.RouteRepository;
+import top.haijunit.train.domain.repository.SelectionRepository;
+import top.haijunit.train.simulation.TrainItem;
 
-import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
 
 /**
  * @author zhanghaijun
@@ -20,9 +27,10 @@ import java.util.List;
 public class RouteService {
 
     private final RouteRepository routeRepository;
+    private final SelectionRepository selectionRepository;
 
-    public RouteEntity isTrigger(BigDecimal kilometer, BigDecimal nextPrePosition) {
-        return routeRepository.findAll().stream().filter(item -> item.isTrigger(kilometer, nextPrePosition)).findFirst().orElse(null);
+    public RouteEntity getNextRoute(RouteEntity route) {
+        return routeRepository.findById(route.getNextId()).orElse(null);
     }
 
     public RouteEntity getNextRoute(Long id) {
@@ -38,4 +46,23 @@ public class RouteService {
         }
         return null;
     }
+
+    public RouteEntity getCurrentRoute(TrainItem train) {
+        Map<Long, SelectionEntity> selectionMap = StreamUtils.toMap(selectionRepository.findAll(), SelectionEntity::getId, Function.identity());
+        for (RouteEntity route : routeRepository.findAll()) {
+            ArrayList<Long> list = route.getSelectionList();
+            SelectionEntity start = selectionMap.get(list.get(0));
+            SelectionEntity end = selectionMap.get(list.get(list.size() - 1));
+            if (null == start || null == end) {
+                continue;
+            }
+            if (train.getDirection() == DirectionEnum.UP && start.getStartKilometer().compareTo(train.getKilometer()) <= 0 && end.getStartKilometer().add(end.getSelectionLength()).compareTo(train.getKilometer()) > 0) {
+                return route;
+            }
+            if (train.getDirection() == DirectionEnum.DOWN && start.getStartKilometer().compareTo(train.getKilometer()) >= 0 && end.getStartKilometer().add(end.getSelectionLength()).compareTo(train.getKilometer()) < 0) {
+                return route;
+            }
+        }
+        return null;
+    }
 }

+ 8 - 5
train-server/src/main/java/top/haijunit/train/service/SwitchService.java

@@ -5,11 +5,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
 import org.springframework.stereotype.Service;
 import top.haijunit.train.domain.constant.SwitchStateEnum;
+import top.haijunit.train.domain.constant.TrainConstant;
 import top.haijunit.train.domain.entity.SwitchEntity;
 import top.haijunit.train.domain.repository.SwitchRepository;
 
-import java.time.LocalTime;
-import java.util.Date;
+import java.time.LocalDateTime;
 import java.util.Map;
 
 /**
@@ -33,19 +33,22 @@ public class SwitchService {
     public boolean changeSwitchState(Map<Long, SwitchStateEnum> switchStateMap) {
         boolean isChanged = false;
         if (MapUtils.isEmpty(switchStateMap)) {
-            return isChanged;
+            return false;
         }
         for (Map.Entry<Long, SwitchStateEnum> entry : switchStateMap.entrySet()) {
             SwitchEntity switchEntity = switchRepository.findById(entry.getKey()).orElse(null);
             if (switchEntity == null) {
                 log.error("-----道岔不存在, id: {}", entry.getKey());
-                continue;
+                return false;
             }
             if (switchEntity.getSwitchState() != entry.getValue()) {
                 switchEntity.setSwitchState(entry.getValue());
-                switchEntity.setUpdateStateTime(new Date());
+                switchEntity.setUpdateStateTime(LocalDateTime.now());
                 switchRepository.save(switchEntity);
                 isChanged = true;
+            } else if (LocalDateTime.now().isBefore(switchEntity.getUpdateStateTime().plusSeconds(TrainConstant.SWITCH_CHANGE_TIME_SECOND))) {
+                // 道岔切换状态需要时间3s
+                isChanged = true;
             }
         }
         return isChanged;

+ 23 - 26
train-server/src/main/java/top/haijunit/train/simulation/RouteComputerService.java

@@ -1,9 +1,7 @@
 package top.haijunit.train.simulation;
 
-import cn.hutool.core.collection.CollUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import top.haijunit.common.utils.StreamUtils;
 import top.haijunit.train.domain.constant.RouteStatusEnum;
@@ -12,7 +10,6 @@ import top.haijunit.train.domain.entity.RouteEntity;
 import top.haijunit.train.service.RouteService;
 import top.haijunit.train.service.SwitchService;
 
-import java.math.BigDecimal;
 import java.util.LinkedList;
 
 /**
@@ -29,35 +26,39 @@ public class RouteComputerService {
     private final RouteService routeService;
 
     public void run(TrainItem train) {
-        // 占用、 列车 车头 过了信号灯 变成红色
-        // 列车 车尾离开 进路 型号等 空闲状态
-        //
-        LinkedList<RouteEntity> list = routeCompute(train);
-        // TODO 释放车尾已过的进路
-
         // 更新进路共享数据
-        TrainSimulationHolder.addRouteList(train.getId(), list);
+        TrainSimulationHolder.addRouteList(train.getId(), routeCompute(train));
     }
 
     public LinkedList<RouteEntity> routeCompute(TrainItem train) {
-        LinkedList<RouteEntity> routeList = TrainSimulationHolder.getRouteList(train.getId());
-        // 1、是否触发进路计算
+        // 1、是否触发进路计算  条件:下一个进路还已经触发 && 列车车头已经越过当前进路的触发点
         // 2、寻找下一跳进路
         // 3、下一条进路是否为空闲
         // 4、下一条进路是否包括道岔,道岔状态是否正确
         // 5、将下一条进路状态置为锁定状态
         // 6、释放车尾已过的进路
-        // TODO 假设向前走100米
-        BigDecimal nextPrePosition = train.getKilometer().add(new BigDecimal(100));
-        RouteEntity routeTrigger = routeService.isTrigger(train.getKilometer(), nextPrePosition);
-        if (null == routeTrigger) {
+        LinkedList<RouteEntity> routeList = TrainSimulationHolder.getRouteList(train.getId());
+        RouteEntity currentRoute = TrainSimulationHolder.getCurrentRoute(train);
+        if (null == currentRoute) {
+            log.info("初始化,没有找到当前的进路信息,列车: {}", train.getId());
+            // 初始化为空处理
+            currentRoute = routeService.getCurrentRoute(train);
+            currentRoute.setRouteStatus(RouteStatusEnum.OCCUPY);
+            routeList = new LinkedList<>();
+            routeList.add(currentRoute);
+        }
+        int index = routeList.indexOf(currentRoute);
+        if (index > 0) {
+            // 当前进路不是第一个进路,需要考虑释放资源 TODO 车尾是否完全进入到当前进路
+            routeList = new LinkedList<>(routeList.subList(index, routeList.size() - 1));
+        }
+        if (!currentRoute.isTrigger(train.getKilometer(), train.getDirection())) {
             // 没有触发进路
             return routeList;
         }
-        // 找到下一个进路
-        RouteEntity nextRoute = routeService.getNextRoute(routeTrigger.getId());
+        RouteEntity nextRoute = routeService.getNextRoute(currentRoute);
         if (null == nextRoute || !StreamUtils.filter(routeList, (item -> item.getId().equals(nextRoute.getId()))).isEmpty()) {
-            // 没有找到下一个进路
+            // 没有找到下一条进路 || 已在已有进路列表中
             return routeList;
         }
         // a)检查进路当前是否为出清/空闲状态,否则返回触发失败;
@@ -65,13 +66,9 @@ public class RouteComputerService {
             // 下一跳进路为非出清状态
             return routeList;
         }
-        if (!nextRoute.getSwitchList().isEmpty()) {
-            // b)检查进路中道岔状态是否与进路要求的状态一致
-            boolean changed = switchService.changeSwitchState(nextRoute.getSwitchMap());
-            if (changed) {
-                // TODo 切换道岔需要时间
-                return routeList;
-            }
+        if (!nextRoute.getSwitchList().isEmpty() && switchService.changeSwitchState(nextRoute.getSwitchMap())) {
+            // b)检查进路中道岔状态是否与进路要求的状态一致 切换道岔需要时间
+            return routeList;
         }
         // c)出清(如果包括道岔,道岔已就位),将进路至于锁闭状态
         nextRoute.setRouteStatus(RouteStatusEnum.LOCK);

+ 1 - 7
train-server/src/main/java/top/haijunit/train/simulation/TrainComputerService.java

@@ -4,11 +4,8 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import top.haijunit.train.domain.entity.RouteEntity;
-import top.haijunit.train.domain.entity.SelectionEntity;
-import top.haijunit.train.domain.repository.SelectionRepository;
 
 import java.util.LinkedList;
-import java.util.List;
 
 /**
  * @author zhanghaijun
@@ -20,16 +17,13 @@ import java.util.List;
 @RequiredArgsConstructor
 public class TrainComputerService {
 
-    private SelectionRepository selectionRepository;
-
     public void run(TrainItem trainItem) {
         LinkedList<RouteEntity> routeList = TrainSimulationHolder.getRouteList(trainItem.getId());
         if (routeList!= null &&!routeList.isEmpty()) {
             // 没有触发进路
             return;
         }
-        List<SelectionEntity> selectionEntities = selectionRepository.findAll();
-
+        // TrainSimulationHolder.getCurrentRoute(trainItem);
 
     }
 }

+ 3 - 0
train-server/src/main/java/top/haijunit/train/simulation/TrainItem.java

@@ -24,6 +24,8 @@ public class TrainItem extends TrainEntity {
     private BigDecimal kilometer;
     // 运行方向
     private DirectionEnum direction;
+    // 当前区段Id
+    private Long blockId;
     // 当前区段号
     private String blockNo;
     // 偏移
@@ -41,6 +43,7 @@ public class TrainItem extends TrainEntity {
         this.speed = new BigDecimal("0.00");
         this.acceleration = new BigDecimal("0.00");
         // TODO 区段号
+        this.blockId = 0L;
         this.blockNo = "";
         this.offset = new BigDecimal("0.00");
     }

+ 20 - 1
train-server/src/main/java/top/haijunit/train/simulation/TrainSimulationHolder.java

@@ -1,11 +1,14 @@
 package top.haijunit.train.simulation;
 
+import cn.hutool.core.collection.CollUtil;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import top.haijunit.train.domain.constant.RouteStatusEnum;
 import top.haijunit.train.domain.entity.RouteEntity;
 
-import java.util.*;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -47,6 +50,22 @@ public class TrainSimulationHolder {
         return TRAVEL_ROUTE_MAP;
     }
 
+    public static RouteEntity getCurrentRoute(TrainItem train) {
+        if (null == train) {
+            return null;
+        }
+        LinkedList<RouteEntity> list = TRAVEL_ROUTE_MAP.get(train.getId());
+        if (CollUtil.isEmpty(list)) {
+            return null;
+        }
+        for (RouteEntity route : list) {
+            if (route.getSelectionList().contains(train.getBlockId())) {
+                return route;
+            }
+        }
+        return null;
+    }
+
     public static boolean isRouteIdle(Long routeId) {
         for (Map.Entry<Long, LinkedList<RouteEntity>> entry : TRAVEL_ROUTE_MAP.entrySet()) {
             return entry.getValue().stream().noneMatch(item -> item.getId().equals(routeId) && !item.getRouteStatus().equals(RouteStatusEnum.IDLE));

+ 3 - 0
train-server/src/main/resources/db/changelog/db-server-train.xml

@@ -81,6 +81,7 @@
             <column name="trig_position" type="DECIMAL(10, 2)" defaultValueNumeric="0.00" remarks="触发点位置"/>
             <column name="direction" type="${number.type}" defaultValueNumeric="1" remarks="进路方向"/>
             <column name="route_status" type="${number.type}" defaultValueNumeric="2" remarks="进路状态"/>
+            <column name="next_id" type="${autoing.type}" defaultValueNumeric="0" remarks="下一条进路Id"/>
         </createTable>
     </changeSet>
     <changeSet id="load-db_route-data" author="zhanghaijun" failOnError="false" runOnChange="true">
@@ -95,6 +96,7 @@
             <column name="switch_state" type="STRING"/>
             <column name="trig_position" type="NUMERIC"/>
             <column name="direction" type="NUMERIC"/>
+            <column name="next_id" type="NUMERIC"/>
         </loadUpdateData>
     </changeSet>
 
@@ -112,6 +114,7 @@
             <column name="zf_state" type="boolean" defaultValueBoolean="false" remarks="折返标志"/>
             <column name="station_id" type="${autoing.type}" defaultValueNumeric="0" remarks="所属车站编号"/>
             <column name="status" type="${number.type}" defaultValueNumeric="2" remarks="状态"/>
+            <column name="is_switch" type="boolean" defaultValueNumeric="2" remarks="是否是道岔"/>
         </createTable>
     </changeSet>
     <changeSet id="load-selection-data" author="zhanghaijun" failOnError="false" runOnChange="true">

+ 9 - 9
train-server/src/main/resources/db/changelog/db_route.txt

@@ -1,9 +1,9 @@
-id,name,signal_ids,signal_state,sele_ids,switch_id,switch_state,trig_position,direction,route_status
-108001,S0306-S0301,101016,3,103025-103032-103031-103010-103009,102007-102004,2-2,7196.89,1,2
-108002,S0301-S0201,101011,2,103008-103007,-1,-1,6841.26,1,2
-108003,S0201-S0103,101007,2,103006-103005,-1,-1,3941.26,1,2
-108004,S0103-S0102,101002,3,103012-103030-103029-103015-103014,102003-102002,2-2,550,1,2
-108005,S0102-S0106,101002,2,103015-103016-103017-103018,102002-102004,1-1,130,2,2
-108006,S0106-S0204,101006,2,103019-103020,-1,-1,585,2,2
-108007,S0204-S0304,101010,2,103021-103022,-1,-1,3641,2,2
-108008,S0304-S0306,101014,2,103023-103024-103025-103026,102005-102007,1-1,6786,2,2
+id,name,signal_ids,signal_state,sele_ids,switch_id,switch_state,trig_position,direction,route_status,next_id
+108001,S0306-S0301,101016,3,103025-103032-103031-103010-103009,102007-102004,2-2,7196.89,1,2,108002
+108002,S0301-S0201,101011,2,103008-103007,-1,-1,6841.26,1,2,108003
+108003,S0201-S0103,101007,2,103006-103005,-1,-1,3941.26,1,2,108004
+108004,S0103-S0102,101002,3,103012-103030-103029-103015-103014,102003-102002,2-2,550,1,2,108005
+108005,S0102-S0106,101002,2,103015-103016-103017-103018,102002-102004,1-1,130,2,2,108006
+108006,S0106-S0204,101006,2,103019-103020,-1,-1,585,2,2,108007
+108007,S0204-S0304,101010,2,103021-103022,-1,-1,3641,2,2,108008
+108008,S0304-S0306,101014,2,103023-103024-103025-103026,102005-102007,1-1,6786,2,2,108001

+ 38 - 38
train-server/src/main/resources/db/changelog/db_selection.txt

@@ -1,41 +1,41 @@
-id,name,start_kilometer,selection_length,pre_id,next_id,direction,zf_state,status,station_id
-103001,T0101,0,150,-1,103002,1,1,2,104001
-103002,T0103-1,150,50,103001,103003,1,0,2,104001
-103003,T0103-2,200,200,103002,103004,1,0,2,104001
-103004,T0103-3,400,50,103003,103005,1,0,2,104001
-103005,T0105,450,145.63,103004,103006,1,0,2,104001
-103006,T0107,595.63,3000,103005,103007,1,0,2,104001
-103007,T0203,3595.63,145.63,103006,103008,1,0,2,104002
-103008,T0205,3741.26,3000,103007,103009,1,0,2,104002
-103009,T0301,6741.26,145.63,103008,103010,1,0,2,104003
-103010,T0303-1,6886.89,50,103009,103011,1,0,2,104003
-103011,T0303-2,6936.89,200,103010,103012,1,0,2,104003
-103012,T0303-3,7136.89,50,103011,103013,1,0,2,104003
-103013,T0305,7186.89,150,103012,-1,1,1,2,104003
-
-103014,T0102,0,150,-1,103015,2,1,2,104001
-103015,T0104-1,150,50,103014,103016,2,0,2,104001
-103016,T0104-2,200,200,103015,103017,2,0,2,104001
-103017,T0104-3,400,50,103016,103018,2,0,2,104001
-103018,T0106,450,145.63,103017,103019,2,0,2,104001
-103019,T0108,595.63,3000,103018,103020,2,0,2,104001
-103020,T0202,3595.63,145.63,103019,103021,2,0,2,104002
-103021,T0204,3741.26,3000,103020,103022,2,0,2,104002
-103022,T0302,6741.26,145.63,103021,103023,2,0,2,104003
-103023,T0304-1,6886.89,50,103022,103024,2,0,2,104003
-103024,T0304-2,6936.89,200,103023,103025,2,0,2,104003
-103025,T0304-3,7136.89,50,103024,103026,2,0,2,104003
-103026,T0306,7186.89,150,103025,-1,2,1,2,104003
-
-103027,T0109,200,141.42,103002,103028,2,0,2,104001
-103028,T0110,300,141.42,103027,103017,2,0,2,104001
-103029,T0112,200,141.42,103015,103030,1,0,2,104001
-103030,T0111,300,141.42,103029,103004,1,0,2,104001
-
-103031,T0307,6936.89,141.42,103010,103032,2,0,2,104003
-103032,T0308,7036.89,141.42,103031,103025,2,0,2,104003
-103033,T0310,6936.89,141.42,103023,103034,1,0,2,104003
-103034,T0309,7036.89,141.42,103033,103012,1,0,2,104003
+id,name,start_kilometer,selection_length,pre_id,next_id,direction,zf_state,status,station_id,is_switch
+103001,T0101,0,150,-1,103002,1,1,2,104001,0
+103002,T0103-1,150,50,103001,103003,1,0,2,104001,0
+103003,T0103-2,200,200,103002,103004,1,0,2,104001,0
+103004,T0103-3,400,50,103003,103005,1,0,2,104001,0
+103005,T0105,450,145.63,103004,103006,1,0,2,104001,0
+103006,T0107,595.63,3000,103005,103007,1,0,2,104001,0
+103007,T0203,3595.63,145.63,103006,103008,1,0,2,104002,0
+103008,T0205,3741.26,3000,103007,103009,1,0,2,104002,0
+103009,T0301,6741.26,145.63,103008,103010,1,0,2,104003,0
+103010,T0303-1,6886.89,50,103009,103011,1,0,2,104003,0
+103011,T0303-2,6936.89,200,103010,103012,1,0,2,104003,0
+103012,T0303-3,7136.89,50,103011,103013,1,0,2,104003,0
+103013,T0305,7186.89,150,103012,-1,1,1,2,104003,0
+
+103014,T0102,0,150,-1,103015,2,1,2,104001,0
+103015,T0104-1,150,50,103014,103016,2,0,2,104001,0
+103016,T0104-2,200,200,103015,103017,2,0,2,104001,0
+103017,T0104-3,400,50,103016,103018,2,0,2,104001,0
+103018,T0106,450,145.63,103017,103019,2,0,2,104001,0
+103019,T0108,595.63,3000,103018,103020,2,0,2,104001,0
+103020,T0202,3595.63,145.63,103019,103021,2,0,2,104002,0
+103021,T0204,3741.26,3000,103020,103022,2,0,2,104002,0
+103022,T0302,6741.26,145.63,103021,103023,2,0,2,104003,0
+103023,T0304-1,6886.89,50,103022,103024,2,0,2,104003,0
+103024,T0304-2,6936.89,200,103023,103025,2,0,2,104003,0
+103025,T0304-3,7136.89,50,103024,103026,2,0,2,104003,0
+103026,T0306,7186.89,150,103025,-1,2,1,2,104003,0
+
+103027,T0109,200,141.42,103002,103028,2,0,2,104001,1
+103028,T0110,300,141.42,103027,103017,2,0,2,104001,1
+103029,T0112,200,141.42,103015,103030,1,0,2,104001,1
+103030,T0111,300,141.42,103029,103004,1,0,2,104001,1
+
+103031,T0307,6936.89,141.42,103010,103032,2,0,2,104003,1
+103032,T0308,7036.89,141.42,103031,103025,2,0,2,104003,1
+103033,T0310,6936.89,141.42,103023,103034,1,0,2,104003,1
+103034,T0309,7036.89,141.42,103033,103012,1,0,2,104003,1
 
 
 

+ 2 - 2
train-web/src/pages/train/controller/DrawTrack.ts

@@ -1,6 +1,6 @@
 import {crtPath} from '../core/Utils'
 import {SelectionItem, SignalItem, SwitchItem} from "@/types/train";
-import {LINE_UP, LINE_DOWN} from './Constant'
+import {LINE_DOWN, LINE_UP} from './Constant'
 
 export class DrawTrack {
 
@@ -67,7 +67,7 @@ export class DrawTrack {
       this.canvas.closePath()
       this.canvas.stroke();
       this.canvas.save();
-      if (item.selectionLength != 141.42 && (item.name.indexOf("-") == -1 || item.name.split("-")[1] == "2")) {
+      if (!item.isSwitch && (item.name.indexOf("-") == -1 || item.name.split("-")[1] == "2")) {
         this.canvas.font = '12px Arial';
         this.canvas.fillStyle = '#31355d';
         this.canvas.fillText(item.name.split("-")[0], Number(item.startKilometer) + Number(item.selectionLength) * 0.5, Y - 3);

+ 1 - 0
train-web/src/types/train.d.ts

@@ -18,6 +18,7 @@ export type SelectionItem = {
   direction: number;
   zfState: string;
   stationId: string;
+  isSwitch: boolean;
 };
 
 export type SwitchItem = {