diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java index 6150498b6..db3cb24f2 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java @@ -840,6 +840,11 @@ public class Operation { */ ASSIST_PRESS_DOWN_TURN_DIRECTION, + /** + * 改方抬起操作 + */ + ASSIST_PRESS_UP_TURN_DIRECTION, + /** * 总辅助按钮操作 */ diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java index 85f3336e6..a8bbfce55 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java @@ -4,6 +4,7 @@ import club.joylink.rtss.constants.DirectionLabelEnum; import club.joylink.rtss.simulation.cbtc.ATS.operation.Operation; import club.joylink.rtss.simulation.cbtc.ATS.operation.annotation.OperateHandler; import club.joylink.rtss.simulation.cbtc.ATS.operation.annotation.OperateHandlerMapping; +import club.joylink.rtss.simulation.cbtc.ATS.service.assist.ButtonThenInterface; import club.joylink.rtss.simulation.cbtc.ATS.service.assist.ButtonValidInterface; import club.joylink.rtss.simulation.cbtc.ATS.service.assist.StationDirectionService; import club.joylink.rtss.simulation.cbtc.Simulation; @@ -29,11 +30,12 @@ public class StationDirectionOperateHandler { @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_DOWN_TURN_DIRECTION) public void pressDownTurnDirection(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum , Integer pressDown) { - ButtonValidInterface validInterface = null; - boolean isPressDown = pressDown == 1; - if (isPressDown) { - validInterface = stationDirectionService.turnDirectionPressDownValid; - } + boolean isPressDown = (pressDown == 1); + // 操作类型 + Operation.Type operationType = isPressDown ? Operation.Type.ASSIST_PRESS_DOWN_TURN_DIRECTION + : Operation.Type.ASSIST_PRESS_UP_TURN_DIRECTION; + // 验证函数 + ButtonValidInterface validInterface = stationDirectionService.getValidMethodByType(operationType); stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum , StationDirection.ButtonTypeEnum.CHANGE_DIRECTION, isPressDown, validInterface, null); } @@ -49,8 +51,9 @@ public class StationDirectionOperateHandler { @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_MAIN_ASSIST) public void pressMainAssist(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum , Integer pressDown) { - stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.MAIN_ASSIST - , (pressDown == 1), null, stationDirectionService.turnAssistThen); + ButtonThenInterface thenInterface = stationDirectionService.getThenMethodByType(Operation.Type.ASSIST_PRESS_MAIN_ASSIST); + stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum + , StationDirection.ButtonTypeEnum.MAIN_ASSIST, (pressDown == 1), null, thenInterface); } /** @@ -62,8 +65,10 @@ public class StationDirectionOperateHandler { */ @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_RECEIVE_ASSIST) public void pressReceiveAssist(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum) { - stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.RECEIVE_ASSIST - , Boolean.TRUE, stationDirectionService.receiveAssistValid, stationDirectionService.receiveAssistThen); + ButtonValidInterface validInterface = stationDirectionService.getValidMethodByType(Operation.Type.ASSIST_PRESS_RECEIVE_ASSIST); + ButtonThenInterface thenInterface = stationDirectionService.getThenMethodByType(Operation.Type.ASSIST_PRESS_RECEIVE_ASSIST); + stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum + , StationDirection.ButtonTypeEnum.RECEIVE_ASSIST, Boolean.TRUE, validInterface, thenInterface); } /** @@ -75,8 +80,10 @@ public class StationDirectionOperateHandler { */ @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_DELIVER_ASSIST) public void pressDeliverAssist(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum) { - stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.DELIVER_ASSIST - , Boolean.TRUE, stationDirectionService.turnAssistValid, stationDirectionService.deliverAssistThen); + ButtonValidInterface validInterface = stationDirectionService.getValidMethodByType(Operation.Type.ASSIST_PRESS_DELIVER_ASSIST); + ButtonThenInterface thenInterface = stationDirectionService.getThenMethodByType(Operation.Type.ASSIST_PRESS_DELIVER_ASSIST); + stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum + , StationDirection.ButtonTypeEnum.DELIVER_ASSIST, Boolean.TRUE, validInterface, thenInterface); } /** @@ -88,8 +95,9 @@ public class StationDirectionOperateHandler { */ @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_BLOCK) public void pressBlockBtn(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum) { - stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.OCCLUSION - , Boolean.TRUE, null, stationDirectionService.turnBlockThen); + ButtonThenInterface thenInterface = stationDirectionService.getThenMethodByType(Operation.Type.ASSIST_PRESS_BLOCK); + stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum + , StationDirection.ButtonTypeEnum.OCCLUSION, Boolean.TRUE, null, thenInterface); } /** @@ -101,8 +109,10 @@ public class StationDirectionOperateHandler { */ @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_RESTORE) public void pressRestoreBtn(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum) { - stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.RESTORE - , Boolean.TRUE, stationDirectionService.turnRestoreValid, stationDirectionService.turnRestoreThen); + ButtonValidInterface validInterface = stationDirectionService.getValidMethodByType(Operation.Type.ASSIST_PRESS_RESTORE); + ButtonThenInterface thenInterface = stationDirectionService.getThenMethodByType(Operation.Type.ASSIST_PRESS_RESTORE); + stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum + , StationDirection.ButtonTypeEnum.RESTORE, Boolean.TRUE, validInterface, thenInterface); } /** diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java index 37ef6123d..21b96dccd 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java @@ -2,6 +2,7 @@ package club.joylink.rtss.simulation.cbtc.ATS.service.assist; import club.joylink.rtss.constants.DirectionLabelEnum; import club.joylink.rtss.entity.DraftMapStationDirection; +import club.joylink.rtss.simulation.cbtc.ATS.operation.Operation; import club.joylink.rtss.simulation.cbtc.Simulation; import club.joylink.rtss.simulation.cbtc.data.map.Route; import club.joylink.rtss.simulation.cbtc.data.map.Stand; @@ -13,8 +14,12 @@ import club.joylink.rtss.simulation.cbtc.exception.SimulationExceptionType; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.function.BiConsumer; import java.util.stream.Collectors; @@ -24,54 +29,26 @@ import java.util.stream.Collectors; @Component @Slf4j public class StationDirectionService { - /** - * 修改按钮状态信息 - * - * @param simulation 仿真数据 - * @param stationCode 车站编码 - * @param label 按钮类型 - * @param type 类型 - * @param pressDown true:按下,false:抬起 - * @param validMethod 操作检验 - * @param buttonDoMethod 操作后触发动作 - */ - public void changeButtonAspect(Simulation simulation, String stationCode, DirectionLabelEnum label, StationDirection.ButtonTypeEnum type, - boolean pressDown, ButtonValidInterface validMethod, ButtonThenInterface buttonDoMethod) { - Station curStation = getStationByCode(simulation, stationCode); - StationDirection stationDirection = curStation.getStationDirectionMap().get(label); - // 检验操作 - if (validMethod != null) { - validMethod.valid(simulation, stationDirection); - } - // 修改状态 - stationDirection.modifyButtonStatus(type, pressDown); - // 后续动作 - if (buttonDoMethod != null) { - buttonDoMethod.doThen(simulation, stationDirection); - } - } /** - * 刷新区间灯状态 + * 指示灯状态操作集合 */ - public void refreshSectionLightStatus(Simulation simulation, DraftMapStationDirection draftMapStationDirection) { - Station station = getStationByCode(simulation, draftMapStationDirection.getStationCode()); - StationDirection stationDirection = station.getStationDirectionMap().get(draftMapStationDirection.getLabelEnum()); - if (stationDirection == null) { - return; - } - // 刷新接发车点灯状态 - stationDirection.refreshAspectStatus(); - // 刷新区段占用状态 - stationDirection.refreshSectionStatus(); - // 辅助灯状态 - stationDirection.refreshAssistStatus(); - } + private Map> aspectStatusHandleMap; + + /** + * 操作按钮验证操作集合 + */ + private Map operationButtonValidMap; + + /** + * 操作按钮后续操作集合 + */ + private Map operationButtonThenMap; /** * 改方按钮按下校验 */ - public ButtonValidInterface turnDirectionPressDownValid = (simulation, stationDirection) -> { + private ButtonValidInterface turnDirectionPressDownValid = (simulation, stationDirection) -> { // 如果处于发辅助状态,说明存在异常情况正在人为处理,直接跳过判断 if (stationDirection.isMainAssistStatus() && stationDirection.isDeliverAssistStatus()) { return; @@ -111,7 +88,7 @@ public class StationDirectionService { /** * 发辅助按钮操作校验 */ - public ButtonValidInterface turnAssistValid = (simulation, stationDirection) -> { + private ButtonValidInterface turnAssistValid = (simulation, stationDirection) -> { if (!stationDirection.isMainAssistStatus()) { throw new SimulationException(SimulationExceptionType.Operation_Cannot_handed, "操作异常:总辅助按钮未按下"); } @@ -120,7 +97,7 @@ public class StationDirectionService { /** * 接辅助按钮操作校验 */ - public ButtonValidInterface receiveAssistValid = (simulation, stationDirection) -> { + private ButtonValidInterface receiveAssistValid = (simulation, stationDirection) -> { // 判断总辅助 this.turnAssistValid.valid(simulation, stationDirection); // 获取邻站实体 @@ -151,7 +128,7 @@ public class StationDirectionService { /** * 总辅助后续操作 */ - public ButtonThenInterface turnAssistThen = (simulation, stationDirection) -> { + private ButtonThenInterface turnAssistThen = (simulation, stationDirection) -> { // 总辅助弹起后,接发辅助、倒计时重置 if (!stationDirection.isMainAssistStatus()) { stationDirection.setReceiveAssistStatus(false); @@ -163,7 +140,7 @@ public class StationDirectionService { /** * 接辅助按钮后续操作 */ - public ButtonThenInterface receiveAssistThen = (simulation, stationDirection) -> { + private ButtonThenInterface receiveAssistThen = (simulation, stationDirection) -> { // 按下接辅助,弹起发辅助 stationDirection.setDeliverAssistStatus(false); // 重新设置倒计时时间 @@ -173,7 +150,7 @@ public class StationDirectionService { /** * 接辅助按钮后续操作 */ - public ButtonThenInterface deliverAssistThen = (simulation, stationDirection) -> { + private ButtonThenInterface deliverAssistThen = (simulation, stationDirection) -> { // 按下发辅助,弹起发辅助 stationDirection.setReceiveAssistStatus(false); // 重新设置倒计时时间 @@ -183,27 +160,20 @@ public class StationDirectionService { /** * 复原按钮操作验证 */ - public ButtonValidInterface turnRestoreValid = (simulation, stationDirection) -> { - // 接车方向需要判断是否已过信号机内方第一道岔区段 - if (StationDirection.DirectionRunModel.S.equals(stationDirection.getRunModel())) { - if (StationDirection.ReceiveAndDeliverModel.R.equals(stationDirection.getRunStatus())) { - throw new SimulationException(SimulationExceptionType.Operation_Cannot_handed, "操作异常:列车未到站"); - } - if (StationDirection.ReceiveAndDeliverModel.A.equals(stationDirection.getRunStatus()) - && stationDirection.getOccupiedLabel().intValue() != 1) { - throw new SimulationException(SimulationExceptionType.Operation_Cannot_handed, "操作异常:列车未到站"); - } - } + private ButtonValidInterface turnRestoreValid = (simulation, stationDirection) -> { + }; /** * 恢复按钮后续操作 */ - public ButtonThenInterface turnRestoreThen = (simulation, stationDirection) -> { + private ButtonThenInterface turnRestoreThen = (simulation, stationDirection) -> { try { - // 只有半自动闭塞、接车方向可以操作、全点亮后才可做 - if (StationDirection.DirectionRunModel.S.equals(stationDirection.getRunModel()) - && StationDirection.ReceiveAndDeliverModel.A.equals(stationDirection.getRunStatus())) { + // 只有半自动闭塞、接车方向可以操作、全点亮可以操作 + boolean isRestoreOperation = StationDirection.DirectionRunModel.S.equals(stationDirection.getRunModel()) + && (StationDirection.ReceiveAndDeliverModel.A.equals(stationDirection.getRunStatus()) + || StationDirection.ReceiveAndDeliverModel.R.equals(stationDirection.getRunStatus())); + if (isRestoreOperation) { // 将本方向接发车状态恢复 stationDirection.reset(); // 获取邻站实体 @@ -229,7 +199,7 @@ public class StationDirectionService { /** * 闭塞按钮操作 */ - public ButtonThenInterface turnBlockThen = (simulation, stationDirection) -> { + private ButtonThenInterface turnBlockThen = (simulation, stationDirection) -> { // 获取邻站实体 Optional adjacentStationOptional = getAdjacentStationOptional(simulation, stationDirection); // 存在邻站 @@ -253,6 +223,139 @@ public class StationDirectionService { } }; + /** + * 自动模式 + */ + private BiConsumer automaticHandle = (stationDirection, adjacentDirection) -> { + adjacentDirection.setRunStatus(StationDirection.ReceiveAndDeliverModel.R); // 邻站对应方向修改为接车方 + }; + + /** + * 半自动模式 + */ + private BiConsumer semiAutomaticHandle = (stationDirection, adjacentDirection) -> { + if (StationDirection.IndicatorStatusEnum.O.equals(stationDirection.getDeliverAspect())) { // 发车灯变为占用时,接车灯也会占用 + adjacentDirection.setReceiveAspect(StationDirection.IndicatorStatusEnum.O); // 接车方接车灯占用 + } + }; + + /** + * 默认 + */ + private BiConsumer defaultHandle = (stationDirection, adjacentDirection) -> { + + }; + + @PostConstruct + private void init() { + // 指示灯状态操作集合 + this.aspectStatusHandleMap = new HashMap<>(); + // 自动模式 + this.aspectStatusHandleMap.put(StationDirection.DirectionRunModel.A, this.automaticHandle); + // 半自动模式 + this.aspectStatusHandleMap.put(StationDirection.DirectionRunModel.S, this.semiAutomaticHandle); + // 操作按钮验证函数集合 + this.operationButtonValidMap = new HashMap<>(); + // 改方按下验证函数 + this.operationButtonValidMap.put(Operation.Type.ASSIST_PRESS_DOWN_TURN_DIRECTION, this.turnDirectionPressDownValid); + // 接辅助按下验证函数 + this.operationButtonValidMap.put(Operation.Type.ASSIST_PRESS_RECEIVE_ASSIST, this.receiveAssistValid); + // 发辅助按下验证函数 + this.operationButtonValidMap.put(Operation.Type.ASSIST_PRESS_DELIVER_ASSIST, this.turnAssistValid); + // 复原按下验证函数 + this.operationButtonValidMap.put(Operation.Type.ASSIST_PRESS_RESTORE, this.turnRestoreValid); + // 操作按钮后续操作集合 + this.operationButtonThenMap = new HashMap<>(); + // 总辅助后续操作 + this.operationButtonThenMap.put(Operation.Type.ASSIST_PRESS_MAIN_ASSIST, this.turnAssistThen); + // 接辅助后续操作 + this.operationButtonThenMap.put(Operation.Type.ASSIST_PRESS_RECEIVE_ASSIST, this.receiveAssistThen); + // 发辅助后续操作 + this.operationButtonThenMap.put(Operation.Type.ASSIST_PRESS_DELIVER_ASSIST, this.deliverAssistThen); + // 闭塞后续操作 + this.operationButtonThenMap.put(Operation.Type.ASSIST_PRESS_BLOCK, this.turnBlockThen); + // 复原后续操作 + this.operationButtonThenMap.put(Operation.Type.ASSIST_PRESS_RESTORE, this.turnRestoreThen); + } + + /** + * 修改按钮状态信息 + * + * @param simulation 仿真数据 + * @param stationCode 车站编码 + * @param label 按钮类型 + * @param type 类型 + * @param pressDown true:按下,false:抬起 + * @param validMethod 操作检验 + * @param buttonDoMethod 操作后触发动作 + */ + public void changeButtonAspect(Simulation simulation, String stationCode, DirectionLabelEnum label, StationDirection.ButtonTypeEnum type, + boolean pressDown, ButtonValidInterface validMethod, ButtonThenInterface buttonDoMethod) { + Station curStation = getStationByCode(simulation, stationCode); + StationDirection stationDirection = curStation.getStationDirectionMap().get(label); + // 检验操作 + if (validMethod != null) { + validMethod.valid(simulation, stationDirection); + } + // 修改状态 + stationDirection.modifyButtonStatus(type, pressDown); + // 后续动作 + if (buttonDoMethod != null) { + buttonDoMethod.doThen(simulation, stationDirection); + } + } + + /** + * 刷新区间灯状态 + */ + public void refreshSectionLightStatus(Simulation simulation, DraftMapStationDirection draftMapStationDirection) { + Station station = getStationByCode(simulation, draftMapStationDirection.getStationCode()); + StationDirection stationDirection = station.getStationDirectionMap().get(draftMapStationDirection.getLabelEnum()); + if (stationDirection == null) { + return; + } + // 刷新接发车点灯状态 + stationDirection.refreshAspectStatus(); + // 发车方向会影响下游接车方向 + if (StationDirection.ReceiveAndDeliverModel.D.equals(stationDirection.getRunStatus())) { + // 获取邻站实体 + Optional adjacentStationOptional = getAdjacentStationOptional(simulation, stationDirection); + if (adjacentStationOptional.isPresent()) { // 邻站存在时 + // 接车方向 + StationDirection adjacentDirection = adjacentStationOptional.get().getStationDirectionMap() + .get(stationDirection.getRelativeDirectionLabelEnum()); + if (adjacentDirection != null) { + this.aspectStatusHandleMap.getOrDefault(stationDirection.getRunModel(), this.defaultHandle) + .accept(stationDirection, adjacentDirection); + } + } + } + // 刷新区段占用状态 + stationDirection.refreshSectionStatus(); + // 辅助灯状态 + stationDirection.refreshAssistStatus(); + } + + /** + * 根据操作类型获取验证方法 + * + * @param type 类型 + * @return 验证方法 + */ + public ButtonValidInterface getValidMethodByType(Operation.Type type) { + return this.operationButtonValidMap.get(type); + } + + /** + * 根据操作类型获取后续操作方法 + * + * @param type 类型 + * @return 操作方法 + */ + public ButtonThenInterface getThenMethodByType(Operation.Type type) { + return this.operationButtonThenMap.get(type); + } + /** * 获取当前车站实体 * diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java index 7339cbb19..4e5eed97c 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java @@ -213,15 +213,19 @@ public class StationDirection extends MapNamedElement { */ public void modifyButtonStatus(ButtonTypeEnum type, boolean pressDown) { switch (type) { + // 改方 case CHANGE_DIRECTION: this.changeDirectionStatus = pressDown; break; + // 接辅助 case RECEIVE_ASSIST: this.receiveAssistStatus = pressDown; break; + // 发辅助 case DELIVER_ASSIST: this.deliverAssistStatus = pressDown; break; + // 总辅助 case MAIN_ASSIST: this.mainAssistStatus = pressDown; break; @@ -315,17 +319,18 @@ public class StationDirection extends MapNamedElement { } /** - * 如果信号灯所在区段任意一边被锁闭 + * 判断信号机发车方向的三个区段是否解锁 * * @return 锁闭状态 */ private boolean judgeSignalLock() { + // 发车方向 + boolean isRight = this.deliverRouteList.stream().findAny().get().isRight(); Section section = this.getSignal().getSection(); - boolean isLock = section.isRouteLock(); - // 判断信号机所在下一个区段是否锁闭 - if (!isLock) { - section = section.getNextSection(getSignal().isRight()); - isLock = section.isRouteLock(); + boolean isLock = section.isOccupied(); + for (int index = 0; !isLock && index < 3 && section != null; index++) { + isLock = section.isOccupied(); + section = section.getNextSection(isRight); } return isLock; } @@ -387,28 +392,25 @@ public class StationDirection extends MapNamedElement { * 半自动闭塞,不会自动恢复 */ private void semiAutomaticModelAspectStatus() { - // 点灯 - if (ReceiveAndDeliverModel.R.equals(this.runStatus)) { // 接车方向 - if (IndicatorStatusEnum.F.equals(this.receiveAspect) && IndicatorStatusEnum.O.equals(this.sectionAspect)) { - this.receiveAspect = IndicatorStatusEnum.O; - } - // 信号灯区段 - Section section = this.getSignal().getSection().getNextSection(getSignal().isRight()); - // 如果区段已被占用,也点亮发车灯 - if (section != null && section.isOccupied()) { - this.runStatus = ReceiveAndDeliverModel.A; - this.deliverAspect = IndicatorStatusEnum.O; - // 判断有车经过 - this.occupiedLabel.incrementAndGet(); - } - } else if (ReceiveAndDeliverModel.D.equals(this.runStatus)) { // 发车方向 - // 进入区间后、标为占用且不主动恢复 - if (IndicatorStatusEnum.F.equals(this.deliverAspect) && IndicatorStatusEnum.O.equals(this.sectionAspect)) { - this.deliverAspect = IndicatorStatusEnum.O; - } - } else if (ReceiveAndDeliverModel.NO.equals(this.runStatus)) { + // 已复原,恢复空闲状态 + if (ReceiveAndDeliverModel.NO.equals(this.runStatus)) { this.deliverAspect = IndicatorStatusEnum.F; this.receiveAspect = IndicatorStatusEnum.F; + } else { + // 信号灯区段 + Section section = this.getSignal().getSection().getNextSection(getSignal().isRight()); + boolean isSectionLock = (section != null && section.isOccupied()); + // 点灯 + if (ReceiveAndDeliverModel.R.equals(this.runStatus) && isSectionLock) { // 接车方向,如果区段已被占用,接车方双红 + this.runStatus = ReceiveAndDeliverModel.A; + this.deliverAspect = IndicatorStatusEnum.O; + this.receiveAspect = IndicatorStatusEnum.O; + // 判断有车经过 + this.occupiedLabel.incrementAndGet(); + } else if (ReceiveAndDeliverModel.D.equals(this.runStatus) && isSectionLock) { // 发车方向 + // 进入区间后、标为占用且不主动恢复 + this.deliverAspect = IndicatorStatusEnum.O; + } } }