Commit ab9caec1 authored by duwei's avatar duwei

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

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