Commit ab9caec1 authored by duwei's avatar duwei

异常事件时空分布(拥堵、失衡、溢出、空放)

parent f918a55a
package net.wanji.opt.controller; package net.wanji.opt.controller;
import cn.hutool.core.date.DateUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
...@@ -13,6 +14,7 @@ import net.wanji.opt.bo.SceneMetricsDetailBO; ...@@ -13,6 +14,7 @@ import net.wanji.opt.bo.SceneMetricsDetailBO;
import net.wanji.opt.service.impl.SceneEvaluateServiceImpl; import net.wanji.opt.service.impl.SceneEvaluateServiceImpl;
import net.wanji.opt.vo.*; import net.wanji.opt.vo.*;
import net.wanji.opt.vo.SceneMetricsDetailVO; import net.wanji.opt.vo.SceneMetricsDetailVO;
import org.springframework.beans.factory.annotation.Value;
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;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -32,13 +34,15 @@ import java.util.List; ...@@ -32,13 +34,15 @@ import java.util.List;
@RequestMapping("/sceneEvaluate") @RequestMapping("/sceneEvaluate")
@RestController @RestController
public class SceneEvaluateController { public class SceneEvaluateController {
@Value("${mock.flag:false}")
private boolean isMock = false;
private final SceneEvaluateServiceImpl sceneEvaluateService; private final SceneEvaluateServiceImpl sceneEvaluateService;
public SceneEvaluateController(SceneEvaluateServiceImpl sceneEvaluateService) { public SceneEvaluateController(SceneEvaluateServiceImpl sceneEvaluateService) {
this.sceneEvaluateService = sceneEvaluateService; this.sceneEvaluateService = sceneEvaluateService;
} }
@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 = "/abnormalDistribute", @PostMapping(value = "/abnormalDistribute",
...@@ -47,6 +51,11 @@ public class SceneEvaluateController { ...@@ -47,6 +51,11 @@ public class SceneEvaluateController {
@ApiResponse(code = 200, message = "OK", response = SceneEvaluateAbnormalDistributeVO.class), @ApiResponse(code = 200, message = "OK", response = SceneEvaluateAbnormalDistributeVO.class),
}) })
public JsonViewObject abnormalDistribute(@RequestBody CrossIdAndStartEndDateBO bo) { public JsonViewObject abnormalDistribute(@RequestBody CrossIdAndStartEndDateBO bo) {
if(isMock == true){
bo.setCrossId("12Q5V099C30");
bo.setStartDate(DateUtil.parse("2025-04-07 08:50:00", "yyyy-MM-dd HH:mm:ss"));
bo.setEndDate(DateUtil.parse("2025-04-07 16:30:00", "yyyy-MM-dd HH:mm:ss"));
}
SceneEvaluateAbnormalDistributeVO res = sceneEvaluateService.abnormalDistribute(bo); SceneEvaluateAbnormalDistributeVO res = sceneEvaluateService.abnormalDistribute(bo);
return JsonViewObject.newInstance().success(res); return JsonViewObject.newInstance().success(res);
} }
......
...@@ -75,8 +75,11 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService { ...@@ -75,8 +75,11 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
Date endDate = bo.getEndDate(); Date endDate = bo.getEndDate();
SceneEvaluateAbnormalDistributeVO vo = new SceneEvaluateAbnormalDistributeVO(); SceneEvaluateAbnormalDistributeVO vo = new SceneEvaluateAbnormalDistributeVO();
//日期,状态分布(路口状态:0正常;1失衡;2拥堵;3溢出;4死锁;5空放)
List<SceneEvaluateAbnormalDistributeVO.TimeDistribution> timeDistributionList = List<SceneEvaluateAbnormalDistributeVO.TimeDistribution> timeDistributionList =
buildTimeDistributionList(crossId, startDate, endDate); buildTimeDistributionList(crossId, startDate, endDate);
vo.setTimeDateDistributionList(buildTimeDateDistributionList(timeDistributionList)); vo.setTimeDateDistributionList(buildTimeDateDistributionList(timeDistributionList));
setCounts(timeDistributionList, vo); setCounts(timeDistributionList, vo);
...@@ -1144,6 +1147,7 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService { ...@@ -1144,6 +1147,7 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
finalTimeDistributionList finalTimeDistributionList
.sort(Comparator.comparing(SceneEvaluateAbnormalDistributeVO.FinalTimeDistribution::getProblemDate) .sort(Comparator.comparing(SceneEvaluateAbnormalDistributeVO.FinalTimeDistribution::getProblemDate)
.thenComparing(SceneEvaluateAbnormalDistributeVO.FinalTimeDistribution::getDistributionTime)); .thenComparing(SceneEvaluateAbnormalDistributeVO.FinalTimeDistribution::getDistributionTime));
// 生成时间日期分布 // 生成时间日期分布
List<SceneEvaluateAbnormalDistributeVO.TimeDateDistribution> timeDateDistributionList = new ArrayList<>(); List<SceneEvaluateAbnormalDistributeVO.TimeDateDistribution> timeDateDistributionList = new ArrayList<>();
List<String> minuteSectionArray = TimeArrayUtil.getMinuteSectionArray(5); List<String> minuteSectionArray = TimeArrayUtil.getMinuteSectionArray(5);
...@@ -1299,6 +1303,8 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService { ...@@ -1299,6 +1303,8 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
int unbalanceTimes = 0; int unbalanceTimes = 0;
int spilloverDuration = 0; int spilloverDuration = 0;
int spilloverTimes = 0; int spilloverTimes = 0;
int emptyReleaseDuration = 0;
int emptyReleaseTimes = 0;
for (SceneEvaluateAbnormalDistributeVO.TimeDistribution timeDistribution : timeDistributionList) { for (SceneEvaluateAbnormalDistributeVO.TimeDistribution timeDistribution : timeDistributionList) {
List<RunningEvaluateMetricsDetailVO.ProblemStatus> problemStatusList = List<RunningEvaluateMetricsDetailVO.ProblemStatus> problemStatusList =
timeDistribution.getProblemStatusList(); timeDistribution.getProblemStatusList();
...@@ -1314,15 +1320,20 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService { ...@@ -1314,15 +1320,20 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
} else if (status != null && status.equals(CrossStatusEnum.SPILLOVER.getCode())) { } else if (status != null && status.equals(CrossStatusEnum.SPILLOVER.getCode())) {
spilloverTimes++; spilloverTimes++;
spilloverDuration += durationMinutes; spilloverDuration += durationMinutes;
} else if(status != null && status.equals(CrossStatusEnum.EMPTY_RELEASE.getCode())){
emptyReleaseTimes++;
emptyReleaseDuration += durationMinutes;
} }
} }
} }
vo.setCongestionTimes(congestionTimes); vo.setCongestionTimes(congestionTimes);
vo.setUnbalanceTimes(unbalanceTimes); vo.setUnbalanceTimes(unbalanceTimes);
vo.setSpilloverTimes(spilloverTimes); vo.setSpilloverTimes(spilloverTimes);
vo.setCongestionDuration(congestionDuration); vo.setEmptyReleaseTimes(emptyReleaseTimes);
vo.setUnbalanceDuration(unbalanceDuration); vo.setCongestionDuration(congestionDuration/60);//数据库里是秒,这里转成分钟
vo.setSpilloverDuration(spilloverDuration); vo.setUnbalanceDuration(unbalanceDuration/60);
vo.setSpilloverDuration(spilloverDuration/60);
vo.setEmptyReleaseDuration(emptyReleaseDuration/60);
} }
private List<SceneEvaluateAbnormalDistributeVO.TimeDistribution> buildTimeDistributionList( private List<SceneEvaluateAbnormalDistributeVO.TimeDistribution> buildTimeDistributionList(
...@@ -1343,14 +1354,16 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService { ...@@ -1343,14 +1354,16 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
// 路口级别全量数据 // 路口级别全量数据
Calendar partEnd = (Calendar) start.clone(); Calendar partEnd = (Calendar) start.clone();
partEnd.add(Calendar.DAY_OF_MONTH, 1); partEnd.add(Calendar.DAY_OF_MONTH, 1);
int startStamp = (int)(start.getTimeInMillis() / 1000); // int startStamp = (int)(start.getTimeInMillis() / 1000);
int endStamp = (int)(partEnd.getTimeInMillis() / 1000); // int endStamp = (int)(partEnd.getTimeInMillis() / 1000);
List<MetricHistDTO> crossDTOList = crossDataHistMapper.selectMetricHistDTO( String startTime = DateUtil.format(startDate, "yyyy-MM-dd HH:mm:ss");
crossId, startStamp, endStamp); String endTime = DateUtil.format(endDate, "yyyy-MM-dd HH:mm:ss");
List<MetricHistDTO> crossDTOList = crossDataHistMapper.selectMetricHistDTO2(crossId, startTime, endTime);
// 过滤有问题的记录 // 过滤有问题的记录
List<MetricHistDTO> filteredList = crossDTOList.stream() List<MetricHistDTO> filteredList = crossDTOList.stream()
.filter(metricHistDTO -> metricHistDTO.getStatus() != null && !metricHistDTO.getStatus().equals(0)) .filter(metricHistDTO -> metricHistDTO.getStatus() != null && !metricHistDTO.getStatus().equals(0))
.collect(Collectors.toList()); .collect(Collectors.toList());
timeDistribution.setProblemStatusList(runningEvaluateService.buildProblemStatusList(filteredList)); timeDistribution.setProblemStatusList(runningEvaluateService.buildProblemStatusList(filteredList));
res.add(timeDistribution); res.add(timeDistribution);
} }
......
...@@ -30,7 +30,7 @@ public class RunningEvaluateMetricsDetailVO { ...@@ -30,7 +30,7 @@ public class RunningEvaluateMetricsDetailVO {
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public static class ProblemStatus { public static class ProblemStatus {
@ApiModelProperty(value = "路口状态 0正常 1 失衡 2 拥堵 3 溢出 4 空放") @ApiModelProperty(value = "路口状态 0正常 1 失衡 2 拥堵 3 溢出 5 空放")
private Integer status; private Integer status;
@ApiModelProperty(value = "开始时间") @ApiModelProperty(value = "开始时间")
......
...@@ -23,12 +23,16 @@ public class SceneEvaluateAbnormalDistributeVO { ...@@ -23,12 +23,16 @@ public class SceneEvaluateAbnormalDistributeVO {
Integer unbalanceTimes; Integer unbalanceTimes;
@ApiModelProperty(value = "溢出次数") @ApiModelProperty(value = "溢出次数")
Integer spilloverTimes; Integer spilloverTimes;
@ApiModelProperty(value = "空放次数")
Integer emptyReleaseTimes;
@ApiModelProperty(value = "拥堵时长(分钟)") @ApiModelProperty(value = "拥堵时长(分钟)")
Integer congestionDuration; Integer congestionDuration;
@ApiModelProperty(value = "失衡时长(分钟)") @ApiModelProperty(value = "失衡时长(分钟)")
Integer unbalanceDuration; Integer unbalanceDuration;
@ApiModelProperty(value = "溢出时长(分钟)") @ApiModelProperty(value = "溢出时长(分钟)")
Integer spilloverDuration; Integer spilloverDuration;
@ApiModelProperty(value = "空放时长(分钟)")
Integer emptyReleaseDuration;
@ApiModelProperty(value = "时间日期分布") @ApiModelProperty(value = "时间日期分布")
List<TimeDateDistribution> timeDateDistributionList; List<TimeDateDistribution> timeDateDistributionList;
...@@ -91,5 +95,7 @@ public class SceneEvaluateAbnormalDistributeVO { ...@@ -91,5 +95,7 @@ public class SceneEvaluateAbnormalDistributeVO {
@ApiModelProperty(value = "是否拥堵 0否 1是") @ApiModelProperty(value = "是否拥堵 0否 1是")
private Integer isCongestion = 0; private Integer isCongestion = 0;
@ApiModelProperty(value = "是否空放 0否 1是")
private Integer isEmptyRelease = 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