Commit 8c6c8443 authored by duanruiming's avatar duanruiming

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

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