Commit c807b63f authored by duanruiming's avatar duanruiming

[add] 实时监控->添加诊断优化通过场景策略方法获取指标数据,通过指标数据优化方案

parent 6ad8efb0
......@@ -21,4 +21,6 @@ public interface SceneStrategyIdeaMapper {
void deleteByIdeaIds(List<Integer> ids);
void deleteByStrategyIds(List<Integer> ids);
int selectIdBySceneNum(Integer sceneNum);
}
......@@ -24,6 +24,7 @@ import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.po.base.CrossSchemePO;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.strategy.SceneService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
......@@ -59,6 +60,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
UtcFeignClients utcFeignClients;
@Resource
CrossDirTurnPhaseCache crossDirTurnPhaseCache;
@Resource
SceneService sceneService;
@Value("${crossOptParam.maxVehheadDist}")
private Double maxVehheadDist;
......@@ -132,6 +135,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
private void spilloverOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
// todo 获取溢出场景当前执行的策略方法的指标数据,通过指标数据进行下发方案
Integer sceneStrategyIdeaId = sceneService.selectIdBySceneNum(CrossStatusEnum.SPILLOVER.getCode());
// 溢出路口集合
Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId));
String crossId;
......@@ -212,6 +218,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
private void congestionOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
// 获取拥堵场景当前执行的策略方法的指标数据,通过指标数据进行下发方案
Integer sceneStrategyIdeaId = sceneService.selectIdBySceneNum(CrossStatusEnum.CONGESTION.getCode());
// 拥堵路口集合
Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId));
......@@ -281,6 +290,46 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
}
/**
* 路口失衡优化
*
* @param abnormalCrossList 失衡路口实时数据
* @param turnDataRealtimeMap 路口转向实时数据
* @param phaseMap 路口相位配时数据
*/
private void unbalanceOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
// 获取失衡场景当前执行的策略方法的指标数据,通过指标数据进行下发方案
Integer sceneStrategyIdeaId = sceneService.selectIdBySceneNum(CrossStatusEnum.CONGESTION.getCode());
String crossId;
for (CrossDataRealtimePO cross : abnormalCrossList) {
crossId = cross.getCrossId();
// 判断信号机是否在线 todo 是否某些故障也不需要优化
// 判断当前路口是否存在特殊控制操作
if (isOffLineOrSpecialControlMode(crossId)) {
continue;
}
// 判断当前路口是否已优化
if (CROSS_OPT.contains(crossId)) {
continue;
}
// 判断路口是否是绿波
// 计算路口各转向所需的通行时长(秒)
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(crossId);
crossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(calPassTime(item)));
// 执行路口优化
doExecuteCrossOpt(crossTurnDataRealtimeDTOS, phaseMap, crossId, "1");
// 记录已优化的路口
CROSS_OPT.add(crossId);
}
}
/**
* 当前路口异常转向列表 element:进口方向
*
......@@ -368,42 +417,6 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
}
/**
* 路口失衡优化
*
* @param abnormalCrossList 失衡路口实时数据
* @param turnDataRealtimeMap 路口转向实时数据
* @param phaseMap 路口相位配时数据
*/
private void unbalanceOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
String crossId;
for (CrossDataRealtimePO cross : abnormalCrossList) {
crossId = cross.getCrossId();
// 判断信号机是否在线 todo 是否某些故障也不需要优化
// 判断当前路口是否存在特殊控制操作
if (isOffLineOrSpecialControlMode(crossId)) {
continue;
}
// 判断当前路口是否已优化
if (CROSS_OPT.contains(crossId)) {
continue;
}
// 判断路口是否是绿波
// 计算路口各转向所需的通行时长(秒)
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(crossId);
crossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(calPassTime(item)));
// 执行路口优化
doExecuteCrossOpt(crossTurnDataRealtimeDTOS, phaseMap, crossId, "1");
// 记录已优化的路口
CROSS_OPT.add(crossId);
}
}
/**
* 执行路口优化逻辑
......
......@@ -17,4 +17,12 @@ public interface SceneService {
void deleteScene(IntegerIdsDTO integerIdsDTO);
PageInfo<AddOrUpdateSceneDTO> queryScene(QuerySceneDTO querySceneDTO);
/**
* 通过场景编号获取当前执行的场景-策略-方法的id
*
* @param sceneNum
* @return
*/
Integer selectIdBySceneNum(Integer sceneNum);
}
......@@ -50,6 +50,11 @@ public class SceneServiceImpl implements SceneService {
this.ideaMapper = ideaMapper;
}
@Override
public Integer selectIdBySceneNum(Integer sceneNum) {
return sceneStrategyIdeaMapper.selectIdBySceneNum(sceneNum);
}
@Override
@Transactional
public void addOrUpdateScene(AddOrUpdateSceneDTO addOrUpdateSceneDTO) {
......
......@@ -110,7 +110,6 @@ public class CrossMonitorTask {
// todo 对数据进行处理,可能主要是CrossTurnDataRealtimeDTO中的车间距,车时距等配置修改
CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO = new CrossTurnDataRealtimeDTO();
// todo 通过获取场景,策略,方法参数,判断下发方案数据
return crossDataRealtimePOList;
}
......
......@@ -38,4 +38,15 @@
where scene_id = #{sceneId} and strategy_id = #{strategyId}
</select>
<select id="selectIdBySceneNum">
select
max( id )
from
t_strategy_scene_strategy_idea t1
inner join ( select scene_id, strategy_id from t_strategy_scene_strategy where
scene_id = ( select id from t_strategy_scene where scene_num = #{sceneNum} )
and scene_strategy_priority = 1 ) t2
on t1.scene_id = t2.scene_id and t1.strategy_id = t2.strategy_id;
</select>
</mapper>
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