Commit 5f95ca25 authored by hanbing's avatar hanbing

[update] 新信号评价-方案评价-效率提升策略总体评价

parent 297c5f73
...@@ -263,12 +263,96 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService { ...@@ -263,12 +263,96 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.BALANCE.getCode())) { } else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.BALANCE.getCode())) {
buildBalanceVO(crossDataHistPOList, crossDirDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp); buildBalanceVO(crossDataHistPOList, crossDirDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp);
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.SECURITY.getCode())) { } else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.SECURITY.getCode())) {
buildSecurityVO(crossDataHistPOList, crossDirDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp);
} }
return vo; return vo;
} }
private void buildSecurityVO(List<CrossDataHistPO> crossDataHistPOList,
List<CrossDirDataHistPO> crossDirDataHistPOList,
SchemeEvaluateSchemeDetailOverallVO vo, String crossId,
int startTimeStamp, int endTimeStamp) {
List<SchemeEvaluateSchemeDetailOverallVO.OverallMetrics> overallMetricsList = new ArrayList<>();
// 溢流率时长取最大
OptionalDouble effusionMax = crossDirDataHistPOList.stream()
.mapToDouble(CrossDirDataHistPO::getEffusionTime)
.max();
if (effusionMax.isPresent()) {
int minutes = (endTimeStamp - startTimeStamp) / 60; // 观测时长
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
buildEffusionOverallMetrics(effusionMax, minutes);
overallMetricsList.add(overallMetrics);
} else {
throw new RuntimeException("该时段无溢流时长数据");
}
// 绿灯间隔清空率取最大
OptionalDouble clearRateMax = crossDataHistPOList.stream()
.mapToDouble(CrossDataHistPO::getClearRate)
.max();
if (clearRateMax.isPresent()) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
buildClearRateOverallMetrics(clearRateMax);
overallMetricsList.add(overallMetrics);
} else {
throw new RuntimeException("该时段无绿灯间隔清空率数据");
}
// 三急一速数量取最大
// todo 数据库中待添加字段
OptionalDouble emergencyCountMax = OptionalDouble.of(12.56);
// OptionalDouble emergencyCountMax = crossDataHistPOList.stream()
// .map(CrossDataHistPO::getEmergencyCount)
// .filter(Objects::nonNull)
// .mapToDouble(Double::doubleValue) // 将Double转换为double
// .max();
if (emergencyCountMax.isPresent()) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
buildEmergencyCountOverallMetrics(emergencyCountMax);
overallMetricsList.add(overallMetrics);
} else {
throw new RuntimeException("该时段无三急一速数量数据");
}
vo.setOverallMetricsList(overallMetricsList);
// 查询路口指标数值(都取最大),并与评价标准比较:如果饱和度<0.8,则需绿灯间隔清空率大于70%;如果饱和度>0.8,则需绿灯间隔清空率大于60%
// 达到指标要求,显示路口满足安全保障策略需求;未达到指标,显示路口存在安全隐患
List<String> strategyEvaluateList = new ArrayList<>();
boolean isQualified = false;
Double maxSaturation = crossDataHistMapper.selectMaxSaturation(crossId, startTimeStamp, endTimeStamp);
if (clearRateMax.isPresent()) {
isQualified = calcSecurity(maxSaturation, clearRateMax);
}
if (!isQualified) {
strategyEvaluateList.add("路口存在安全隐患");
}
if (CollectionUtil.isEmpty(strategyEvaluateList)) {
strategyEvaluateList.add("路口满足安全保障策略需求");
}
vo.setStrategyEvaluateList(strategyEvaluateList);
}
private boolean calcSecurity(Double maxSaturation, OptionalDouble clearRateMax) {
double clearRateMaxDouble = clearRateMax.getAsDouble();
// 如果饱和度<0.8,则需绿灯间隔清空率大于70%;如果饱和度>0.8,则需绿灯间隔清空率大于60%
if (maxSaturation < 0.8 && clearRateMaxDouble > 0.7) {
return true;
} else if (maxSaturation >= 0.8 && clearRateMaxDouble > 0.6) {
return true;
}
return false;
}
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildEmergencyCountOverallMetrics(
OptionalDouble emergencyCountMax) {
int intMax = (int) Math.round(emergencyCountMax.getAsDouble());
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.EMERGENCY_COUNT.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.EMERGENCY_COUNT.getDescription());
overallMetrics.setMetricValue(intMax);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.EMERGENCY_COUNT.getUnit());
return overallMetrics;
}
private void buildBalanceVO(List<CrossDataHistPO> crossDataHistPOList, private void buildBalanceVO(List<CrossDataHistPO> crossDataHistPOList,
List<CrossDirDataHistPO> crossDirDataHistPOList, List<CrossDirDataHistPO> crossDirDataHistPOList,
SchemeEvaluateSchemeDetailOverallVO vo, String crossId, SchemeEvaluateSchemeDetailOverallVO vo, String crossId,
...@@ -333,6 +417,30 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService { ...@@ -333,6 +417,30 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
vo.setStrategyEvaluateList(strategyEvaluateList); vo.setStrategyEvaluateList(strategyEvaluateList);
} }
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildClearRateOverallMetrics(OptionalDouble clearRateMax) {
int intMax = (int) Math.round(clearRateMax.getAsDouble());
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.GREEN_INTERVAL_CLEAR.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.GREEN_INTERVAL_CLEAR.getDescription());
overallMetrics.setMetricValue(intMax);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.GREEN_INTERVAL_CLEAR.getUnit());
return overallMetrics;
}
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildEffusionOverallMetrics(
OptionalDouble effusionMax, int minutes) {
int intMax = (int) Math.round(effusionMax.getAsDouble());
int effusionRateMax = intMax / minutes;
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.EFFUSION_RATE.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.EFFUSION_RATE.getDescription());
overallMetrics.setMetricValue(effusionRateMax);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.EFFUSION_RATE.getUnit());
return overallMetrics;
}
private boolean calcBalance(Double maxSaturation, Double maxGreenLightUse) { private boolean calcBalance(Double maxSaturation, Double maxGreenLightUse) {
// 如果饱和度<0.8,则需绿灯利用率大于50%;如果饱和度>0.8,则需绿灯利用率大于80% // 如果饱和度<0.8,则需绿灯利用率大于50%;如果饱和度>0.8,则需绿灯利用率大于80%
if (maxSaturation < 0.8 && maxGreenLightUse > 0.5) { if (maxSaturation < 0.8 && maxGreenLightUse > 0.5) {
......
...@@ -28,7 +28,7 @@ public class SchemeEvaluateSchemeDetailOverallVO { ...@@ -28,7 +28,7 @@ public class SchemeEvaluateSchemeDetailOverallVO {
@Data @Data
public static class OverallMetrics { public static class OverallMetrics {
@ApiModelProperty(value = "指标编号") @ApiModelProperty(value = "指标编号")
Integer metricCode; String metricCode;
@ApiModelProperty(value = "指标名称") @ApiModelProperty(value = "指标名称")
String metricName; String metricName;
......
...@@ -23,13 +23,13 @@ public class SchemeEvaluateStrategyMetricMenuVO { ...@@ -23,13 +23,13 @@ public class SchemeEvaluateStrategyMetricMenuVO {
private String strategyCode; private String strategyCode;
@ApiModelProperty(value = "评价指标列表") @ApiModelProperty(value = "评价指标列表")
List<EvaluateMetric> metricList; private List<EvaluateMetric> metricList;
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public static class EvaluateMetric { public static class EvaluateMetric {
@ApiModelProperty(value = "指标编号") @ApiModelProperty(value = "指标编号")
Integer metricCode; private String metricCode;
@ApiModelProperty(value = "指标名称") @ApiModelProperty(value = "指标名称")
private String metricName; private String metricName;
......
package net.wanji.common.enums; package net.wanji.common.enums;
import lombok.Getter;
import java.util.*; import java.util.*;
public class StrategyAndMetricsEnum { public class StrategyAndMetricsEnum {
@Getter
public enum Strategy { public enum Strategy {
BALANCE("100030", "均衡调控"), BALANCE("100030", "均衡调控"),
EFFICIENCY("100152", "效率提升"), EFFICIENCY("100152", "效率提升"),
...@@ -25,51 +28,34 @@ public class StrategyAndMetricsEnum { ...@@ -25,51 +28,34 @@ public class StrategyAndMetricsEnum {
return null; return null;
} }
public String getMsg() {
return msg;
}
public String getCode() {
return code;
}
} }
@Getter
public enum Metrics { public enum Metrics {
NO_STOP_THROUGH_RATE(1, "不停车通过率", "%"), NO_STOP_THROUGH_RATE("1", "不停车通过率", "%"),
STOP_THROUGH_RATE(2, "一/二/三次及以上停车通过率", "%"), STOP_THROUGH_RATE("2", "一/二/三次及以上停车通过率", "%"),
AVERAGE_DELAY(3, "平均延误", "s"), AVERAGE_DELAY("3", "平均延误", "s"),
MAX_QUEUE_LENGTH(4, "最大排队长度", "m"), MAX_QUEUE_LENGTH("4", "最大排队长度", "m"),
STOP_COUNT(5, "停车次数", "次"), STOP_COUNT("5", "停车次数", "次"),
AVERAGE_SPEED(6, "平均速度", "km/h"), AVERAGE_SPEED("6", "平均速度", "km/h"),
GREEN_LIGHT_UTILIZATION(7, "绿灯有效利用率", "%"), GREEN_LIGHT_UTILIZATION("7", "绿灯有效利用率", "%"),
SATURATION(8, "饱和度", ""), SATURATION("8", "饱和度", ""),
LOAD_BALANCE(9, "负载均衡度", ""), LOAD_BALANCE("9", "负载均衡度", ""),
OVERFLOW_RATE(10, "溢流率", "%"), EFFUSION_RATE("10", "溢流率", "%"),
GREEN_INTERVAL_CLEAR(11, "绿灯间隔清空率", "%"), GREEN_INTERVAL_CLEAR("11", "绿灯间隔清空率", "%"),
EMERGENCY_COUNT(12, "三急一速数量", ""); EMERGENCY_COUNT("12", "三急一速数量", "");
private final Integer code; private final String code;
private final String description; private final String description;
private final String unit; private final String unit;
Metrics(Integer code, String description, String unit) { Metrics(String code, String description, String unit) {
this.code = code; this.code = code;
this.description = description; this.description = description;
this.unit = unit; this.unit = unit;
} }
public String getDescription() {
return description;
}
public Integer getCode() {
return code;
}
public String getUnit() {
return unit;
}
} }
public static final Map<Strategy, List<Metrics>> STRATEGY_METRICS_MAP; public static final Map<Strategy, List<Metrics>> STRATEGY_METRICS_MAP;
...@@ -90,7 +76,7 @@ public class StrategyAndMetricsEnum { ...@@ -90,7 +76,7 @@ public class StrategyAndMetricsEnum {
Metrics.LOAD_BALANCE Metrics.LOAD_BALANCE
)); ));
map.put(Strategy.SECURITY, Arrays.asList( map.put(Strategy.SECURITY, Arrays.asList(
Metrics.OVERFLOW_RATE, Metrics.EFFUSION_RATE,
Metrics.GREEN_INTERVAL_CLEAR, Metrics.GREEN_INTERVAL_CLEAR,
Metrics.EMERGENCY_COUNT Metrics.EMERGENCY_COUNT
)); ));
......
...@@ -24,4 +24,6 @@ public interface CrossDataHistMapper extends BaseMapper<CrossDataHistPO> { ...@@ -24,4 +24,6 @@ public interface CrossDataHistMapper extends BaseMapper<CrossDataHistPO> {
List<CrossDataHistPO> selectByCrossIdAndStartEnd(String crossId, int startStamp, int endStamp); List<CrossDataHistPO> selectByCrossIdAndStartEnd(String crossId, int startStamp, int endStamp);
List<MetricHistDTO> selectMetricHistDTO(String crossId, int startStamp, int endStamp); List<MetricHistDTO> selectMetricHistDTO(String crossId, int startStamp, int endStamp);
Double selectMaxSaturation(String crossId, int startStamp, int endStamp);
} }
...@@ -86,4 +86,12 @@ ...@@ -86,4 +86,12 @@
order by batch_time order by batch_time
</select> </select>
<select id="selectMaxSaturation" resultType="java.lang.Double">
select max(sturation)
from t_cross_data_hist
where cross_id = #{crossId}
and batch_time <![CDATA[ >= ]]> #{startStamp}
and batch_time <![CDATA[ <= ]]> #{endStamp}
</select>
</mapper> </mapper>
\ No newline at end of file
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