Commit 7f50efb6 authored by hanbing's avatar hanbing

[add] 新信号评价-方案评价-异常事件时空分布

parent d6d90541
package net.wanji.opt.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.opt.service.impl.SceneEvaluateServiceImpl;
import net.wanji.opt.vo.SceneEvaluateabnormalDistributeVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType;
/**
* 运行评价
*
* @author Kent HAN
*/
@Api(value = "SceneEvaluateController", description = "场景评价")
@RequestMapping("/sceneEvaluate")
@RestController
public class SceneEvaluateController {
private final SceneEvaluateServiceImpl sceneEvaluateService;
public SceneEvaluateController(SceneEvaluateServiceImpl sceneEvaluateService) {
this.sceneEvaluateService = sceneEvaluateService;
}
@ApiOperation(value = "异常事件时空分布", notes = "异常事件时空分布", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/abnormalDistribute",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SceneEvaluateabnormalDistributeVO.class),
})
public JsonViewObject abnormalDistribute(@RequestBody CrossIdAndStartEndDateBO bo) {
SceneEvaluateabnormalDistributeVO res = sceneEvaluateService.abnormalDistribute(bo);
return JsonViewObject.newInstance().success(res);
}
}
\ No newline at end of file
package net.wanji.opt.service;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.opt.vo.SceneEvaluateabnormalDistributeVO;
public interface SceneEvaluateService {
SceneEvaluateabnormalDistributeVO abnormalDistribute(CrossIdAndStartEndDateBO bo);
}
...@@ -406,7 +406,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -406,7 +406,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return uniqueRes; return uniqueRes;
} }
private List<RunningEvaluateMetricsDetailVO.ProblemStatus> buildProblemStatusList( List<RunningEvaluateMetricsDetailVO.ProblemStatus> buildProblemStatusList(
List<MetricHistDTO> metricHistDTOList) { List<MetricHistDTO> metricHistDTOList) {
List<RunningEvaluateMetricsDetailVO.ProblemStatus> res = new ArrayList<>(); List<RunningEvaluateMetricsDetailVO.ProblemStatus> res = new ArrayList<>();
// 验证数据是否正确 // 验证数据是否正确
......
package net.wanji.opt.service.impl;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.dao.mapper.CrossDataHistMapper;
import net.wanji.databus.dto.MetricHistDTO;
import net.wanji.opt.service.SceneEvaluateService;
import net.wanji.opt.vo.RunningEvaluateMetricsDetailVO;
import net.wanji.opt.vo.SceneEvaluateabnormalDistributeVO;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Kent HAN
* @date 2023/8/28 16:38
*/
@Slf4j
@Service
public class SceneEvaluateServiceImpl implements SceneEvaluateService {
private final CrossDataHistMapper crossDataHistMapper;
private final RunningEvaluateServiceImpl runningEvaluateService;
public SceneEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper, RunningEvaluateServiceImpl runningEvaluateService) {
this.crossDataHistMapper = crossDataHistMapper;
this.runningEvaluateService = runningEvaluateService;
}
@Override
public SceneEvaluateabnormalDistributeVO abnormalDistribute(CrossIdAndStartEndDateBO bo) {
String crossId = bo.getCrossId();
Date startDate = bo.getStartDate();
Date endDate = bo.getEndDate();
SceneEvaluateabnormalDistributeVO vo = new SceneEvaluateabnormalDistributeVO();
List<SceneEvaluateabnormalDistributeVO.TimeDistribution> timeDistributionList =
buildTimeDistributionList(crossId, startDate, endDate);
vo.setTimeDistributionList(timeDistributionList);
setCounts(timeDistributionList, vo);
return vo;
}
private static void setCounts(List<SceneEvaluateabnormalDistributeVO.TimeDistribution> timeDistributionList,
SceneEvaluateabnormalDistributeVO vo) {
int congestionDuration = 0;
int congestionTimes = 0;
int unbalanceDuration = 0;
int unbalanceTimes = 0;
int spilloverDuration = 0;
int spilloverTimes = 0;
for (SceneEvaluateabnormalDistributeVO.TimeDistribution timeDistribution : timeDistributionList) {
List<RunningEvaluateMetricsDetailVO.ProblemStatus> problemStatusList =
timeDistribution.getProblemStatusList();
for (RunningEvaluateMetricsDetailVO.ProblemStatus problemStatus : problemStatusList) {
Integer status = problemStatus.getStatus();
Integer durationMinutes = problemStatus.getDurationMinutes();
if (status != null && status.equals(CrossStatusEnum.CONGESTION.getCode())) {
congestionTimes++;
congestionDuration += durationMinutes;
} else if (status != null && status.equals(CrossStatusEnum.UNBALANCE.getCode())) {
unbalanceTimes++;
unbalanceDuration += durationMinutes;
} else if (status != null && status.equals(CrossStatusEnum.SPILLOVER.getCode())) {
spilloverTimes++;
spilloverDuration += durationMinutes;
}
}
}
vo.setCongestionTimes(congestionTimes);
vo.setUnbalanceTimes(unbalanceTimes);
vo.setSpilloverTimes(spilloverTimes);
vo.setCongestionDuration(congestionDuration);
vo.setUnbalanceDuration(unbalanceDuration);
vo.setSpilloverDuration(spilloverDuration);
}
private List<SceneEvaluateabnormalDistributeVO.TimeDistribution> buildTimeDistributionList(
String crossId, Date startDate, Date endDate) {
List<SceneEvaluateabnormalDistributeVO.TimeDistribution> res = new ArrayList<>();
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
start.setTime(startDate);
end.setTime(endDate);
// 使 endDate 包含在内
end.add(Calendar.DATE, 1);
for (Date date = start.getTime(); start.before(end); start.add(Calendar.DATE, 1), date = start.getTime()) {
SceneEvaluateabnormalDistributeVO.TimeDistribution timeDistribution =
new SceneEvaluateabnormalDistributeVO.TimeDistribution();
timeDistribution.setProblemDate(date);
// 获取问题列表
// 路口级别全量数据
int startStamp = (int) (startDate.getTime() / 1000); // 10位时间戳
int endStamp = (int) (endDate.getTime() / 1000);
List<MetricHistDTO> crossDTOList = crossDataHistMapper.selectMetricHistDTO(
crossId, startStamp, endStamp);
// 过滤有问题的记录
List<MetricHistDTO> filteredList = crossDTOList.stream()
.filter(metricHistDTO -> metricHistDTO.getStatus() != null && !metricHistDTO.getStatus().equals(0))
.collect(Collectors.toList());
timeDistribution.setProblemStatusList(runningEvaluateService.buildProblemStatusList(filteredList));
res.add(timeDistribution);
}
return res;
}
}
package net.wanji.opt.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "SceneEvaluateabnormalDistributeVO", description = "异常事件时空分布")
public class SceneEvaluateabnormalDistributeVO {
@ApiModelProperty(value = "拥堵次数")
Integer congestionTimes;
@ApiModelProperty(value = "失衡次数")
Integer unbalanceTimes;
@ApiModelProperty(value = "溢出次数")
Integer spilloverTimes;
@ApiModelProperty(value = "拥堵时长(分钟)")
Integer congestionDuration;
@ApiModelProperty(value = "失衡时长(分钟)")
Integer unbalanceDuration;
@ApiModelProperty(value = "溢出时长(分钟)")
Integer spilloverDuration;
@ApiModelProperty(value = "时间分布")
List<TimeDistribution> timeDistributionList;
@NoArgsConstructor
@Data
public static class TimeDistribution {
@ApiModelProperty(value = "日期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "M/d", timezone = "GMT+8")
private Date problemDate;
@ApiModelProperty(value = "状态列表")
private List<RunningEvaluateMetricsDetailVO.ProblemStatus> problemStatusList;
}
}
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