添加进路排列检查失败日志打印
大客流策略流程
This commit is contained in:
parent
6f6a323d8d
commit
c2d0137c28
@ -280,6 +280,7 @@ public class RouteService {
|
||||
public Route.CheckFailMessage setting(Simulation simulation, Route route) {
|
||||
Route.CheckFailMessage check = this.check(simulation, route);
|
||||
if (Objects.nonNull(check)) {
|
||||
log.info(String.format("进路[%s]排列检查失败,无法排列:%s", route.debugStr(), check.debugStr()));
|
||||
return check;
|
||||
}
|
||||
// 进路开始办理
|
||||
|
@ -534,6 +534,10 @@ public class Route extends MapNamedElement {
|
||||
}
|
||||
return JsonUtils.writeValueAsString(map);
|
||||
}
|
||||
|
||||
public String debugStr() {
|
||||
return String.format("设备%s,失败原因:%s", this.device.debugStr(), this.reason);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -56,6 +56,9 @@ public class PassengerFlowSimulateService {
|
||||
@Autowired
|
||||
private MapPassengerFlowDataService mapPassengerFlowDataService;
|
||||
|
||||
public List<PassengerFlowSimulationData> getPassengerFlowSimulations() {
|
||||
return new ArrayList<>(passengerFlowSimulationDataMap.values());
|
||||
}
|
||||
|
||||
public boolean changePassengerFlow(String group, Long passengerFlowId) {
|
||||
if(!Objects.equals(group2mapPassengerFlowID.get(group),passengerFlowId)){
|
||||
@ -550,6 +553,10 @@ public class PassengerFlowSimulateService {
|
||||
return viewInfo.closeView(mapElement.getDeviceType());
|
||||
}
|
||||
|
||||
public Simulation getSimulationByGroup(String group) {
|
||||
return this.groupSimulationCache.getSimulationByGroup(group);
|
||||
}
|
||||
|
||||
static class PassengerFlowViewInfo {
|
||||
String group;
|
||||
UserVO user;
|
||||
|
@ -1,11 +1,14 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.data;
|
||||
|
||||
import club.joylink.rtss.simulation.cbtc.data.map.Stand;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.strategy.data.StandPassenger;
|
||||
import club.joylink.rtss.vo.client.passenger.PassengerFlowMessage2TD;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Getter
|
||||
public class PassengerFlowSimulationData {
|
||||
@ -20,6 +23,11 @@ public class PassengerFlowSimulationData {
|
||||
*/
|
||||
private List<PassengerFlowMessage2TD> historyPassengerMessage2TD = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* 出现大客流的站台
|
||||
*/
|
||||
private Map<String, StandPassenger> lpfStandMap = new ConcurrentHashMap<>();
|
||||
|
||||
public PassengerFlowSimulationData(String group,
|
||||
PassengerFlowData passengerFlowData,
|
||||
Map<String, StandPassengerFlow> standPassengerFlowMap,
|
||||
@ -37,4 +45,18 @@ public class PassengerFlowSimulationData {
|
||||
public List<TrainPassengerFlow> getAllTrainPassengerFlow() {
|
||||
return new ArrayList<>(trainPassengerFlowMap.values());
|
||||
}
|
||||
|
||||
public void addLpfStand(StandPassenger standPassenger) {
|
||||
this.lpfStandMap.put(standPassenger.getStand().getCode(), standPassenger);
|
||||
}
|
||||
|
||||
public void setLpfStands(List<StandPassenger> lpfStandList) {
|
||||
for (StandPassenger standPassenger : lpfStandList) {
|
||||
this.lpfStandMap.put(standPassenger.getStand().getCode(), standPassenger);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean containsLpfStand(Stand stand) {
|
||||
return this.lpfStandMap.containsKey(stand.getCode());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,16 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy;
|
||||
|
||||
public final class Config {
|
||||
/** 策略向后推算的时间,单位 - 分钟 */
|
||||
public static final int STRATEGY_CAL_TIME = 30;
|
||||
/** 站台大客流判断基准值 */
|
||||
public static final int STAND_LPF_TRIGGER = 800;
|
||||
/** 站台最大停站时间:单位 - 秒 */
|
||||
public static final int STAND_MAX_STOP_TIME = 90;
|
||||
/** 列车最大容量 */
|
||||
public static final int TRAIN_CAPACITY = 1500;
|
||||
/** 站台乘客上列车速度: 人/秒 (列车停站上车时间应该是总停站时间-(开关门6s+下车4s+发车前确认5s)) */
|
||||
public static final float PASSENGER_ON_SPEED = 12;
|
||||
/** 列车跳停节省时间,单位 - 秒 */
|
||||
public static final int TRAIN_PASS_SAVE_TIME = 60;
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy;
|
||||
|
||||
import club.joylink.rtss.simulation.cbtc.Simulation;
|
||||
import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository;
|
||||
import club.joylink.rtss.simulation.cbtc.data.plan.TripPlan;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.PassengerFlowSimulateService;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.data.PassengerFlowSimulationData;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.data.StandPassengerFlow;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.strategy.data.StrategyCalculateData;
|
||||
import club.joylink.rtss.websocket.StompMessageService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class LargePassengerFlowStrategyService {
|
||||
|
||||
@Autowired
|
||||
private PassengerFlowSimulateService passengerFlowSimulateService;
|
||||
|
||||
@Autowired
|
||||
private StompMessageService stompMessageService;
|
||||
|
||||
@Scheduled(fixedRate = 300*1000)
|
||||
public void checkLpf() {
|
||||
List<PassengerFlowSimulationData> pfSimulationList = this.passengerFlowSimulateService.getPassengerFlowSimulations();
|
||||
if (CollectionUtils.isEmpty(pfSimulationList)) {
|
||||
return;
|
||||
}
|
||||
for (PassengerFlowSimulationData passengerFlowSimulationData : pfSimulationList) {
|
||||
// 查询大客流站台
|
||||
List<StandPassengerFlow> standPassengerFlowList = passengerFlowSimulationData.getAllStandPassengerFlow();
|
||||
List<StandPassengerFlow> lpfList = new ArrayList<>();
|
||||
for (StandPassengerFlow standPassengerFlow : standPassengerFlowList) {
|
||||
if (standPassengerFlow.getPassengerQuantity() > Config.STAND_LPF_TRIGGER) {
|
||||
lpfList.add(standPassengerFlow);
|
||||
}
|
||||
}
|
||||
if (!lpfList.isEmpty()) {
|
||||
// 发现大客流,计算策略
|
||||
StrategyCalculateData strategyCalculateData = this.buildStrategyCalculateData(passengerFlowSimulationData);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private StrategyCalculateData buildStrategyCalculateData(PassengerFlowSimulationData passengerFlowSimulationData) {
|
||||
Simulation simulation = this.passengerFlowSimulateService.getSimulationByGroup(passengerFlowSimulationData.getGroup());
|
||||
SimulationDataRepository repository = simulation.getRepository();
|
||||
Map<String, List<TripPlan>> serviceTripsMap = repository.getServiceTripsMap();
|
||||
StrategyCalculateData strategyCalculateData = new StrategyCalculateData(
|
||||
serviceTripsMap,
|
||||
repository.getRealRunRecordList(),
|
||||
passengerFlowSimulationData.getAllStandPassengerFlow(),
|
||||
passengerFlowSimulationData.getAllTrainPassengerFlow()
|
||||
);
|
||||
return strategyCalculateData;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy;
|
||||
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.strategy.data.Strategy;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.strategy.data.StrategyCalculateData;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class ParkTimeStrategyServiceImpl implements StrategyService {
|
||||
|
||||
@Override
|
||||
public Strategy calculate(StrategyCalculateData data) {
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy;
|
||||
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.strategy.data.Strategy;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.strategy.data.StrategyCalculateData;
|
||||
|
||||
public interface StrategyService {
|
||||
|
||||
Strategy calculate(StrategyCalculateData data);
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy.data;
|
||||
|
||||
public class ParkTimeStrategy extends Strategy {
|
||||
/** 站台code */
|
||||
String standCode;
|
||||
/** 停站时间 */
|
||||
Integer time;
|
||||
|
||||
@Override
|
||||
public String buildDescription() {
|
||||
this.description = "";
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy.data;
|
||||
|
||||
import club.joylink.rtss.simulation.cbtc.data.map.Stand;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.data.StandPassengerFlow;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.strategy.Config;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class StandPassenger {
|
||||
|
||||
Stand stand;
|
||||
|
||||
/** 是否大客流站 */
|
||||
boolean lpf;
|
||||
/**
|
||||
* 站台等待人数
|
||||
*/
|
||||
int wait;
|
||||
|
||||
private StandPassenger() {
|
||||
|
||||
}
|
||||
|
||||
public StandPassenger(StandPassengerFlow standPassengerFlow) {
|
||||
this.stand = standPassengerFlow.getStand();
|
||||
this.wait = standPassengerFlow.getPassengerQuantity();
|
||||
if (this.wait > Config.STAND_LPF_TRIGGER) {
|
||||
this.lpf = true;
|
||||
}
|
||||
}
|
||||
|
||||
public StandPassenger clone() {
|
||||
StandPassenger obj = new StandPassenger();
|
||||
obj.stand = this.stand;
|
||||
obj.wait = this.wait;
|
||||
return obj;
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy.data;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class StationPassenger {
|
||||
|
||||
/**
|
||||
* 车站code
|
||||
*/
|
||||
String code;
|
||||
/**
|
||||
* 车站等待人数
|
||||
*/
|
||||
int wait;
|
||||
|
||||
public StationPassenger(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public StationPassenger(String code, int wait) {
|
||||
this.code = code;
|
||||
this.wait = wait;
|
||||
}
|
||||
|
||||
public void addPassenger(int num) {
|
||||
this.wait += num;
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy.data;
|
||||
|
||||
public abstract class Strategy {
|
||||
|
||||
String description;
|
||||
|
||||
/** 指标1:时刻表偏差 */
|
||||
Float target1;
|
||||
/** 指标2:乘客等待时间 */
|
||||
Float target2;
|
||||
/** 综合指标:对指标1,2加权求和 */
|
||||
Float coTarget;
|
||||
|
||||
public abstract String buildDescription();
|
||||
}
|
@ -0,0 +1,79 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy.data;
|
||||
|
||||
import club.joylink.rtss.simulation.cbtc.data.plan.RealRun;
|
||||
import club.joylink.rtss.simulation.cbtc.data.plan.TripPlan;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.data.StandPassengerFlow;
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.data.TrainPassengerFlow;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class StrategyCalculateData {
|
||||
|
||||
/**
|
||||
* key-服务号
|
||||
*/
|
||||
Map<String, List<TripPlan>> planMap;
|
||||
/**
|
||||
* key-服务车次号
|
||||
*/
|
||||
Map<String, List<RealRun>> runMap;
|
||||
|
||||
Map<String, StandPassenger> standPassengerMap;
|
||||
|
||||
List<TrainPassenger> trainPassengerList;
|
||||
|
||||
private StrategyCalculateData() {
|
||||
|
||||
}
|
||||
|
||||
public StrategyCalculateData(Map<String, List<TripPlan>> serviceTripsMap,
|
||||
List<RealRun> realRunRecordList,
|
||||
List<StandPassengerFlow> allStandPassengerFlow,
|
||||
List<TrainPassengerFlow> allTrainPassengerFlow) {
|
||||
this.planMap = new HashMap<>(serviceTripsMap);
|
||||
Map<String, List<RealRun>> realRunMap = new HashMap<>();
|
||||
for (RealRun realRun : realRunRecordList) {
|
||||
String stNumber = realRun.getSTNumber();
|
||||
List<RealRun> list = realRunMap.get(stNumber);
|
||||
if (list == null) {
|
||||
list = new ArrayList<>();
|
||||
realRunMap.put(stNumber, list);
|
||||
}
|
||||
list.add(realRun);
|
||||
}
|
||||
this.runMap = realRunMap;
|
||||
Map<String, StandPassenger> spMap = new HashMap<>();
|
||||
for (StandPassengerFlow standPassengerFlow : allStandPassengerFlow) {
|
||||
StandPassenger standPassenger = new StandPassenger(standPassengerFlow);
|
||||
spMap.put(standPassenger.getStand().getCode(), standPassenger);
|
||||
}
|
||||
this.standPassengerMap = spMap;
|
||||
List<TrainPassenger> tpList = new ArrayList<>();
|
||||
for (TrainPassengerFlow trainPassengerFlow : allTrainPassengerFlow) {
|
||||
TrainPassenger trainPassenger = new TrainPassenger(trainPassengerFlow);
|
||||
tpList.add(trainPassenger);
|
||||
}
|
||||
this.trainPassengerList = tpList;
|
||||
}
|
||||
|
||||
public StrategyCalculateData clone() {
|
||||
StrategyCalculateData obj = new StrategyCalculateData();
|
||||
obj.planMap = new HashMap<>(this.planMap);
|
||||
obj.runMap = new HashMap<>(this.runMap);
|
||||
Map<String, StandPassenger> standPassengerMap = new HashMap<>();
|
||||
this.standPassengerMap.forEach((code, standPassenger) -> {
|
||||
standPassengerMap.put(code, standPassenger.clone());
|
||||
});
|
||||
obj.standPassengerMap = standPassengerMap;
|
||||
List<TrainPassenger> tpList = new ArrayList<>();
|
||||
for (TrainPassenger trainPassenger : this.trainPassengerList) {
|
||||
tpList.add(trainPassenger.clone());
|
||||
}
|
||||
obj.trainPassengerList = tpList;
|
||||
return obj;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package club.joylink.rtss.simulation.cbtc.passenger.strategy.data;
|
||||
|
||||
import club.joylink.rtss.simulation.cbtc.passenger.data.TrainPassengerFlow;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class TrainPassenger {
|
||||
|
||||
private String groupNumber;
|
||||
/** 服务号 */
|
||||
String serviceNumber;
|
||||
/** 车次号 */
|
||||
String tripNumber;
|
||||
|
||||
/** 列车上人数 */
|
||||
int remain;
|
||||
|
||||
public TrainPassenger() {
|
||||
}
|
||||
|
||||
public TrainPassenger(TrainPassengerFlow tpf) {
|
||||
this.groupNumber = tpf.getTrain().getGroupNumber();
|
||||
this.serviceNumber = tpf.getTrain().getServiceNumber();
|
||||
this.tripNumber = tpf.getTrain().getTripNumber();
|
||||
this.remain = tpf.getPassengerQuantity();
|
||||
}
|
||||
|
||||
public TrainPassenger clone() {
|
||||
TrainPassenger obj = new TrainPassenger();
|
||||
obj.groupNumber = this.groupNumber;
|
||||
obj.serviceNumber = this.serviceNumber;
|
||||
obj.tripNumber = this.tripNumber;
|
||||
obj.remain = this.remain;
|
||||
return obj;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user