Commit 592b33ff authored by hanbing's avatar hanbing

[update] 信号优化,方案评价-查询速度优化

parent 9c35f355
......@@ -23,4 +23,6 @@ public interface SceneMapper {
ScenePO selectBySceneNum(Integer status);
ScenePO selectById(Integer sceneId);
List<ScenePO> selectAll();
}
......@@ -21,4 +21,6 @@ public interface SceneStrategyMapper {
void deleteByStrategyIds(List<Integer> ids);
List<Integer> selectSceneIdsByStrategyId(Integer strategyId);
List<SceneStrategyPO> selectAll();
}
......@@ -33,4 +33,6 @@ public interface StrategyMapper {
void insertGreenwave(Integer greenwaveId, Integer strategyId);
List<String> selectGreenwaveAllNames();
List<StrategyPO> selectAll();
}
......@@ -16,7 +16,10 @@ import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.dto.MetricHistDTO;
import net.wanji.databus.dto.RunningPlanDTO;
import net.wanji.databus.po.*;
import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.databus.po.CrossTurnInfoPO;
import net.wanji.databus.po.LaneInfoPO;
import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.bo.MetricsDetailBO;
......@@ -227,7 +230,8 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
.filter(po -> !Objects.equals(po.getStatus(), CrossStatusEnum.NORMAL.getCode()))
.collect(Collectors.toList());
// 按采集时间小时进行聚合
Map<String, List<CrossDataHistPO>> timePOMap = buildTimePOMap(collect);;
Map<String, List<CrossDataHistPO>> timePOMap = buildTimePOMap(collect);
;
// 找出当前小时的记录
List<CrossDataHistPO> currentHourList = timePOMap.get(time.substring(0, 2)); // 保留小时字符串
if (currentHourList != null) {
......@@ -376,6 +380,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private List<RunningEvaluateMetricsDetailVO.ProblemScheme> buildSchemeList(
List<MetricHistDTO> metricHistDTOList, String crossId) {
List<BaseCrossSchemePO> baseCrossSchemePOList = baseCrossSchemeMapper.selectAll();
List<RunningEvaluateMetricsDetailVO.ProblemScheme> res = new ArrayList<>();
// 验证数据是否正确
if (!isDataValid(metricHistDTOList)) {
......@@ -412,7 +417,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
boolean isIntersecting = isTimeIntersecting(
eventStartTime, eventEndTime, sectionStartTime, sectionEndTime);
buildResIfIntersecting(res, crossSectionPO, sectionStartTime, sectionEndTime, isIntersecting,
baseCrossSchemeMapper);
baseCrossSchemePOList);
}
}
// 去除相同方案
......@@ -423,11 +428,15 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
}
void buildResIfIntersecting(List<RunningEvaluateMetricsDetailVO.ProblemScheme> res, CrossSectionPO crossSectionPO,
String sectionStartTime, String sectionEndTime, boolean isIntersecting,
BaseCrossSchemeMapper baseCrossSchemeMapper) {
String sectionStartTime, String sectionEndTime, boolean isIntersecting,
List<BaseCrossSchemePO> crossSchemePOList) {
if (isIntersecting) {
Integer schemeId = crossSectionPO.getSchemeId();
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(schemeId);
Optional<BaseCrossSchemePO> result = crossSchemePOList.stream()
.filter(crossScheme -> schemeId.equals(crossScheme.getId()))
.findFirst();
BaseCrossSchemePO baseCrossSchemePO = result.get();
String schemeName = baseCrossSchemePO.getName();
RunningEvaluateMetricsDetailVO.ProblemScheme problemScheme =
......@@ -521,7 +530,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
String crossId = bo.getCrossId();
RunningEvaluateScopeTreeVO runningEvaluateScopeTreeVO = new RunningEvaluateScopeTreeVO();
runningEvaluateScopeTreeVO.setCrossId(crossId);
List<RunningEvaluateScopeTreeVO.DirVO> dirVOList= buildDirVOList(crossId);
List<RunningEvaluateScopeTreeVO.DirVO> dirVOList = buildDirVOList(crossId);
runningEvaluateScopeTreeVO.setChild(dirVOList);
return runningEvaluateScopeTreeVO;
}
......@@ -580,7 +589,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
.collect(Collectors.groupingBy(CrossDataHistPO::getStartTime))
.values().stream()
.map(list -> list.stream().max(Comparator.comparingInt(CrossDataHistPO::getDuration))
.orElse(null))
.orElse(null))
.collect(Collectors.toList())
));
......
......@@ -11,10 +11,7 @@ import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.common.utils.tool.TimeArrayUtil;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.dao.entity.BaseCrossSchedulesPO;
import net.wanji.databus.dao.entity.BaseCrossSchedulesPlanPO;
import net.wanji.databus.dao.entity.BaseCrossSchemePO;
import net.wanji.databus.dao.entity.CrossSectionPO;
import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.po.*;
import net.wanji.opt.bo.CrossSchemeListBO;
......@@ -121,11 +118,15 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
res.setProblemCounts(problemCounts); // 问题方案数量
// 构造问题方案列表(根据日期)
Map<Date, List<CrossDataHistPO>> dateProblemsMap = buildDateProblemsMap(timeProblemMap); // 构造日期-问题结果集
List<CrossSectionPO> crossSectionPOList = baseCrossSectionMapper.selectAll();
List<BaseCrossSchemePO> crossSchemePOList = baseCrossSchemeMapper.selectAll();
Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> dateSchemesMap =
buildDateSchemesMap(dateProblemsMap, crossId); // 构造日期-问题方案结果集
buildDateSchemesMap(dateProblemsMap, crossId, crossSectionPOList, crossSchemePOList); // 构造日期-问题方案结果集
List<ScenePO> scenePOList = sceneMapper.selectAll();
List<SchemeEvaluateProblemSchemeVO.ByDateVO> byDateVOList = buildProblemSchemeListByDate(
dateProblemsMap, dateSchemesMap);
dateProblemsMap, dateSchemesMap, scenePOList);
res.setProblemSchemeListByDate(byDateVOList);
// 构造计数
int schemeCounts = calcSchemeCounts(dateSchemesMap);
......@@ -1370,18 +1371,26 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
}
private int calcSchemeCounts(Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> dateSchemesMap) {
int schemeCounts = 0;
for (List<RunningEvaluateMetricsDetailVO.ProblemScheme> list : dateSchemesMap.values()) {
schemeCounts += list.size();
Set<Integer> problemIdSet = new HashSet<>();
Collection<List<RunningEvaluateMetricsDetailVO.ProblemScheme>> values = dateSchemesMap.values();
for (List<RunningEvaluateMetricsDetailVO.ProblemScheme> list : values) {
for (RunningEvaluateMetricsDetailVO.ProblemScheme problemScheme : list) {
Integer schemeId = problemScheme.getSchemeId();
problemIdSet.add(schemeId);
}
}
return schemeCounts;
return problemIdSet.size();
}
@NotNull
private List<SchemeEvaluateProblemSchemeVO.ByDateVO> buildProblemSchemeListByDate(
Map<Date, List<CrossDataHistPO>> dateProblemsMap,
Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> dateSchemesMap) {
Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> dateSchemesMap, List<ScenePO> scenePOList) {
List<SchemeEvaluateProblemSchemeVO.ByDateVO> byDateVOList = new ArrayList<>();
List<SceneStrategyPO> sceneStrategyPOList = sceneStrategyMapper.selectAll();
List<StrategyPO> strategyPOList = strategyMapper.selectAll();
for (Map.Entry<Date, List<CrossDataHistPO>> entry : dateProblemsMap.entrySet()) {
Date key = entry.getKey();
......@@ -1397,12 +1406,22 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
for (CrossDataHistPO crossDataHistPO : value) {
Integer status = crossDataHistPO.getStatus();
// 根据场景查询策略
ScenePO scenePO = sceneMapper.selectBySceneNum(status);
Optional<ScenePO> first = scenePOList.stream()
.filter(po -> status.equals(po.getSceneNum()))
.findFirst();
ScenePO scenePO = first.get();
Integer sceneId = scenePO.getId();
List<SceneStrategyPO> sceneStrategyList = sceneStrategyMapper.selectBySceneId(sceneId);
List<SceneStrategyPO> sceneStrategyList = sceneStrategyPOList.stream()
.filter(po -> sceneId.equals(po.getSceneId()))
.collect(Collectors.toList());
for (SceneStrategyPO sceneStrategyPO : sceneStrategyList) {
Integer strategyId = sceneStrategyPO.getStrategyId();
StrategyPO strategyPO = strategyMapper.selectById(strategyId);
Optional<StrategyPO> first1 = strategyPOList.stream()
.filter(po -> strategyId.equals(po.getId()))
.findFirst();
StrategyPO strategyPO = first1.get();
String strategyCode = strategyPO.getStrategyCode();
if (strategyCode.equals(StrategyAndMetricsEnum.Strategy.EFFICIENCY.getCode())) {
efficiencyProblemCounts += 1;
......@@ -1423,7 +1442,8 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
}
private Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> buildDateSchemesMap(
Map<Date, List<CrossDataHistPO>> dateProblemsMap, String crossId) {
Map<Date, List<CrossDataHistPO>> dateProblemsMap, String crossId, List<CrossSectionPO> crossSectionPOList,
List<BaseCrossSchemePO> crossSchemePOList) {
Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> dateSchemesMap = new HashMap<>();
// 获取当前计划ID
......@@ -1433,8 +1453,13 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(datetime);
Integer planId = runningEvaluateService.findPlanId(datetime, dateStr, crossId);
List<CrossSectionPO> crossSectionPOList = baseCrossSectionMapper.selectByCrossAndPlan(crossId, planId);
for (CrossSectionPO crossSectionPO : crossSectionPOList) {
List<CrossSectionPO> filteredList = crossSectionPOList.stream()
.filter(crossSection -> crossId.equals(crossSection.getCrossId()) &&
planId.equals(crossSection.getPlanId()))
.collect(Collectors.toList());
for (CrossSectionPO crossSectionPO : filteredList) {
String sectionStartTime = crossSectionPO.getStartTime();
String sectionEndTime = crossSectionPO.getEndTime();
List<CrossDataHistPO> value = dateListEntry.getValue();
......@@ -1449,7 +1474,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
boolean isIntersecting = runningEvaluateService.isTimeIntersecting(
eventStartTime, eventEndTime, sectionStartTime, sectionEndTime);
runningEvaluateService.buildResIfIntersecting(problemSchemeList, crossSectionPO, sectionStartTime,
sectionEndTime, isIntersecting, baseCrossSchemeMapper);
sectionEndTime, isIntersecting, crossSchemePOList);
}
}
// 去除相同方案
......
......@@ -57,9 +57,16 @@
</select>
<select id="selectById" resultType="net.wanji.opt.po.strategy.ScenePO">
id,scene_code,scene_num,scene_name,scene_target,gmt_create,gmt_modified
select
id,scene_code,scene_num,scene_name,scene_target,gmt_create,gmt_modified
from t_strategy_scene
where id = ${sceneId}
</select>
<select id="selectAll" resultType="net.wanji.opt.po.strategy.ScenePO">
select
id,scene_code,scene_num,scene_name,scene_target,gmt_create,gmt_modified
from t_strategy_scene
</select>
</mapper>
......@@ -35,4 +35,10 @@
where strategy_id = #{strategyId}
</select>
<select id="selectAll" resultType="net.wanji.opt.po.strategy.SceneStrategyPO">
select
id,scene_id,strategy_id,scene_strategy_priority,gmt_create,gmt_modified
from t_strategy_scene_strategy
</select>
</mapper>
......@@ -95,4 +95,10 @@
WHERE strategy_target = 2
</select>
<select id="selectAll" resultType="net.wanji.opt.po.strategy.StrategyPO">
select
id,strategy_code,strategy_name,strategy_target,strategy_detail,gmt_create,gmt_modified
from t_strategy_strategy
</select>
</mapper>
......@@ -54,4 +54,6 @@ public interface BaseCrossSchemeMapper {
@Param("schemeNo") Integer schemeNo);
List<BaseCrossSchemePO> selectByCrossIdAndPartialSchemeName(String crossId, String schemeName);
List<BaseCrossSchemePO> selectAll();
}
......@@ -172,4 +172,10 @@
</if>
</select>
<select id="selectAll" resultType="net.wanji.databus.dao.entity.BaseCrossSchemePO">
select
id,scheme_no,name,cross_id,cycle,coord_phase,offset,source,is_deleted,status,gmt_create,gmt_modified
from t_base_cross_scheme
</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