Commit 0ccb6829 authored by hanbing's avatar hanbing

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

parent 88b04a94
...@@ -14,6 +14,9 @@ import java.util.Date; ...@@ -14,6 +14,9 @@ import java.util.Date;
@Data @Data
@ApiModel(value = "SchemeDetailOverallBO", description = "方案详情-总体评价入参") @ApiModel(value = "SchemeDetailOverallBO", description = "方案详情-总体评价入参")
public class SchemeDetailOverallBO { public class SchemeDetailOverallBO {
@ApiModelProperty(value = "路口ID")
private String crossId;
@ApiModelProperty(value = "年月日,格式 2023/7/9") @ApiModelProperty(value = "年月日,格式 2023/7/9")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/M/d", timezone = "GMT+8") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/M/d", timezone = "GMT+8")
private Date problemDate; private Date problemDate;
...@@ -24,6 +27,6 @@ public class SchemeDetailOverallBO { ...@@ -24,6 +27,6 @@ public class SchemeDetailOverallBO {
@ApiModelProperty(value = "结束时间 HH:mm") @ApiModelProperty(value = "结束时间 HH:mm")
String endTime; String endTime;
@ApiModelProperty(value = "策略编号") @ApiModelProperty(value = "策略编号 100030均衡调控 100152效率提升 100010安全保障")
String strategyCode; String strategyCode;
} }
...@@ -8,9 +8,11 @@ import net.wanji.common.framework.rest.JsonViewObject; ...@@ -8,9 +8,11 @@ import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.bo.CrossIdBO; import net.wanji.databus.bo.CrossIdBO;
import net.wanji.opt.bo.CrossSchemeListBO; import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.ProblemSchemeBO; import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
import net.wanji.opt.service.impl.SchemeEvaluateServiceImpl; import net.wanji.opt.service.impl.SchemeEvaluateServiceImpl;
import net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO; import net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO; import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import net.wanji.opt.vo.SchemeEvaluateSchemeDetailOverallVO;
import net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO; import net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -18,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -18,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import java.text.ParseException;
import java.util.List; import java.util.List;
/** /**
...@@ -71,16 +74,17 @@ public class SchemeEvaluateController { ...@@ -71,16 +74,17 @@ public class SchemeEvaluateController {
return JsonViewObject.newInstance().success(res); return JsonViewObject.newInstance().success(res);
} }
// @ApiOperation(value = "方案详情-总体评价", notes = "方案详情-总体评价", response = JsonViewObject.class, @ApiOperation(value = "方案详情-总体评价", notes = "方案详情-总体评价", response = JsonViewObject.class,
// produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
// @PostMapping(value = "/schemeDetailOverall", @PostMapping(value = "/schemeDetailOverall",
// produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
// @ApiResponses({ @ApiResponses({
// @ApiResponse(code = 200, message = "OK", response = SchemeEvaluateSchemeDetailOverallVO.class), @ApiResponse(code = 200, message = "OK", response = SchemeEvaluateSchemeDetailOverallVO.class),
// }) })
// public JsonViewObject schemeDetailOverall(@RequestBody SchemeDetailOverallBO schemeDetailOverallBO) { public JsonViewObject schemeDetailOverall(@RequestBody SchemeDetailOverallBO schemeDetailOverallBO)
// SchemeEvaluateSchemeDetailOverallVO res = schemeEvaluateService.schemeDetailOverall(schemeDetailOverallBO); throws ParseException {
// return JsonViewObject.newInstance().success(res); SchemeEvaluateSchemeDetailOverallVO res = schemeEvaluateService.schemeDetailOverall(schemeDetailOverallBO);
// } return JsonViewObject.newInstance().success(res);
}
} }
\ No newline at end of file
...@@ -3,10 +3,13 @@ package net.wanji.opt.service; ...@@ -3,10 +3,13 @@ package net.wanji.opt.service;
import net.wanji.databus.bo.CrossIdBO; import net.wanji.databus.bo.CrossIdBO;
import net.wanji.opt.bo.CrossSchemeListBO; import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.ProblemSchemeBO; import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
import net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO; import net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO; import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import net.wanji.opt.vo.SchemeEvaluateSchemeDetailOverallVO;
import net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO; import net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO;
import java.text.ParseException;
import java.util.List; import java.util.List;
public interface SchemeEvaluateService { public interface SchemeEvaluateService {
...@@ -15,4 +18,6 @@ public interface SchemeEvaluateService { ...@@ -15,4 +18,6 @@ public interface SchemeEvaluateService {
List<SchemeEvaluateStrategyMetricMenuVO> strategyMetricMenu(CrossIdBO crossIdBO); List<SchemeEvaluateStrategyMetricMenuVO> strategyMetricMenu(CrossIdBO crossIdBO);
List<SchemeEvaluateCrossSchemeListVO> crossSchemeList(CrossSchemeListBO crossSchemeListBO); List<SchemeEvaluateCrossSchemeListVO> crossSchemeList(CrossSchemeListBO crossSchemeListBO);
SchemeEvaluateSchemeDetailOverallVO schemeDetailOverall(SchemeDetailOverallBO schemeDetailOverallBO) throws ParseException;
} }
...@@ -4,13 +4,22 @@ import cn.hutool.core.collection.CollectionUtil; ...@@ -4,13 +4,22 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.enums.CrossInOutEnum;
import net.wanji.common.enums.StrategyAndMetricsEnum; import net.wanji.common.enums.StrategyAndMetricsEnum;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.bo.CrossIdBO; import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.dao.entity.*; 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.mapper.*; import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.po.CrossDataHistPO; import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.databus.po.CrossDirDataHistPO;
import net.wanji.opt.bo.CrossSchemeListBO; import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.ProblemSchemeBO; import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
import net.wanji.opt.dao.mapper.strategy.SceneMapper; import net.wanji.opt.dao.mapper.strategy.SceneMapper;
import net.wanji.opt.dao.mapper.strategy.SceneStrategyMapper; import net.wanji.opt.dao.mapper.strategy.SceneStrategyMapper;
import net.wanji.opt.dao.mapper.strategy.StrategyMapper; import net.wanji.opt.dao.mapper.strategy.StrategyMapper;
...@@ -18,14 +27,12 @@ import net.wanji.opt.po.strategy.ScenePO; ...@@ -18,14 +27,12 @@ import net.wanji.opt.po.strategy.ScenePO;
import net.wanji.opt.po.strategy.SceneStrategyPO; import net.wanji.opt.po.strategy.SceneStrategyPO;
import net.wanji.opt.po.strategy.StrategyPO; import net.wanji.opt.po.strategy.StrategyPO;
import net.wanji.opt.service.SchemeEvaluateService; import net.wanji.opt.service.SchemeEvaluateService;
import net.wanji.opt.vo.RunningEvaluateMetricsDetailVO; import net.wanji.opt.vo.*;
import net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
...@@ -47,6 +54,9 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService { ...@@ -47,6 +54,9 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
private final StrategyMapper strategyMapper; private final StrategyMapper strategyMapper;
private final BaseCrossSchedulesMapper baseCrossSchedulesMapper; private final BaseCrossSchedulesMapper baseCrossSchedulesMapper;
private final BaseCrossSchedulesPlanMapper baseCrossSchedulesPlanMapper; private final BaseCrossSchedulesPlanMapper baseCrossSchedulesPlanMapper;
private final CrossDataRealtimeMapper crossDataRealtimeMapper;
private final CrossDirDataHistMapper crossDirDataHistMapper;
private final BaseCrossDirInfoMapper baseCrossDirInfoMapper;
public SchemeEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper, public SchemeEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper,
RunningEvaluateServiceImpl runningEvaluateService, RunningEvaluateServiceImpl runningEvaluateService,
...@@ -56,7 +66,9 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService { ...@@ -56,7 +66,9 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
@Qualifier("sceneStrategyMapper") SceneStrategyMapper sceneStrategyMapper, @Qualifier("sceneStrategyMapper") SceneStrategyMapper sceneStrategyMapper,
@Qualifier("strategyMapper") StrategyMapper strategyMapper, @Qualifier("strategyMapper") StrategyMapper strategyMapper,
@Qualifier("baseCrossSchedulesMapper") BaseCrossSchedulesMapper baseCrossSchedulesMapper, @Qualifier("baseCrossSchedulesMapper") BaseCrossSchedulesMapper baseCrossSchedulesMapper,
@Qualifier("baseCrossSchedulesPlanMapper") BaseCrossSchedulesPlanMapper baseCrossSchedulesPlanMapper) { @Qualifier("baseCrossSchedulesPlanMapper") BaseCrossSchedulesPlanMapper baseCrossSchedulesPlanMapper,
CrossDataRealtimeMapper crossDataRealtimeMapper, CrossDirDataHistMapper crossDirDataHistMapper,
@Qualifier("baseCrossDirInfoMapper") BaseCrossDirInfoMapper baseCrossDirInfoMapper) {
this.crossDataHistMapper = crossDataHistMapper; this.crossDataHistMapper = crossDataHistMapper;
this.runningEvaluateService = runningEvaluateService; this.runningEvaluateService = runningEvaluateService;
this.baseCrossSectionMapper = baseCrossSectionMapper; this.baseCrossSectionMapper = baseCrossSectionMapper;
...@@ -66,6 +78,9 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService { ...@@ -66,6 +78,9 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
this.strategyMapper = strategyMapper; this.strategyMapper = strategyMapper;
this.baseCrossSchedulesMapper = baseCrossSchedulesMapper; this.baseCrossSchedulesMapper = baseCrossSchedulesMapper;
this.baseCrossSchedulesPlanMapper = baseCrossSchedulesPlanMapper; this.baseCrossSchedulesPlanMapper = baseCrossSchedulesPlanMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.crossDirDataHistMapper = crossDirDataHistMapper;
this.baseCrossDirInfoMapper = baseCrossDirInfoMapper;
} }
@Override @Override
...@@ -215,6 +230,187 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService { ...@@ -215,6 +230,187 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
return sortedList; return sortedList;
} }
@Override
public SchemeEvaluateSchemeDetailOverallVO schemeDetailOverall(SchemeDetailOverallBO schemeDetailOverallBO)
throws ParseException {
String crossId = schemeDetailOverallBO.getCrossId();
String strategyCode = schemeDetailOverallBO.getStrategyCode();
Date problemDate = schemeDetailOverallBO.getProblemDate();
String startTime = schemeDetailOverallBO.getStartTime();
String endTime = schemeDetailOverallBO.getEndTime();
SchemeEvaluateSchemeDetailOverallVO vo = new SchemeEvaluateSchemeDetailOverallVO();
// 服务水平
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
Double sturation = crossDataRealtimePO.getSturation();
String serviceLevel = CrossUtil.getServiceLevel(sturation);
vo.setServiceLevel(serviceLevel);
if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.EFFICIENCY.getCode())) {
// 查询路口指标数值
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String dateStr = dateFormat.format(problemDate);
String concatenatedStartTime = dateStr + " " + startTime;
String concatenatedEndTime = dateStr + " " + endTime;
int startTimeStamp = (int) (timeFormat.parse(concatenatedStartTime).getTime() / 1000);
int endTimeStamp = (int) (timeFormat.parse(concatenatedEndTime).getTime() / 1000);
List<CrossDataHistPO> crossDataHistPOList = crossDataHistMapper.selectByCrossIdAndStartEnd(
crossId, startTimeStamp, endTimeStamp);
List<SchemeEvaluateSchemeDetailOverallVO.OverallMetrics> overallMetricsList = new ArrayList<>();
// 排队长度
OptionalDouble queueLengthAverage = crossDataHistPOList.stream()
.mapToDouble(CrossDataHistPO::getQueueLength)
.average();
if (queueLengthAverage.isPresent()) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
buildQueueLengthOverallMetrics(queueLengthAverage);
overallMetricsList.add(overallMetrics);
} else {
throw new RuntimeException("该时段无最大排队数据");
}
// 平均延误
OptionalDouble delayTimeAverage = crossDataHistPOList.stream()
.mapToDouble(CrossDataHistPO::getDelayTime)
.average();
if (delayTimeAverage.isPresent()) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
buildDelayTimeOverallMetrics(delayTimeAverage);
overallMetricsList.add(overallMetrics);
} else {
throw new RuntimeException("该时段无延误数据");
}
// 停车次数
OptionalDouble stopTimesAverage = crossDataHistPOList.stream()
.mapToDouble(CrossDataHistPO::getStopTimes)
.average();
if (stopTimesAverage.isPresent()) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
buildStopTimesOverallMetrics(stopTimesAverage);
overallMetricsList.add(overallMetrics);
} else {
throw new RuntimeException("该时段无停车次数数据");
}
// 不停车通过率
List<CrossDirDataHistPO> crossDirDataHistPOList = crossDirDataHistMapper.selectByCrossIdAndStartEnd(
crossId, startTimeStamp, endTimeStamp);
OptionalDouble noStopRateAverage = crossDirDataHistPOList.stream()
.mapToDouble(CrossDirDataHistPO::getNoStopRate)
.average();
if (noStopRateAverage.isPresent()) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
buildNoStopRateOverallMetrics(noStopRateAverage);
overallMetricsList.add(overallMetrics);
} else {
throw new RuntimeException("该时段无不停车通过率数据");
}
vo.setOverallMetricsList(overallMetricsList);
// 查询方向指标数值并与评价标准比较
// 获取路口方向
List<Integer> dirCodes = baseCrossDirInfoMapper.selectInDirsByCrossId(crossId);
List<String> strategyEvaluateList = new ArrayList<>();
for (Integer dirCode : dirCodes) {
Double avgDelayTime = crossDirDataHistMapper.selectAvgDelayTime(
crossId, dirCode, CrossInOutEnum.IN.getCode(), startTimeStamp, endTimeStamp);
Double avgQueueLength = crossDirDataHistMapper.selectAvgQueueLength(
crossId, dirCode, CrossInOutEnum.IN.getCode(), startTimeStamp, endTimeStamp);
int level = calcLevel(avgDelayTime, avgQueueLength);
if (level == 3) {
strategyEvaluateList.add(BaseEnum.SignalDirectionEnum.getNameByCode(dirCode) + "进口延误较高效率较低");
} else if (level == 4) {
strategyEvaluateList.add(BaseEnum.SignalDirectionEnum.getNameByCode(dirCode) + "进口延误高效率低");
}
}
if (CollectionUtil.isEmpty(strategyEvaluateList)) {
strategyEvaluateList.add("路口满足效率提升策略需求");
}
vo.setStrategyEvaluateList(strategyEvaluateList);
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.BALANCE.getCode())) {
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.SECURITY.getCode())) {
}
return vo;
}
private int calcLevel(Double avgDelayTime, Double avgQueueLength) {
int level = 0;
if (avgDelayTime != null) {
int intAvgDelayTime = (int) Math.round(avgDelayTime);
if (intAvgDelayTime >=40 && intAvgDelayTime <= 49) {
level = 3;
} else if (intAvgDelayTime >= 50) {
level = 4;
}
}
if (avgQueueLength != null) {
int intAvgQueueLength = (int) Math.round(avgQueueLength);
if (intAvgQueueLength >= 60 && intAvgQueueLength <=79 && level < 3) {
level = 3;
} else if (intAvgQueueLength >= 80) {
level = 4;
}
}
return level;
}
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildNoStopRateOverallMetrics(
OptionalDouble noStopRateAverage) {
// 先乘以100,再四舍五入并转换为 int 类型
int intStopTimesAverage = (int) Math.round(noStopRateAverage.getAsDouble() * 100);
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.NO_STOP_THROUGH_RATE.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.NO_STOP_THROUGH_RATE.getDescription());
overallMetrics.setMetricValue(intStopTimesAverage);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.NO_STOP_THROUGH_RATE.getUnit());
return overallMetrics;
}
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildStopTimesOverallMetrics(
OptionalDouble stopTimesAverage) {
// 四舍五入并转换为 int 类型
int intStopTimesAverage = (int) Math.round(stopTimesAverage.getAsDouble());
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.STOP_COUNT.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.STOP_COUNT.getDescription());
overallMetrics.setMetricValue(intStopTimesAverage);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.STOP_COUNT.getUnit());
return overallMetrics;
}
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildDelayTimeOverallMetrics(
OptionalDouble delayTimeAverage) {
// 四舍五入并转换为 int 类型
int intDelayTimeAverage = (int) Math.round(delayTimeAverage.getAsDouble());
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getDescription());
overallMetrics.setMetricValue(intDelayTimeAverage);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getUnit());
return overallMetrics;
}
@NotNull
private static SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildQueueLengthOverallMetrics(
OptionalDouble queueLengthAverage) {
// 四舍五入并转换为 int 类型
int intQueueLengthAverage = (int) Math.round(queueLengthAverage.getAsDouble());
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.MAX_QUEUE_LENGTH.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.MAX_QUEUE_LENGTH.getDescription());
overallMetrics.setMetricValue(intQueueLengthAverage);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.MAX_QUEUE_LENGTH.getUnit());
return overallMetrics;
}
@NotNull @NotNull
private static SchemeEvaluateCrossSchemeListVO buildSchemeEvaluateCrossSchemeListVO private static SchemeEvaluateCrossSchemeListVO buildSchemeEvaluateCrossSchemeListVO
(BaseCrossSchemePO baseCrossSchemePO, CrossSectionPO crossSectionPO) { (BaseCrossSchemePO baseCrossSchemePO, CrossSectionPO crossSectionPO) {
......
...@@ -19,7 +19,7 @@ public class SchemeEvaluateSchemeDetailOverallVO { ...@@ -19,7 +19,7 @@ public class SchemeEvaluateSchemeDetailOverallVO {
String serviceLevel; String serviceLevel;
@ApiModelProperty(value = "策略评价") @ApiModelProperty(value = "策略评价")
List<String> strategyEvaluate; List<String> strategyEvaluateList;
@ApiModelProperty(value = "指标数据") @ApiModelProperty(value = "指标数据")
List<OverallMetrics> overallMetricsList; List<OverallMetrics> overallMetricsList;
...@@ -34,7 +34,7 @@ public class SchemeEvaluateSchemeDetailOverallVO { ...@@ -34,7 +34,7 @@ public class SchemeEvaluateSchemeDetailOverallVO {
String metricName; String metricName;
@ApiModelProperty(value = "指标数值") @ApiModelProperty(value = "指标数值")
String metricValue; Integer metricValue;
@ApiModelProperty(value = "指标数值单位") @ApiModelProperty(value = "指标数值单位")
String metricUnit; String metricUnit;
......
...@@ -124,7 +124,7 @@ public class BaseEnum { ...@@ -124,7 +124,7 @@ public class BaseEnum {
private String nick; private String nick;
public static SignalDirectionEnum getNameByCode(int code) { public static SignalDirectionEnum getNickByCode(int code) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) { for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getCode() == code) { if (signalDirectionEnum.getCode() == code) {
return signalDirectionEnum; return signalDirectionEnum;
...@@ -133,6 +133,15 @@ public class BaseEnum { ...@@ -133,6 +133,15 @@ public class BaseEnum {
return null; return null;
} }
public static String getNameByCode(int code) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getCode() == code) {
return signalDirectionEnum.getName();
}
}
return null;
}
public static SignalDirectionEnum getNameByNick(String nick) { public static SignalDirectionEnum getNameByNick(String nick) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) { for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getNick().equals(nick)) { if (signalDirectionEnum.getNick().equals(nick)) {
......
...@@ -35,25 +35,28 @@ public class StrategyAndMetricsEnum { ...@@ -35,25 +35,28 @@ public class StrategyAndMetricsEnum {
} }
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, "平均延误"), AVERAGE_DELAY(3, "平均延误", "s"),
MAX_QUEUE_LENGTH(4, "最大排队长度"), MAX_QUEUE_LENGTH(4, "最大排队长度", "m"),
STOP_COUNT(5, "停车次数"), STOP_COUNT(5, "停车次数", "次"),
AVERAGE_SPEED(6, "平均速度"), 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, "溢流率"), OVERFLOW_RATE(10, "溢流率", "%"),
GREEN_INTERVAL_CLEAR(11, "绿灯间隔清空率"), GREEN_INTERVAL_CLEAR(11, "绿灯间隔清空率", "%"),
EMERGENCY_COUNT(12, "三急一速数量"); EMERGENCY_COUNT(12, "三急一速数量", "");
private final Integer code; private final Integer code;
private final String description; private final String description;
private final String unit;
Metrics(Integer code, String description) {
Metrics(Integer code, String description, String unit) {
this.code = code; this.code = code;
this.description = description; this.description = description;
this.unit = unit;
} }
public String getDescription() { public String getDescription() {
...@@ -63,6 +66,10 @@ public class StrategyAndMetricsEnum { ...@@ -63,6 +66,10 @@ public class StrategyAndMetricsEnum {
public Integer getCode() { public Integer getCode() {
return code; 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;
......
...@@ -34,4 +34,10 @@ public interface CrossDirDataHistMapper extends BaseMapper<CrossDirDataHistPO> { ...@@ -34,4 +34,10 @@ public interface CrossDirDataHistMapper extends BaseMapper<CrossDirDataHistPO> {
List<CrossDirDataHistPO> selectPhaseQueueEnd(String crossId, Integer dir, long currentSeconds, long preSeconds); List<CrossDirDataHistPO> selectPhaseQueueEnd(String crossId, Integer dir, long currentSeconds, long preSeconds);
List<MetricHistDTO> selectMetricHistDTO(String crossId, int startStamp, int endStamp); List<MetricHistDTO> selectMetricHistDTO(String crossId, int startStamp, int endStamp);
List<CrossDirDataHistPO> selectByCrossIdAndStartEnd(String crossId, int startStamp, int endStamp);
Double selectAvgDelayTime(String crossId, Integer dirType, Integer inOutType, int startStamp, int endStamp);
Double selectAvgQueueLength(String crossId, Integer dirType, Integer inOutType, int startStamp, int endStamp);
} }
...@@ -119,4 +119,28 @@ ...@@ -119,4 +119,28 @@
order by batch_time order by batch_time
</select> </select>
<select id="selectByCrossIdAndStartEnd" resultType="net.wanji.databus.po.CrossDirDataHistPO">
select <include refid="Base_Column_List"/>
from t_cross_dir_data_hist
where cross_id = #{crossId}
and batch_time <![CDATA[ >= ]]> #{startStamp}
and batch_time <![CDATA[ <= ]]> #{endStamp}
</select>
<select id="selectAvgDelayTime" resultType="java.lang.Double">
select avg(delay_time)
from t_cross_dir_data_hist
where cross_id = #{crossId} and dir_type = #{dirType} and in_out_type = #{inOutType}
and batch_time <![CDATA[ >= ]]> #{startStamp}
and batch_time <![CDATA[ <= ]]> #{endStamp}
</select>
<select id="selectAvgQueueLength" resultType="java.lang.Double">
select avg(queue_length)
from t_cross_dir_data_hist
where cross_id = #{crossId} and dir_type = #{dirType} and in_out_type = #{inOutType}
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