diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcRunPlanErrorMsgService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcRunPlanErrorMsgService.java index 1e4e98790..1bbab77d7 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcRunPlanErrorMsgService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcRunPlanErrorMsgService.java @@ -7,11 +7,16 @@ import club.joylink.rtss.simulation.cbtc.CTC.data.CtcStationRunPlanLog; import club.joylink.rtss.simulation.cbtc.CTC.data.RouteSequence; import club.joylink.rtss.simulation.cbtc.CTC.data.TrackSection; import club.joylink.rtss.simulation.cbtc.Simulation; +import club.joylink.rtss.simulation.cbtc.data.map.Route; +import club.joylink.rtss.simulation.cbtc.data.map.Section; +import club.joylink.rtss.simulation.cbtc.data.map.Signal; +import club.joylink.rtss.simulation.cbtc.data.map.StationDirection; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.function.BiFunction; import java.util.stream.Collectors; @@ -22,41 +27,39 @@ import java.util.stream.Collectors; public class CtcRunPlanErrorMsgService { /** - * 股道超限检查 + * 创建计划时,股道超限检查 */ public RunPlanCheck transfiniteCheck = (simulation, stationCode, runPlanParam) -> { CtcStationRunPlanLog.TransfiniteType transfinite = runPlanParam.getTransfinite(); - if (CtcStationRunPlanLog.TransfiniteType.NO.equals(transfinite)) { - return; - } - /** - * 检验逻辑 - */ - BiFunction doCheck = (leveType, trackSection) -> { - if (trackSection == null) { - return false; - } - List typeList = - Arrays.stream(CtcStationRunPlanLog.TransfiniteType.values()).collect(Collectors.toList()); - int runPlanIndex = typeList.indexOf(leveType); - int sectionIndex = typeList.indexOf(trackSection.getTransfinite()); - return runPlanIndex > sectionIndex; // 运行等级 > 股道等级说明超限 + arriveAndDepartSectionCheck(simulation, stationCode, runPlanParam, transfinite); + }; - }; - CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository(); - // 发车是否存在 - if (runPlanParam.departIsExist() && !StringUtils.isEmpty(runPlanParam.getDepartSectionCode())) { - TrackSection trackSection = effectRepository.queryTrackSection(stationCode, runPlanParam.getDepartSectionCode()); - if (doCheck.apply(runPlanParam.getTransfinite(), trackSection)) { - BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("运行计划超限不符合【发车股道:%s】超限", runPlanParam.getDepartSectionCode())); - } + /** + * 在计划日志中,股道超限检查 + */ + public RunPlanCheck logTransfiniteCheck = (simulation, stationCode, runPlanParam) -> { + CtcStationRunPlanLog runPlanLog = simulation.getCtcRepository().getRunPlanByRunPlanCode(stationCode, runPlanParam.getRunPlanCode()); + CtcStationRunPlanLog.TransfiniteType transfinite = runPlanLog.getTransfinite(); + arriveAndDepartSectionCheck(simulation, stationCode, runPlanParam, transfinite); + }; + + /** + * 股道与计划不一致 + */ + public RunPlanCheck sectionInconsistentCheck = (simulation, stationCode, runPlanParam) -> { + CtcStationRunPlanLog runPlanLog = simulation.getCtcRepository().getRunPlanByRunPlanCode(stationCode, runPlanParam.getRunPlanCode()); + CtcRunPlanParam planParam = runPlanLog.getPlanParam(); + // 接车股道 + boolean isCheck = !StringUtils.isEmpty(planParam.getArriveSectionCode()) && !StringUtils.isEmpty(runPlanParam.getArriveSectionCode()) + && (!Objects.equals(runPlanParam.getArriveSectionCode(), planParam.getArriveSectionCode())); + if (isCheck) { + BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("接车股道与计划股道不一致【车次:%s】", runPlanLog.getTripNumber())); } - // 接车是否存在 - if (runPlanParam.arriveIsExist() && !StringUtils.isEmpty(runPlanParam.getArriveStationCode())) { - TrackSection trackSection = effectRepository.queryTrackSection(stationCode, runPlanParam.getArriveStationCode()); - if (doCheck.apply(runPlanParam.getTransfinite(), trackSection)) { - BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("运行计划超限不符合【接车股道:%s】超限", runPlanParam.getArriveStationCode())); - } + // 发车股道 + isCheck = !StringUtils.isEmpty(planParam.getDepartSectionCode()) && !StringUtils.isEmpty(runPlanParam.getDepartSectionCode()) + && (!Objects.equals(runPlanParam.getDepartSectionCode(), planParam.getDepartSectionCode())); + if (isCheck) { + BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("发车股道与计划股道不一致【车次:%s】", runPlanLog.getTripNumber())); } }; @@ -81,19 +84,107 @@ public class CtcRunPlanErrorMsgService { }; /** - * 接、发口连通检查 + * 接、发口与计划不一致检查 */ - public RunPlanCheck directionCheck = (simulation, stationCode, runPlanParam) -> { + public RunPlanCheck directionInconsistentCheck = (simulation, stationCode, runPlanParam) -> { + CtcStationRunPlanLog runPlanLog = simulation.getCtcRepository().getRunPlanByRunPlanCode(stationCode, runPlanParam.getRunPlanCode()); + CtcRunPlanParam planParam = runPlanLog.getPlanParam(); // 接车口 - if (!StringUtils.isEmpty(runPlanParam.getArriveDirectionCode())) { - + boolean isCheck = !StringUtils.isEmpty(planParam.getArriveDirectionCode()) && !StringUtils.isEmpty(runPlanParam.getArriveDirectionCode()) + && !Objects.equals(runPlanParam.getArriveDirectionCode(), planParam.getArriveDirectionCode()); + if (isCheck) { + BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("接车口与计划不一致【车次:%s】", runPlanLog.getTripNumber())); } // 发车口 - if (!StringUtils.isEmpty(runPlanParam.getDepartDirectionCode())) { - + isCheck = !StringUtils.isEmpty(planParam.getDepartDirectionCode()) && !StringUtils.isEmpty(runPlanParam.getDepartDirectionCode()) + && !Objects.equals(runPlanParam.getDepartDirectionCode(), planParam.getDepartDirectionCode()); + if (isCheck) { + BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("发车口与计划不一致【车次:%s】", runPlanLog.getTripNumber())); } }; + /** + * 创建计划时,道路连通检查 + */ + public RunPlanCheck pathConnectedCheck = (simulation, stationCode, runPlanParam) -> { + // 到达连通检查 + if (!StringUtils.isEmpty(runPlanParam.getArriveDirectionCode()) && !StringUtils.isEmpty(runPlanParam.getArriveSectionCode())) { + pathConnectedCheck(simulation, runPlanParam.getArriveDirectionCode(), runPlanParam.getArriveSectionCode(), true); + } + // 出发连通检查 + if (!StringUtils.isEmpty(runPlanParam.getDepartDirectionCode()) && !StringUtils.isEmpty(runPlanParam.getDepartSectionCode())) { + pathConnectedCheck(simulation, runPlanParam.getDepartDirectionCode(), runPlanParam.getDepartSectionCode(), false); + } + }; + + /** + * 检验逻辑 + */ + private BiFunction doTransfiniteCheck = (leveType, trackSection) -> { + if (trackSection == null) { + return false; + } + List typeList = + Arrays.stream(CtcStationRunPlanLog.TransfiniteType.values()).collect(Collectors.toList()); + int runPlanIndex = typeList.indexOf(leveType); + int sectionIndex = typeList.indexOf(trackSection.getTransfinite()); + return runPlanIndex > sectionIndex; // 运行等级 > 股道等级说明超限 + }; + + /** + * 接发股道超限检查 + * + * @param simulation 仿真 + * @param stationCode 车站 + * @param runPlanParam 运行计划参数 + * @param transfinite 超限等级 + */ + private void arriveAndDepartSectionCheck(Simulation simulation, String stationCode, CtcRunPlanParam runPlanParam + , CtcStationRunPlanLog.TransfiniteType transfinite) { + if (CtcStationRunPlanLog.TransfiniteType.NO.equals(transfinite)) { + return; + } + CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository(); + // 发车是否存在 + if (runPlanParam.departIsExist() && !StringUtils.isEmpty(runPlanParam.getDepartSectionCode())) { + TrackSection trackSection = effectRepository.queryTrackSection(stationCode, runPlanParam.getDepartSectionCode()); + if (doTransfiniteCheck.apply(transfinite, trackSection)) { + BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("运行计划超限不符合【发车股道:%s】超限" + , runPlanParam.getDepartSectionCode())); + } + } + // 接车是否存在 + if (runPlanParam.arriveIsExist() && !StringUtils.isEmpty(runPlanParam.getArriveStationCode())) { + TrackSection trackSection = effectRepository.queryTrackSection(stationCode, runPlanParam.getArriveStationCode()); + if (doTransfiniteCheck.apply(transfinite, trackSection)) { + BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format("运行计划超限不符合【接车股道:%s】超限" + , runPlanParam.getArriveStationCode())); + } + } + } + + /** + * 道路连通检查 + * + * @param simulation 仿真 + * @param directionCode 出入口 + * @param sectionCode 停发车股道 + */ + private void pathConnectedCheck(Simulation simulation, String directionCode, String sectionCode, boolean arrive) { + StationDirection stationDirection = simulation.getRepository().getByCode(directionCode, StationDirection.class); + Section section = simulation.getRepository().getByCode(sectionCode, Section.class); + List routeList = arrive ? stationDirection.getReceiveRouteList() : stationDirection.getDeliverRouteList(); + Signal signal = arrive ? section.getSignalToLeft() : section.getSignalToRight(); + Signal routeSignal = null; + for (Route r : routeList) { + routeSignal = arrive ? r.getDestination() : r.getStart(); + if (Objects.equals(routeSignal, signal)) { + return; + } + } + String strFormat = arrive ? "进路不连通【入口:%s,停车股道:%s】" : "进路不连通【出口:%s,出发股道:%s】"; + BusinessExceptionAssertEnum.OPERATION_FAIL.exception(String.format(strFormat, stationDirection.getSignal().getShowName(), section.getName())); + } @FunctionalInterface public interface RunPlanCheck { diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcStationRunPlanLogService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcStationRunPlanLogService.java index 9e7a680d0..d293fe1aa 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcStationRunPlanLogService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcStationRunPlanLogService.java @@ -44,9 +44,18 @@ public class CtcStationRunPlanLogService { */ public void modifyBatchRunPlan(Simulation simulation, String stationCode, List planParamList, int force) { if (force == 0) { - for (CtcRunPlanParam p : planParamList) { + planParamList.forEach(p -> { + // 进路接近检查 ctcRunPlanErrorMsgService.sectionRouteCheck.valid(simulation, stationCode, p); - } + // 股道超限检查 + ctcRunPlanErrorMsgService.logTransfiniteCheck.valid(simulation, stationCode, p); + // 股道与计划不一致检查 + ctcRunPlanErrorMsgService.sectionInconsistentCheck.valid(simulation, stationCode, p); + // 接发口不一致 + ctcRunPlanErrorMsgService.directionInconsistentCheck.valid(simulation, stationCode, p); + // 连通性检查 + + }); } List changeList = new LinkedList<>(); List createList = new LinkedList<>(); @@ -244,7 +253,7 @@ public class CtcStationRunPlanLogService { curRunPlanParam.setDepartSectionCode(sectionCode); } CtcRunPlanVO ctcRunPlanVO = CtcRunPlanVO.compareAndChange(curRunPlanParam, effectRunPlanParam); - ctcRunPlanVO.setCreateTime(simulation.getSystemTime()); + ctcRunPlanVO.setCreateTime(simulation.getCorrectSystemTime()); simulation.getCtcRepository().saveApplyRunPlan(ctcRunPlanVO); } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcZoneService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcZoneService.java index 040ad080e..565558a2b 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcZoneService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/runplan/CtcZoneService.java @@ -191,7 +191,7 @@ public class CtcZoneService { CtcManageRepository.StationRunPlanRepository runPlanRepository = zoneRepository.getStationRunPlanMap().get(station.getCode()); if (runPlanRepository != null) { - effectRepository.releaseRunPlanByStationCode(runPlanRepository, simulation.getSystemTime()); + effectRepository.releaseRunPlanByStationCode(runPlanRepository, simulation.getCorrectSystemTime()); } }); updateStageRunPlan(simulation, stationCodeSet); @@ -211,7 +211,7 @@ public class CtcZoneService { CtcManageRepository.StationRunPlanRepository runPlanRepository = zoneRepository.getStationRunPlanMap().get(stationCode); BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(runPlanRepository); CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository(); - effectRepository.releaseRunPlanByStationCode(runPlanRepository, simulation.getSystemTime()); + effectRepository.releaseRunPlanByStationCode(runPlanRepository, simulation.getCorrectSystemTime()); updateStageRunPlan(simulation, stationCode); return "success"; } @@ -226,7 +226,7 @@ public class CtcZoneService { = simulation.getCtcRepository().getCtcZoneRepository().getStationRunPlanMap(); CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository(); stationRunPlanMap.forEach((k, v) -> { - effectRepository.releaseRunPlanByStationCode(v, simulation.getSystemTime()); + effectRepository.releaseRunPlanByStationCode(v, simulation.getCorrectSystemTime()); updateStageRunPlan(simulation, k); }); return "success"; diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CTC/service/CTCService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CTC/service/CTCService.java index cc6cd3e54..ae3e291a9 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CTC/service/CTCService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CTC/service/CTCService.java @@ -1,6 +1,5 @@ package club.joylink.rtss.simulation.cbtc.CTC.service; -import club.joylink.rtss.exception.BaseException; import club.joylink.rtss.exception.BusinessExceptionAssertEnum; import club.joylink.rtss.simulation.cbtc.CI.CiApiService; import club.joylink.rtss.simulation.cbtc.CTC.data.CtcRepository; @@ -125,7 +124,7 @@ public class CTCService { CtcStationRunPlanLog previousStationPlan = getCtcStationRunPlanByRunPlanCode(simulation, previousStation.getCode(), runPlanCode); currentStationPlan.finishReceivingNotice(); previousStationPlan.finishDepartureNotice(); - String systemTime = simulation.getSystemTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:dd")); + String systemTime = simulation.getCorrectSystemTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:dd")); currentStationPlan.getArriveRunPlan().setAdjacentMessageTime(systemTime); previousStationPlan.getDepartRunPlan().setAdjacentMessageTime(systemTime); }