Commit 7e81b999 authored by hanbing's avatar hanbing

[update] 运行评价-干线路口评价增加绿灯空放时长

parent 4f2734d9
...@@ -14,16 +14,19 @@ import net.wanji.databus.dao.mapper.*; ...@@ -14,16 +14,19 @@ import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.po.*; import net.wanji.databus.po.*;
import net.wanji.databus.vo.CrossIdAndNameVO; import net.wanji.databus.vo.CrossIdAndNameVO;
import net.wanji.opt.bo.*; import net.wanji.opt.bo.*;
import net.wanji.opt.common.KafkaConsumerUtil;
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;
import net.wanji.opt.dto.GreenwaveInSectionDTO; import net.wanji.opt.dto.GreenwaveInSectionDTO;
import net.wanji.opt.dto.LineSchemeDTO; import net.wanji.opt.dto.LineSchemeDTO;
import net.wanji.opt.dto.PhaseEmptyResult;
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.MainlineEvaluateService; import net.wanji.opt.service.MainlineEvaluateService;
import net.wanji.opt.vo.*; import net.wanji.opt.vo.*;
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.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -42,6 +45,12 @@ import java.util.stream.Collectors; ...@@ -42,6 +45,12 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServers;
@Value("${spring.kafka.empty-phase-topic}")
private String emptyPhaseTopic;
private final BaseCrossDirInfoMapper baseCrossDirInfoMapper; private final BaseCrossDirInfoMapper baseCrossDirInfoMapper;
private final BaseCrossTurnInfoMapper baseCrossTurnInfoMapper; private final BaseCrossTurnInfoMapper baseCrossTurnInfoMapper;
private final LaneInfoMapper laneInfoMapper; private final LaneInfoMapper laneInfoMapper;
...@@ -881,7 +890,18 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -881,7 +890,18 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
List<BaseCrossDirInfoPO> baseCrossDirInfoPOList = List<BaseCrossDirInfoPO> baseCrossDirInfoPOList =
baseCrossDirInfoMapper.selectByInOutType(CrossInOutEnum.IN.getCode()); baseCrossDirInfoMapper.selectByInOutType(CrossInOutEnum.IN.getCode());
// 从 Kafka 获取绿灯空放数据
KafkaConsumerUtil kafkaConsumerUtil =
new KafkaConsumerUtil(bootstrapServers, "mainline-empty-phase-comsumer");
List<PhaseEmptyResult> phaseEmptyResults =
kafkaConsumerUtil.consumeEmptyPhaseForTimeRange(
emptyPhaseTopic, 0, startDate.getTime(), endDate.getTime());
for (String crossId : crossIdList) { for (String crossId : crossIdList) {
List<PhaseEmptyResult> crossEmptyPhaseList = phaseEmptyResults.stream().
filter(p -> crossId.equals(p.getCrossId()))
.collect(Collectors.toList());
MainlineCrossEvaluateVO mainlineCrossEvaluateVO = new MainlineCrossEvaluateVO(); MainlineCrossEvaluateVO mainlineCrossEvaluateVO = new MainlineCrossEvaluateVO();
Optional<BaseCrossInfoPO> result = baseCrossInfoPOList.stream() Optional<BaseCrossInfoPO> result = baseCrossInfoPOList.stream()
...@@ -929,7 +949,7 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -929,7 +949,7 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
mainlineCrossEvaluateVO.setNonCoordValue( mainlineCrossEvaluateVO.setNonCoordValue(
calcNonCoordValue(coordDirCodeList, crossId, crossDirDataHistPOList, baseCrossDirInfoPOList)); calcNonCoordValue(coordDirCodeList, crossId, crossDirDataHistPOList, baseCrossDirInfoPOList));
mainlineCrossEvaluateVO.setDirElementList(buildDirElementList( mainlineCrossEvaluateVO.setDirElementList(buildDirElementList(
crossId, metricName, baseCrossDirInfoPOList, crossDirDataHistPOList)); crossId, metricName, baseCrossDirInfoPOList, crossDirDataHistPOList, crossEmptyPhaseList));
mainlineCrossEvaluateVO.setCrossEvaluateList(buildCrossEvaluateList( mainlineCrossEvaluateVO.setCrossEvaluateList(buildCrossEvaluateList(
crossId, baseCrossDirInfoPOList, crossDirDataHistPOList)); crossId, baseCrossDirInfoPOList, crossDirDataHistPOList));
res.add(mainlineCrossEvaluateVO); res.add(mainlineCrossEvaluateVO);
...@@ -985,7 +1005,7 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -985,7 +1005,7 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
private List<MainlineCrossEvaluateVO.DirElement> buildDirElementList( private List<MainlineCrossEvaluateVO.DirElement> buildDirElementList(
String crossId, String metricName, List<BaseCrossDirInfoPO> baseCrossDirInfoPOList, String crossId, String metricName, List<BaseCrossDirInfoPO> baseCrossDirInfoPOList,
List<CrossDirDataHistPO> crossDirDataHistPOList) { List<CrossDirDataHistPO> crossDirDataHistPOList, List<PhaseEmptyResult> crossEmptyPhaseList) {
// 获取路口所有方向 // 获取路口所有方向
List<BaseCrossDirInfoPO> collect = baseCrossDirInfoPOList.stream() List<BaseCrossDirInfoPO> collect = baseCrossDirInfoPOList.stream()
...@@ -1005,14 +1025,20 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1005,14 +1025,20 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
.filter(item -> 1 == item.getInOutType()) .filter(item -> 1 == item.getInOutType())
.filter(item -> dirCode.equals(item.getDirType())) .filter(item -> dirCode.equals(item.getDirType()))
.collect(Collectors.toList()); .collect(Collectors.toList());
dirElement.setValue(calcDirValue(metricName, filteredList));
List<PhaseEmptyResult> dirPhaseEmptyList = crossEmptyPhaseList.stream()
.filter(p -> dirCode.equals(Integer.parseInt(p.getDirection())))
.collect(Collectors.toList());
dirElement.setValue(calcDirValue(metricName, filteredList, dirPhaseEmptyList));
res.add(dirElement); res.add(dirElement);
} }
return res; return res;
} }
private Integer calcDirValue(String metricName, List<CrossDirDataHistPO> crossDirDataHistPOList) { private Integer calcDirValue(String metricName, List<CrossDirDataHistPO> crossDirDataHistPOList,
List<PhaseEmptyResult> dirPhaseEmptyList) {
int dirValue = 0; int dirValue = 0;
if (Objects.equals(metricName, StrategyAndMetricsEnum.Metrics.GREEN_LIGHT_EFFICIENCY.getDescription())) { if (Objects.equals(metricName, StrategyAndMetricsEnum.Metrics.GREEN_LIGHT_EFFICIENCY.getDescription())) {
double average = crossDirDataHistPOList.stream() double average = crossDirDataHistPOList.stream()
...@@ -1044,6 +1070,30 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1044,6 +1070,30 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
.max() .max()
.orElse(0.0); .orElse(0.0);
dirValue = (int) Math.round(max); dirValue = (int) Math.round(max);
} else if (Objects.equals(metricName, StrategyAndMetricsEnum.Metrics.EFFUSION_RATE.getDescription())) {
double average = crossDirDataHistPOList.stream()
.mapToDouble(CrossDirDataHistPO::getEffusionRate)
.average()
.orElse(0.0);
dirValue = (int) Math.round(average * 100);
} else if (Objects.equals(metricName, StrategyAndMetricsEnum.Metrics.EMPTY_PHASE.getDescription())) {
for (CrossDirDataHistPO po : crossDirDataHistPOList) {
// 计算结束时间
Date endTime = new Date(po.getStartTime().getTime() + 5 * 60 * 1000); // 增加5分钟
// 遍历每个 PhaseEmptyResult 来查找和累加 duration
for (PhaseEmptyResult phaseEmptyResult : dirPhaseEmptyList) {
if (phaseEmptyResult.getDetectTime() * 1000 >= po.getStartTime().getTime()
&& phaseEmptyResult.getDetectTime() * 1000 <= endTime.getTime()) {
// 累加 duration
po.setEmptyPhase(po.getEmptyPhase() + phaseEmptyResult.getDuration());
}
}
}
double sum = crossDirDataHistPOList.stream()
.mapToDouble(CrossDirDataHistPO::getEmptyPhase)
.sum();
dirValue = (int) Math.round(sum);
} }
return dirValue; return dirValue;
} }
......
...@@ -65,4 +65,6 @@ public class CrossDirDataRealtimePO { ...@@ -65,4 +65,6 @@ public class CrossDirDataRealtimePO {
public Double effusionRate; public Double effusionRate;
@ApiModelProperty(value = "绿灯有效利用率", notes = "") @ApiModelProperty(value = "绿灯有效利用率", notes = "")
public Double greenLightEfficiency; public Double greenLightEfficiency;
@ApiModelProperty(value = "绿灯空放时长")
private Integer emptyPhase = 0;
} }
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