Forráskód Böngészése

fix 屏蔽门动态控制

zhanghaijun 2 éve%!(EXTRA string=óta)
szülő
commit
7a65822876

+ 7 - 4
train-server/src/main/java/top/haijunit/train/controller/TrainController.java

@@ -6,13 +6,11 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import top.haijunit.common.domain.ResultData;
+import top.haijunit.train.domain.entity.PlatformDoorEntity;
 import top.haijunit.train.domain.entity.SelectionEntity;
 import top.haijunit.train.domain.entity.SignalEntity;
 import top.haijunit.train.domain.entity.SwitchEntity;
-import top.haijunit.train.domain.repository.SelectionRepository;
-import top.haijunit.train.domain.repository.SignalRepository;
-import top.haijunit.train.domain.repository.StationRepository;
-import top.haijunit.train.domain.repository.SwitchRepository;
+import top.haijunit.train.domain.repository.*;
 
 import java.util.List;
 
@@ -29,6 +27,7 @@ public class TrainController {
     private final SignalRepository signalRepository;
     private final SelectionRepository selectionRepository;
     private final SwitchRepository switchRepository;
+    private final PlatformDoorRepository platformDoorRepository;
 
     @GetMapping("/signal")
     public ResultData<List<SignalEntity>> signalAll() {
@@ -45,5 +44,9 @@ public class TrainController {
         return ResultData.success(switchRepository.findAll());
     }
 
+    @GetMapping("/door")
+    public ResultData<List<PlatformDoorEntity>> doorAll() {
+        return ResultData.success(platformDoorRepository.findAll());
+    }
 
 }

+ 36 - 0
train-server/src/main/java/top/haijunit/train/domain/constant/DoorStatusEnum.java

@@ -0,0 +1,36 @@
+package top.haijunit.train.domain.constant;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * @author zhanghaijun
+ * @date 2024/2/18 11:27
+ * @description 屏蔽门状态枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum DoorStatusEnum {
+    CLOSE(0, "关闭"),
+    OPEN(1, "开启"),
+    DISABLE(2, "禁用"),
+    ;
+
+    @JsonValue
+    private final int code;
+    private final String describe;
+
+    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
+    public static DoorStatusEnum getByCode(Integer code) {
+        for (DoorStatusEnum genderEnum : values()) {
+            if (Objects.equals(genderEnum.getCode(), code)) {
+                return genderEnum;
+            }
+        }
+        return null;
+    }
+}

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

@@ -0,0 +1,26 @@
+package top.haijunit.train.domain.convert;
+
+import jakarta.persistence.AttributeConverter;
+import jakarta.persistence.Converter;
+import top.haijunit.train.domain.constant.DoorStatusEnum;
+
+import java.util.Optional;
+
+/**
+ * @author zhanghaijun
+ * @date 2024/2/18 11:28
+ * @description 屏蔽门状态枚举类型转换
+ */
+@Converter(autoApply = true)
+public class DoorStatusConverter implements AttributeConverter<DoorStatusEnum, Integer> {
+
+    @Override
+    public Integer convertToDatabaseColumn(DoorStatusEnum statusEnum) {
+        return Optional.of(statusEnum).map(DoorStatusEnum::getCode).orElse(DoorStatusEnum.CLOSE.getCode());
+    }
+
+    @Override
+    public DoorStatusEnum convertToEntityAttribute(Integer code) {
+        return DoorStatusEnum.getByCode(code);
+    }
+}

+ 9 - 6
train-server/src/main/java/top/haijunit/train/domain/entity/PlatformDoorEntity.java

@@ -1,11 +1,9 @@
 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;
+import top.haijunit.train.domain.constant.DoorStatusEnum;
 
 import java.io.Serializable;
 
@@ -24,9 +22,14 @@ public class PlatformDoorEntity implements Serializable {
 
     // 站台门名称
     private String name;
-    // 站台门方向
-    private DirectionEnum direction;
+    // 门的状态
+    private DoorStatusEnum status;
+
     // 所属站台
     private Long stationId;
+    // 所属平台
+    private Long platformId;
+    // 站台门方向
+    private DirectionEnum direction;
 
 }

+ 2 - 1
train-server/src/main/java/top/haijunit/train/domain/repository/PlatformDoorRepository.java

@@ -4,7 +4,6 @@ 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;
 
@@ -17,4 +16,6 @@ import java.util.List;
 public interface PlatformDoorRepository extends JpaRepository<PlatformDoorEntity, Long> {
 
     List<PlatformDoorEntity> findByStationIdAndDirection(Long stationId, DirectionEnum direction);
+
+    List<PlatformDoorEntity> findByPlatformId(Long platformId);
 }

+ 10 - 2
train-server/src/main/java/top/haijunit/train/listener/MessageEventListener.java

@@ -12,6 +12,7 @@ import org.springframework.stereotype.Component;
 import top.haijunit.train.device.domain.CommandEnum;
 import top.haijunit.train.device.entity.DeviceEntity;
 import top.haijunit.train.device.service.DeviceService;
+import top.haijunit.train.service.PlatformDoorService;
 import top.haijunit.train.utils.TrainWebSocketUtils;
 import top.haijunit.websocket.event.MessageEvent;
 
@@ -26,6 +27,7 @@ import top.haijunit.websocket.event.MessageEvent;
 public class MessageEventListener implements ApplicationListener<MessageEvent> {
 
     private final DeviceService deviceService;
+    private final PlatformDoorService doorService;
 
     @Override
     public void onApplicationEvent(MessageEvent event) {
@@ -54,12 +56,18 @@ public class MessageEventListener implements ApplicationListener<MessageEvent> {
                     break;
                 case ELEVATOR_VERTICAL_COMMAND:
                     TrainWebSocketUtils.sendMessage(CommandEnum.ELEVATOR_VERTICAL, getMessage(CommandEnum.ELEVATOR_VERTICAL, entity));
+                    break;
                 case ELEVATOR_HAND_COMMAND:
                     TrainWebSocketUtils.sendMessage(CommandEnum.ELEVATOR_HAND, getMessage(CommandEnum.ELEVATOR_HAND, entity));
+                    break;
+                case PLATFORM_DOOR_LCW:
+                case AFC_IBP, IBP_CONTROL, IBP_DOOR_OPEN, IBP_DOOR_CLOSE:
+                case PSL_LOCK, PSL_CONTROL, PSL_DOOR_OPEN, PSL_DOOR_CLOSE:
+                    // 屏蔽门控制指令
+                    doorService.updateIbpControl(entity);
+                    break;
                 default:
                     log.warn("未处理返回的消息:{}", message);
-                    // TrainWebSocketUtils.sendMessage(CommandEnum.PLATFORM_DOOR_LOCK, getMessage(CommandEnum.PLATFORM_DOOR_LOCK, entity));
-                    // TrainWebSocketUtils.sendMessage(CommandEnum.PLATFORM_DOOR_CONTROL, getMessage(CommandEnum.PLATFORM_DOOR_CONTROL, entity));
             }
         } catch (RuntimeException exception) {
             log.error("消息处理异常: {},消息: {}", exception.getMessage(), message);

+ 108 - 0
train-server/src/main/java/top/haijunit/train/service/PlatformDoorService.java

@@ -0,0 +1,108 @@
+package top.haijunit.train.service;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import top.haijunit.train.device.domain.CommandEnum;
+import top.haijunit.train.device.entity.DeviceEntity;
+import top.haijunit.train.domain.constant.DirectionEnum;
+import top.haijunit.train.domain.constant.DoorStatusEnum;
+import top.haijunit.train.domain.entity.PlatformDoorEntity;
+import top.haijunit.train.domain.repository.PlatformDoorRepository;
+import top.haijunit.train.utils.TrainWebSocketUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author zhanghaijun
+ * @date 2024/2/16 11:01
+ * @description 站台门的控制逻辑: LCW(单门控制) > PSL(控制室控制) > IBP(列车长控制) > 信号(自动控制)
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class PlatformDoorService {
+
+    private final PlatformDoorRepository platformDoorRepository;
+
+    public void updateIbpControl(DeviceEntity entity) {
+        switch (entity.getCommand()) {
+            case AFC_IBP:
+            case PSL_LOCK:
+                break;
+            case IBP_CONTROL:
+            case PSL_CONTROL:
+                // 更新权限
+                break;
+            case IBP_DOOR_OPEN:
+            case PSL_DOOR_OPEN:
+                sendDoorStatus(DoorStatusEnum.OPEN, Convert.toLong(entity.getCode(), 0L));
+                break;
+            case IBP_DOOR_CLOSE:
+            case PSL_DOOR_CLOSE:
+                sendDoorStatus(DoorStatusEnum.CLOSE, Convert.toLong(entity.getCode(), 0L));
+                break;
+            case PLATFORM_DOOR_LCW:
+                // LCW 更新屏蔽门
+                List<PlatformDoorEntity> list = new ArrayList<>();
+                list.add(platformDoorRepository.getReferenceById(Convert.toLong(entity.getCode(), 0L)));
+                switch (entity.getStatus()) {
+                    case 1:
+                        sendDoorStatus(DoorStatusEnum.OPEN, list);
+                        break;
+                    case 2:
+                        sendDoorStatus(DoorStatusEnum.CLOSE, list);
+                        break;
+                    case 3:
+                        sendDoorStatus(DoorStatusEnum.DISABLE, list);
+                        break;
+                }
+
+                break;
+        }
+    }
+
+    /**
+     * 信号更新屏蔽门
+     * @param state 状态
+     * @param stationId 车站Id
+     * @param direction 方向
+     */
+    public void sendDoorStatus(DoorStatusEnum state, Long stationId, DirectionEnum direction) {
+        sendDoorStatus(state, platformDoorRepository.findByStationIdAndDirection(stationId, direction));
+    }
+
+    /**
+     * IBP PSL 更新屏蔽门
+     * @param state 状态
+     * @param platformId 平台Id
+     */
+    public List<PlatformDoorEntity> sendDoorStatus(DoorStatusEnum state, Long platformId) {
+        return sendDoorStatus(state, platformDoorRepository.findByPlatformId(platformId));
+    }
+
+    private List<PlatformDoorEntity> sendDoorStatus(DoorStatusEnum state, List<PlatformDoorEntity> doorList) {
+        List<PlatformDoorEntity> list = new ArrayList<>();
+        for (PlatformDoorEntity entity : doorList) {
+            if (entity.getStatus() == DoorStatusEnum.DISABLE) {
+                continue;
+            }
+            entity.setStatus(state);
+            list.add(entity);
+            JSONObject doorData = JSONUtil.createObj();
+            doorData.set(CommandEnum.PLATFORM_DOOR_LOCK.getNameStr(), Convert.toStr(entity.getId(), ""));
+            doorData.set(CommandEnum.PLATFORM_DOOR_LOCK.getStatusStr(), state.getCode());
+            TrainWebSocketUtils.sendMessage(CommandEnum.PLATFORM_DOOR_LOCK, doorData);
+        }
+        if (CollUtil.isEmpty(list)) {
+            return list;
+        } else {
+            return platformDoorRepository.saveAllAndFlush(list);
+        }
+    }
+}

+ 9 - 19
train-server/src/main/java/top/haijunit/train/simulation/train/TrainComputerService.java

@@ -1,7 +1,6 @@
 package top.haijunit.train.simulation.train;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.convert.Convert;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
@@ -10,11 +9,10 @@ import org.springframework.stereotype.Service;
 import top.haijunit.common.utils.ErrorUtil;
 import top.haijunit.common.utils.StreamUtils;
 import top.haijunit.train.device.domain.CommandEnum;
-import top.haijunit.train.domain.constant.DirectionEnum;
+import top.haijunit.train.domain.constant.DoorStatusEnum;
 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.PlatformDoorService;
 import top.haijunit.train.service.SectionService;
 import top.haijunit.train.simulation.domain.SectionItem;
 import top.haijunit.train.simulation.domain.TrainItem;
@@ -36,7 +34,7 @@ import java.util.*;
 @RequiredArgsConstructor
 public class TrainComputerService {
     private final SectionService sectionService;
-    private final PlatformDoorRepository platformDoorRepository;
+    private final PlatformDoorService platformDoorService;
 
     public void run(TrainItem trainItem) {
         try {
@@ -67,7 +65,7 @@ public class TrainComputerService {
             // 更新列车数据时间
             train.setUpdateTimeMillis(nowMillis);
             // 停车状态 时间不足30S
-            train.setOpenDoor(this.openOrCloseDoor(sectionList, train, timeDifference > (TrainConstant.STOP_TIME_SECOND - 2) * 1000 ? 0 : 1));
+            train.setOpenDoor(this.openOrCloseDoor(sectionList, train, timeDifference > (TrainConstant.STOP_TIME_SECOND - 2) * 1000 ? DoorStatusEnum.CLOSE : DoorStatusEnum.OPEN));
             return train;
         }
         // 更新速度和时间
@@ -194,28 +192,20 @@ public class TrainComputerService {
     }
 
     // 开关屏蔽门
-    public boolean openOrCloseDoor(LinkedList<SectionItem> sectionList, TrainItem train, int state) {
+    public boolean openOrCloseDoor(LinkedList<SectionItem> sectionList, TrainItem train, DoorStatusEnum statusEnum) {
         // 0 关门 1 开门
-        if ((train.isOpenDoor() && state == 1) || (!train.isOpenDoor() && state == 0)) {
+        if ((train.isOpenDoor() && statusEnum.getCode() == 1) || (!train.isOpenDoor() && statusEnum.getCode() == 0)) {
             // 避免重复发送
             return train.isOpenDoor();
         }
         // 列车开关门
         JSONObject trainData = JSONUtil.createObj();
         trainData.set(CommandEnum.TRAIN_OPEN_DOOR.getNameStr(), train.getTrainNo());
-        trainData.set(CommandEnum.TRAIN_OPEN_DOOR.getStatusStr(), state);
+        trainData.set(CommandEnum.TRAIN_OPEN_DOOR.getStatusStr(), statusEnum);
         TrainWebSocketUtils.sendMessage(CommandEnum.TRAIN_OPEN_DOOR, trainData);
         // 站台屏蔽门开关门
         Optional<SectionItem> optional = sectionList.stream().filter(item -> item.getSectionId().equals(train.getBlockId())).findFirst();
-        if (optional.isPresent()) {
-            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(), Convert.toStr(entity.getId(), ""));
-                doorData.set(CommandEnum.PLATFORM_DOOR_LOCK.getStatusStr(), state);
-                TrainWebSocketUtils.sendMessage(CommandEnum.PLATFORM_DOOR_LOCK, doorData);
-            }
-        }
-        return state != 0;
+        optional.ifPresent(sectionItem -> platformDoorService.sendDoorStatus(statusEnum, sectionItem.getStationId(), train.getDirection()));
+        return statusEnum.getCode() != 0;
     }
 }

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

@@ -248,7 +248,9 @@
                 <constraints nullable="false" primaryKey="true"/>
             </column>
             <column name="name" type="VARCHAR(128)" defaultValue="" remarks="站台活动门编码"/>
+            <column name="status" type="${number.type}" defaultValueNumeric="0" remarks="状态"/>
             <column name="station_id" type="${autoing.type}" defaultValueNumeric="0" remarks="所属站台"/>
+            <column name="platform_id" type="${autoing.type}" defaultValueNumeric="0" remarks="所属平台"/>
             <column name="direction" type="${number.type}" defaultValueNumeric="1" remarks="方向"/>
         </createTable>
     </changeSet>
@@ -257,6 +259,7 @@
         <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="status" type="NUMERIC"/>
             <column name="direction" type="NUMERIC"/>
             <column name="station_id" type="NUMERIC"/>
         </loadUpdateData>

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

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

+ 5 - 1
train-web/src/api/train.ts

@@ -1,6 +1,6 @@
 import request from "@/api/http";
 import { AxiosPromise } from 'axios';
-import { SignalItem, SelectionItem, SwitchItem } from '@/types/train-travel'
+import { SignalItem, SelectionItem, SwitchItem, DoorItem } from '@/types/train-travel'
 
 // 获取全部的点位
 export function signalAll(): AxiosPromise<Array<SignalItem>> {
@@ -14,3 +14,7 @@ export function selectionAll(): AxiosPromise<Array<SelectionItem>> {
 export function switchAll(): AxiosPromise<Array<SwitchItem>> {
   return request({ url: '/train/switch', method: 'get' })
 }
+
+export function doorAll(): AxiosPromise<Array<DoorItem>> {
+  return request({ url: '/train/door', method: 'get' })
+}

+ 57 - 5
train-web/src/pages/device/DeviceDoor.vue

@@ -47,6 +47,9 @@
   </div>
 </template>
 <script setup lang="ts">
+import { StoreDevices } from '@/store/modules/devices.ts'
+import { StoreDoor } from '@/store/modules/door.ts'
+import { DoorItem, DoorStatusEnum } from '@/types/train-travel'
 
 interface StationItem {
   name: string;
@@ -62,7 +65,7 @@ interface StationItem {
     }>
   }>
 }
-const doorUpList = ref<StationItem>({
+const doorUpList = reactive<StationItem>({
   name: "上行",
   carriage: [
     {
@@ -127,7 +130,7 @@ const doorUpList = ref<StationItem>({
     }
   ]
 })
-const stationDown = ref<StationItem>({
+const stationDown = reactive<StationItem>({
   name: "下行",
   carriage: [
     {
@@ -192,26 +195,27 @@ const stationDown = ref<StationItem>({
     }
   ]
 });
+
 // 表格
 interface StateItem {
   name: string;
   stateUp?: "state-valid" | "state-alarm" | "state-invalid";
   stateDown?: "state-valid" | "state-alarm" | "state-invalid";
 }
-const tableData1 = ref<StateItem[]>([
+const tableData1 = reactive<StateItem[]>([
   { name: "所有门关闭并锁定", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "SIG自动开门命令", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "SIG自动关门命令", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "IBP操作允许", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "PSL操作允许", stateUp: 'state-valid', stateDown: 'state-valid' },
 ]);
-const tableData2 = ref<StateItem[]>([
+const tableData2 = reactive<StateItem[]>([
   { name: "IBP开门命令", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "IBP关门命令", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "PSL开门命令", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "PSL关闭命令", stateUp: 'state-valid', stateDown: 'state-valid' },
 ]);
-const tableData3 = ref<StateItem[]>([
+const tableData3 = reactive<StateItem[]>([
   { name: "互锁接触报警", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "控制故障报警", stateUp: 'state-valid', stateDown: 'state-valid' },
   { name: "健康系统故障报警", stateUp: 'state-valid' },
@@ -227,6 +231,54 @@ const arraySpanMethod = ({ row, columnIndex }: any) => {
     }
   }
 }
+
+// 屏蔽门状态动态处理
+const updateStation = function () {
+  const list: DoorItem[] = StoreDoor().getDoorList;
+  console.log(list);
+  const array: StationItem[] = [doorUpList, stationDown];
+  for (let index = 0; index < array.length; index++) {
+    const element: StationItem = array[index];
+    for (let i = 0; i < element.carriage.length; i++) {
+      const carriage = element.carriage[i];
+      for (let j = 0; j < carriage.doors.length; j++) {
+        const door = carriage.doors[j];
+        const item = list.find((item) => item.id == door.code);
+        if (item) {
+          switch (item.status) {
+            case DoorStatusEnum.OPEN:
+              door.icon = '屏蔽门';
+              door.color = '#FFFFFF';
+              break;
+            case DoorStatusEnum.CLOSE:
+              door.icon = '屏蔽门';
+              door.color = '#42BF01';
+              break;
+            case DoorStatusEnum.DISABLE:
+              door.icon = '屏蔽门';
+              door.color = '#870102';
+              break;
+            default:
+              break;
+          }
+        }
+      }
+    }
+  }
+}
+
+const updateDevice = function () {
+
+}
+onMounted(function () {
+  StoreDoor().loadDoorAll();
+  updateStation();
+  updateDevice();
+  console.log("---doorUpList---:", doorUpList);
+});
+watch(() => StoreDoor().getDoorList, () => { updateStation(); })
+watch(() => StoreDevices().getDeviceArray, () => { updateDevice(); })
+
 </script>
 <style scoped lang="scss">
 .box {

+ 34 - 0
train-web/src/store/modules/door.ts

@@ -0,0 +1,34 @@
+/**
+ * 站台门的控制逻辑: LCW > PSL > IBP > 信号
+ */
+import { defineStore } from "pinia";
+import { DoorItem } from "@/types/train-travel";
+import { doorAll } from "@/api/train";
+
+enum DoorControl {
+  LCW = 1,
+  PSL = 2,
+  IBP = 3,
+  SIGNAL = 4,
+}
+
+export const StoreDoor = defineStore("door", {
+  state: () => {
+    return {
+      doorList: [] as DoorItem[],
+      doorControl: DoorControl.SIGNAL
+    };
+  },
+  getters: {
+    getDoorList(): DoorItem[] {
+      return this.doorList;
+    },
+  },
+  actions: {
+    async loadDoorAll() {
+      const { data } = await doorAll();
+      this.doorList = (data || []);
+    }
+  },
+  persist: false
+});

+ 8 - 5
train-web/src/store/socket.ts

@@ -1,8 +1,9 @@
 import { defineStore } from "pinia";
 import SocketClient from "@/types/WebSocketClient";
 import { CommandEnum, RouteItem, TrainItem } from '@/types/train-travel'
-import { deviceCammandList } from '@/types/device';
-import { StoreDevices } from '@/store/modules/devices.ts'
+import { deviceCammandList, PLATFORM_DOOR_LOCK } from '@/types/device';
+import { StoreDevices } from '@/store/modules/devices.ts';
+import { StoreDoor } from '@/store/modules/door.ts'
 
 interface WebSocketState {
   client: SocketClient<string> | null;
@@ -46,7 +47,12 @@ export const useStoreSocket = defineStore("websocket", {
               const routeList: RouteItem[] = Array.from(Object.values(routeMap)).flatMap(routeItems => routeItems);
               this.routeList = [...routeList];
               break;
+            case PLATFORM_DOOR_LOCK.command:
+              // 屏蔽门控制
+              StoreDoor().loadDoorAll();
+              break;
             default:
+              // 通用的设备控制
               if (deviceCammandList.indexOf(result.cmd) !== -1) {
                 StoreDevices().loadDeviceAll();
               } else {
@@ -67,7 +73,4 @@ export const useStoreSocket = defineStore("websocket", {
     },
   },
   persist: false,
-  // persist: {
-  //   paths: ['messages']
-  // },
 });

+ 14 - 0
train-web/src/types/train-travel.ts

@@ -121,3 +121,17 @@ export type RouteItem = {
   // 是否可折返
   turnBack: boolean;
 }
+
+export enum DoorStatusEnum {
+  CLOSE = 0, // 关闭
+  OPEN = 1, // 开启
+  DISABLE = 2 // 禁用
+}
+export interface DoorItem {
+  id: string;
+  name: string;
+  status: number;
+  stationId: number;
+  platformId: number;
+  direction: DirectionEnum;
+}