【调度台运行日志信息操作】

【运行日志签收】
【运行日志重置功能】
This commit is contained in:
weizhihong 2022-06-27 16:58:26 +08:00
parent 54e73fffe4
commit de3435cfd9
14 changed files with 672 additions and 460 deletions

View File

@ -6,6 +6,7 @@ import club.joylink.rtss.simulation.cbtc.ATS.operation.annotation.OperateHandler
import club.joylink.rtss.simulation.cbtc.ATS.operation.vo.CtcRunPlanParam;
import club.joylink.rtss.simulation.cbtc.ATS.service.runplan.CtcZoneService;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.data.map.StationDirection;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -35,29 +36,29 @@ public class CtcZoneOperateHandler {
/**
* 修改股道
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveSection 到达股道
* @param departSection 发车股道
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param sectionCode 股道
* @param model 接发
*/
@OperateHandlerMapping(type = Operation.Type.CTC_ZONE_SAVE_TRACK_SECTION)
public void saveTrackSection(Simulation simulation, String stationCode, String runPlanCode, String arriveSection, String departSection) {
ctcZoneService.saveTrackSection(simulation, stationCode, runPlanCode, arriveSection, departSection);
public void saveTrackSection(Simulation simulation, String stationCode, String runPlanCode, String sectionCode, StationDirection.ReceiveAndDeliverModel model) {
ctcZoneService.saveTrackSection(simulation, stationCode, runPlanCode, sectionCode, model);
}
/**
* 修改车次
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveTripNumber 到达车次
* @param departTripNumber 发车车次
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param tripNumber 车次
* @param model 接发
*/
@OperateHandlerMapping(type = Operation.Type.CTC_ZONE_SAVE_TRIP_NUMBER)
public void saveTripNumber(Simulation simulation, String stationCode, String runPlanCode, String arriveTripNumber, String departTripNumber) {
ctcZoneService.saveTripNumber(simulation, stationCode, runPlanCode, arriveTripNumber, departTripNumber);
public void saveTripNumber(Simulation simulation, String stationCode, String runPlanCode, String tripNumber, StationDirection.ReceiveAndDeliverModel model) {
ctcZoneService.saveTripNumber(simulation, stationCode, runPlanCode, tripNumber, model);
}
/**
@ -66,40 +67,40 @@ public class CtcZoneOperateHandler {
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveTime 到达时间
* @param departTime 车时间
* @param planTime 计划时间
* @param model
*/
@OperateHandlerMapping(type = Operation.Type.CTC_ZONE_SAVE_PLAN_TIME)
public void savePlanTime(Simulation simulation, String stationCode, String runPlanCode, LocalTime arriveTime, LocalTime departTime) {
ctcZoneService.savePlanTime(simulation, stationCode, runPlanCode, arriveTime, departTime);
public void savePlanTime(Simulation simulation, String stationCode, String runPlanCode, LocalTime planTime, StationDirection.ReceiveAndDeliverModel model) {
ctcZoneService.savePlanTime(simulation, stationCode, runPlanCode, planTime, model);
}
/**
* 修改到出入口
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveDirectionCode 到达方向编码
* @param departDirectionCode 发车方向编码
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param directionCode 方向编码
* @param model 接发
*/
@OperateHandlerMapping(type = Operation.Type.CTC_ZONE_SAVE_DIRECTION)
public void saveDirection(Simulation simulation, String stationCode, String runPlanCode, String arriveDirectionCode, String departDirectionCode) {
ctcZoneService.saveDirection(simulation, stationCode, runPlanCode, arriveDirectionCode, departDirectionCode);
public void saveDirection(Simulation simulation, String stationCode, String runPlanCode, String directionCode, StationDirection.ReceiveAndDeliverModel model) {
ctcZoneService.saveDirection(simulation, stationCode, runPlanCode, directionCode, model);
}
/**
* 修改到发车站
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveStation 到达方向车站编码
* @param departStation 发车方向车站编码
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param planStationCode 计划方向车站编码
* @param model 接发
*/
@OperateHandlerMapping(type = Operation.Type.CTC_ZONE_SAVE_STATION)
public void saveStation(Simulation simulation, String stationCode, String runPlanCode, String arriveStation, String departStation) {
ctcZoneService.saveStation(simulation, stationCode, runPlanCode, arriveStation, departStation);
public void saveStation(Simulation simulation, String stationCode, String runPlanCode, String planStationCode, StationDirection.ReceiveAndDeliverModel model) {
ctcZoneService.saveStation(simulation, stationCode, runPlanCode, planStationCode, model);
}
/**

View File

@ -46,11 +46,6 @@ public class CtcRunPlanParam implements Cloneable {
*/
private String arriveSectionCode;
/**
* 发车股道
*/
private String departSectionCode;
/**
* 到达计划时间
*/
@ -61,6 +56,31 @@ public class CtcRunPlanParam implements Cloneable {
*/
private LocalTime arriveTime;
/**
* 到达车次
*/
private String arriveTripNumber;
/**
* 到达车站
*/
private String arriveStationCode;
/**
* 到达方向编码到达口
*/
private String arriveDirectionCode;
/**
* 始发计划
*/
private Boolean startRunPlan;
/**
* 发车股道
*/
private String departSectionCode;
/**
* 发车计划时间
*/
@ -71,45 +91,40 @@ public class CtcRunPlanParam implements Cloneable {
*/
private LocalTime departTime;
/**
* 到达车次
*/
private String arriveTripNumber;
/**
* 发车车次
*/
private String departTripNumber;
/**
* 到达车站
*/
private String arriveStationCode;
/**
* 发车车站
*/
private String departStationCode;
/**
* 到达方向编码到达口
*/
private String arriveDirectionCode;
/**
* 发向方向编码发车口
*/
private String departDirectionCode;
/**
* 终到计划
*/
private String endRunPlan;
/**
* 状态-1删除0修改1添加
*/
private int status;
/**
* 客运车
* 电力计划
*/
private CtcStationRunPlanLog.PlanPropertiesType passenger;
private Boolean electrical;
/**
* 办理客运
*/
private Boolean passenger;
/**
* 重点列车
@ -151,6 +166,16 @@ public class CtcRunPlanParam implements Cloneable {
*/
private Map<CtcStationRunPlanLog.RunPlanTask, Integer> runPlanTaskMap = new HashMap<>();
/**
* 列车类型
*/
private TrainType trainType;
/**
* 运行类型
*/
private RunType runType;
/**
* 删除时构造实体
*
@ -161,6 +186,7 @@ public class CtcRunPlanParam implements Cloneable {
p.setRunPlanCode(this.runPlanCode);
p.setStationCode(this.stationCode);
p.setTripNumber(this.tripNumber);
p.setGroupNumber(this.getGroupNumber());
p.setRunPlanTaskMap(null);
return p;
}
@ -169,11 +195,18 @@ public class CtcRunPlanParam implements Cloneable {
* 生成主键
*/
public void generateRunPlanCodeAndTripNumber() {
this.groupNumber = this.groupNumber != null ? this.groupNumber : String.format("%03d", 1);
this.tripNumber = StringUtils.isEmpty(this.tripNumber) ?
(StringUtils.isEmpty(this.arriveTripNumber) ? this.departTripNumber : this.arriveTripNumber) : this.tripNumber;
this.runPlanCode = StringUtils.isEmpty(this.runPlanCode) ? (this.groupNumber + this.tripNumber) : this.runPlanCode;
}
/**
* 对比两个计划对象,并修改实际计划
*
* @param modify 修改的
* @return 修改过的字段
*/
public CtcRunPlanParam compareAndChange(CtcRunPlanParam modify) {
CtcRunPlanParam runPlanParam = new CtcRunPlanParam();
runPlanParam.setRunPlanCode(modify.getRunPlanCode());
@ -208,21 +241,11 @@ public class CtcRunPlanParam implements Cloneable {
runPlanParam.setDepartSectionCode(modify.getDepartSectionCode());
change = true;
}
if (!Objects.equals(this.arrivePlanTime, modify.getArrivePlanTime())) {
this.arrivePlanTime = modify.getArrivePlanTime();
runPlanParam.setArrivePlanTime(modify.getArrivePlanTime());
change = true;
}
if (!Objects.equals(this.arriveTime, modify.getArriveTime())) {
this.arriveTime = modify.getArriveTime();
runPlanParam.setArriveTime(modify.getArriveTime());
change = true;
}
if (!Objects.equals(this.departPlanTime, modify.getDepartPlanTime())) {
this.departPlanTime = modify.getDepartPlanTime();
runPlanParam.setDepartPlanTime(modify.getDepartPlanTime());
change = true;
}
if (!Objects.equals(this.departTime, modify.getDepartTime())) {
this.departTime = modify.getDepartTime();
runPlanParam.setDepartTime(modify.getDepartTime());
@ -258,6 +281,84 @@ public class CtcRunPlanParam implements Cloneable {
runPlanParam.setDepartDirectionCode(modify.getDepartDirectionCode());
change = true;
}
// 到达计划时间
if (!Objects.equals(this.arrivePlanTime, modify.getArrivePlanTime())) {
this.arrivePlanTime = modify.getArrivePlanTime();
runPlanParam.setArrivePlanTime(modify.getArrivePlanTime());
change = true;
}
// 出发计划时间
if (!Objects.equals(this.departPlanTime, modify.getDepartPlanTime())) {
this.departPlanTime = modify.getDepartPlanTime();
runPlanParam.setDepartPlanTime(modify.getDepartPlanTime());
change = true;
}
// 始发
if (!Objects.equals(this.startRunPlan, modify.getStartRunPlan())) {
this.startRunPlan = modify.getStartRunPlan();
runPlanParam.setStartRunPlan(modify.getStartRunPlan());
change = true;
}
// 终到
if (!Objects.equals(this.endRunPlan, modify.getEndRunPlan())) {
this.endRunPlan = modify.getEndRunPlan();
runPlanParam.setEndRunPlan(modify.getEndRunPlan());
change = true;
}
// 电力计划
if (!Objects.equals(this.electrical, modify.getElectrical())) {
this.electrical = modify.getElectrical();
runPlanParam.setElectrical(modify.getElectrical());
change = true;
}
// 办理客运
if (!Objects.equals(this.passenger, modify.getPassenger())) {
this.passenger = modify.getPassenger();
runPlanParam.setPassenger(modify.getPassenger());
change = true;
}
// 重点列车
if (!Objects.equals(this.keyTrains, modify.getKeyTrains())) {
this.keyTrains = modify.getKeyTrains();
runPlanParam.setKeyTrains(modify.getKeyTrains());
change = true;
}
// 是否军用
if (!Objects.equals(this.military, modify.getMilitary())) {
this.military = modify.getMilitary();
runPlanParam.setMilitary(modify.getMilitary());
change = true;
}
// 运行股道与基本径路不一致
if (!Objects.equals(this.trackDiscordant, modify.getTrackDiscordant())) {
this.trackDiscordant = modify.getTrackDiscordant();
runPlanParam.setTrackDiscordant(modify.getTrackDiscordant());
change = true;
}
// 出入口与基本径路不一致
if (!Objects.equals(this.entryOutDiscordant, modify.getEntryOutDiscordant())) {
this.entryOutDiscordant = modify.getTrackDiscordant();
runPlanParam.setEntryOutDiscordant(modify.getEntryOutDiscordant());
change = true;
}
// 超限等级
if (!Objects.equals(this.transfinite, modify.getTransfinite())) {
this.transfinite = modify.getTransfinite();
runPlanParam.setTransfinite(modify.getTransfinite());
change = true;
}
// 列车类型
if (!Objects.equals(this.trainType, modify.getTrainType())) {
this.trainType = modify.getTrainType();
runPlanParam.setTrainType(modify.getTrainType());
change = true;
}
// 运行类型
if (!Objects.equals(this.runType, modify.getRunType())) {
this.runType = modify.getRunType();
runPlanParam.setRunType(modify.getRunType());
change = true;
}
// 存在不一样的选项
Map<CtcStationRunPlanLog.RunPlanTask, Integer> modifyMap = new HashMap<>();
modify.getRunPlanTaskMap().forEach((k, v) -> {
@ -270,9 +371,143 @@ public class CtcRunPlanParam implements Cloneable {
runPlanParam.setRunPlanTaskMap(modifyMap);
change = true;
}
if (!Objects.equals(this.status, modify.getStatus())) {
this.status = modify.getStatus();
runPlanParam.setStatus(modify.getStatus());
change = true;
}
return change ? runPlanParam : null;
}
/**
* 对比两个计划对象
*
* @param origin 原有的
* @param modify 修改的
* @return 修改过的字段
*/
public CtcRunPlanParam compareAndChange(CtcRunPlanParam origin, CtcRunPlanParam modify) {
this.setRunPlanCode(modify.getRunPlanCode());
boolean change = false;
if (!Objects.equals(origin.getStationCode(), modify.getStationCode())) {
this.stationCode = modify.getStationCode();
change = true;
}
if (!Objects.equals(origin.getTripNumber(), modify.getTripNumber())) {
this.tripNumber = modify.getTripNumber();
change = true;
}
if (!Objects.equals(origin.getGroupNumber(), modify.getGroupNumber())) {
this.groupNumber = modify.getGroupNumber();
change = true;
}
if (!Objects.equals(origin.getTrackSectionCode(), modify.getTrackSectionCode())) {
this.trackSectionCode = modify.getTrackSectionCode();
change = true;
}
if (!Objects.equals(origin.getArriveSectionCode(), modify.getArriveSectionCode())) {
this.arriveSectionCode = modify.getArriveSectionCode();
change = true;
}
if (!Objects.equals(origin.getDepartSectionCode(), modify.getDepartSectionCode())) {
this.departSectionCode = modify.getDepartSectionCode();
change = true;
}
if (!Objects.equals(origin.getArriveTime(), modify.getArriveTime())) {
this.arriveTime = modify.getArriveTime();
change = true;
}
if (!Objects.equals(origin.getDepartTime(), modify.getDepartTime())) {
this.departTime = modify.getDepartTime();
change = true;
}
if (!Objects.equals(origin.getArriveTripNumber(), modify.getArriveTripNumber())) {
this.arriveTripNumber = modify.getArriveTripNumber();
change = true;
}
if (!Objects.equals(origin.getDepartTripNumber(), modify.getDepartTripNumber())) {
this.departTripNumber = modify.getDepartTripNumber();
change = true;
}
if (!Objects.equals(origin.getArriveStationCode(), modify.getArriveStationCode())) {
this.arriveStationCode = modify.getArriveStationCode();
change = true;
}
if (!Objects.equals(origin.getDepartStationCode(), modify.getDepartStationCode())) {
this.departStationCode = modify.getDepartStationCode();
change = true;
}
if (!Objects.equals(origin.getArriveDirectionCode(), modify.getArriveDirectionCode())) {
this.arriveDirectionCode = modify.getArriveDirectionCode();
change = true;
}
if (!Objects.equals(origin.getDepartDirectionCode(), modify.getDepartDirectionCode())) {
this.departDirectionCode = modify.getDepartDirectionCode();
change = true;
}
// 到达计划时间
if (!Objects.equals(origin.getArrivePlanTime(), modify.getArrivePlanTime())) {
this.arrivePlanTime = modify.getArrivePlanTime();
change = true;
}
// 出发计划时间
if (!Objects.equals(origin.getDepartPlanTime(), modify.getDepartPlanTime())) {
this.departPlanTime = modify.getDepartPlanTime();
change = true;
}
// 始发
if (!Objects.equals(origin.getStartRunPlan(), modify.getStartRunPlan())) {
this.startRunPlan = modify.getStartRunPlan();
change = true;
}
// 终到
if (!Objects.equals(origin.getEndRunPlan(), modify.getEndRunPlan())) {
this.endRunPlan = modify.getEndRunPlan();
change = true;
}
// 电力计划
if (!Objects.equals(origin.getElectrical(), modify.getElectrical())) {
this.electrical = modify.getElectrical();
change = true;
}
// 办理客运
if (!Objects.equals(origin.getPassenger(), modify.getPassenger())) {
this.passenger = modify.getPassenger();
change = true;
}
// 重点列车
if (!Objects.equals(origin.getKeyTrains(), modify.getKeyTrains())) {
this.keyTrains = modify.getKeyTrains();
change = true;
}
// 是否军用
if (!Objects.equals(origin.getMilitary(), modify.getMilitary())) {
this.military = modify.getMilitary();
change = true;
}
// 运行股道与基本径路不一致
if (!Objects.equals(origin.getTrackDiscordant(), modify.getTrackDiscordant())) {
this.trackDiscordant = modify.getTrackDiscordant();
change = true;
}
// 出入口与基本径路不一致
if (!Objects.equals(origin.getEntryOutDiscordant(), modify.getEntryOutDiscordant())) {
this.entryOutDiscordant = modify.getTrackDiscordant();
change = true;
}
// 超限等级
if (!Objects.equals(origin.getTransfinite(), modify.getTransfinite())) {
this.transfinite = modify.getTransfinite();
change = true;
}
// 状态
if (!Objects.equals(origin.getStatus(), modify.getStatus())) {
this.status = modify.getStatus();
change = true;
}
return change ? this : null;
}
@Override
public String toString() {
return "CtcRunPlanParam{" +
@ -313,7 +548,7 @@ public class CtcRunPlanParam implements Cloneable {
* @return 是否存在
*/
public boolean arriveIsExist() {
return this.arrivePlanTime != null || !StringUtils.isEmpty(this.arriveTripNumber) || !StringUtils.isEmpty(this.arriveSectionCode)
return this.arriveTime != null || !StringUtils.isEmpty(this.arriveTripNumber) || !StringUtils.isEmpty(this.arriveSectionCode)
|| !StringUtils.isEmpty(this.arriveDirectionCode) || !StringUtils.isEmpty(this.arriveStationCode);
}
@ -323,7 +558,21 @@ public class CtcRunPlanParam implements Cloneable {
* @return 是否存在
*/
public boolean departIsExist() {
return this.departPlanTime != null || !StringUtils.isEmpty(this.departTripNumber) || !StringUtils.isEmpty(this.departSectionCode)
return this.departTime != null || !StringUtils.isEmpty(this.departTripNumber) || !StringUtils.isEmpty(this.departSectionCode)
|| !StringUtils.isEmpty(this.departDirectionCode) || !StringUtils.isEmpty(this.departStationCode);
}
/**
* 列车类型
*/
public enum TrainType {
FAST_PASSENGER_TRAIN, // 快速旅客列车
}
/**
* 运行类型
*/
public enum RunType {
FAST_PASSENGER_TRAIN, // 快速旅客列车
}
}

View File

@ -3,7 +3,9 @@ package club.joylink.rtss.simulation.cbtc.ATS.service.runplan;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.cbtc.ATS.operation.vo.CtcRunPlanParam;
import club.joylink.rtss.simulation.cbtc.CTC.CTCService;
import club.joylink.rtss.simulation.cbtc.CTC.data.*;
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcEffectRepository;
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcStationRunPlanLog;
import club.joylink.rtss.simulation.cbtc.CTC.data.RouteSequence;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.data.map.Section;
import club.joylink.rtss.simulation.cbtc.data.map.Station;
@ -19,7 +21,6 @@ import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Component
@Slf4j
@ -187,24 +188,27 @@ public class CtcStationRunPlanLogService {
public void signForRunPlan(Simulation simulation, String stationCode) {
CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository();
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(effectRepository);
CtcManageRepository.StationRunPlanRepository stationRunPlanRepository = effectRepository.getStationRunPlanMap().get(stationCode);
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(stationRunPlanRepository);
List<CtcRunPlanParam> runPlanParamList = stationRunPlanRepository.getRunPlanParamMap().values().stream().collect(Collectors.toList());
// 如果发生变化,覆盖原有的信息
stationRunPlanRepository.getRunPlanParamMap().forEach((runPlanCode, ctcRunPlanParam) -> {
CtcStationRunPlanLog runPlanLog = simulation.getCtcRepository().getRunPlanByRunPlanCode(stationCode, runPlanCode);
if (runPlanLog != null) {
CtcRunPlanVO runPlanVO = CtcRunPlanVO.compareAndChange(ctcRunPlanParam, runPlanLog);
if (runPlanVO != null) {
runPlanLog.setBaseAttribute(ctcRunPlanParam);
runPlanLog.setArriveRunPlan(CtcStationRunPlanLog.createRunPlanItem(simulation, ctcRunPlanParam, true));
runPlanLog.setDepartRunPlan(CtcStationRunPlanLog.createRunPlanItem(simulation, ctcRunPlanParam, false));
CtcEffectRepository.CtcStageRunPlanRepository runPlanRepository = effectRepository.getStationStageRunPlanMap().get(stationCode);
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(runPlanRepository);
int curVersion = runPlanRepository.getVersion().get(); // 当前生效区版本
Integer oldVersion = effectRepository.getStageRunPlanVersionMap().get(stationCode); // 旧版本
if (oldVersion == null || curVersion != oldVersion) {
runPlanRepository.getCtcRunPlanVOList().forEach(ctcRunPlanVO -> {
CtcStationRunPlanLog runPlanLog = simulation.getCtcRepository()
.getRunPlanByRunPlanCodeAndStationCode(stationCode, ctcRunPlanVO.getRunPlanCode());
if (runPlanLog != null) {
runPlanLog.setBaseAttribute(ctcRunPlanVO.getOriginRunPlan());
// 到达
modifyRunPlanItemInfo(simulation, runPlanLog.getArriveRunPlan(), ctcRunPlanVO.getOriginRunPlan(), true);
// 出发
modifyRunPlanItemInfo(simulation, runPlanLog.getDepartRunPlan(), ctcRunPlanVO.getOriginRunPlan(), false);
} else {
runPlanLog = createRunPlanLog(simulation, stationCode, ctcRunPlanVO.getOriginRunPlan());
simulation.getCtcRepository().addRunPlanToSimulationMap(runPlanLog);
}
} else {
runPlanLog = createRunPlanLog(simulation, stationCode, ctcRunPlanParam);
simulation.getCtcRepository().addRunPlanToSimulationMap(runPlanLog);
}
});
});
effectRepository.getStageRunPlanVersionMap().put(stationCode, curVersion);
}
}
/**
@ -225,8 +229,12 @@ public class CtcStationRunPlanLogService {
// 出发
change = change || modifyRunPlanItemInfo(simulation, runPlanLog.getDepartRunPlan(), planParam, false);
// 是否客运
if (planParam.getPassenger() != null && !Objects.equals(planParam.getPassenger(), runPlanLog.getPassenger())) {
runPlanLog.setPassenger(planParam.getPassenger());
if (planParam.getPassenger() != null) {
CtcStationRunPlanLog.PlanPropertiesType planPropertiesType = planParam.getPassenger() ?
CtcStationRunPlanLog.PlanPropertiesType.PASSENGER : null;
if (!Objects.equals(planParam.getPassenger(), runPlanLog.getPassenger())) {
runPlanLog.setPassenger(planPropertiesType);
}
}
// 重点列车
if (planParam.getKeyTrains() != null && !Objects.equals(planParam.getKeyTrains(), runPlanLog.getKeyTrains())) {

View File

@ -2,16 +2,18 @@ package club.joylink.rtss.simulation.cbtc.ATS.service.runplan;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.cbtc.ATS.operation.vo.CtcRunPlanParam;
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcEffectRepository;
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcManageRepository;
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcZone;
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcZoneRepository;
import club.joylink.rtss.simulation.cbtc.CTC.data.*;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.data.map.StationDirection;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.time.LocalTime;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
@Component
@Slf4j
@ -26,46 +28,47 @@ public class CtcZoneService {
public void saveRunPlan(Simulation simulation, CtcRunPlanParam planParam) {
CtcZoneRepository railwayRepository = simulation.getCtcRepository().getCtcZoneRepository();
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(railwayRepository);
// 初始化运行计划编码车次信息
planParam.generateRunPlanCodeAndTripNumber();
if (StringUtils.isEmpty(planParam.getRunPlanCode())) { // 初始化运行计划编码车次信息
planParam.generateRunPlanCodeAndTripNumber();
}
railwayRepository.saveRunPlan(planParam);
}
/**
* 修改股道
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveSection 到达股道
* @param departSection 发车股道
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param sectionCode 股道
* @param model 接发
*/
public void saveTrackSection(Simulation simulation, String stationCode, String runPlanCode, String arriveSection, String departSection) {
public void saveTrackSection(Simulation simulation, String stationCode, String runPlanCode, String sectionCode, StationDirection.ReceiveAndDeliverModel model) {
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(sectionCode);
CtcRunPlanParam runPlanParam = simulation.getCtcRepository().getCtcZoneRepository().queryRunPlan(stationCode, runPlanCode);
if (!StringUtils.isEmpty(arriveSection)) {
runPlanParam.setArriveSectionCode(arriveSection);
}
if (!StringUtils.isEmpty(departSection)) {
runPlanParam.setDepartSectionCode(departSection);
if (StationDirection.ReceiveAndDeliverModel.R.equals(model)) {
runPlanParam.setArriveSectionCode(sectionCode);
} else {
runPlanParam.setDepartSectionCode(sectionCode);
}
}
/**
* 修改车次
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveTripNumber 到达车次
* @param departTripNumber 发车车次
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param tripNumber 车次
* @param model 接发
*/
public void saveTripNumber(Simulation simulation, String stationCode, String runPlanCode, String arriveTripNumber, String departTripNumber) {
public void saveTripNumber(Simulation simulation, String stationCode, String runPlanCode, String tripNumber, StationDirection.ReceiveAndDeliverModel model) {
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(tripNumber);
CtcRunPlanParam runPlanParam = simulation.getCtcRepository().getCtcZoneRepository().queryRunPlan(stationCode, runPlanCode);
if (!StringUtils.isEmpty(arriveTripNumber)) {
runPlanParam.setArriveTripNumber(arriveTripNumber);
}
if (!StringUtils.isEmpty(departTripNumber)) {
runPlanParam.setDepartTripNumber(departTripNumber);
if (StationDirection.ReceiveAndDeliverModel.R.equals(model)) {
runPlanParam.setArriveTripNumber(tripNumber);
} else {
runPlanParam.setDepartTripNumber(tripNumber);
}
}
@ -75,54 +78,54 @@ public class CtcZoneService {
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveTime 到达时间
* @param departTime 车时间
* @param planTime 计划时间
* @param model
*/
public void savePlanTime(Simulation simulation, String stationCode, String runPlanCode, LocalTime arriveTime, LocalTime departTime) {
public void savePlanTime(Simulation simulation, String stationCode, String runPlanCode, LocalTime planTime, StationDirection.ReceiveAndDeliverModel model) {
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(planTime);
CtcRunPlanParam runPlanParam = simulation.getCtcRepository().getCtcZoneRepository().queryRunPlan(stationCode, runPlanCode);
if (!StringUtils.isEmpty(arriveTime)) {
runPlanParam.setArrivePlanTime(arriveTime);
}
if (!StringUtils.isEmpty(departTime)) {
runPlanParam.setDepartPlanTime(departTime);
if (StationDirection.ReceiveAndDeliverModel.R.equals(model)) {
runPlanParam.setArriveTime(planTime);
} else {
runPlanParam.setDepartTime(planTime);
}
}
/**
* 修改到出入口
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveDirectionCode 到达方向编码
* @param departDirectionCode 发车方向编码
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param runPlanCode 运行计划编码
* @param directionCode 方向编码
*/
public void saveDirection(Simulation simulation, String stationCode, String runPlanCode, String arriveDirectionCode, String departDirectionCode) {
public void saveDirection(Simulation simulation, String stationCode, String runPlanCode, String directionCode, StationDirection.ReceiveAndDeliverModel model) {
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(directionCode);
CtcRunPlanParam runPlanParam = simulation.getCtcRepository().getCtcZoneRepository().queryRunPlan(stationCode, runPlanCode);
if (!StringUtils.isEmpty(arriveDirectionCode)) {
runPlanParam.setArriveDirectionCode(arriveDirectionCode);
}
if (!StringUtils.isEmpty(departDirectionCode)) {
runPlanParam.setDepartDirectionCode(departDirectionCode);
if (StationDirection.ReceiveAndDeliverModel.R.equals(model)) {
runPlanParam.setArriveDirectionCode(directionCode);
} else {
runPlanParam.setDepartDirectionCode(directionCode);
}
}
/**
* 修改到发车站
*
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param arriveStation 到达方向车站编码
* @param departStation 发车方向车站编码
* @param simulation 仿真
* @param stationCode 车站编码
* @param runPlanCode 运行计划编码
* @param planStationCode 计划方向车站编码
* @param model 接发
*/
public void saveStation(Simulation simulation, String stationCode, String runPlanCode, String arriveStation, String departStation) {
public void saveStation(Simulation simulation, String stationCode, String runPlanCode, String planStationCode, StationDirection.ReceiveAndDeliverModel model) {
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(planStationCode);
CtcRunPlanParam runPlanParam = simulation.getCtcRepository().getCtcZoneRepository().queryRunPlan(stationCode, runPlanCode);
if (!StringUtils.isEmpty(arriveStation)) {
runPlanParam.setArriveStationCode(arriveStation);
}
if (!StringUtils.isEmpty(departStation)) {
runPlanParam.setDepartStationCode(departStation);
if (StationDirection.ReceiveAndDeliverModel.R.equals(model)) {
runPlanParam.setArriveStationCode(planStationCode);
} else {
runPlanParam.setDepartStationCode(planStationCode);
}
}
@ -151,12 +154,15 @@ public class CtcZoneService {
.findFirst().orElse(null);
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(ctcZone);
CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository();
Set<String> stationCodeSet = new HashSet<>();
ctcZone.getStationList().forEach(station -> {
stationCodeSet.add(station.getCode());
CtcManageRepository.StationRunPlanRepository runPlanRepository = zoneRepository.getStationRunPlanMap().get(station.getCode());
if (runPlanRepository != null) {
effectRepository.releaseRunPlanByStationCode(runPlanRepository, simulation.getCorrectSystemTime());
}
});
updateStageRunPlan(simulation, stationCodeSet);
}
/**
@ -172,5 +178,39 @@ public class CtcZoneService {
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(runPlanRepository);
CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository();
effectRepository.releaseRunPlanByStationCode(runPlanRepository, simulation.getCorrectSystemTime());
updateStageRunPlan(simulation, stationCode);
}
/**
* 更新至阶段计划
*
* @param simulation 仿真
* @param stationCodeSet 车站编码列表
*/
private void updateStageRunPlan(Simulation simulation, Set<String> stationCodeSet) {
stationCodeSet.forEach(stationCode -> updateStageRunPlan(simulation, stationCode));
}
/**
* 更新至阶段计划
*
* @param simulation 仿真
* @param stationCode 车站编码
*/
private void updateStageRunPlan(Simulation simulation, String stationCode) {
// 生效区的数据
CtcManageRepository.StationRunPlanRepository runPlanRepository = simulation.getCtcRepository().getEffectStationRunPlanMap(stationCode);
List<CtcRunPlanVO> allList = new LinkedList<>();
runPlanRepository.getRunPlanParamMap().forEach((runPlanCode, ctcRunPlanParam) -> {
CtcStationRunPlanLog runPlanLog = simulation.getCtcRepository().getRunPlanByRunPlanCodeAndStationCode(stationCode, runPlanCode);
CtcRunPlanVO runPlanVO = CtcRunPlanVO.compareAndChange(ctcRunPlanParam, runPlanLog);
if (runPlanVO != null) {
allList.add(runPlanVO);
}
});
if (!allList.isEmpty()) {
simulation.getCtcRepository().releaseRunPlanStagePlan(stationCode, allList, simulation.getCorrectSystemTime()
, runPlanRepository.getVersion().get());
}
}
}

View File

@ -314,18 +314,8 @@ public class CTCLogicLoop {
* @param simulation 仿真
*/
public void sendZoneRunPlanSend(Simulation simulation) {
// 生效区的数据
CtcEffectRepository effectRepository = simulation.getCtcRepository().getCtcEffectRepository();
List<CtcRunPlanVO> allList = new LinkedList<>();
effectRepository.getStationRunPlanMap().forEach((k, v) -> {
v.getRunPlanParamMap().forEach((runPlanCode, ctcRunPlanParam) -> {
CtcStationRunPlanLog runPlanLog = simulation.getCtcRepository().getRunPlanByRunPlanCode(k, runPlanCode);
CtcRunPlanVO runPlanVO = CtcRunPlanVO.compareAndChange(ctcRunPlanParam, runPlanLog);
if (runPlanVO != null) {
allList.add(runPlanVO);
}
});
});
List<CtcEffectRepository.CtcStageRunPlanRepository> allList
= simulation.getCtcRepository().getCtcEffectRepository().getChangeStageRunPlan();
if (!CollectionUtils.isEmpty(allList)) {
sendCtcMessage(simulation.getId(), allList, WebSocketMessageType.SIMULATION_RAILWAY_RUN_PLAN_SEND, simulation.getSimulationUserIds());
}

View File

@ -1,13 +1,17 @@
package club.joylink.rtss.simulation.cbtc.CTC.data;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.cbtc.ATS.operation.vo.CtcRunPlanParam;
import lombok.Getter;
import lombok.Setter;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* CTC生效区数据
@ -22,6 +26,30 @@ public class CtcEffectRepository {
*/
private final Map<String, CtcManageRepository.StationRunPlanRepository> stationRunPlanMap = new ConcurrentHashMap<>();
/**
* 阶段计划与各车站与生效区
*/
private final Map<String, CtcStageRunPlanRepository> stationStageRunPlanMap = new ConcurrentHashMap<>();
/**
* 阶段计划版本
*/
private final Map<String, Integer> stageRunPlanVersionMap = new HashMap<>();
/**
* 保存运行计划信息
*
* @param runPlanParam 运行计划
*/
public void saveRunPlan(CtcRunPlanParam runPlanParam) {
if (!this.stationRunPlanMap.containsKey(runPlanParam.getStationCode())) {
CtcManageRepository.StationRunPlanRepository repository = new CtcManageRepository.StationRunPlanRepository();
repository.setStationCode(runPlanParam.getStationCode());
this.stationRunPlanMap.put(runPlanParam.getStationCode(), repository);
}
this.stationRunPlanMap.get(runPlanParam.getStationCode()).saveRunPlan(runPlanParam);
}
/**
* 单车站发布
*
@ -46,14 +74,97 @@ public class CtcEffectRepository {
}
/**
* 获取生效区运行计划
* 获取车站的运行计划数据
*
* @param stationCode 车站编码
* @return 运行计划
* @param stationCode
* @return 运行计划数据
*/
public Map<String, CtcRunPlanParam> getStationRunPlanParam(String stationCode) {
CtcManageRepository.StationRunPlanRepository runPlanRepository = this.getStationRunPlanMap().get(stationCode);
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(runPlanRepository);
return runPlanRepository.getRunPlanParamMap();
public CtcManageRepository.StationRunPlanRepository getStationRunPlanRepository(String stationCode) {
return this.stationRunPlanMap.get(stationCode);
}
/**
* 发布阶段计划
*
* @param stationCode 车站编码
* @param ctcRunPlanVOList 运行计划列表
* @param updateDateTime 更新时间
* @param version 版本
*/
public void releaseRunPlanStagePlan(String stationCode, List<CtcRunPlanVO> ctcRunPlanVOList
, LocalDateTime updateDateTime, int version) {
if (!CollectionUtils.isEmpty(ctcRunPlanVOList)) {
CtcStageRunPlanRepository runPlanRepository = this.stationStageRunPlanMap
.getOrDefault(stationCode, new CtcStageRunPlanRepository(stationCode));
runPlanRepository.setVersion(version);
runPlanRepository.setCtcRunPlanVOList(ctcRunPlanVOList);
runPlanRepository.setUpdateTime(updateDateTime);
this.stationStageRunPlanMap.put(stationCode, runPlanRepository);
}
}
/**
* 获取阶段计划已发布情况
*
* @return 变化的车站
*/
public List<CtcStageRunPlanRepository> getChangeStageRunPlan() {
return this.stationStageRunPlanMap.values().stream()
.filter(r -> this.stageRunPlanVersionMap.get(r.getVersion()) == null
|| this.stageRunPlanVersionMap.get(r.getVersion()) != r.getVersion().get())
.collect(Collectors.toList());
}
/**
* 阶段计划数据
*/
@Getter
@Setter
public class CtcStageRunPlanRepository {
/**
* 车站编码
*/
private String stationCode;
/**
* 当前数据版本
*/
private AtomicInteger version;
/**
* 最近变更时间
*/
private LocalDateTime updateTime;
/**
* 变化的计划列表
*/
private List<CtcRunPlanVO> ctcRunPlanVOList;
public CtcStageRunPlanRepository(String stationCode) {
this.stationCode = stationCode;
this.version = new AtomicInteger(0);
}
public void setVersion(int version) {
this.version.set(version);
}
/**
* 发布计划表
*
* @param ctcRunPlanVOList 计划列表
* @param updateTime 更新时间
*/
public void updateRunPlanList(List<CtcRunPlanVO> ctcRunPlanVOList, LocalDateTime updateTime) {
this.ctcRunPlanVOList = ctcRunPlanVOList;
this.version.incrementAndGet();
this.updateTime = updateTime;
}
}
public void reset() {
this.stationRunPlanMap.clear();
this.stationStageRunPlanMap.clear();
}
}

View File

@ -7,6 +7,7 @@ import club.joylink.rtss.simulation.cbtc.CTC.data.vo.RouteSequenceVO;
import club.joylink.rtss.simulation.cbtc.CTC.data.vo.TrackViewVO;
import lombok.Getter;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
@ -30,8 +31,8 @@ public class CtcRepository {
* 铁路局的数据包含区段信息用户信息设置的默认信息等
*/
/******************************************* 以下为调度台数据:车站为单位 *********************************************/
/******************************************* 以下为调度台数据:车站为单位 *********************************************/
/**
* 数据
*/
@ -97,12 +98,6 @@ public class CtcRepository {
*/
private List<CtcStationRunPlanLog> allRunPlanList = new LinkedList<>();
/**
* 原始数据中行车计划原始行驶计划数据
* 编码为key
*/
private final Map<String, Map<String, CtcStationRunPlanLog>> originRunPlanMap = new ConcurrentHashMap<>();
/**
* 仿真数据中行车计划后期客户添加
* 编码为key
@ -130,15 +125,14 @@ public class CtcRepository {
trackViewMap.clear();
trackViewVOMap.clear();
// 仿真运行数据直接清空
this.simulationRunPlanMap.clear();
this.ctcZoneRepository.reset();
this.ctcZoneRepositoryVO.reset();
this.ctcEffectRepository.reset();
this.manageRepositoryMap.clear();
this.ctcManageRepositoryVO.reset();
this.allRunPlanList.clear();
// 重置原始数据
this.originRunPlanMap.values().forEach(runPlanMap -> runPlanMap.values().forEach(runPlan -> {
runPlan.reset();
this.allRunPlanList.add(runPlan);
}));
// 运行计划状态清除
this.runPlanStatusVOMap.clear();
this.simulationRunPlanMap.clear();
this.runPlanStatusVOMap.clear(); // 运行计划状态清除
dispatchCommandIdGenerator = new AtomicInteger(0);
dispatchCommandSet.clear();
}
@ -162,26 +156,6 @@ public class CtcRepository {
runPlanLogList.forEach(this::addRunPlanToSimulationMap);
}
/**
* 添加至初始数据中的行车计划
*/
public void addRunPlanToOriginMap(CtcStationRunPlanLog runPlanLog) {
String stationCode = runPlanLog.getStation().getCode();
// 编码为Key
Map<String, CtcStationRunPlanLog> stationRunLogMap =
this.originRunPlanMap.getOrDefault(stationCode, new ConcurrentHashMap<>(64));
stationRunLogMap.put(runPlanLog.getCode(), runPlanLog);
this.originRunPlanMap.put(stationCode, stationRunLogMap);
this.allRunPlanList.add(runPlanLog);
}
/**
* 添加至仿真中的行车计划
*/
public void addRunPlanListToOriginMap(List<CtcStationRunPlanLog> runPlanLogList) {
runPlanLogList.forEach(this::addRunPlanToOriginMap);
}
/**
* 移除车站的所有运行计划
*/
@ -204,6 +178,35 @@ public class CtcRepository {
return planLog;
}
public CtcStationRunPlanLog getRunPlanByRunPlanCodeAndStationCode(String stationCode, String runPlanCode) {
// 运行计划集合
Map<String, CtcStationRunPlanLog> runPlanLogMap = this.simulationRunPlanMap.getOrDefault(stationCode, new HashMap<>());
return runPlanLogMap.get(runPlanCode);
}
/**
* 获取生效区
*
* @param stationCode 车站编码
* @return 车站生效区的运行计划
*/
public CtcManageRepository.StationRunPlanRepository getEffectStationRunPlanMap(String stationCode) {
return this.ctcEffectRepository.getStationRunPlanRepository(stationCode);
}
/**
* 发布至阶段数据
*
* @param stationCode 车站编码
* @param ctcRunPlanVOList 运行计划列表
* @param updateDateTime 更新时间
* @param version 版本
*/
public void releaseRunPlanStagePlan(String stationCode, List<CtcRunPlanVO> ctcRunPlanVOList
, LocalDateTime updateDateTime, int version) {
this.ctcEffectRepository.releaseRunPlanStagePlan(stationCode, ctcRunPlanVOList, updateDateTime, version);
}
/**
* 根据车次获取运行计划
*/

View File

@ -3,9 +3,6 @@ package club.joylink.rtss.simulation.cbtc.CTC.data;
import club.joylink.rtss.simulation.cbtc.ATS.operation.vo.CtcRunPlanParam;
import lombok.Getter;
import lombok.Setter;
import org.springframework.util.StringUtils;
import java.util.Objects;
/**
* 阶段对比
@ -24,7 +21,7 @@ public class CtcRunPlanVO {
private String runPlanCode;
/**
* 原始运行计划
* 当前运行计划
*/
private CtcRunPlanParam originRunPlan;
@ -47,165 +44,12 @@ public class CtcRunPlanVO {
* @param runPlanLog 行车日志
*/
public static CtcRunPlanVO compareAndChange(CtcRunPlanParam runPlanParam, CtcStationRunPlanLog runPlanLog) {
CtcRunPlanParam changeRunPlan = new CtcRunPlanParam();
CtcRunPlanVO runPlanVO = new CtcRunPlanVO(runPlanParam);
if (runPlanLog == null) {
return new CtcRunPlanVO(runPlanParam);
}
boolean change = false;
// 到达信息
if (runPlanParam.arriveIsExist()) {
if (runPlanLog.getArriveRunPlan() != null) {
CtcStationRunPlanLog.RunPlanItem runPlanItem = runPlanLog.getArriveRunPlan();
// 计划时间
if (!Objects.equals(runPlanParam.getArrivePlanTime(), runPlanItem.getPlanTime())) {
changeRunPlan.setArrivePlanTime(runPlanParam.getArrivePlanTime());
change = true;
}
// 车次
if (!Objects.equals(runPlanParam.getArriveTripNumber(), runPlanItem.getTripNumber())) {
changeRunPlan.setArriveTripNumber(runPlanParam.getArriveTripNumber());
change = true;
}
// 股道
if (runPlanItem.getTrackSection() == null && !StringUtils.isEmpty(runPlanParam.getArriveSectionCode())) {
changeRunPlan.setArriveSectionCode(runPlanParam.getArriveSectionCode());
change = true;
} else if (runPlanItem.getTrackSection() != null
&& !Objects.equals(runPlanParam.getArriveSectionCode(), runPlanItem.getTrackSection().getCode())) {
changeRunPlan.setArriveSectionCode(runPlanParam.getArriveSectionCode());
change = true;
}
// 车站
if (runPlanItem.getStation() == null && !StringUtils.isEmpty(runPlanParam.getArriveStationCode())) {
changeRunPlan.setArriveStationCode(runPlanParam.getArriveStationCode());
change = true;
} else if (runPlanItem.getStation() != null
&& !Objects.equals(runPlanParam.getArriveStationCode(), runPlanItem.getStation().getCode())) {
changeRunPlan.setArriveStationCode(runPlanParam.getArriveStationCode());
change = true;
}
// 出入口
if (runPlanItem.getStationDirection() == null && !StringUtils.isEmpty(runPlanParam.getArriveDirectionCode())) {
changeRunPlan.setArriveDirectionCode(runPlanParam.getArriveDirectionCode());
change = true;
} else if (runPlanItem.getStation() != null
&& !Objects.equals(runPlanParam.getArriveDirectionCode(), runPlanItem.getStationDirection().getCode())) {
changeRunPlan.setArriveDirectionCode(runPlanParam.getArriveDirectionCode());
change = true;
}
} else {
changeRunPlan.setArrivePlanTime(runPlanParam.getArrivePlanTime());
changeRunPlan.setArriveTripNumber(runPlanParam.getArriveTripNumber());
changeRunPlan.setArriveSectionCode(runPlanParam.getArriveSectionCode());
changeRunPlan.setArriveDirectionCode(runPlanParam.getArriveDirectionCode());
changeRunPlan.setArriveStationCode(runPlanParam.getArriveStationCode());
change = true;
}
} else {
change = runPlanLog.getArriveRunPlan() != null;
}
// 出发时间
if (runPlanParam.departIsExist()) {
if (runPlanLog.getDepartRunPlan() != null) {
CtcStationRunPlanLog.RunPlanItem runPlanItem = runPlanLog.getDepartRunPlan();
// 计划时间
if (!Objects.equals(runPlanParam.getDepartPlanTime(), runPlanItem.getPlanTime())) {
changeRunPlan.setDepartPlanTime(runPlanParam.getDepartPlanTime());
change = true;
}
// 车次
if (!Objects.equals(runPlanParam.getDepartTripNumber(), runPlanItem.getTripNumber())) {
changeRunPlan.setDepartTripNumber(runPlanParam.getDepartTripNumber());
change = true;
}
// 股道
if (runPlanItem.getTrackSection() == null && !StringUtils.isEmpty(runPlanParam.getDepartSectionCode())) {
changeRunPlan.setDepartSectionCode(runPlanParam.getDepartSectionCode());
change = true;
} else if (runPlanItem.getTrackSection() != null
&& !Objects.equals(runPlanParam.getDepartSectionCode(), runPlanItem.getTrackSection().getCode())) {
changeRunPlan.setDepartSectionCode(runPlanParam.getDepartSectionCode());
change = true;
}
// 车站
if (runPlanItem.getStation() == null && !StringUtils.isEmpty(runPlanParam.getDepartStationCode())) {
changeRunPlan.setDepartStationCode(runPlanParam.getDepartStationCode());
change = true;
} else if (runPlanItem.getStation() != null
&& !Objects.equals(runPlanParam.getDepartStationCode(), runPlanItem.getStation().getCode())) {
changeRunPlan.setDepartStationCode(runPlanParam.getDepartStationCode());
change = true;
}
// 出入口
if (runPlanItem.getStationDirection() == null && !StringUtils.isEmpty(runPlanParam.getDepartDirectionCode())) {
changeRunPlan.setDepartDirectionCode(runPlanParam.getDepartDirectionCode());
change = true;
} else if (runPlanItem.getStation() != null
&& !Objects.equals(runPlanParam.getDepartDirectionCode(), runPlanItem.getStationDirection().getCode())) {
changeRunPlan.setDepartDirectionCode(runPlanParam.getDepartDirectionCode());
change = true;
}
} else {
changeRunPlan.setDepartPlanTime(runPlanParam.getDepartPlanTime());
changeRunPlan.setDepartTripNumber(runPlanParam.getDepartTripNumber());
changeRunPlan.setDepartSectionCode(runPlanParam.getDepartSectionCode());
changeRunPlan.setDepartDirectionCode(runPlanParam.getDepartDirectionCode());
changeRunPlan.setDepartStationCode(runPlanParam.getDepartStationCode());
change = true;
}
} else {
change = runPlanLog.getDepartRunPlan() != null;
}
// 车次
if (!Objects.equals(runPlanParam.getGroupNumber(), runPlanLog.getGroupNumber())) {
changeRunPlan.setGroupNumber(runPlanParam.getGroupNumber());
change = true;
}
// 股道信息
if (!Objects.equals(runPlanParam.getTrackSectionCode(), runPlanLog.getTrackSectionCode())) {
changeRunPlan.setTrackSectionCode(runPlanParam.getTrackSectionCode());
change = true;
}
// 是否删除
if (!Objects.equals(runPlanParam.getStatus() == -1, runPlanLog.getDelete())) {
changeRunPlan.setStatus(runPlanParam.getStatus());
change = true;
}
// 客运车
if (!Objects.equals(runPlanParam.getPassenger(), runPlanLog.getPassenger())) {
changeRunPlan.setPassenger(runPlanParam.getPassenger());
change = true;
}
// 重点列车
if (!Objects.equals(runPlanParam.getKeyTrains(), runPlanLog.getKeyTrains())) {
changeRunPlan.setKeyTrains(runPlanParam.getKeyTrains());
change = true;
}
// 军用
if (!Objects.equals(runPlanParam.getMilitary(), runPlanLog.getMilitary())) {
changeRunPlan.setMilitary(runPlanParam.getMilitary());
change = true;
}
// 运行股道与基本径路不一致
if (!Objects.equals(runPlanParam.getTrackDiscordant(), runPlanLog.getTrackDiscordant())) {
changeRunPlan.setTrackDiscordant(runPlanParam.getTrackDiscordant());
change = true;
}
// 出入口与基本径路不一致
if (!Objects.equals(runPlanParam.getEntryOutDiscordant(), runPlanLog.getEntryOutDiscordant())) {
changeRunPlan.setEntryOutDiscordant(runPlanParam.getEntryOutDiscordant());
change = true;
}
// 超限等级
if (!Objects.equals(runPlanParam.getTransfinite(), runPlanLog.getTransfinite())) {
changeRunPlan.setTransfinite(runPlanParam.getTransfinite());
change = true;
}
if (change) {
CtcRunPlanVO runPlanVO = new CtcRunPlanVO(runPlanParam);
runPlanVO.setChangeRunPlan(changeRunPlan);
return runPlanVO;
}
return null;
CtcRunPlanParam changeRunPlan = new CtcRunPlanParam().compareAndChange(runPlanLog.getPlanParam(), runPlanParam);
runPlanVO.setChangeRunPlan(changeRunPlan);
return changeRunPlan != null ? runPlanVO : null;
}
}

View File

@ -139,7 +139,9 @@ public class CtcStationRunPlanLog {
public void setBaseAttribute(CtcRunPlanParam paramInfo) {
this.tripNumber = paramInfo.getTripNumber();
this.trackSectionCode = paramInfo.getTrackSectionCode();
this.passenger = paramInfo.getPassenger(); // 是否客运
if (paramInfo.getPassenger() != null && paramInfo.getPassenger()) {
this.passenger = PlanPropertiesType.PASSENGER; // 是否客运
}
this.keyTrains = paramInfo.getKeyTrains(); // 重点列车
this.military = paramInfo.getMilitary(); // 是否军用
this.trackDiscordant = paramInfo.getTrackDiscordant(); // 运行股道与基本径路不一致
@ -153,25 +155,6 @@ public class CtcStationRunPlanLog {
}
}
public void reset() {
this.remark = null;
this.lateReason = null;
this.planProperties = null;
// 运行任务复位
if (!CollectionUtils.isEmpty(this.runPlanTaskItemMap)) {
this.runPlanTaskItemMap.forEach((k, v) -> v.reset());
}
if (this.arriveRunPlan != null) {
this.arriveRunPlan.setRunModel(StationDirection.ReceiveAndDeliverModel.R);
this.arriveRunPlan.reset();
}
if (this.departRunPlan != null) {
this.departRunPlan.setRunModel(StationDirection.ReceiveAndDeliverModel.D);
this.departRunPlan.reset();
}
this.delete = false;
}
public void finishReceivingNotice() {
BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertNotNull(arriveRunPlan);
arriveRunPlan.setAdjacentMessage(RunPlanItem.FINISH);
@ -255,21 +238,11 @@ public class CtcStationRunPlanLog {
*/
private Station station;
/**
* 默认的邻近车站
*/
private Station defaultStation;
/**
* 股道区段发车股道目标(站台), 倒车计划目标区段发车计划起始区段
*/
private Section trackSection;
/**
* 默认股道区段
*/
private Section defaultTrackSection;
/**
* 车次号
*/
@ -320,11 +293,6 @@ public class CtcStationRunPlanLog {
*/
private StationDirection stationDirection;
/**
* 默认的发车方向
*/
private StationDirection defaultStationDirection;
/**
* 列车类型
*/
@ -356,35 +324,6 @@ public class CtcStationRunPlanLog {
this.processTypeMap = new HashMap<>(ProcessType.values().length);
}
public void reset() {
this.stationDirection = this.defaultStationDirection;
this.station = this.defaultStation;
if (this.stationDirection != null) {
this.right = this.stationDirection.getRight();
this.accessName = this.stationDirection.getName();
this.initAccessName();
} else {
this.accessName = null;
}
if (StationDirection.ReceiveAndDeliverModel.R.equals(this.runModel)) {
this.tripNumber = this.paramInfo.getArriveTripNumber();
this.planTime = this.getParamInfo().getArrivePlanTime();
} else {
this.tripNumber = this.paramInfo.getDepartTripNumber();
this.planTime = this.getParamInfo().getDepartPlanTime();
}
this.trackSection = this.defaultTrackSection;
this.actualTime = null;
this.adjacentStatus = null;
this.adjacentDepart = null;
this.adjacentMessage = NO;
this.occupiedCode = null;
this.adjacentMessageTime = null;
this.trainTypeMap.clear();
this.processTypeMap.clear();
}
public void initAccessName() {
if (StringUtils.isEmpty(this.accessName)) {
this.accessName = String.format("%s%s(%s)", "甲丙", this.right ? "上行" : "下行", this.station.getName());
@ -414,7 +353,6 @@ public class CtcStationRunPlanLog {
runPlanItem = new RunPlanItem(paramInfo);
Station adjacentStation = simulation.getRepository().getByCode(stationCode, Station.class);
runPlanItem.setStation(adjacentStation);
runPlanItem.setDefaultStation(adjacentStation);
runPlanItem.setTripNumber(tripNumber);
// 计划时间
LocalTime planTime = arrive ? paramInfo.getArrivePlanTime() : paramInfo.getDepartPlanTime();
@ -432,7 +370,6 @@ public class CtcStationRunPlanLog {
if (!StringUtils.isEmpty(sectionCode)) {
Section section = simulation.getRepository().getByCode(sectionCode, Section.class);
runPlanItem.setTrackSection(section);
runPlanItem.setDefaultTrackSection(section);
}
// 接发方向
StationDirection.ReceiveAndDeliverModel runStatus = arrive ?
@ -444,7 +381,6 @@ public class CtcStationRunPlanLog {
StationDirection stationDirection = simulation.getRepository().getByCode(directionCode, StationDirection.class);
// 接发状态
runPlanItem.setStationDirection(stationDirection);
runPlanItem.setDefaultStationDirection(stationDirection);
runPlanItem.setAccessName(stationDirection.getName());
runPlanItem.setRight(stationDirection.getRight());
runPlanItem.setRunModel(stationDirection.getDefaultRunStatus());
@ -454,27 +390,6 @@ public class CtcStationRunPlanLog {
return runPlanItem;
}
/**
* 列车类型
*/
public enum TrainType {
CARS_OPEN_TO_TRAFFIC_HEAVY, // 运用车重车
CARS_OPEN_TO_TRAFFIC_EMPTY, // 运用车空车
CARS_OPEN_TO_TRAFFIC_NO, // 非运用车
CABOOSE, // 守车
}
/**
* 流程类型
*/
public enum ProcessType {
TRAIN_ARRIVE_RETURN, // 列车到达补机返回
CONFIRM_BLOCK, // 承认闭塞
CANCEL_BLOCK, // 取消闭塞
TRACKING_SHUNTING, // 跟踪调车
TRACKING_SHUNTING_FINISH, // 跟踪调车完毕
}
/**
* 运行作业类型
*/
@ -530,7 +445,7 @@ public class CtcStationRunPlanLog {
public static class RunPlanTaskItem implements Cloneable {
private RunPlanTask type;
private RunPlanTaskStatus status;
private RunPlanTaskStatus status = RunPlanTaskStatus.NO;
public RunPlanTaskItem(RunPlanTask type) {
this.type = type;
@ -554,10 +469,6 @@ public class CtcStationRunPlanLog {
return change;
}
public void reset() {
this.status = RunPlanTaskStatus.NO;
}
@Override
public RunPlanTaskItem clone() {
try {
@ -575,10 +486,32 @@ public class CtcStationRunPlanLog {
}
}
/**
* 列车类型
*/
public enum TrainType {
CARS_OPEN_TO_TRAFFIC_HEAVY, // 运用车重车
CARS_OPEN_TO_TRAFFIC_EMPTY, // 运用车空车
CARS_OPEN_TO_TRAFFIC_NO, // 非运用车
CABOOSE, // 守车
}
/**
* 流程类型
*/
public enum ProcessType {
TRAIN_ARRIVE_RETURN, // 列车到达补机返回
CONFIRM_BLOCK, // 承认闭塞
CANCEL_BLOCK, // 取消闭塞
TRACKING_SHUNTING, // 跟踪调车
TRACKING_SHUNTING_FINISH, // 跟踪调车完毕
}
/**
* 超限类型
*/
public enum TransfiniteType {
NO, // 不超限
TRANSFINITE_SUPER, // 超级超限
TRANSFINITE_ONE_LEVEL, // 一级超限
TRANSFINITE_TWO_LEVEL, // 二级超限

View File

@ -64,4 +64,12 @@ public class CtcZoneRepository {
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotNull(runPlanParam);
return runPlanParam;
}
/**
* 重置
*/
public void reset() {
this.ctcZoneList.clear();
this.stationRunPlanMap.clear();
}
}

View File

@ -67,4 +67,8 @@ public class CtcZoneRepositoryVO {
}
return messageInfo;
}
public void reset() {
this.runPlanParamMap.clear();
}
}

View File

@ -106,4 +106,15 @@ public class CtcManageRepositoryVO {
}
return messageInfo;
}
public void reset() {
this.editAreaTrackSectionVersionMap.clear();
this.editAreaTrackSectionVOMap.clear();
this.editAreaCtcRunPlanVersionMap.clear();
this.editAreaCtcRunPlanParamVOMap.clear();
this.effectAreaTrackSectionVersionMap.clear();
this.effectAreaTrackSectionVOMap.clear();
this.effectAreaCtcRunPlanVersionMap.clear();
this.effectAreaCtcRunPlanParamVOMap.clear();
}
}

View File

@ -577,7 +577,11 @@ public class Simulation extends club.joylink.rtss.simulation.Simulation<Simulati
this.repository.reset();
this.iscsRepository.reset();
this.ctcRepository.reset();
SimulationBuilder.generateRouteSequence(this); // TODO: 2022/6/14 重新考虑重置逻辑
if (this.repository.getConfig().isHasCTC()) {
SimulationBuilder.buildCtcRailwayInfo(this); // 重新
SimulationBuilder.buildCtcStationRunPlanLog(this);
SimulationBuilder.generateRouteSequence(this); // TODO: 2022/6/14 重新考虑重置逻辑
}
this.getSimulationMembers().forEach(member -> member.setCommand(null));
this.planRunning = false;
if (!CollectionUtils.isEmpty(simulationConversationMap)) {
@ -674,7 +678,7 @@ public class Simulation extends club.joylink.rtss.simulation.Simulation<Simulati
return this.querySimulationMemberByUserId(uid);
}
public interface JobName{
public interface JobName {
String script = "Script";
String checkLpf = "checkLpf";
String standPassengerFlowSimulate = "standPassengerFlowSimulate";

View File

@ -99,10 +99,10 @@ public class SimulationBuilder {
loadDepotInOutRoutePath(simulation);
// CTC行车日志数据结构构建
if (simulation.getRepository().getConfig().isHasCTC()) {
buildCtcRailwayInfo(simulation);
buildCtcStationRunPlanLog(simulation);
LocalDateTime now = LocalDateTime.now();
System.out.println("CTC行车日志耗时" + Duration.between(now, LocalDateTime.now()).getSeconds());
buildCtcRailwayInfo(simulation);
buildCtcStationRunPlanLog(simulation);
now = LocalDateTime.now();
generateRouteSequence(simulation);
System.out.println("CTC进路序列耗时" + Duration.between(now, LocalDateTime.now()).getSeconds());
@ -408,7 +408,7 @@ public class SimulationBuilder {
ctcRunPlanParam.setDepartTripNumber(tripPlan.getTripNumber());
ctcRunPlanParam.setStationCode(stationPlan.getStation().getCode());
ctcRunPlanParam.setTrackSectionCode(stationPlan.getSection().getCode());
ctcRunPlanParam.setPassenger(CtcStationRunPlanLog.PlanPropertiesType.PASSENGER);
ctcRunPlanParam.setPassenger(Boolean.TRUE);
// 到达计划始发站没有到达计划
if (index > 0) {
adjacentStationPlan = tripPlan.getPlanList().get(index - 1);
@ -425,9 +425,13 @@ public class SimulationBuilder {
});
// 集中中心一份
CtcZoneRepository ctcZoneRepository = simulation.getCtcRepository().getCtcZoneRepository();
// 生效区一份
CtcEffectRepository ctcEffectRepository = simulation.getCtcRepository().getCtcEffectRepository();
ctcRunPlanParamList.forEach(param -> {
// 集中中心增加
ctcZoneRepository.saveRunPlan(param.clone());
// 生效区
ctcEffectRepository.saveRunPlan(param.clone());
// 车务管理终端一份
CtcManageRepository ctcManageRepository = simulation.getCtcRepository().getManageRepositoryMap().get(param.getStationCode());
ctcManageRepository.saveRunPlanToEditArea(param.clone());
@ -439,7 +443,7 @@ public class SimulationBuilder {
runPlanLog.setOrigin(true);
runPlanLog.setArriveRunPlan(CtcStationRunPlanLog.createRunPlanItem(simulation, param, true));
runPlanLog.setDepartRunPlan(CtcStationRunPlanLog.createRunPlanItem(simulation, param, false));
simulation.getCtcRepository().addRunPlanToOriginMap(runPlanLog);
simulation.getCtcRepository().addRunPlanToSimulationMap(runPlanLog);
});
}
@ -455,11 +459,13 @@ public class SimulationBuilder {
if (arriveFlag) {
defaultRunStatus = StationDirection.ReceiveAndDeliverModel.R;
ctcRunPlanParam.setArrivePlanTime(stationPlan.getArriveTime());
// ctcRunPlanParam.setArriveTime(stationPlan.getArriveTime());
ctcRunPlanParam.setArriveStationCode(adjacentStation.getCode());
ctcRunPlanParam.setArriveSectionCode(stationPlan.getSection().getCode()); // 停靠股道
} else {
defaultRunStatus = StationDirection.ReceiveAndDeliverModel.D;
ctcRunPlanParam.setDepartPlanTime(stationPlan.getLeaveTime());
// ctcRunPlanParam.setDepartTime(stationPlan.getLeaveTime());
ctcRunPlanParam.setDepartStationCode(adjacentStation.getCode());
ctcRunPlanParam.setDepartSectionCode(stationPlan.getSection().getCode()); // 停靠股道
}