Commit bc6765cc authored by hanbing's avatar hanbing

[add] 新信号评价-方案评价,构造日期-问题方案结果集

parent cb74c813
......@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType;
import java.util.List;
/**
* 运行评价
......@@ -39,7 +38,7 @@ public class SchemeEvaluateController {
@ApiResponse(code = 200, message = "OK", response = SchemeEvaluateProblemSchemeVO.class),
})
public JsonViewObject problemSchemeList(@RequestBody ProblemSchemeBO problemSchemeBO) {
List<SchemeEvaluateProblemSchemeVO> res = schemeEvaluateService.problemSchemeList(problemSchemeBO);
SchemeEvaluateProblemSchemeVO res = schemeEvaluateService.problemSchemeList(problemSchemeBO);
return JsonViewObject.newInstance().success(res);
}
......
......@@ -3,9 +3,6 @@ package net.wanji.opt.service;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import java.util.List;
public interface SchemeEvaluateService {
List<SchemeEvaluateProblemSchemeVO> problemSchemeList(ProblemSchemeBO problemSchemeBO);
SchemeEvaluateProblemSchemeVO problemSchemeList(ProblemSchemeBO problemSchemeBO);
}
......@@ -755,7 +755,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return schemeIdSet.size();
}
private Integer findPlanId(Date datetime, String dateStr, String crossId) {
Integer findPlanId(Date datetime, String dateStr, String crossId) {
CrossIdBO crossIdBO = new CrossIdBO();
crossIdBO.setCrossId(crossId);
RunningPlanDTO runningPlanDTO = listRunningPlan(crossIdBO);
......@@ -894,7 +894,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return execList;
}
private boolean isTimeIntersecting(String startTime1, String endTime1, String startTime2, String endTime2) {
boolean isTimeIntersecting(String startTime1, String endTime1, String startTime2, String endTime2) {
return !(endTime1.compareTo(startTime2) <= 0 || startTime1.compareTo(endTime2) >= 0);
}
......
package net.wanji.opt.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.entity.BaseCrossSchemePO;
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.CrossDataHistMapper;
import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.service.SchemeEvaluateService;
import net.wanji.opt.vo.RunningEvaluateMetricsDetailVO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
......@@ -22,14 +29,23 @@ import java.util.stream.Collectors;
@Service
public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
private final CrossDataHistMapper crossDataHistMapper;
private final RunningEvaluateServiceImpl runningEvaluateService;
private final BaseCrossSectionMapper baseCrossSectionMapper;
private final BaseCrossSchemeMapper baseCrossSchemeMapper;
public SchemeEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper) {
public SchemeEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper,
RunningEvaluateServiceImpl runningEvaluateService,
@Qualifier("baseCrossSectionMapper") BaseCrossSectionMapper baseCrossSectionMapper,
@Qualifier("baseCrossSchemeMapper") BaseCrossSchemeMapper baseCrossSchemeMapper) {
this.crossDataHistMapper = crossDataHistMapper;
this.runningEvaluateService = runningEvaluateService;
this.baseCrossSectionMapper = baseCrossSectionMapper;
this.baseCrossSchemeMapper = baseCrossSchemeMapper;
}
@Override
public List<SchemeEvaluateProblemSchemeVO> problemSchemeList(ProblemSchemeBO problemSchemeBO) {
List<SchemeEvaluateProblemSchemeVO> res = new ArrayList<>();
public SchemeEvaluateProblemSchemeVO problemSchemeList(ProblemSchemeBO problemSchemeBO) {
SchemeEvaluateProblemSchemeVO res = new SchemeEvaluateProblemSchemeVO();
String crossId = problemSchemeBO.getCrossId();
Date startDate = problemSchemeBO.getStartDate();
Date endDate = problemSchemeBO.getEndDate();
......@@ -40,18 +56,112 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
String endTime = problemSchemeBO.getEndTime();
List<CrossDataHistPO> crossDataHistPOList =
crossDataHistMapper.selectByCrossIdAndStartEnd(crossId, startDateStamp, endDateStamp);
// 根据入参筛选结果
Map<String, List<CrossDataHistPO>> stringListMap = getStringListMap(
// 构造时间-问题结果集
Map<String, List<CrossDataHistPO>> timeProblemMap = getTimeProblemMap(
crossDataHistPOList, endTime, startTime);
// 构造结果
// 问题次数
int problemCounts = 0;
if (CollectionUtil.isNotEmpty(timeProblemMap)) {
for (List<CrossDataHistPO> list : timeProblemMap.values()) {
problemCounts += list.size();
}
}
// 问题方案数量
res.setProblemCounts(problemCounts);
// 构造问题方案列表(根据日期)
// 构造日期-问题结果集
Map<Date, List<CrossDataHistPO>> dateProblemsMap = buildDateProblemsMap(timeProblemMap);
// 构造日期-问题方案结果集
Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> dateSchemesMap =
buildDateSchemesMap(dateProblemsMap, crossId);
// res.setProblemSchemeListByDate();
// res.setSchemeCounts();
// res.setEfficiencyProblemCounts();
// res.setBalanceProblemCounts();
// res.setSecurityProblemCounts();
// res.setProblemSchemeListByScheme();
return res;
}
private Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> buildDateSchemesMap(
Map<Date, List<CrossDataHistPO>> dateProblemsMap, String crossId) {
Map<Date, List<RunningEvaluateMetricsDetailVO.ProblemScheme>> dateSchemesMap = new HashMap<>();
// 获取当前计划ID
for (Map.Entry<Date, List<CrossDataHistPO>> dateListEntry : dateProblemsMap.entrySet()) {
List<RunningEvaluateMetricsDetailVO.ProblemScheme> problemSchemeList = new ArrayList<>();
Date datetime = dateListEntry.getKey();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(datetime);
Integer planId = runningEvaluateService.findPlanId(datetime, dateStr, crossId);
List<CrossSectionPO> crossSectionPOList = baseCrossSectionMapper.selectByCrossAndPlan(crossId, planId);
for (CrossSectionPO crossSectionPO : crossSectionPOList) {
String sectionStartTime = crossSectionPO.getStartTime();
String sectionEndTime = crossSectionPO.getEndTime();
List<CrossDataHistPO> value = dateListEntry.getValue();
for (CrossDataHistPO crossDataHistPO : value) {
SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
Date abnormalEventStartTime = crossDataHistPO.getStartTime();
Integer duration = crossDataHistPO.getDuration();
Date abnormalEventEndTime = DateUtil.offsetMinute(abnormalEventStartTime, duration);
String eventStartTime = sdf2.format(abnormalEventStartTime);
String eventEndTime = sdf2.format(abnormalEventEndTime);
// 比较两组时间段是否相交
boolean isIntersecting = runningEvaluateService.isTimeIntersecting(
eventStartTime, eventEndTime, sectionStartTime, sectionEndTime);
if (isIntersecting) {
Integer schemeId = crossSectionPO.getSchemeId();
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(schemeId);
String schemeName = baseCrossSchemePO.getName();
RunningEvaluateMetricsDetailVO.ProblemScheme problemScheme =
new RunningEvaluateMetricsDetailVO.ProblemScheme();
problemScheme.setSchemeName(schemeName);
problemScheme.setStartTime(sectionStartTime);
problemScheme.setEndTime(sectionEndTime);
problemSchemeList.add(problemScheme);
}
}
}
// 去除相同方案
List<RunningEvaluateMetricsDetailVO.ProblemScheme> uniqueRes = problemSchemeList.stream()
.distinct()
.collect(Collectors.toList());
dateSchemesMap.put(datetime, uniqueRes);
}
return dateSchemesMap;
}
private Map<Date, List<CrossDataHistPO>> buildDateProblemsMap(Map<String, List<CrossDataHistPO>> timeProblemMap) {
// 创建一个新的Map,用于存储以Date为Key,List<CrossDataHistPO>为Value的数据
Map<Date, List<CrossDataHistPO>> dateMap = new HashMap<>();
// 创建一个SimpleDateFormat对象,用于将10位时间戳转换为Date对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 遍历timeProblemMap的所有entries
for (List<CrossDataHistPO> list : timeProblemMap.values()) {
for (CrossDataHistPO po : list) {
long timestamp = po.getBatchTime() * 1000L; // 将10位时间戳转换为13位
Date date = new Date(timestamp);
String formattedDate = sdf.format(date); // 格式化日期为"yyyy-MM-dd"
try {
Date keyDate = sdf.parse(formattedDate); // 将格式化后的日期字符串转回为Date对象
// 将CrossDataHistPO对象添加到相应日期的List中
dateMap.computeIfAbsent(keyDate, k -> new ArrayList<>()).add(po);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return dateMap;
}
@NotNull
private static Map<String, List<CrossDataHistPO>> getStringListMap(List<CrossDataHistPO> crossDataHistPOList, String endTime, String startTime) {
private static Map<String, List<CrossDataHistPO>> getTimeProblemMap(
List<CrossDataHistPO> crossDataHistPOList, String endTime, String startTime) {
// 过滤有问题的记录
List<CrossDataHistPO> filteredList = crossDataHistPOList.stream()
.filter(po -> po.getStatus() != null && po.getStatus() != 0)
......
......@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.Objects;
/**
* @author Kent HAN
......@@ -46,4 +47,17 @@ public class BaseCrossSchemePO {
/** 修改时间 */
@ApiModelProperty(name = "修改时间",notes = "")
private Date gmtModified ;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BaseCrossSchemePO that = (BaseCrossSchemePO) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
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