Commit 238e1068 authored by hanbing's avatar hanbing

[add] 绿波评价-干线方案分析

parent b6cf3c68
...@@ -26,6 +26,9 @@ import org.springframework.stereotype.Service; ...@@ -26,6 +26,9 @@ import org.springframework.stereotype.Service;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -604,7 +607,124 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -604,7 +607,124 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
} }
private List<MainlineSchemeAnalysisVO.GreenwaveData> buildGreenwaveData(List<GreenwaveHistPO> filteredList) { private List<MainlineSchemeAnalysisVO.GreenwaveData> buildGreenwaveData(List<GreenwaveHistPO> filteredList) {
return null; List<MainlineSchemeAnalysisVO.GreenwaveData> res = new ArrayList<>();
List<GreenwaveHistPO> distinctList = filteredList.stream()
.filter(distinctByKey(GreenwaveHistPO::getGreenwaveName))
.collect(Collectors.toList());
for (GreenwaveHistPO greenwaveHistPO : distinctList) {
MainlineSchemeAnalysisVO.GreenwaveData greenwaveData = new MainlineSchemeAnalysisVO.GreenwaveData();
greenwaveData.setName(greenwaveHistPO.getGreenwaveName());
Integer greenwaveId = greenwaveHistPO.getId();
greenwaveData.setDirList(buildDirList(greenwaveId));
res.add(greenwaveData);
}
return res;
}
private List<MainlineSchemeAnalysisVO.DirectionList> buildDirList(Integer greenwaveId) {
GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectById(greenwaveId);
List<MainlineSchemeAnalysisVO.DirectionList> res = new ArrayList<>();
String greenwaveName = greenwaveInfoPO.getName();
String[] split = greenwaveName.split(" ");
String dirName = split[1];
Integer coordinateDir = greenwaveInfoPO.getDir();
if (coordinateDir == 0) { // 正向
MainlineSchemeAnalysisVO.DirectionList directionList = new MainlineSchemeAnalysisVO.DirectionList();
directionList.setName(dirName + "(协调方向)");
directionList.setMetricList(buildMetricList(greenwaveId, coordinateDir));
res.add(directionList);
MainlineSchemeAnalysisVO.DirectionList directionList1 = new MainlineSchemeAnalysisVO.DirectionList();
String dirNameRev = reverseDirName(dirName, "向");
directionList1.setName(dirNameRev + "(非协调方向)");
directionList1.setMetricList(buildMetricList(greenwaveId, coordinateDir));
res.add(directionList1);
} else if (coordinateDir == 1) { // 反向
MainlineSchemeAnalysisVO.DirectionList directionList = new MainlineSchemeAnalysisVO.DirectionList();
directionList.setName(dirName + "(非协调方向)");
directionList.setMetricList(buildMetricList(greenwaveId, coordinateDir));
res.add(directionList);
MainlineSchemeAnalysisVO.DirectionList directionList1 = new MainlineSchemeAnalysisVO.DirectionList();
String dirNameRev = reverseDirName(dirName, "向");
directionList1.setName(dirNameRev + "(协调方向)");
directionList1.setMetricList(buildMetricList(greenwaveId, coordinateDir));
res.add(directionList1);
} else { // 双向
MainlineSchemeAnalysisVO.DirectionList directionList = new MainlineSchemeAnalysisVO.DirectionList();
directionList.setName(dirName + "(协调方向)");
directionList.setMetricList(buildMetricList(greenwaveId, coordinateDir));
res.add(directionList);
MainlineSchemeAnalysisVO.DirectionList directionList1 = new MainlineSchemeAnalysisVO.DirectionList();
String dirNameRev = reverseDirName(dirName, "向");
directionList1.setName(dirNameRev + "(协调方向)");
directionList1.setMetricList(buildMetricList(greenwaveId, coordinateDir));
res.add(directionList1);
}
return res;
}
private List<String> buildMetricList(Integer greenwaveId, Integer coordinateDir) {
List<String> res = new ArrayList<>();
// 确定控制策略
GreenwaveScenePO greenwaveScenePO = greenwaveSceneMapper.selectByGreenwaveId(greenwaveId);
Integer sceneId = greenwaveScenePO.getSceneId();
List<SceneStrategyPO> sceneStrategyPOList = sceneStrategyMapper.selectBySceneId(sceneId);
Optional<SceneStrategyPO> maxPriorityPO = sceneStrategyPOList.stream()
.max(Comparator.comparingInt(SceneStrategyPO::getSceneStrategyPriority));
SceneStrategyPO sceneStrategyPO = maxPriorityPO.get();
Integer strategyId = sceneStrategyPO.getStrategyId();
StrategyPO strategyPO = strategyMapper.selectById(strategyId);
String strategyCode = strategyPO.getStrategyCode();
if (coordinateDir == 0 || coordinateDir == 1) { // 单向绿波
if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_EFFICIENCY.getCode())) {
addMetrics(res);
res.add(StrategyAndMetricsEnum.Metrics.UNCOORDINATE_PHASE_QUEUE.getDescription());
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.BALANCE.getCode())) {
res.add(StrategyAndMetricsEnum.Metrics.CORD_QUEUE_RATIO.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.UNCOORDINATE_PHASE_QUEUE.getDescription());
}
} else { // 双向绿波
if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.LINE_EFFICIENCY.getCode())) {
addMetrics(res);
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.BALANCE.getCode())) {
res.add(StrategyAndMetricsEnum.Metrics.CORD_QUEUE_RATIO.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.UNCOORDINATE_PHASE_QUEUE.getDescription());
}
}
return res;
}
private void addMetrics(List<String> res) {
res.add(StrategyAndMetricsEnum.Metrics.NO_PARK_PASS_RATE.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.TRVAL_TIME.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.GREEN_LIGHT_EFFICIENCY.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.STOP_TIMES.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.AVERAGE_SPEED.getDescription());
res.add(StrategyAndMetricsEnum.Metrics.CORD_RELIABILITY.getDescription());
}
private String reverseDirName(String input, String character) {
int index = input.indexOf(character);
if (index != -1) {
String part1 = input.substring(index + character.length()); // Part after "向"
String part2 = input.substring(0, index + character.length()); // Part before and including "向"
return part1 + part2;
}
return input;
}
private <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
} }
private List<String> calcEvaluateData(List<GreenwaveHistPO> filteredList) { private List<String> calcEvaluateData(List<GreenwaveHistPO> filteredList) {
......
...@@ -46,7 +46,12 @@ public class StrategyAndMetricsEnum { ...@@ -46,7 +46,12 @@ public class StrategyAndMetricsEnum {
EFFUSION_RATE("10", "溢流率", "%", "effusionRate"), EFFUSION_RATE("10", "溢流率", "%", "effusionRate"),
CLEAR_RATE("11", "绿灯间隔清空率", "%", "clearRate"), CLEAR_RATE("11", "绿灯间隔清空率", "%", "clearRate"),
EMERGENCY_COUNT("12", "三急一速数量", "", "emergencyCount"), EMERGENCY_COUNT("12", "三急一速数量", "", "emergencyCount"),
EMPTY_DISCHARGES("13", "空放次数", "次", "emptyDischarges"); EMPTY_DISCHARGES("13", "空放次数", "次", "emptyDischarges"),
NO_PARK_PASS_RATE("14", "协调不停车通过率", "%", "noparkPassRate"),
CORD_RELIABILITY("15", "协调方案可靠性", "%", "cordReliability"),
CORD_QUEUE_RATIO("16", "协调路段排队空间占比", "%", "cordQueueRatio"),
UNCOORDINATE_PHASE_QUEUE("17", "非协调相位二次排队", "%", "uncoordinatePhaseQueue"),
TRVAL_TIME("18", "干线行程时间", "s", "trvalTime");
private final String code; private final String code;
private final String description; private final String description;
......
...@@ -38,7 +38,7 @@ public class GreenwaveRealtimePO { ...@@ -38,7 +38,7 @@ public class GreenwaveRealtimePO {
@ApiModelProperty(name = "延误时间(秒)",notes = "") @ApiModelProperty(name = "延误时间(秒)",notes = "")
private Integer delayTime ; private Integer delayTime ;
/** 不停车通过率 */ /** 不停车通过率 */
@ApiModelProperty(name = "不停车通过率",notes = "") @ApiModelProperty(name = "协调不停车通过率",notes = "")
private Double noparkPassRate ; private Double noparkPassRate ;
@ApiModelProperty(name = "协调方案可靠性",notes = "") @ApiModelProperty(name = "协调方案可靠性",notes = "")
......
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