Commit 1460282d authored by hanbing's avatar hanbing

[add] 新信号评价-运行评价-热力图

parent 42043a14
......@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.bo.HeatMapBO;
import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.bo.MetricsDetailBO;
......@@ -132,4 +133,16 @@ public class RunningEvaluateController {
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "运行评价热力图", notes = "运行评价热力图", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/heatMap",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateHeatMapVO.class),
})
public JsonViewObject heatMap(@RequestBody HeatMapBO bo) {
List<RunningEvaluateHeatMapVO> res = runningEvaluateService.heatMap(bo);
return JsonViewObject.newInstance().success(res);
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package net.wanji.opt.service;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.bo.HeatMapBO;
import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.bo.MetricsDetailBO;
......@@ -25,4 +26,6 @@ public interface RunningEvaluateService {
RunningEvaluateMetricsDetailVO metricsDetail(MetricsDetailBO bo);
RunningEvaluateScopeTreeVO scopeTree(CrossIdBO bo);
List<RunningEvaluateHeatMapVO> heatMap(HeatMapBO bo);
}
......@@ -11,6 +11,7 @@ import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.common.utils.tool.TimeArrayUtil;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.bo.HeatMapBO;
import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.dto.MetricHistDTO;
......@@ -31,6 +32,7 @@ import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -471,6 +473,61 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return runningEvaluateScopeTreeVO;
}
@Override
public List<RunningEvaluateHeatMapVO> heatMap(HeatMapBO bo) {
String crossId = bo.getCrossId();
Date startDate = bo.getStartDate();
Date endDate = bo.getEndDate();
endDate = DateUtil.offsetDay(endDate, 1); // 包含最后一天
int startStamp = (int) (startDate.getTime() / 1000); // 10位时间戳
int endStamp = (int) (endDate.getTime() / 1000);
Integer status = bo.getStatus();
List<RunningEvaluateHeatMapVO> res = new ArrayList<>();
List<CrossDataHistPO> crossDataHistPOList = crossDataHistMapper.selectByCrossIdAndStartEnd(
crossId, startStamp, endStamp);
// 根据 status 值选择分组字段
Function<CrossDataHistPO, String> groupByField;
switch (status) {
case 1:
groupByField = CrossDataHistPO::getUnbalanceDirs;
break;
case 2:
groupByField = CrossDataHistPO::getCongestionDirs;
break;
case 3:
groupByField = CrossDataHistPO::getSpilloverDirs;
break;
default:
throw new IllegalArgumentException("状态值非法");
}
// 过滤 status 字段值为 status 变量的对象,并按照选择的字段分组
Map<String, List<CrossDataHistPO>> grouped = crossDataHistPOList.stream()
.filter(po -> status.equals(po.getStatus()))
.collect(Collectors.groupingBy(groupByField));
// 对每个组进行处理,仅保留 start_time 相同的记录中 duration 最大的一条
Map<String, List<CrossDataHistPO>> filteredGrouped = grouped.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream()
.collect(Collectors.groupingBy(CrossDataHistPO::getStartTime))
.values().stream()
.map(list -> list.stream().max(Comparator.comparingInt(CrossDataHistPO::getDuration))
.orElse(null))
.collect(Collectors.toList())
));
// 遍历 filteredGrouped,提取每个 key 和与该 key 关联的列表的元素个数
filteredGrouped.forEach((key, list) -> {
RunningEvaluateHeatMapVO runningEvaluateHeatMapVO = new RunningEvaluateHeatMapVO();
runningEvaluateHeatMapVO.setDir(Integer.parseInt(key));
runningEvaluateHeatMapVO.setCounts(list.size());
res.add(runningEvaluateHeatMapVO);
});
return res;
}
private List<RunningEvaluateScopeTreeVO.DirVO> buildDirVOList(String crossId) {
List<RunningEvaluateScopeTreeVO.DirVO> res = new ArrayList<>();
Integer type = 1; // 进口
......
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "RunningEvaluateHeatMapVO", description = "运行评价热力图")
public class RunningEvaluateHeatMapVO {
@ApiModelProperty(value = "方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北")
private Integer dir;
@ApiModelProperty(value = "发生次数")
private Integer counts;
}
package net.wanji.databus.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class HeatMapBO {
@ApiModelProperty(value = "路口ID")
private String crossId;
@ApiModelProperty(value = "开始日期 yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date startDate;
@ApiModelProperty(value = "结束日期 yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date endDate;
@ApiModelProperty(value = "路口状态 0正常 1 失衡 2 拥堵 3 溢出")
private Integer status;
}
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