Commit 8c6c8443 authored by duanruiming's avatar duanruiming

[update] 实时监控->拥堵溢出优化

parent 153c8f12
......@@ -16,7 +16,7 @@ public interface CrossOptimizeService {
* 路口实时优化
* @return
*/
String realtimeOptimize(List<CrossDataRealtimePO> abnormalCrossList);
String realtimeOptimize(List<CrossDataRealtimePO> abnormalCrossList, List<CrossDataRealtimePO> crossDataRealtimePOList);
/**
* 路口方案优化
......
......@@ -80,15 +80,16 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Override
@Transactional
public String realtimeOptimize(List<CrossDataRealtimePO> abnormalCrossList) {
public String realtimeOptimize(List<CrossDataRealtimePO> abnormalCrossList, List<CrossDataRealtimePO> crossDataRealtimePOList) {
try {
// 相位配时信息,key:路口编号_方向类型_转向类型,value 相位配时信息
// 相位配时信息,key: 路口编号_方向类型_转向类型,value: 相位配时信息
Map<String, CrossPhaseDTO> phaseMap = listPhaseList();
setTurnList(abnormalCrossList, phaseMap);
setTurnList(crossDataRealtimePOList, phaseMap);
// 获取所有信控路口转向实时数据
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtime = listTurnDataRealtime(abnormalCrossList);
// 获取所有信控路口转向实时数据,包括异常路口和正常路口
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtime = listTurnDataRealtime(crossDataRealtimePOList);
// 恢复优化路口原始方案:上一批次优化后,路口正常需要恢复原始方案
restoreOptCrossOriSchema(abnormalCrossList, phaseMap);
......@@ -140,17 +141,17 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
continue;
}
// 判断路口是否是绿波
// 路口拥堵方向转向,dir_turn
List<String> optCrossDirTurnList = getOptCrossDirTurnList(cross);
// 路口拥堵进口方向,dir
List<String> optCrossDirList = getOptCrossInDirList(cross);
// 溢出当前路口方向转向减少时间 10s
// 计算路口各转向所需的通行时长(秒)
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(crossId);
for (String dirTurn : optCrossDirTurnList) {
for (String dir : optCrossDirList) {
for (CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO : crossTurnDataRealtimeDTOS) {
Integer inDir = crossTurnDataRealtimeDTO.getInDir();
String turnType = crossTurnDataRealtimeDTO.getTurnType();
if (Objects.equals(dirTurn, String.join("_", String.valueOf(inDir), turnType))) {
if (Objects.equals(dir, String.valueOf(inDir))) {
crossTurnDataRealtimeDTO.setPassTime(-10.0);
}
}
......@@ -165,13 +166,17 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
if (CollectionUtils.isEmpty(ridInfoEntities)) {
continue;
}
for (String dirTurn : optCrossDirTurnList) {
Integer dir = Integer.valueOf(dirTurn.substring(0, 1));
for (String dirTurn : optCrossDirList) {
Integer dir = Integer.valueOf(dirTurn);
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
Integer inDir = ridInfoEntity.getInDir();
if (!congestCrossMap.containsKey(ridInfoEntity.getEndCrossId()) && Objects.equals(inDir, dir)) {
String endCrossId = ridInfoEntity.getEndCrossId();
List<CrossTurnDataRealtimeDTO> endcrossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(endCrossId);
if (CollectionUtils.isEmpty(endcrossTurnDataRealtimeDTOS)) {
log.error("溢出路口:{},优化其下游路口:{}时,路口转向数据为空", crossId, ridInfoEntity.getEndCrossId());
throw new Exception();
}
endcrossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(calPassTime(item)));
// 进行优化下发
doExecuteCrossOpt(crossTurnDataRealtimeDTOS, phaseMap, endCrossId, "3");
......@@ -195,6 +200,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
private void congestionOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
// 拥堵路口集合
Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId));
String crossId;
......@@ -208,7 +214,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
// 路口拥堵方向转向,dir_turn
List<String> optCrossDirTurnList = getOptCrossDirTurnList(cross);
List<String> optCrossDirList = getOptCrossInDirList(cross);
// 判断当前路口是否已优化
if (CROSS_OPT.contains(crossId)) {
......@@ -221,24 +227,29 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
if (CollectionUtils.isEmpty(ridInfoEntities)) {
continue;
}
for (String dirTurn : optCrossDirTurnList) {
Integer dir = Integer.valueOf(dirTurn.substring(0, 1));
String turn = dirTurn.substring(2, 1);
// 当前路口拥堵方向,优化当前路口方向的上游路口的直行和左转方向
for (String congestionDir : optCrossDirList) {
Integer intCongestionDir = Integer.valueOf(congestionDir);
// 拥堵路口对上游路口进行优化
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
String startCrossId = ridInfoEntity.getStartCrossId();
// 上游路口时拥堵路口时,不进行优化
if (congestCrossMap.containsKey(startCrossId)) {
continue;
}
Integer inDir = ridInfoEntity.getInDir();
// 拥堵列表包含上游路口,不需要操作, 否则当前路口进行优化,并且路口拥堵方向和驶入方向相同
// 优化当前开始路口的此方向直行,和逆时针方向左转
if (!congestCrossMap.containsKey(ridInfoEntity.getEndCrossId()) && Objects.equals(inDir, dir)) {
String startCrossId = ridInfoEntity.getStartCrossId();
if (Objects.equals(inDir, intCongestionDir)) {
// 计算上游路口各转向所需的通行时长(秒) 此方向和逆时针左转可可减时间 10s
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(startCrossId);
if (!CollectionUtils.isEmpty(crossTurnDataRealtimeDTOS)) {
for (CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO : crossTurnDataRealtimeDTOS) {
Integer startInDir = crossTurnDataRealtimeDTO.getInDir();
if (Objects.equals(startInDir, dir) && Objects.equals("s", turn)) {
String turnType = crossTurnDataRealtimeDTO.getTurnType();
if (Objects.equals(startInDir, intCongestionDir)) {
crossTurnDataRealtimeDTO.setPassTime(-10.0);
}
if (Objects.equals(startInDir, (dir + 2) == 9 ? 1 : dir + 2) && Objects.equals("l", turn)) {
if (Objects.equals(startInDir, (intCongestionDir + 2) == 9 ? 1 : intCongestionDir + 2) && Objects.equals("l", turnType)) {
crossTurnDataRealtimeDTO.setPassTime(-10.0);
}
}
......@@ -247,6 +258,10 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
// 记录已优化的路口
CROSS_OPT.add(crossId);
} else {
log.error("当前拥堵路口: {}, 实时监控优化上游路口: {}时,未获取到上游路口的实时转向数据!", crossId, startCrossId);
}
}
}
}
......@@ -255,13 +270,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
/**
* 当前路口异常转向列表 element:dir_turn
* 当前路口异常转向列表 element:进口方向
*
* @param cross
* @return
*/
private static List<String> getOptCrossDirTurnList(CrossDataRealtimePO cross) {
List<String> crossIdDirTurnList = new ArrayList<>();
private static List<String> getOptCrossInDirList(CrossDataRealtimePO cross) {
List<String> crossIdDirList = new ArrayList<>();
List<CrossDirInfoDTO> dirList = cross.getDirList();
List<CrossTurnInfoDTO> turnList = cross.getTurnList();
if (!CollectionUtils.isEmpty(dirList) && !CollectionUtils.isEmpty(turnList)) {
......@@ -270,16 +285,17 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
Integer inOutType = crossDirInfoDTO.getInOutType();
for (CrossTurnInfoDTO crossTurnInfoDTO : turnList) {
Integer inDir = crossTurnInfoDTO.getInDir();
String turnType = crossTurnInfoDTO.getTurnType();
// 路口方向进口=驶入方向
if (Objects.equals(dirType, inDir) && Objects.equals(1, inOutType) && Objects.equals("s", turnType)) {
String str = String.join("_", crossDirInfoDTO.getCrossDirId(), turnType);
crossIdDirTurnList.add(str);
if (Objects.equals(dirType, inDir) && Objects.equals(1, inOutType)) {
String str = String.valueOf(crossDirInfoDTO.getDirType());
if (!crossIdDirList.contains(str)) {
crossIdDirList.add(str);
}
}
}
}
return crossIdDirTurnList;
}
return crossIdDirList;
}
/**
......@@ -458,9 +474,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* @param phaseTimeOptResultMap
* @return
*/
private SchemeSendVO getSchemeSendVO(String crossId, Map<String, CrossPhaseDTO> phaseMap, Map<String, Integer> phaseTimeOptResultMap) {
private SchemeSendVO getSchemeSendVO(String crossId, Map<String, CrossPhaseDTO> phaseMap, Map<String, Integer> phaseTimeOptResultMap) throws Exception {
String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, crossId, "1", "s");
CrossPhaseDTO crossPhaseDTO = phaseMap.get(key);
if (Objects.isNull(crossPhaseDTO)) {
log.error("当前路口:{}未获取到信号机相位等信息,无法进行方案下发优化", crossId);
throw new Exception();
}
Integer schemeId = crossPhaseDTO.getSchemeId();
List<CrossSchemePO> crossSchemePOS = crossSchemeMapper.listCrossSchemeInfo(crossId, null, schemeId);
......@@ -726,10 +746,14 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
CrossSchemeDTO scheme = schemeMap.get(section.getSchemeId()); // 方案信息
if (Objects.isNull(scheme.getPhaseInfos())) {
log.error("{}-路口, {}-方案,方案中相位信息不能为空", crossId, scheme.getId());
throw new Exception("方案中相位信息不能为空");
continue;
}
for (CrossPhaseDTO phase : scheme.getPhaseInfos()) { // 相位信息列表
if (Objects.isNull(phase.getLightsInfos())) {
log.error("{}-路口, {}-方案,{}-灯组,灯组中车道信息不能为空", crossId, scheme.getId(), phase.getId());
continue;
}
for (CrossLightsDTO lights : phase.getLightsInfos()) { // 灯组信息列表
dir = lights.getDir();
......
......@@ -53,7 +53,7 @@ public class CrossMonitorTask {
// }
// 调用路口实时优化
crossOptimizeService.realtimeOptimize(abnormalCrossList);
crossOptimizeService.realtimeOptimize(abnormalCrossList, crossDataRealtimePOList);
}
......@@ -103,7 +103,9 @@ public class CrossMonitorTask {
// todo test数据
List<CrossDataRealtimePO> crossDataRealtimePOList = new ArrayList<>(1);
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectById("14Q1409IRF0");
CrossDataRealtimePO crossDataRealtimePO1 = crossDataRealtimeMapper.selectById("14Q0S09IQB0");
crossDataRealtimePOList.add(crossDataRealtimePO);
crossDataRealtimePOList.add(crossDataRealtimePO1);
// todo 对数据进行处理,可能主要是CrossTurnDataRealtimeDTO中的车间距,车时距等配置修改
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment