Commit d2afa625 authored by hanbing's avatar hanbing

[add] 新信号评价-运行评价-方案问题

parent 90bd6481
...@@ -9,8 +9,9 @@ import net.wanji.databus.bo.CrossIdAndStartEndDateBO; ...@@ -9,8 +9,9 @@ import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.vo.RunningEvaluateCrossListVO; import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO; import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.service.impl.RunningEvaluateServiceImpl; import net.wanji.opt.service.impl.RunningEvaluateServiceImpl;
import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO; import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateSchemeProblemsVO;
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;
...@@ -95,4 +96,16 @@ public class RunningEvaluateController { ...@@ -95,4 +96,16 @@ public class RunningEvaluateController {
return JsonViewObject.newInstance().success(res); return JsonViewObject.newInstance().success(res);
} }
@ApiOperation(value = "方案问题", notes = "方案问题", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/schemeProblems",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateSchemeProblemsVO.class),
})
public JsonViewObject schemeProblems(@RequestBody CrossIdAndStartEndDateBO bo) {
List<RunningEvaluateSchemeProblemsVO> res = runningEvaluateService.schemeProblems(bo);
return JsonViewObject.newInstance().success(res);
}
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ import net.wanji.databus.vo.RunningEvaluateCrossListVO; ...@@ -5,6 +5,7 @@ import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO; import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.vo.RunningEvaluateIndexStatusVO; import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO; import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import net.wanji.opt.vo.RunningEvaluateSchemeProblemsVO;
import java.util.List; import java.util.List;
...@@ -18,4 +19,6 @@ public interface RunningEvaluateService { ...@@ -18,4 +19,6 @@ public interface RunningEvaluateService {
List<RunningEvaluateIndexStatusVO> unbalanceStatus(CrossIdAndStartEndDateBO bo); List<RunningEvaluateIndexStatusVO> unbalanceStatus(CrossIdAndStartEndDateBO bo);
List<RunningEvaluateIndexStatusVO> spilloverStatus(CrossIdAndStartEndDateBO bo); List<RunningEvaluateIndexStatusVO> spilloverStatus(CrossIdAndStartEndDateBO bo);
List<RunningEvaluateSchemeProblemsVO> schemeProblems(CrossIdAndStartEndDateBO bo);
} }
...@@ -6,7 +6,9 @@ import net.wanji.common.enums.CrossStatusEnum; ...@@ -6,7 +6,9 @@ import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.utils.tool.CrossUtil; import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.common.utils.tool.TimeArrayUtil; import net.wanji.common.utils.tool.TimeArrayUtil;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO; import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.dao.entity.BaseCrossSchemePO;
import net.wanji.databus.dao.entity.CrossSectionPO; import net.wanji.databus.dao.entity.CrossSectionPO;
import net.wanji.databus.dao.mapper.BaseCrossSchemeMapper;
import net.wanji.databus.dao.mapper.BaseCrossSectionMapper; import net.wanji.databus.dao.mapper.BaseCrossSectionMapper;
import net.wanji.databus.dao.mapper.CrossDataHistMapper; import net.wanji.databus.dao.mapper.CrossDataHistMapper;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper; import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
...@@ -17,15 +19,19 @@ import net.wanji.opt.bo.CrossNameBO; ...@@ -17,15 +19,19 @@ import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.service.RunningEvaluateService; import net.wanji.opt.service.RunningEvaluateService;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO; import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import net.wanji.opt.vo.RunningEvaluateIndexStatusVO; import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateSchemeProblemsVO;
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.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.time.Instant;
/** /**
* @author Kent HAN * @author Kent HAN
...@@ -37,13 +43,16 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -37,13 +43,16 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private final CrossDataRealtimeMapper crossDataRealtimeMapper; private final CrossDataRealtimeMapper crossDataRealtimeMapper;
private final CrossDataHistMapper crossDataHistMapper; private final CrossDataHistMapper crossDataHistMapper;
private final BaseCrossSectionMapper baseCrossSectionMapper; private final BaseCrossSectionMapper baseCrossSectionMapper;
private final BaseCrossSchemeMapper baseCrossSchemeMapper;
public RunningEvaluateServiceImpl(CrossDataRealtimeMapper crossDataRealtimeMapper, public RunningEvaluateServiceImpl(CrossDataRealtimeMapper crossDataRealtimeMapper,
CrossDataHistMapper crossDataHistMapper, CrossDataHistMapper crossDataHistMapper,
@Qualifier("baseCrossSectionMapper") BaseCrossSectionMapper baseCrossSectionMapper) { @Qualifier("baseCrossSectionMapper") BaseCrossSectionMapper baseCrossSectionMapper,
@Qualifier("baseCrossSchemeMapper") BaseCrossSchemeMapper baseCrossSchemeMapper) {
this.crossDataRealtimeMapper = crossDataRealtimeMapper; this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.crossDataHistMapper = crossDataHistMapper; this.crossDataHistMapper = crossDataHistMapper;
this.baseCrossSectionMapper = baseCrossSectionMapper; this.baseCrossSectionMapper = baseCrossSectionMapper;
this.baseCrossSchemeMapper = baseCrossSchemeMapper;
} }
@Override @Override
...@@ -124,6 +133,107 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -124,6 +133,107 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return buildRes(bo, crossId, status); return buildRes(bo, crossId, status);
} }
@Override
public List<RunningEvaluateSchemeProblemsVO> schemeProblems(CrossIdAndStartEndDateBO bo) {
String crossId = bo.getCrossId();
List<RunningEvaluateSchemeProblemsVO> res = new ArrayList<>();
List<String> timeArray = TimeArrayUtil.getTimeArray();
for (String time : timeArray) {
RunningEvaluateSchemeProblemsVO vo = new RunningEvaluateSchemeProblemsVO();
vo.setTime(time);
List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId);
// 找出有问题的记录
List<CrossDataHistPO> collect = crossDataHistPOList.stream()
.filter(po -> !Objects.equals(po.getStatus(), CrossStatusEnum.NORMAL.getCode()))
.collect(Collectors.toList());
// 按采集时间小时进行聚合
SimpleDateFormat sdf = new SimpleDateFormat("HH");
Map<String, List<CrossDataHistPO>> timePOMap = crossDataHistPOList.stream()
.collect(Collectors.groupingBy(po -> {
Date date = new Date((long) po.getBatchTime() * 1000); // 将10位时间戳转换为Date对象
return sdf.format(date); // 将Date对象转换为"HH"格式的字符串
}));
// 找出当前小时的记录
List<CrossDataHistPO> currentHourList = timePOMap.get(time.substring(0, 2)); // 保留小时字符串
if (currentHourList != null) {
// 按相同开始时间去重,保留持续时间最长的一个
List<CrossDataHistPO> uniqueList = currentHourList.stream()
.collect(Collectors.groupingBy(
CrossDataHistPO::getStartTime, // 按startTime分组
Collectors.collectingAndThen(
// 在每个组中找到duration最大的元素
Collectors.maxBy(Comparator.comparingLong(CrossDataHistPO::getDuration)),
Optional::get // 从Optional中获取元素
)
))
.values().stream().collect(Collectors.toList()); // 从Map中获取值并收集到新的列表中
// 统计数量
vo.setCounts(uniqueList.size());
// 找出出现问题的日期和方案
List<RunningEvaluateSchemeProblemsVO.DateAndScheme> dateAndSchemeList = new ArrayList<>();
dateAndSchemeList = buildDateAndSchemeList(uniqueList, crossId);
vo.setDateAndSchemeList(dateAndSchemeList);
}
res.add(vo);
}
return res;
}
private List<RunningEvaluateSchemeProblemsVO.DateAndScheme> buildDateAndSchemeList(
List<CrossDataHistPO> uniqueList, String crossId) {
List<RunningEvaluateSchemeProblemsVO.DateAndScheme> res = new ArrayList<>();
// 将问题按日期分组
Map<LocalDate, List<CrossDataHistPO>> groupedByDate = uniqueList.stream()
.collect(Collectors.groupingBy(
// 将10位时间戳转换为Instant
crossDataHistPO -> Instant.ofEpochSecond(crossDataHistPO.getBatchTime())
.atZone(ZoneId.systemDefault()) // 将Instant转换为系统默认时区的ZonedDateTime
.toLocalDate() // 获取LocalDate
));
for (Map.Entry<LocalDate, List<CrossDataHistPO>> entry : groupedByDate.entrySet()) {
LocalDate localDate = entry.getKey(); // 获取日期
List<CrossDataHistPO> crossDataHistPOs = entry.getValue(); // 获取该日期下的CrossDataHistPO对象列表
RunningEvaluateSchemeProblemsVO.DateAndScheme dateAndScheme =
new RunningEvaluateSchemeProblemsVO.DateAndScheme();
Date date = Date.from(localDate.atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant());
dateAndScheme.setProblemDate(date);
Set<String> schemeNameSet = new HashSet<>();
for (CrossDataHistPO abnormalEvent : crossDataHistPOs) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Date abnormalEventStartTime = abnormalEvent.getStartTime();
Integer duration = abnormalEvent.getDuration();
Date abnormalEventEndTime = DateUtil.offsetMinute(abnormalEventStartTime, duration);
String eventStartTime = sdf.format(abnormalEventStartTime);
String eventEndTime = sdf.format(abnormalEventEndTime);
List<CrossSectionPO> crossSectionPOList = baseCrossSectionMapper.selectByCrossId(crossId);
for (CrossSectionPO crossSectionPO : crossSectionPOList) {
String sectionStartTime = crossSectionPO.getStartTime();
String sectionEndTime = crossSectionPO.getEndTime();
// 比较两组时间段是否相交
boolean isIntersecting = isTimeIntersecting(
eventStartTime, eventEndTime, sectionStartTime, sectionEndTime);
if (isIntersecting) {
Integer schemeId = crossSectionPO.getSchemeId();
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(schemeId);
schemeNameSet.add(baseCrossSchemePO.getName());
dateAndScheme.setSchemeNameSet(schemeNameSet);
}
}
}
res.add(dateAndScheme);
}
return res;
}
@NotNull @NotNull
private List<RunningEvaluateIndexStatusVO> buildRes(CrossIdAndStartEndDateBO bo, String crossId, int status) { private List<RunningEvaluateIndexStatusVO> buildRes(CrossIdAndStartEndDateBO bo, String crossId, int status) {
List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId); List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId);
...@@ -138,9 +248,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -138,9 +248,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
@NotNull @NotNull
private List<RunningEvaluateIndexStatusVO> buildRunningEvaluateIndexStatusVOList( private List<RunningEvaluateIndexStatusVO> buildRunningEvaluateIndexStatusVOList(
List<CrossDataHistPO> crossDataHistPOList, int status) { List<CrossDataHistPO> crossDataHistPOList, int status) {
SimpleDateFormat sdf = new SimpleDateFormat("HH"); SimpleDateFormat sdf = new SimpleDateFormat("HH");
Map<String, List<CrossDataHistPO>> timePOMap = crossDataHistPOList.stream() Map<String, List<CrossDataHistPO>> timePOMap = crossDataHistPOList.stream()
.collect(Collectors.groupingBy(po -> { .collect(Collectors.groupingBy(po -> {
Date date = new Date((long) po.getBatchTime() * 1000); // 将10位时间戳转换为Date对象 Date date = new Date((long) po.getBatchTime() * 1000); // 将10位时间戳转换为Date对象
......
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;
import java.util.Set;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "RunningEvaluateSchemeProblemsVO", description = "查询方案问题返回值")
public class RunningEvaluateSchemeProblemsVO {
@ApiModelProperty(value = "时间")
private String time;
@ApiModelProperty(value = "次数")
private Integer counts;
@ApiModelProperty(value = "问题方案")
private List<DateAndScheme> dateAndSchemeList;
@Data
@NoArgsConstructor
public static class DateAndScheme {
@ApiModelProperty(value = "日期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "M/d", timezone = "GMT+8")
private Date problemDate;
@ApiModelProperty(value = "方案名称")
private Set<String> schemeNameSet;
}
}
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