Commit 74c07590 authored by duanruiming's avatar duanruiming

[update] 实时监控-路口优化-拥堵优化

parent 0d9a77a9
......@@ -9,6 +9,8 @@ import net.wanji.common.framework.Constants;
import net.wanji.common.utils.tool.BeanListUtils;
import net.wanji.common.utils.tool.DateUtil;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.RidInfoEntity;
import net.wanji.databus.dao.mapper.RidInfoMapper;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.pojo.vo.SignalStatusVO;
......@@ -50,6 +52,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Resource
CrossSchemeMapper crossSchemeMapper;
@Resource
RidInfoMapper ridInfoMapper;
@Resource
UtcFeignClients utcFeignClients;
......@@ -72,11 +77,11 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
Map<Integer, List<CrossDataRealtimeDTO>> crossDataMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getStatus));
abnormalCrossList = crossDataMap.get(CrossStatusEnum.SPILLOVER.getCode()); // 溢出
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
// spilloverOpt();
}
abnormalCrossList = crossDataMap.get(CrossStatusEnum.CONGESTION.getCode()); // 拥堵
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
congestionOpt(abnormalCrossList, turnDataRealtime, phaseMap);
}
abnormalCrossList = crossDataMap.get(CrossStatusEnum.UNBALANCE.getCode()); // 失衡
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
......@@ -89,6 +94,55 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
return null;
}
/**
* 路口拥堵优化
*
* @param abnormalCrossList
* @param turnDataRealtimeMap
* @param phaseMap
*/
private void congestionOpt(List<CrossDataRealtimeDTO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
Map<String, List<CrossDataRealtimeDTO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getCrossId));
String crossId;
for (CrossDataRealtimeDTO cross : abnormalCrossList) {
crossId = cross.getCrossId();
// 判断信号机是否在线 todo 是否某些故障也不需要优化
// 判断当前路口是否存在特殊控制操作
if (isOffLineOrSpecialControlMode(crossId)) {
continue;
}
// 获取上游路口
List<RidInfoEntity> ridInfoEntities = ridInfoMapper.selectOne("", crossId);
// 不存在上游路口,不做处理
if (CollectionUtils.isEmpty(ridInfoEntities)) {
continue;
}
// 判断当前路口是否已优化
if (CROSS_OPT.contains(crossId)) {
continue;
}
// 拥堵路口对上游路口进行优化
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
// 拥堵列表包含上游路口,不需要操作, 否则当前路口进行优化 优化当前开始路口的此方向直行,和逆时针方向左转
if (!congestCrossMap.containsKey(ridInfoEntity.getEndCrossId())) {
String startCrossId = ridInfoEntity.getStartCrossId();
doExecuteCrossOpt(turnDataRealtimeMap, phaseMap, startCrossId);
}
}
// 判断路口是否是绿波
// 记录已优化的路口
CROSS_OPT.add(crossId);
}
}
/**
* 设置异常数据转向数据
*
......@@ -161,27 +215,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
// 判断路口是否是绿波
// 计算路口各转向所需的通行时长(秒)
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(crossId);
crossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(item.calPassTime(item)));
// 计算路口各相位调整时长(秒)
Map<String, Integer> phaseTimeOptResultMap = new HashMap<>();
Map<Integer, String> timeOffsetPhaseMap = getTimeOffsetPhaseMap(phaseMap, crossTurnDataRealtimeDTOS);
// 是否需要拆分相位
if (isSplitPhase(timeOffsetPhaseMap)) {
} else {
phaseTimeOptResultMap = getPhaseTimeOptMap(timeOffsetPhaseMap);
}
// 修改原始方案绿灯时间为优化后时间,方案下发
SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, phaseTimeOptResultMap);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject);
throw new Exception();
}
// 执行路口优化
doExecuteCrossOpt(turnDataRealtimeMap, phaseMap, crossId);
// 记录已优化的路口
CROSS_OPT.add(crossId);
......@@ -189,6 +224,38 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
/**
* 执行路口优化逻辑
* 计算路口相位优化时长并下发方案
*
* @param turnDataRealtimeMap
* @param phaseMap
* @param crossId
* @throws Exception
*/
private void doExecuteCrossOpt(Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap, Map<String, CrossPhaseDTO> phaseMap, String crossId) throws Exception {
// 计算路口各转向所需的通行时长(秒)
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(crossId);
crossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(item.calPassTime(item)));
// 计算路口各相位调整时长(秒)
Map<String, Integer> phaseTimeOptResultMap = new HashMap<>();
Map<Integer, String> timeOffsetPhaseMap = getTimeOffsetPhaseMap(phaseMap, crossTurnDataRealtimeDTOS);
// 是否需要拆分相位
if (isSplitPhase(timeOffsetPhaseMap)) {
} else {
phaseTimeOptResultMap = getPhaseTimeOptMap(timeOffsetPhaseMap);
}
// 修改原始方案绿灯时间为优化后时间,方案下发
SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, phaseTimeOptResultMap);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject);
throw new Exception();
}
}
/**
* 构建下发的优化方案
* 如果phaseTimeOptResultMap=null,下发的原始方案
......
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