Commit 8cc1f43e authored by hanbing's avatar hanbing

[update] 新信号评价-方案评价-效率提升策略详细问题

parent 4cdf2cdd
......@@ -10,10 +10,7 @@ import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
import net.wanji.opt.service.impl.SchemeEvaluateServiceImpl;
import net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import net.wanji.opt.vo.SchemeEvaluateSchemeDetailOverallVO;
import net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO;
import net.wanji.opt.vo.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -87,4 +84,17 @@ public class SchemeEvaluateController {
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "方案详情-详细问题", notes = "方案详情-详细问题", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/detailedProblem",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SchemeEvaluateSchemeDetailedProblemVO.class),
})
public JsonViewObject detailedProblem(@RequestBody SchemeDetailOverallBO schemeDetailOverallBO)
throws ParseException {
SchemeEvaluateSchemeDetailedProblemVO res = schemeEvaluateService.detailedProblem(schemeDetailOverallBO);
return JsonViewObject.newInstance().success(res);
}
}
\ No newline at end of file
......@@ -4,10 +4,7 @@ import net.wanji.databus.bo.CrossIdBO;
import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
import net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import net.wanji.opt.vo.SchemeEvaluateSchemeDetailOverallVO;
import net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO;
import net.wanji.opt.vo.*;
import java.text.ParseException;
import java.util.List;
......@@ -20,4 +17,6 @@ public interface SchemeEvaluateService {
List<SchemeEvaluateCrossSchemeListVO> crossSchemeList(CrossSchemeListBO crossSchemeListBO);
SchemeEvaluateSchemeDetailOverallVO schemeDetailOverall(SchemeDetailOverallBO schemeDetailOverallBO) throws ParseException;
SchemeEvaluateSchemeDetailedProblemVO detailedProblem(SchemeDetailOverallBO schemeDetailOverallBO) throws ParseException;
}
......@@ -7,6 +7,7 @@ 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.TurnConvertEnum;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.dao.entity.BaseCrossSchedulesPO;
......@@ -17,6 +18,7 @@ import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.databus.po.CrossDirDataHistPO;
import net.wanji.databus.po.CrossTurnDataHistPO;
import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
......@@ -57,6 +59,10 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
private final CrossDataRealtimeMapper crossDataRealtimeMapper;
private final CrossDirDataHistMapper crossDirDataHistMapper;
private final BaseCrossDirInfoMapper baseCrossDirInfoMapper;
private final CrossTurnDataHistMapper crossTurnDataHistMapper;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
public SchemeEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper,
RunningEvaluateServiceImpl runningEvaluateService,
......@@ -68,7 +74,8 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
@Qualifier("baseCrossSchedulesMapper") BaseCrossSchedulesMapper baseCrossSchedulesMapper,
@Qualifier("baseCrossSchedulesPlanMapper") BaseCrossSchedulesPlanMapper baseCrossSchedulesPlanMapper,
CrossDataRealtimeMapper crossDataRealtimeMapper, CrossDirDataHistMapper crossDirDataHistMapper,
@Qualifier("baseCrossDirInfoMapper") BaseCrossDirInfoMapper baseCrossDirInfoMapper) {
@Qualifier("baseCrossDirInfoMapper") BaseCrossDirInfoMapper baseCrossDirInfoMapper,
CrossTurnDataHistMapper crossTurnDataHistMapper) {
this.crossDataHistMapper = crossDataHistMapper;
this.runningEvaluateService = runningEvaluateService;
this.baseCrossSectionMapper = baseCrossSectionMapper;
......@@ -81,6 +88,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.crossDirDataHistMapper = crossDirDataHistMapper;
this.baseCrossDirInfoMapper = baseCrossDirInfoMapper;
this.crossTurnDataHistMapper = crossTurnDataHistMapper;
}
@Override
......@@ -246,8 +254,6 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
String serviceLevel = CrossUtil.getServiceLevel(sturation);
vo.setServiceLevel(serviceLevel);
// 查询起止时间内历史数据
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;
......@@ -269,6 +275,243 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
return vo;
}
@Override
public SchemeEvaluateSchemeDetailedProblemVO detailedProblem(SchemeDetailOverallBO schemeDetailOverallBO)
throws ParseException {
String crossId = schemeDetailOverallBO.getCrossId();
Date problemDate = schemeDetailOverallBO.getProblemDate();
String startTime = schemeDetailOverallBO.getStartTime();
String endTime = schemeDetailOverallBO.getEndTime();
String strategyCode = schemeDetailOverallBO.getStrategyCode();
// 查询起止时间内历史数据
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<CrossDirDataHistPO> crossDirDataHistPOList = crossDirDataHistMapper.selectByCrossIdAndStartEnd(
crossId, startTimeStamp, endTimeStamp);
List<CrossTurnDataHistPO> crossTurnDataHistPOList =
crossTurnDataHistMapper.selectByCrossId(crossId, endTimeStamp, startTimeStamp);
SchemeEvaluateSchemeDetailedProblemVO vo = new SchemeEvaluateSchemeDetailedProblemVO();
if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.EFFICIENCY.getCode())) {
buildEfficiencyDetailVO(
crossDirDataHistPOList, crossTurnDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp);
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.BALANCE.getCode())) {
// buildBalanceDetailVO(
// crossDirDataHistPOList, crossTurnDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp);
} else if (Objects.equals(strategyCode, StrategyAndMetricsEnum.Strategy.SECURITY.getCode())) {
// buildSecurityDetailVO(
// crossDirDataHistPOList, crossTurnDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp);
}
return vo;
}
private void buildEfficiencyDetailVO(List<CrossDirDataHistPO> crossDirDataHistPOList,
List<CrossTurnDataHistPO> crossTurnDataHistPOList,
SchemeEvaluateSchemeDetailedProblemVO vo, String crossId,
int startTimeStamp, int endTimeStamp) {
List<String> problemList = new ArrayList<>();
List<SchemeEvaluateSchemeDetailedProblemVO.TableContent> tableContentList = new ArrayList<>();
// 获取路口方向
List<Integer> dirCodes = baseCrossDirInfoMapper.selectInDirsByCrossId(crossId);
for (Integer dirCode : dirCodes) {
Map<String, String> metricsMap = new HashMap<>();
SchemeEvaluateSchemeDetailedProblemVO.TableContent tableContent =
new SchemeEvaluateSchemeDetailedProblemVO.TableContent();
tableContent.setPosition(BaseEnum.SignalDirectionEnum.getNameByCode(dirCode) + "进口");
// 流量加总
int flow = crossDirDataHistPOList.stream()
.filter(item -> Objects.equals(item.getDirType(), dirCode)
&& Objects.equals(item.getInOutType(), CrossInOutEnum.IN.getCode()))
.mapToInt(CrossDirDataHistPO::getFlow)
.sum();
tableContent.setFlow(flow);
// 速度取平均
double speed = crossDirDataHistPOList.stream()
.filter(item -> Objects.equals(item.getDirType(), dirCode)
&& Objects.equals(item.getInOutType(), CrossInOutEnum.IN.getCode()))
.mapToDouble(CrossDirDataHistPO::getSpeed)
.average()
.orElse(0.0);
long speedLong = Math.round(speed);
metricsMap.put(StrategyAndMetricsEnum.Metrics.AVERAGE_SPEED.getCode(),
speedLong + StrategyAndMetricsEnum.Metrics.AVERAGE_SPEED.getUnit());
// 延误取最大
int maxDelayTime = crossDirDataHistPOList.stream()
.filter(item -> Objects.equals(item.getDirType(), dirCode)
&& Objects.equals(item.getInOutType(), CrossInOutEnum.IN.getCode()))
.mapToInt(CrossDirDataHistPO::getDelayTime)
.max()
.orElse(0);
metricsMap.put(StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getCode(),
maxDelayTime + StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getUnit());
// 排队长度取最大
double maxQueueLength = crossDirDataHistPOList.stream()
.filter(item -> Objects.equals(item.getDirType(), dirCode)
&& Objects.equals(item.getInOutType(), CrossInOutEnum.IN.getCode()))
.mapToDouble(CrossDirDataHistPO::getQueueLength)
.max()
.orElse(0.0);
long queueLengthLong = Math.round(maxQueueLength);
metricsMap.put(StrategyAndMetricsEnum.Metrics.MAX_QUEUE_LENGTH.getCode(),
queueLengthLong + StrategyAndMetricsEnum.Metrics.MAX_QUEUE_LENGTH.getUnit());
// 不停车通过率取平均
double noStopRate = crossDirDataHistPOList.stream()
.filter(item -> Objects.equals(item.getDirType(), dirCode)
&& Objects.equals(item.getInOutType(), CrossInOutEnum.IN.getCode()))
.mapToDouble(CrossDirDataHistPO::getNoStopRate)
.average()
.orElse(0.0);
long noStopRateLong = Math.round(noStopRate * 100);
metricsMap.put(StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode(),
noStopRateLong + StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getUnit());
// 一/二/三次及以上停车通过率取最大
double stopRate = crossDirDataHistPOList.stream()
.filter(item -> Objects.equals(item.getDirType(), dirCode)
&& Objects.equals(item.getInOutType(), CrossInOutEnum.IN.getCode()))
.mapToDouble(CrossDirDataHistPO::getOneStopRate)
.max()
.orElse(0.0);
long stopRateLong = Math.round(stopRate * 100);
metricsMap.put(StrategyAndMetricsEnum.Metrics.STOP_RATE.getCode(),
stopRateLong + StrategyAndMetricsEnum.Metrics.STOP_RATE.getUnit());
// 停车次数取最大
double stopTimes = crossDirDataHistPOList.stream()
.filter(item -> Objects.equals(item.getDirType(), dirCode)
&& Objects.equals(item.getInOutType(), CrossInOutEnum.IN.getCode()))
.mapToDouble(CrossDirDataHistPO::getStopTimes)
.max()
.orElse(0.0);
long stopTimesLong = Math.round(stopTimes);
metricsMap.put(StrategyAndMetricsEnum.Metrics.STOP_TIMES.getCode(),
stopTimesLong + StrategyAndMetricsEnum.Metrics.STOP_TIMES.getUnit());
// 筛选当前方向的转向数据
List<CrossTurnDataHistPO> dirTurnPOList = crossTurnDataHistPOList.stream()
.filter(item -> Objects.equals(item.getInDir(), dirCode))
.collect(Collectors.toList());
tableContent.setSubList(buildEfficiencySublist(problemList, dirTurnPOList, dirCode));
tableContent.setMetricsMap(metricsMap);
for (SchemeEvaluateSchemeDetailedProblemVO.TableContent content : tableContent.getSubList()) {
if (content.getHasProblem() == 1) {
tableContent.setHasProblem(1);
}
}
tableContentList.add(tableContent);
}
vo.setTableContentList(tableContentList);
if (CollectionUtil.isNotEmpty(problemList)) {
problemList.add("其他方向运行效率良好");
}
vo.setProblems(problemList);
}
private List<SchemeEvaluateSchemeDetailedProblemVO.TableContent> buildEfficiencySublist(
List<String> problemList, List<CrossTurnDataHistPO> currentDirTurnPOList, Integer dirCode) {
List<SchemeEvaluateSchemeDetailedProblemVO.TableContent> tableContentList = new ArrayList<>();
// 获取该方向的每个转向
List<String> turnTypes = currentDirTurnPOList.stream()
.map(CrossTurnDataHistPO::getTurnType)
.distinct()
.collect(Collectors.toList());
for (String turnType : turnTypes) {
SchemeEvaluateSchemeDetailedProblemVO.TableContent tableContent =
new SchemeEvaluateSchemeDetailedProblemVO.TableContent();
tableContent.setPosition(TurnConvertEnum.getDescByCode(turnType));
Map<String, String> metricsMap = new HashMap<>();
// 流量加总
int flow = currentDirTurnPOList.stream()
.filter(item -> Objects.equals(item.getTurnType(), turnType))
.mapToInt(CrossTurnDataHistPO::getFlow)
.sum();
tableContent.setFlow(flow);
// 速度取平均
double speed = currentDirTurnPOList.stream()
.filter(item -> Objects.equals(item.getTurnType(), turnType))
.mapToDouble(CrossTurnDataHistPO::getSpeed)
.average()
.orElse(0.0);
long speedLong = Math.round(speed);
metricsMap.put(StrategyAndMetricsEnum.Metrics.AVERAGE_SPEED.getCode(),
speedLong + StrategyAndMetricsEnum.Metrics.AVERAGE_SPEED.getUnit());
// 延误取最大
int maxDelayTime = currentDirTurnPOList.stream()
.filter(item -> Objects.equals(item.getTurnType(), turnType))
.mapToInt(CrossTurnDataHistPO::getDelayTime)
.max()
.orElse(0);
metricsMap.put(StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getCode(),
maxDelayTime + StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getUnit());
// 排队长度取最大
double maxQueueLength = currentDirTurnPOList.stream()
.filter(item -> Objects.equals(item.getTurnType(), turnType))
.mapToDouble(CrossTurnDataHistPO::getQueueLength)
.max()
.orElse(0.0);
long queueLengthLong = Math.round(maxQueueLength);
metricsMap.put(StrategyAndMetricsEnum.Metrics.MAX_QUEUE_LENGTH.getCode(),
queueLengthLong + StrategyAndMetricsEnum.Metrics.MAX_QUEUE_LENGTH.getUnit());
// 不停车通过率取平均
double noStopRate = currentDirTurnPOList.stream()
.filter(item -> Objects.equals(item.getTurnType(), turnType))
.mapToDouble(CrossTurnDataHistPO::getNoStopRate)
.average()
.orElse(0.0);
long noStopRateLong = Math.round(noStopRate * 100);
metricsMap.put(StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode(),
noStopRateLong + StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getUnit());
// 一/二/三次及以上停车通过率取最大
double stopRate = currentDirTurnPOList.stream()
.filter(item -> Objects.equals(item.getTurnType(), turnType))
.mapToDouble(CrossTurnDataHistPO::getOneStopRate)
.max()
.orElse(0.0);
long stopRateLong = Math.round(stopRate * 100);
metricsMap.put(StrategyAndMetricsEnum.Metrics.STOP_RATE.getCode(),
stopRateLong + StrategyAndMetricsEnum.Metrics.STOP_RATE.getUnit());
// 停车次数取最大
double stopTimes = currentDirTurnPOList.stream()
.filter(item -> Objects.equals(item.getTurnType(), turnType))
.mapToDouble(CrossTurnDataHistPO::getStopTimes)
.max()
.orElse(0.0);
long stopTimesLong = Math.round(stopTimes);
metricsMap.put(StrategyAndMetricsEnum.Metrics.STOP_TIMES.getCode(),
stopTimesLong + StrategyAndMetricsEnum.Metrics.STOP_TIMES.getUnit());
// 计算指标是否合格
int level = calcEfficiencyLevel(maxDelayTime, maxQueueLength);
if (level == 3) {
tableContent.setHasProblem(1);
problemList.add(BaseEnum.SignalDirectionEnum.getNameByCode(dirCode) + "进口"
+ TurnConvertEnum.getDescByCode(turnType) + "延误较高效率较低");
} else if (level == 4) {
tableContent.setHasProblem(1);
problemList.add(BaseEnum.SignalDirectionEnum.getNameByCode(dirCode) + "进口"
+ TurnConvertEnum.getDescByCode(turnType) + "延误高效率低");
}
tableContent.setMetricsMap(metricsMap);
tableContentList.add(tableContent);
}
return tableContentList;
}
private void buildSecurityVO(List<CrossDataHistPO> crossDataHistPOList,
List<CrossDirDataHistPO> crossDirDataHistPOList,
SchemeEvaluateSchemeDetailOverallVO vo, String crossId,
......@@ -504,8 +747,8 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
throw new RuntimeException("该时段无最大排队数据");
}
// 延误取最大
OptionalDouble delayTimeMax = crossDataHistPOList.stream()
.mapToDouble(CrossDataHistPO::getDelayTime)
OptionalInt delayTimeMax = crossDataHistPOList.stream()
.mapToInt(CrossDataHistPO::getDelayTime)
.max();
if (delayTimeMax.isPresent()) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
......@@ -542,7 +785,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
List<Integer> dirCodes = baseCrossDirInfoMapper.selectInDirsByCrossId(crossId);
List<String> strategyEvaluateList = new ArrayList<>();
for (Integer dirCode : dirCodes) {
Double maxDelayTime = crossDirDataHistMapper.selectMaxDelayTime(
Integer maxDelayTime = crossDirDataHistMapper.selectMaxDelayTime(
crossId, dirCode, CrossInOutEnum.IN.getCode(), startTimeStamp, endTimeStamp);
Double maxQueueLength = crossDirDataHistMapper.selectMaxQueueLength(
crossId, dirCode, CrossInOutEnum.IN.getCode(), startTimeStamp, endTimeStamp);
......@@ -559,13 +802,12 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
vo.setStrategyEvaluateList(strategyEvaluateList);
}
private int calcEfficiencyLevel(Double delayTime, Double queueLength) {
private int calcEfficiencyLevel(Integer delayTime, Double queueLength) {
int level = 0;
if (delayTime != null) {
int intDelayTime = (int) Math.round(delayTime);
if (intDelayTime >=40 && intDelayTime <= 49) {
if (delayTime >=40 && delayTime <= 49) {
level = 3;
} else if (intDelayTime >= 50) {
} else if (delayTime >= 50) {
level = 4;
}
}
......@@ -586,10 +828,10 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
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.setMetricCode(StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getDescription());
overallMetrics.setMetricValue(intStopTimesAverage);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.NO_STOP_THROUGH_RATE.getUnit());
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getUnit());
return overallMetrics;
}
......@@ -599,17 +841,16 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
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.setMetricCode(StrategyAndMetricsEnum.Metrics.STOP_TIMES.getCode());
overallMetrics.setMetricName(StrategyAndMetricsEnum.Metrics.STOP_TIMES.getDescription());
overallMetrics.setMetricValue(intStopTimesAverage);
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.STOP_COUNT.getUnit());
overallMetrics.setMetricUnit(StrategyAndMetricsEnum.Metrics.STOP_TIMES.getUnit());
return overallMetrics;
}
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildDelayTimeOverallMetrics(
OptionalDouble delayTimeAverage) {
// 四舍五入并转换为 int 类型
int intDelayTimeAverage = (int) Math.round(delayTimeAverage.getAsDouble());
OptionalInt delayTimeAverage) {
int intDelayTimeAverage = delayTimeAverage.getAsInt();
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
new SchemeEvaluateSchemeDetailOverallVO.OverallMetrics();
overallMetrics.setMetricCode(StrategyAndMetricsEnum.Metrics.AVERAGE_DELAY.getCode());
......
package net.wanji.opt.vo;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "SchemeEvaluateSchemeDetailedProblemVO", description = "方案详情-详细问题")
public class SchemeEvaluateSchemeDetailedProblemVO {
@ApiModelProperty(value = "存在问题")
private List<String> problems;
@ApiModelProperty(value = "表格数据")
private List<TableContent> tableContentList;
@NoArgsConstructor
@Data
public static class TableContent {
@ApiModelProperty(value = "位置")
private String position;
@ApiModelProperty(value = "流量")
private Integer flow;
@ApiModelProperty(value = "是否有问题,0否 1是")
private Integer hasProblem = 0;
@ApiModelProperty(value = "子列表")
private List<TableContent> subList;
// 可变指标数据
@JsonIgnore
private Map<String, String> metricsMap;
@JsonAnyGetter
public Map<String, String> any() {
return metricsMap;
}
}
}
......@@ -32,11 +32,11 @@ public class StrategyAndMetricsEnum {
@Getter
public enum Metrics {
NO_STOP_THROUGH_RATE("1", "不停车通过率", "%"),
STOP_THROUGH_RATE("2", "一/二/三次及以上停车通过率", "%"),
NO_STOP_RATE("1", "不停车通过率", "%"),
STOP_RATE("2", "一/二/三次及以上停车通过率", "%"),
AVERAGE_DELAY("3", "平均延误", "s"),
MAX_QUEUE_LENGTH("4", "最大排队长度", "m"),
STOP_COUNT("5", "停车次数", "次"),
STOP_TIMES("5", "停车次数", "次"),
AVERAGE_SPEED("6", "平均速度", "km/h"),
GREEN_LIGHT_UTILIZATION("7", "绿灯有效利用率", "%"),
SATURATION("8", "饱和度", ""),
......@@ -63,11 +63,11 @@ public class StrategyAndMetricsEnum {
static {
Map<Strategy, List<Metrics>> map = new HashMap<>();
map.put(Strategy.EFFICIENCY, Arrays.asList(
Metrics.NO_STOP_THROUGH_RATE,
Metrics.STOP_THROUGH_RATE,
Metrics.NO_STOP_RATE,
Metrics.STOP_RATE,
Metrics.AVERAGE_DELAY,
Metrics.MAX_QUEUE_LENGTH,
Metrics.STOP_COUNT,
Metrics.STOP_TIMES,
Metrics.AVERAGE_SPEED
));
map.put(Strategy.BALANCE, Arrays.asList(
......
......@@ -37,7 +37,7 @@ public interface CrossDirDataHistMapper extends BaseMapper<CrossDirDataHistPO> {
List<CrossDirDataHistPO> selectByCrossIdAndStartEnd(String crossId, int startStamp, int endStamp);
Double selectMaxDelayTime(String crossId, Integer dirType, Integer inOutType, int startStamp, int endStamp);
Integer selectMaxDelayTime(String crossId, Integer dirType, Integer inOutType, int startStamp, int endStamp);
Double selectMaxQueueLength(String crossId, Integer dirType, Integer inOutType, int startStamp, int endStamp);
......
......@@ -20,7 +20,7 @@ public interface CrossTurnDataHistMapper extends BaseMapper<CrossTurnDataHistPO>
CrossTurnDataHistPO selectNoPark(String crossId, Integer dir, String turn, long currentSeconds, long preSeconds);
List<CrossTurnDataHistPO> selectByCrossId(String crossId, long currentSeconds, long preSeconds);
List<CrossTurnDataHistPO> selectByCrossId(String crossId, long endTimeStamp, long startTimeStamp);
List<MetricHistDTO> selectMetricHistDTO(String crossId, int startStamp, int endStamp);
}
......@@ -70,8 +70,8 @@
select <include refid="Base_Column_List"/>
from t_cross_turn_data_hist
where cross_id = #{crossId}
and batch_time <![CDATA[ <= ]]> #{currentSeconds}
and batch_time <![CDATA[ >= ]]> #{preSeconds}
and batch_time <![CDATA[ <= ]]> #{endTimeStamp}
and batch_time <![CDATA[ >= ]]> #{startTimeStamp}
</select>
<select id="selectMetricHistDTO" resultType="net.wanji.databus.dto.MetricHistDTO">
......
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