Commit c807b63f authored by duanruiming's avatar duanruiming

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

parent 6ad8efb0
...@@ -21,4 +21,6 @@ public interface SceneStrategyIdeaMapper { ...@@ -21,4 +21,6 @@ public interface SceneStrategyIdeaMapper {
void deleteByIdeaIds(List<Integer> ids); void deleteByIdeaIds(List<Integer> ids);
void deleteByStrategyIds(List<Integer> ids); void deleteByStrategyIds(List<Integer> ids);
int selectIdBySceneNum(Integer sceneNum);
} }
...@@ -24,6 +24,7 @@ import net.wanji.opt.po.base.CrossSchemeOptLogPO; ...@@ -24,6 +24,7 @@ import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.po.base.CrossSchemePO; import net.wanji.opt.po.base.CrossSchemePO;
import net.wanji.opt.po.trend.CrossDataRealtimePO; import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.CrossOptimizeService; import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.strategy.SceneService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -59,6 +60,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -59,6 +60,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
UtcFeignClients utcFeignClients; UtcFeignClients utcFeignClients;
@Resource @Resource
CrossDirTurnPhaseCache crossDirTurnPhaseCache; CrossDirTurnPhaseCache crossDirTurnPhaseCache;
@Resource
SceneService sceneService;
@Value("${crossOptParam.maxVehheadDist}") @Value("${crossOptParam.maxVehheadDist}")
private Double maxVehheadDist; private Double maxVehheadDist;
...@@ -132,6 +135,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -132,6 +135,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
private void spilloverOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap, private void spilloverOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception { 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)); Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId));
String crossId; String crossId;
...@@ -212,6 +218,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -212,6 +218,9 @@ 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 {
// 获取拥堵场景当前执行的策略方法的指标数据,通过指标数据进行下发方案
Integer sceneStrategyIdeaId = sceneService.selectIdBySceneNum(CrossStatusEnum.CONGESTION.getCode());
// 拥堵路口集合 // 拥堵路口集合
Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId)); Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId));
...@@ -281,6 +290,46 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -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:进口方向 * 当前路口异常转向列表 element:进口方向
* *
...@@ -368,42 +417,6 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -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 { ...@@ -17,4 +17,12 @@ public interface SceneService {
void deleteScene(IntegerIdsDTO integerIdsDTO); void deleteScene(IntegerIdsDTO integerIdsDTO);
PageInfo<AddOrUpdateSceneDTO> queryScene(QuerySceneDTO querySceneDTO); PageInfo<AddOrUpdateSceneDTO> queryScene(QuerySceneDTO querySceneDTO);
/**
* 通过场景编号获取当前执行的场景-策略-方法的id
*
* @param sceneNum
* @return
*/
Integer selectIdBySceneNum(Integer sceneNum);
} }
...@@ -50,6 +50,11 @@ public class SceneServiceImpl implements SceneService { ...@@ -50,6 +50,11 @@ public class SceneServiceImpl implements SceneService {
this.ideaMapper = ideaMapper; this.ideaMapper = ideaMapper;
} }
@Override
public Integer selectIdBySceneNum(Integer sceneNum) {
return sceneStrategyIdeaMapper.selectIdBySceneNum(sceneNum);
}
@Override @Override
@Transactional @Transactional
public void addOrUpdateScene(AddOrUpdateSceneDTO addOrUpdateSceneDTO) { public void addOrUpdateScene(AddOrUpdateSceneDTO addOrUpdateSceneDTO) {
......
...@@ -110,7 +110,6 @@ public class CrossMonitorTask { ...@@ -110,7 +110,6 @@ public class CrossMonitorTask {
// todo 对数据进行处理,可能主要是CrossTurnDataRealtimeDTO中的车间距,车时距等配置修改 // todo 对数据进行处理,可能主要是CrossTurnDataRealtimeDTO中的车间距,车时距等配置修改
CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO = new CrossTurnDataRealtimeDTO(); CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO = new CrossTurnDataRealtimeDTO();
// todo 通过获取场景,策略,方法参数,判断下发方案数据
return crossDataRealtimePOList; return crossDataRealtimePOList;
} }
......
...@@ -38,4 +38,15 @@ ...@@ -38,4 +38,15 @@
where scene_id = #{sceneId} and strategy_id = #{strategyId} where scene_id = #{sceneId} and strategy_id = #{strategyId}
</select> </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> </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