@ -5,23 +5,26 @@ import club.joylink.rtss.simulation.cbtc.ATS.service.AtsStandService;
import club.joylink.rtss.simulation.cbtc.ATS.service.AtsTrainService ;
import club.joylink.rtss.simulation.cbtc.Simulation ;
import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository ;
import club.joylink.rtss.simulation.cbtc.data.map.* ;
import club.joylink.rtss.simulation.cbtc.data.map.MapConfig ;
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.Stand ;
import club.joylink.rtss.simulation.cbtc.data.plan.StationPlan ;
import club.joylink.rtss.simulation.cbtc.data.plan.TripPlan ;
import club.joylink.rtss.simulation.cbtc.data.support.RoutePath ;
import club.joylink.rtss.simulation.cbtc.data.vo.TrainInfo ;
import club.joylink.rtss.simulation.cbtc.onboard.ATP.OnboardAtpApiService ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Component ;
import org.springframework.util.CollectionUtils ;
import java.time.LocalDateTime ;
import java.time.LocalTime ;
import java.time.temporal.ChronoUnit ;
import java.util.ArrayList ;
import java.util.List ;
import java.util.Objects ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Component ;
import org.springframework.util.CollectionUtils ;
/ * *
* 计划车阶段处理服务
@ -29,6 +32,7 @@ import java.util.Objects;
@Slf4j
@Component
public class AtsPlanTrainStageService implements AtsStageService {
@Autowired
private AtsRealRunRecordService realRunRecordService ;
@Autowired
@ -39,9 +43,11 @@ public class AtsPlanTrainStageService implements AtsStageService {
private AtsTrainService atsTrainService ;
@Override
public void handleTransferTrackParking ( Simulation simulation , TrainInfo trainInfo , Section parkSection ) {
public void handleTransferTrackParking ( Simulation simulation , TrainInfo trainInfo ,
Section parkSection ) {
SimulationDataRepository repository = simulation . getRepository ( ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) , trainInfo . getTripNumber ( ) ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) ,
trainInfo . getTripNumber ( ) ) ;
/ / List < RoutePath > routePathList = repository . queryRoutePathsByEnd ( parkSection ) ;
/ / if ( routePathList . get ( 0 ) . isRight ( ) = = trainInfo . getRight ( ) ) { / / 准备回库
/ / if ( ! parkSection . isTurnBackTrack ( ) ) { / / 针对上饶沙盘
@ -82,15 +88,18 @@ public class AtsPlanTrainStageService implements AtsStageService {
}
@Override
public void handleNormalStandParking ( Simulation simulation , TrainInfo trainInfo , Section parkSection ) {
public void handleNormalStandParking ( Simulation simulation , TrainInfo trainInfo ,
Section parkSection ) {
SimulationDataRepository repository = simulation . getRepository ( ) ;
MapConfig config = repository . getConfig ( ) ;
List < Stand > standList = parkSection . getStandList ( ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) , trainInfo . getTripNumber ( ) ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) ,
trainInfo . getTripNumber ( ) ) ;
TripPlan nextTripPlan = null ;
StationPlan stationPlan = tripPlan . queryStationPlan ( parkSection ) ;
if ( config . isStandTbStrategyIsInvalid ( ) ) {
if ( stationPlan ! = null & & tripPlan . isLastPlan ( stationPlan ) & & tripPlan . isFrontTurnBack ( ) ) { / / 到达终点站了 , 判断站前折返还是站后折返
if ( stationPlan ! = null & & tripPlan . isLastPlan ( stationPlan )
& & tripPlan . isFrontTurnBack ( ) ) { / / 到达终点站了 , 判断站前折返还是站后折返
/ / 站前折返 , 查询下一车次计划
nextTripPlan = repository . queryNextTripPlanOf ( tripPlan ) ;
} else if ( stationPlan = = null & & tripPlan . isLastPlanStation ( parkSection . getStation ( ) ) ) {
@ -101,9 +110,12 @@ public class AtsPlanTrainStageService implements AtsStageService {
}
if ( nextTripPlan ! = null ) { / / 站前折返 , 更新计划
this . updateTripPlan ( simulation , trainInfo , nextTripPlan ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertEquals ( nextTripPlan . getFirstStationPlan ( ) . getSection ( ) , parkSection ,
String . format ( " 下一车次计划[%s]第一站台轨和停靠站台轨不相同:[%s] " , nextTripPlan . getStNumber ( ) , parkSection . getName ( ) ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan , nextTripPlan . getFirstStationPlan ( ) ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertEquals (
nextTripPlan . getFirstStationPlan ( ) . getSection ( ) , parkSection ,
String . format ( " 下一车次计划[%s]第一站台轨和停靠站台轨不相同:[%s] " ,
nextTripPlan . getStNumber ( ) , parkSection . getName ( ) ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan ,
nextTripPlan . getFirstStationPlan ( ) ) ;
}
} else {
if ( ! CollectionUtils . isEmpty ( standList ) ) {
@ -114,20 +126,24 @@ public class AtsPlanTrainStageService implements AtsStageService {
case AUTO :
if ( stationPlan ! = null & & tripPlan . isLastPlan ( stationPlan ) ) { / / 当前计划终点站
if ( Objects . equals ( stand . isRight ( ) , trainInfo . getRight ( ) ) ) {
onboardAtpApiService . startTurnBack ( simulation , trainInfo . getGroupNumber ( ) , parkSection . getCode ( ) ) ;
onboardAtpApiService . startTurnBack ( simulation , trainInfo . getGroupNumber ( ) ,
parkSection . getCode ( ) ) ;
nextTripPlan = repository . queryNextTripPlanOf ( tripPlan ) ;
if ( nextTripPlan ! = null ) { / / 站前折返 , 更新计划
this . updateTripPlan ( simulation , trainInfo , nextTripPlan ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan , nextTripPlan . getSecondStationPlan ( ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan ,
nextTripPlan . getSecondStationPlan ( ) ) ;
}
}
}
break ;
default :
if ( stationPlan ! = null & & tripPlan . isLastPlan ( stationPlan ) & & tripPlan . isFrontTurnBack ( ) ) { / / 到达终点站了 , 判断站前折返还是站后折返
if ( stationPlan ! = null & & tripPlan . isLastPlan ( stationPlan )
& & tripPlan . isFrontTurnBack ( ) ) { / / 到达终点站了 , 判断站前折返还是站后折返
/ / 站前折返 , 查询下一车次计划
nextTripPlan = repository . queryNextTripPlanOf ( tripPlan ) ;
} else if ( stationPlan = = null & & tripPlan . isLastPlanStation ( parkSection . getStation ( ) ) ) {
} else if ( stationPlan = = null & & tripPlan . isLastPlanStation (
parkSection . getStation ( ) ) ) {
if ( config . isAtsAutoHandleManualFrontTurnBack ( ) ) {
/ / 人工站前折返
nextTripPlan = repository . queryNextTripPlanOf ( tripPlan ) ;
@ -135,9 +151,12 @@ public class AtsPlanTrainStageService implements AtsStageService {
}
if ( nextTripPlan ! = null ) { / / 站前折返 , 更新计划
this . updateTripPlan ( simulation , trainInfo , nextTripPlan ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertEquals ( nextTripPlan . getFirstStationPlan ( ) . getSection ( ) , parkSection ,
String . format ( " 下一车次计划[%s]第一站台轨和停靠站台轨不相同:[%s] " , nextTripPlan . getStNumber ( ) , parkSection . getName ( ) ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan , nextTripPlan . getFirstStationPlan ( ) ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertEquals (
nextTripPlan . getFirstStationPlan ( ) . getSection ( ) , parkSection ,
String . format ( " 下一车次计划[%s]第一站台轨和停靠站台轨不相同:[%s] " ,
nextTripPlan . getStNumber ( ) , parkSection . getName ( ) ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan ,
nextTripPlan . getFirstStationPlan ( ) ) ;
}
break ;
}
@ -146,9 +165,11 @@ public class AtsPlanTrainStageService implements AtsStageService {
}
@Override
public void ready2DepartFromNormalStand ( Simulation simulation , TrainInfo trainInfo , Section parkSection ) {
public void ready2DepartFromNormalStand ( Simulation simulation , TrainInfo trainInfo ,
Section parkSection ) {
SimulationDataRepository repository = simulation . getRepository ( ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) , trainInfo . getTripNumber ( ) ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) ,
trainInfo . getTripNumber ( ) ) ;
StationPlan stationPlan = tripPlan . queryStationPlan ( parkSection ) ;
if ( stationPlan = = null ) {
/ / 非计划中的停靠站台轨 , 暂不处理
@ -168,7 +189,8 @@ public class AtsPlanTrainStageService implements AtsStageService {
}
/ / 到达终点站 , 准备折返
log . debug ( String . format ( " 列车[%s]折返初始化 " , trainInfo . getGroupNumber ( ) ) ) ;
List < RoutePath > routePaths = repository . getRoutePaths ( parkSection , tripPlan . getEndSection ( ) ) ;
List < RoutePath > routePaths = repository . getRoutePaths ( parkSection ,
tripPlan . getEndSection ( ) ) ;
Signal signal = parkSection . getSignalOf ( routePaths . get ( 0 ) . isRight ( ) ) ;
if ( signal . isMainAspect ( ) | | signal . isGuideAspect ( ) ) {
Route lockedRoute = signal . getLockedRoute ( ) ;
@ -190,7 +212,8 @@ public class AtsPlanTrainStageService implements AtsStageService {
this . onboardAtpApiService . updateTripPlan ( simulation , trainInfo . getGroupNumber ( ) , nextTripPlan ) ;
}
public void updateNextPlan ( Simulation simulation , TrainInfo trainInfo , TripPlan tripPlan , StationPlan nextStationPlan ) {
public void updateNextPlan ( Simulation simulation , TrainInfo trainInfo , TripPlan tripPlan ,
StationPlan nextStationPlan ) {
if ( nextStationPlan = = null ) {
log . warn ( String . format ( " 列车[%s]下一计划到站为null " , trainInfo . debugStr ( ) ) ) ;
return ;
@ -239,7 +262,8 @@ public class AtsPlanTrainStageService implements AtsStageService {
}
int planRunTime = ( int ) ChronoUnit . SECONDS . between ( startTime , endTime ) ;
int adjustRunTime = planRunTime ;
if ( ! turnBack & & ! outbound & & config . isAdjustOperationAutomatically ( ) & & trainInfo . isAtsAutoAdjust ( ) ) {
if ( ! turnBack & & ! outbound & & config . isAdjustOperationAutomatically ( )
& & trainInfo . isAtsAutoAdjust ( ) ) {
startTime = systemTime . toLocalTime ( ) ;
adjustRunTime = ( int ) ChronoUnit . SECONDS . between ( startTime , endTime ) ;
}
@ -253,12 +277,17 @@ public class AtsPlanTrainStageService implements AtsStageService {
}
@Override
public void handleTurnBackTrackParking ( Simulation simulation , TrainInfo trainInfo , Section parkSection ) {
public void handleTurnBackTrackParking ( Simulation simulation , TrainInfo trainInfo ,
Section parkSection ) {
SimulationDataRepository repository = simulation . getRepository ( ) ;
LocalDateTime systemTime = simulation . getSystemTime ( ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) , trainInfo . getTripNumber ( ) ) ;
if ( tripPlan . getEndSection ( ) . equals ( parkSection )
/*|| tripPlan.getEndSection().getStation().equals(parkSection.getStation())*/ ) {
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) ,
trainInfo . getTripNumber ( ) ) ;
/ / 车次计划中的车站计划全部完成 , 并且当前折返轨与计划折返轨属于同一站 , 则认为车次计划完成
boolean completed = tripPlan . getPlanList ( ) . stream ( ) . allMatch ( StationPlan : : isFinished )
& & tripPlan . getEndSection ( ) . getStation ( ) . equals ( parkSection . getStation ( ) ) ;
if ( completed ) {
/ / 计划终端折返轨或和计划终端折返轨同站的折返轨 , 根据车次类型处理
TripPlan nextTripPlan = repository . queryNextTripPlanOf ( tripPlan ) ;
if ( nextTripPlan = = null ) {
@ -268,15 +297,19 @@ public class AtsPlanTrainStageService implements AtsStageService {
/ / 备用车
if ( systemTime . toLocalTime ( ) . plusMinutes ( 5 ) . isAfter ( nextTripPlan . getStartTime ( ) ) ) {
this . updateTripPlan ( simulation , trainInfo , nextTripPlan ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertNotEquals ( parkSection , nextTripPlan . getFirstStationPlan ( ) . getSection ( ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan , nextTripPlan . getFirstStationPlan ( ) ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertNotEquals ( parkSection ,
nextTripPlan . getFirstStationPlan ( ) . getSection ( ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan ,
nextTripPlan . getFirstStationPlan ( ) ) ;
return ;
}
} else if ( tripPlan . isTurnBack ( ) ) {
/ / 折返计划
this . updateTripPlan ( simulation , trainInfo , nextTripPlan ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertNotEquals ( parkSection , nextTripPlan . getFirstStationPlan ( ) . getSection ( ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan , nextTripPlan . getFirstStationPlan ( ) ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertNotEquals ( parkSection ,
nextTripPlan . getFirstStationPlan ( ) . getSection ( ) ) ;
this . updateNextPlan ( simulation , trainInfo , nextTripPlan ,
nextTripPlan . getFirstStationPlan ( ) ) ;
return ;
}
} else {
@ -317,7 +350,8 @@ public class AtsPlanTrainStageService implements AtsStageService {
return ;
}
SimulationDataRepository repository = simulation . getRepository ( ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) , trainInfo . getTripNumber ( ) ) ;
TripPlan tripPlan = repository . getTripPlan ( trainInfo . getServiceNumber ( ) ,
trainInfo . getTripNumber ( ) ) ;
StationPlan stationPlan = tripPlan . queryStationPlan ( planStandTrack ) ;
Section section = repository . getByCode ( planStandTrack , Section . class ) ;
/ / 更新离站信息