Przeglądaj źródła

列车门+站台屏蔽门 开关控制

zhanghaijun 2 lat temu
rodzic
commit
e60f46e2bd

+ 32 - 0
train-server/src/main/java/top/haijunit/train/domain/entity/PlatformDoorEntity.java

@@ -0,0 +1,32 @@
+package top.haijunit.train.domain.entity;
+
+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 java.io.Serializable;
+
+/**
+ * @author zhanghaijun
+ * @date 2023/12/24 15:00
+ * @description 站台活动门
+ */
+@Data
+@Entity(name = "db_platform_door")
+public class PlatformDoorEntity implements Serializable {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    // 站台门名称
+    private String name;
+    // 站台门方向
+    private DirectionEnum direction;
+    // 所属站台
+    private Long stationId;
+
+}

+ 20 - 0
train-server/src/main/java/top/haijunit/train/domain/repository/PlatformDoorRepository.java

@@ -0,0 +1,20 @@
+package top.haijunit.train.domain.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import top.haijunit.train.domain.constant.DirectionEnum;
+import top.haijunit.train.domain.entity.PlatformDoorEntity;
+import top.haijunit.train.domain.entity.PlatformEntity;
+
+import java.util.List;
+
+/**
+ * @author zhang
+ * @date 2023/11/26 02:02
+ * @description 站台屏蔽门
+ */
+@Repository
+public interface PlatformDoorRepository extends JpaRepository<PlatformDoorEntity, Long> {
+
+    List<PlatformDoorEntity> findByStationIdAndDirection(Long stationId, DirectionEnum direction);
+}

+ 1 - 0
train-server/src/main/java/top/haijunit/train/service/SectionService.java

