Commit 9e8652e7 authored by hanbing's avatar hanbing

[update] 新信号评价-场景评价-异常事件时空图

parent 04dae3df
package net.wanji.opt.service.impl; package net.wanji.opt.service.impl;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum; import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.utils.tool.TimeArrayUtil;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO; import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.dao.mapper.CrossDataHistMapper; import net.wanji.databus.dao.mapper.CrossDataHistMapper;
import net.wanji.databus.dto.MetricHistDTO; import net.wanji.databus.dto.MetricHistDTO;
import net.wanji.opt.service.SceneEvaluateService; import net.wanji.opt.service.SceneEvaluateService;
import net.wanji.opt.vo.RunningEvaluateMetricsDetailVO; import net.wanji.opt.vo.RunningEvaluateMetricsDetailVO;
import net.wanji.opt.vo.SceneEvaluateabnormalDistributeVO; import net.wanji.opt.vo.SceneEvaluateabnormalDistributeVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -22,6 +26,7 @@ import java.util.stream.Collectors; ...@@ -22,6 +26,7 @@ import java.util.stream.Collectors;
public class SceneEvaluateServiceImpl implements SceneEvaluateService { public class SceneEvaluateServiceImpl implements SceneEvaluateService {
private final CrossDataHistMapper crossDataHistMapper; private final CrossDataHistMapper crossDataHistMapper;
private final RunningEvaluateServiceImpl runningEvaluateService; private final RunningEvaluateServiceImpl runningEvaluateService;
SimpleDateFormat HOUR_SDF = new SimpleDateFormat("HH:mm");
public SceneEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper, RunningEvaluateServiceImpl runningEvaluateService) { public SceneEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper, RunningEvaluateServiceImpl runningEvaluateService) {
this.crossDataHistMapper = crossDataHistMapper; this.crossDataHistMapper = crossDataHistMapper;
...@@ -37,13 +42,13 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService { ...@@ -37,13 +42,13 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
SceneEvaluateabnormalDistributeVO vo = new SceneEvaluateabnormalDistributeVO(); SceneEvaluateabnormalDistributeVO vo = new SceneEvaluateabnormalDistributeVO();
List<SceneEvaluateabnormalDistributeVO.TimeDistribution> timeDistributionList = List<SceneEvaluateabnormalDistributeVO.TimeDistribution> timeDistributionList =
buildTimeDistributionList(crossId, startDate, endDate); buildTimeDistributionList(crossId, startDate, endDate);
vo.setFinalTimeDistributionList(buildFinalTimeDistributionList(timeDistributionList)); vo.setTimeDateDistributionList(buildFinalTimeDistributionList(timeDistributionList));
setCounts(timeDistributionList, vo); setCounts(timeDistributionList, vo);
return vo; return vo;
} }
public List<SceneEvaluateabnormalDistributeVO.FinalTimeDistribution> buildFinalTimeDistributionList( public List<SceneEvaluateabnormalDistributeVO.TimeDateDistribution> buildFinalTimeDistributionList(
List<SceneEvaluateabnormalDistributeVO.TimeDistribution> timeDistributionList) { List<SceneEvaluateabnormalDistributeVO.TimeDistribution> timeDistributionList) {
List<SceneEvaluateabnormalDistributeVO.FinalTimeDistribution> finalTimeDistributionList = new ArrayList<>(); List<SceneEvaluateabnormalDistributeVO.FinalTimeDistribution> finalTimeDistributionList = new ArrayList<>();
...@@ -110,7 +115,82 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService { ...@@ -110,7 +115,82 @@ 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));
return finalTimeDistributionList; // 生成时间日期分布
List<SceneEvaluateabnormalDistributeVO.TimeDateDistribution> timeDateDistributionList = new ArrayList<>();
List<String> minuteSectionArray = TimeArrayUtil.getMinuteSectionArray(5);
for (String timeStr : minuteSectionArray) {
SceneEvaluateabnormalDistributeVO.TimeDateDistribution timeDateDistribution =
new SceneEvaluateabnormalDistributeVO.TimeDateDistribution();
timeDateDistribution.setHourMinute(timeStr);
timeDateDistribution.setStatusByDateList(buildStatusByDateList(timeStr, finalTimeDistributionList));
timeDateDistributionList.add(timeDateDistribution);
}
return timeDateDistributionList;
}
private List<SceneEvaluateabnormalDistributeVO.StatusByDate> buildStatusByDateList(
String timeStr, List<SceneEvaluateabnormalDistributeVO.FinalTimeDistribution> finalTimeDistributionList) {
List<SceneEvaluateabnormalDistributeVO.StatusByDate> res = new ArrayList<>();
for (SceneEvaluateabnormalDistributeVO.FinalTimeDistribution ftd : finalTimeDistributionList) {
Date problemDate = ftd.getProblemDate();
Date distributionTime = ftd.getDistributionTime();
String format = HOUR_SDF.format(distributionTime);
if (Objects.equals(timeStr, format)) {
SceneEvaluateabnormalDistributeVO.StatusByDate inRes = getRecordInRes(res, problemDate);
// 如果 res 中没有记录
if (ObjectUtil.isEmpty(inRes)) {
SceneEvaluateabnormalDistributeVO.StatusByDate statusByDate = buildStatusByDate(ftd, problemDate);
res.add(statusByDate);
} else {
modifyRecordInRes(ftd, inRes);
}
}
}
return res;
}
private void modifyRecordInRes(
SceneEvaluateabnormalDistributeVO.FinalTimeDistribution ftd,
SceneEvaluateabnormalDistributeVO.StatusByDate inRes) {
Integer status = ftd.getStatus();
if (Objects.equals(status, CrossStatusEnum.UNBALANCE.getCode())) {
inRes.setIsUnbalance(1);
} else if (Objects.equals(status, CrossStatusEnum.CONGESTION.getCode())) {
inRes.setIsCongestion(1);
} else if (Objects.equals(status, CrossStatusEnum.SPILLOVER.getCode())) {
inRes.setIsSpillover(1);
}
}
@NotNull
private SceneEvaluateabnormalDistributeVO.StatusByDate buildStatusByDate(
SceneEvaluateabnormalDistributeVO.FinalTimeDistribution ftd, Date problemDate) {
SceneEvaluateabnormalDistributeVO.StatusByDate statusByDate =
new SceneEvaluateabnormalDistributeVO.StatusByDate();
statusByDate.setProblemDate(problemDate);
modifyRecordInRes(ftd, statusByDate);
return statusByDate;
}
private SceneEvaluateabnormalDistributeVO.StatusByDate getRecordInRes(
List<SceneEvaluateabnormalDistributeVO.StatusByDate> res, Date problemDate) {
for (SceneEvaluateabnormalDistributeVO.StatusByDate statusByDate : res) {
Date problemDateInRes = statusByDate.getProblemDate();
// 创建Calendar实例
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
// 设置Calendar实例的时间
cal1.setTime(problemDate);
cal2.setTime(problemDateInRes);
// 比较两个日期是否相等(忽略时间部分)
boolean isSameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
if (isSameDay) {
return statusByDate;
}
}
return null;
} }
private boolean isSameDay(Date date1, Date date2) { private boolean isSameDay(Date date1, Date date2) {
......
...@@ -30,8 +30,8 @@ public class SceneEvaluateabnormalDistributeVO { ...@@ -30,8 +30,8 @@ public class SceneEvaluateabnormalDistributeVO {
@ApiModelProperty(value = "溢出时长(分钟)") @ApiModelProperty(value = "溢出时长(分钟)")
Integer spilloverDuration; Integer spilloverDuration;
@ApiModelProperty(value = "时间分布") @ApiModelProperty(value = "时间日期分布")
List<FinalTimeDistribution> finalTimeDistributionList; List<TimeDateDistribution> timeDateDistributionList;
@NoArgsConstructor @NoArgsConstructor
@Data @Data
...@@ -61,4 +61,35 @@ public class SceneEvaluateabnormalDistributeVO { ...@@ -61,4 +61,35 @@ public class SceneEvaluateabnormalDistributeVO {
private Date distributionTime; private Date distributionTime;
} }
@NoArgsConstructor
@Data
public static class TimeDateDistribution {
@ApiModelProperty(value = "时间 HH:mm")
private String hourMinute;
@ApiModelProperty(value = "状态列表")
private List<StatusByDate> statusByDateList;
}
@NoArgsConstructor
@Data
public static class StatusByDate {
@ApiModelProperty(value = "日期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "M/d", timezone = "GMT+8")
private Date problemDate;
@ApiModelProperty(value = "是否失衡 0否 1是")
private Integer isUnbalance = 0;
@ApiModelProperty(value = "是否溢出 0否 1是")
private Integer isSpillover = 0;
@ApiModelProperty(value = "是否拥堵 0否 1是")
private Integer isCongestion = 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