@@ -110,6 +110,7 @@ public class SectionService {
                 sectionItem.setStartKilometer(selection.getStartKilometer());
                 sectionItem.setSwitch(selection.isSwitch());
                 sectionItem.setTurnBack(selection.getZfState());
+                sectionItem.setStationId(selection.getStationId());
                 // 进路数据
                 sectionItem.setId(getSectionUId(route.getId(), selection.getId()));
                 sectionItem.setRouteId(route.getId());

+ 2 - 0
train-server/src/main/java/top/haijunit/train/simulation/domain/SectionItem.java

@@ -32,6 +32,8 @@ public class SectionItem {
     private boolean isTurnBack;
     // 方向
     private DirectionEnum direction;
+    // 所属站台
+    private Long stationId;
 
     // 进路Id
     private Long routeId;

+ 30 - 2
train-server/src/main/java/top/haijunit/train/simulation/train/TrainComputerService.java

@@ -1,14 +1,19 @@
 package top.haijunit.train.simulation.train;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import top.haijunit.common.utils.ErrorUtil;
 import top.haijunit.common.utils.StreamUtils;
-import top.haijunit.train.domain.constant.DirectionEnum;
+import top.haijunit.train.device.domain.CommandEnum;
 import top.haijunit.train.domain.constant.TrainConstant;
+import top.haijunit.train.domain.entity.PlatformDoorEntity;
 import top.haijunit.train.domain.entity.SignStopEntity;
+import top.haijunit.train.domain.repository.PlatformDoorRepository;
 import top.haijunit.train.service.SectionService;
 import top.haijunit.train.simulation.domain.SectionItem;
 import top.haijunit.train.simulation.domain.TrainItem;
@@ -30,6 +35,7 @@ import java.util.*;
 @RequiredArgsConstructor
 public class TrainComputerService {
     private final SectionService sectionService;
+    private final PlatformDoorRepository platformDoorRepository;
 
     public void run(TrainItem trainItem) {
         try {
@@ -57,7 +63,7 @@ public class TrainComputerService {
         long timeDifference = Math.abs(nowMillis - train.getUpdateTimeMillis());
         if (NumberUtil.isLessOrEqual(distance, BigDecimal.ZERO) && timeDifference <= TrainConstant.STOP_TIME_SECOND * 1000) {
             // 停车状态 时间不足30S
-            TrainWebSocketUtils.sendMessage(train.getTrainNo(), timeDifference > (TrainConstant.STOP_TIME_SECOND - 2) * 1000 ? 1 : 0);
+            this.openOrCloseDoor(sectionList, train, timeDifference > (TrainConstant.STOP_TIME_SECOND - 2) * 1000 ? 1 : 0);
             return train;
         }
         if (NumberUtil.isGreater(distance, BigDecimal.ZERO)) {
@@ -127,4 +133,26 @@ public class TrainComputerService {
         }
         return getDistanceMa(list, nextSectionOptional.get(), null, totalDistance);
     }
+
+    // 开关屏蔽门
+    @Async
+    public void openOrCloseDoor(LinkedList<SectionItem> sectionList, TrainItem train, int state) {
+        // 列车开关门
+        JSONObject trainData = JSONUtil.createObj();
+        trainData.set(CommandEnum.TRAIN_OPEN_DOOR.getNameStr(), train.getTrainNo());
+        trainData.set(CommandEnum.TRAIN_OPEN_DOOR.getStatusStr(), state);
+        TrainWebSocketUtils.sendMessage(CommandEnum.TRAIN_OPEN_DOOR, trainData);
+        // 站台屏蔽门开关门
+        Optional<SectionItem> optional = sectionList.stream().filter(item -> item.getSectionId().equals(train.getTrainId())).findFirst();
+        if (optional.isEmpty()) {
+            return;
+        }
+        List<PlatformDoorEntity> doorList = platformDoorRepository.findByStationIdAndDirection(optional.get().getStationId(), train.getDirection());
+        for (PlatformDoorEntity entity : doorList) {
+            JSONObject doorData = JSONUtil.createObj();
+            doorData.set(CommandEnum.PLATFORM_DOOR_LOCK.getNameStr(), entity.getId());
+            doorData.set(CommandEnum.PLATFORM_DOOR_LOCK.getStatusStr(), state);
+            TrainWebSocketUtils.sendMessage(CommandEnum.PLATFORM_DOOR_LOCK, doorData);
+        }
+    }
 }

+ 21 - 1
train-server/src/main/resources/db/changelog/train/db-server-train.xml

@@ -226,7 +226,7 @@
             <column name="name" type="VARCHAR(128)" defaultValue="" remarks="车次号"/>
             <column name="train_length" type="DECIMAL(10, 2)" defaultValueNumeric="135.63" remarks="列车长度"/>
             <column name="section_id" type="${autoing.type}" defaultValueNumeric="0" remarks="所在的区段"/>
-            <column name="section_offset" type="${number.type}" defaultValueNumeric="2" remarks="区段的偏移量"/>
+            <column name="section_offset" type="DOUBLE(10,5)" defaultValueNumeric="2" remarks="区段的偏移量"/>
         </createTable>
     </changeSet>
     <changeSet id="load-db_train-data" author="zhanghaijun" failOnError="false" runOnChange="true">
@@ -239,5 +239,25 @@
             <column name="section_offset" type="NUMERIC"/>
         </loadUpdateData>
     </changeSet>
+
+    <changeSet id="db_platform_door" author="zhanghaijun" failOnError="false" runOnChange="true">
+        <createTable tableName="db_platform_door" schemaName="${schema.name}" remarks="站台活动门表">
+            <column name="id" type="${autoing.type}" autoIncrement="true" remarks="编号">
+                <constraints nullable="false" primaryKey="true"/>
+            </column>
+            <column name="name" type="VARCHAR(128)" defaultValue="" remarks="站台活动门编码"/>
+            <column name="station_id" type="${autoing.type}" defaultValueNumeric="0" remarks="所属站台"/>
+            <column name="direction" type="${number.type}" defaultValueNumeric="1" remarks="方向"/>
+        </createTable>
+    </changeSet>
+    <changeSet id="load-db_platform_door-data" author="zhanghaijun" failOnError="false" runOnChange="true">
+        <delete tableName="db_platform_door" catalogName="${catalog.name}" schemaName="${schema.name}"/>
+        <loadUpdateData tableName="db_platform_door" file="db_platform_door.txt" relativeToChangelogFile="true" primaryKey="id" quotchar="'" catalogName="${catalog.name}" schemaName="${schema.name}">
+            <column name="id" type="NUMERIC"/>
+            <column name="name" type="STRING"/>
+            <column name="direction" type="NUMERIC"/>
+            <column name="station_id" type="NUMERIC"/>
+        </loadUpdateData>
+    </changeSet>
 </databaseChangeLog>
 

+ 186 - 0
train-server/src/main/resources/db/changelog/train/db_platform_door.txt

@@ -0,0 +1,186 @@
+id,name,direction,station_id
+138001,SA1-1,1,104001
+138002,SA1-2,1,104001
+138003,SA1-3,1,104001
+138004,SA1-4,1,104001
+138005,SA1-5,1,104001
+138006,SA2-1,1,104001
+138007,SA2-2,1,104001
+138008,SA2-3,1,104001
+138009,SA2-4,1,104001
+138010,SA2-5,1,104001
+138011,SA3-1,1,104001
+138012,SA3-2,1,104001
+138013,SA3-3,1,104001
+138014,SA3-4,1,104001
+138015,SA3-5,1,104001
+138016,SA4-1,1,104001
+138017,SA4-2,1,104001
+138018,SA4-3,1,104001
+138019,SA4-4,1,104001
+138020,SA4-5,1,104001
+138021,SA5-1,1,104001
+138022,SA5-2,1,104001
+138023,SA5-3,1,104001
+138024,SA5-4,1,104001
+138025,SA5-5,1,104001
+138026,SA6-1,1,104001
+138027,SA6-2,1,104001
+138028,SA6-3,1,104001
+138029,SA6-4,1,104001
+138030,SA6-5,1,104001
+
+138031,XA1-1,2,104001
+138032,XA1-2,2,104001
+138033,XA1-3,2,104001
+138034,XA1-4,2,104001
+138035,XA1-5,2,104001
+138036,XA2-1,2,104001
+138037,XA2-2,2,104001
+138038,XA2-3,2,104001
+138039,XA2-4,2,104001
+138040,XA2-5,2,104001
+138041,XA3-1,2,104001
+138042,XA3-2,2,104001
+138043,XA3-3,2,104001
+138044,XA3-4,2,104001
+138045,XA3-5,2,104001
+138046,XA4-1,2,104001
+138047,XA4-2,2,104001
+138048,XA4-3,2,104001
+138049,XA4-4,2,104001
+138050,XA4-5,2,104001
+138051,XA5-1,2,104001
+138052,XA5-2,2,104001
+138053,XA5-3,2,104001
+138054,XA5-4,2,104001
+138055,XA5-5,2,104001
+138056,XA6-1,2,104001
+138057,XA6-2,2,104001
+138058,XA6-3,2,104001
+138059,XA6-4,2,104001
+138060,XA6-5,2,104001
+
+138061,SA1-1,1,104002
+138062,SA1-2,1,104002
+138063,SA1-3,1,104002
+138064,SA1-4,1,104002
+138065,SA1-5,1,104002
+138066,SA2-1,1,104002
+138067,SA2-2,1,104002
+138068,SA2-3,1,104002
+138069,SA2-4,1,104002
+138070,SA2-5,1,104002
+138071,SA3-1,1,104002
+138072,SA3-2,1,104002
+138073,SA3-3,1,104002
+138074,SA3-4,1,104002
+138075,SA3-5,1,104002
+138076,SA4-1,1,104002
+138077,SA4-2,1,104002
+138078,SA4-3,1,104002
+138079,SA4-4,1,104002
+138080,SA4-5,1,104002
+138081,SA5-1,1,104002
+138082,SA5-2,1,104002
+138083,SA5-3,1,104002
+138084,SA5-4,1,104002
+138085,SA5-5,1,104002
+138086,SA6-1,1,104002
+138087,SA6-2,1,104002
+138088,SA6-3,1,104002
+138089,SA6-4,1,104002
+138090,SA6-5,1,104002
+
+138091,XA1-1,2,104002
+138092,XA1-2,2,104002
+138093,XA1-3,2,104002
+138094,XA1-4,2,104002
+138095,XA1-5,2,104002
+138096,XA2-1,2,104002
+138097,XA2-2,2,104002
+138038,XA2-3,2,104002
+138099,XA2-4,2,104002
+138100,XA2-5,2,104002
+138101,XA3-1,2,104002
+138102,XA3-2,2,104002
+138103,XA3-3,2,104002
+138104,XA3-4,2,104002
+138105,XA3-5,2,104002
+138106,XA4-1,2,104002
+138107,XA4-2,2,104002
+138108,XA4-3,2,104002
+138109,XA4-4,2,104002
+138110,XA4-5,2,104002
+138111,XA5-1,2,104002
+138112,XA5-2,2,104002
+138113,XA5-3,2,104002
+138114,XA5-4,2,104002
+138115,XA5-5,2,104002
+138116,XA6-1,2,104002
+138117,XA6-2,2,104002
+138118,XA6-3,2,104002
+138119,XA6-4,2,104002
+138120,XA6-5,2,104002
+
+138121,SA1-1,1,104003
+138122,SA1-2,1,104003
+138123,SA1-3,1,104003
+138124,SA1-4,1,104003
+138125,SA1-5,1,104003
+138126,SA2-1,1,104003
+138127,SA2-2,1,104003
+138128,SA2-3,1,104003
+138129,SA2-4,1,104003
+138130,SA2-5,1,104003
+138131,SA3-1,1,104003
+138132,SA3-2,1,104003
+138133,SA3-3,1,104003
+138134,SA3-4,1,104003
+138135,SA3-5,1,104003
+138136,SA4-1,1,104003
+138137,SA4-2,1,104003
+138138,SA4-3,1,104003
+138139,SA4-4,1,104003
+138140,SA4-5,1,104003
+138141,SA5-1,1,104003
+138142,SA5-2,1,104003
+138143,SA5-3,1,104003
+138144,SA5-4,1,104003
+138145,SA5-5,1,104003
+138146,SA6-1,1,104003
+138147,SA6-2,1,104003
+138148,SA6-3,1,104003
+138149,SA6-4,1,104003
+138150,SA6-5,1,104003
+
+138151,XA1-1,2,104003
+138152,XA1-2,2,104003
+138153,XA1-3,2,104003
+138154,XA1-4,2,104003
+138155,XA1-5,2,104003
+138156,XA2-1,2,104003
+138157,XA2-2,2,104003
+138158,XA2-3,2,104003
+138159,XA2-4,2,104003
+138160,XA2-5,2,104003
+138161,XA3-1,2,104003
+138162,XA3-2,2,104003
+138163,XA3-3,2,104003
+138164,XA3-4,2,104003
+138165,XA3-5,2,104003
+138166,XA4-1,2,104003
+138167,XA4-2,2,104003
+138168,XA4-3,2,104003
+138169,XA4-4,2,104003
+138170,XA4-5,2,104003
+138171,XA5-1,2,104003
+138172,XA5-2,2,104003
+138173,XA5-3,2,104003
+138174,XA5-4,2,104003
+138175,XA5-5,2,104003
+138176,XA6-1,2,104003
+138177,XA6-2,2,104003
+138178,XA6-3,2,104003
+138179,XA6-4,2,104003
+138180,XA6-5,2,104003