Commit 7b036473 authored by hanbing's avatar hanbing

[add] 新信号评价-运行评价-失衡情况

parent 5a1eb2d0
......@@ -9,7 +9,7 @@ import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.service.impl.RunningEvaluateServiceImpl;
import net.wanji.opt.vo.RunningEvaluateCongestionStatusVO;
import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -64,10 +64,22 @@ public class RunningEvaluateController {
@PostMapping(value = "/congestionStatus",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateCongestionStatusVO.class),
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateIndexStatusVO.class),
})
public JsonViewObject congestionStatus(@RequestBody CrossIdAndStartEndDateBO bo) {
List<RunningEvaluateCongestionStatusVO> res = runningEvaluateService.congestionStatus(bo);
List<RunningEvaluateIndexStatusVO> res = runningEvaluateService.congestionStatus(bo);
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "失衡情况", notes = "失衡情况", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/unbalanceStatus",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateIndexStatusVO.class),
})
public JsonViewObject unbalanceStatus(@RequestBody CrossIdAndStartEndDateBO bo) {
List<RunningEvaluateIndexStatusVO> res = runningEvaluateService.unbalanceStatus(bo);
return JsonViewObject.newInstance().success(res);
}
......
......@@ -3,7 +3,7 @@ package net.wanji.opt.service;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.vo.RunningEvaluateCongestionStatusVO;
import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import java.util.List;
......@@ -13,6 +13,7 @@ public interface RunningEvaluateService {
RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo);
List<RunningEvaluateCongestionStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo);
List<RunningEvaluateIndexStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo);
List<RunningEvaluateIndexStatusVO> unbalanceStatus(CrossIdAndStartEndDateBO bo);
}
......@@ -2,6 +2,7 @@ package net.wanji.opt.service.impl;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.common.utils.tool.TimeArrayUtil;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
......@@ -14,8 +15,9 @@ import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.service.RunningEvaluateService;
import net.wanji.opt.vo.RunningEvaluateCongestionStatusVO;
import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
......@@ -36,7 +38,9 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private final CrossDataHistMapper crossDataHistMapper;
private final BaseCrossSectionMapper baseCrossSectionMapper;
public RunningEvaluateServiceImpl(CrossDataRealtimeMapper crossDataRealtimeMapper, CrossDataHistMapper crossDataHistMapper, @Qualifier("baseCrossSectionMapper") BaseCrossSectionMapper baseCrossSectionMapper) {
public RunningEvaluateServiceImpl(CrossDataRealtimeMapper crossDataRealtimeMapper,
CrossDataHistMapper crossDataHistMapper,
@Qualifier("baseCrossSectionMapper") BaseCrossSectionMapper baseCrossSectionMapper) {
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.crossDataHistMapper = crossDataHistMapper;
this.baseCrossSectionMapper = baseCrossSectionMapper;
......@@ -96,26 +100,56 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
}
@Override
public List<RunningEvaluateCongestionStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo) {
public List<RunningEvaluateIndexStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo) {
String crossId = bo.getCrossId();
int status = CrossStatusEnum.CONGESTION.getCode();
return buildRes(bo, crossId, status);
}
@NotNull
private List<RunningEvaluateIndexStatusVO> buildRes(CrossIdAndStartEndDateBO bo, String crossId, int status) {
List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId);
List<CrossDataHistPO> collect = crossDataHistPOList.stream()
.filter(po -> po.getStatus() == status)
.collect(Collectors.toList());
List<RunningEvaluateIndexStatusVO> res = buildRunningEvaluateIndexStatusVOList(collect, status);
return res;
}
@Override
public List<RunningEvaluateIndexStatusVO> unbalanceStatus(CrossIdAndStartEndDateBO bo) {
String crossId = bo.getCrossId();
int status = CrossStatusEnum.UNBALANCE.getCode();
return buildRes(bo, crossId, status);
}
@NotNull
private List<RunningEvaluateIndexStatusVO> buildRunningEvaluateIndexStatusVOList(
List<CrossDataHistPO> crossDataHistPOList, int status) {
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<RunningEvaluateCongestionStatusVO> res = new ArrayList<>();
List<RunningEvaluateIndexStatusVO> res = new ArrayList<>();
List<String> timeArray = TimeArrayUtil.getTimeArray();
for (String time : timeArray) {
RunningEvaluateCongestionStatusVO vo = new RunningEvaluateCongestionStatusVO();
RunningEvaluateIndexStatusVO vo = new RunningEvaluateIndexStatusVO();
vo.setTime(time);
List<CrossDataHistPO> subList = timePOMap.get(time.substring(0, 2)); // 保留小时字符串
if (subList != null) {
Double avgCongestionIndex = calcAvgCongestionIndex(subList);
vo.setCongestionIndex(avgCongestionIndex);
Double avgCongestionIndex = calcAvgIndex(subList, status);
vo.setIndex(avgCongestionIndex);
}
res.add(vo);
......@@ -123,12 +157,21 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return res;
}
private Double calcAvgCongestionIndex(List<CrossDataHistPO> subList) {
private Double calcAvgIndex(List<CrossDataHistPO> subList, int status) {
double average = subList.stream()
.mapToDouble(CrossDataHistPO::getCongestionIndex)
.average()
.orElse(0.0);
Double average = 0.0;
if (status == CrossStatusEnum.CONGESTION.getCode()) {
average = subList.stream()
.mapToDouble(CrossDataHistPO::getCongestionIndex)
.average()
.orElse(0.0);
} else if (status == CrossStatusEnum.UNBALANCE.getCode()) {
average = subList.stream()
.mapToDouble(CrossDataHistPO::getUnbalanceIndex)
.average()
.orElse(0.0);
}
DecimalFormat df = new DecimalFormat("#.00");
String formattedAverage = df.format(average);
......@@ -177,15 +220,15 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private List<CrossDataHistPO> buildSpilloverEvents(List<CrossDataHistPO> crossDataHistPOList) {
return buildEvents(crossDataHistPOList, 3);
return buildEvents(crossDataHistPOList, CrossStatusEnum.SPILLOVER.getCode());
}
private List<CrossDataHistPO> buildUnbalanceEvents(List<CrossDataHistPO> crossDataHistPOList) {
return buildEvents(crossDataHistPOList, 1);
return buildEvents(crossDataHistPOList, CrossStatusEnum.UNBALANCE.getCode());
}
private List<CrossDataHistPO> buildCongestionEvents(List<CrossDataHistPO> crossDataHistPOList) {
return buildEvents(crossDataHistPOList, 2);
return buildEvents(crossDataHistPOList, CrossStatusEnum.CONGESTION.getCode());
}
private List<CrossDataHistPO> buildEvents(List<CrossDataHistPO> crossDataHistPOList, int status) {
......
......@@ -7,13 +7,13 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
@ApiModel(value = "RunningEvaluateCongestionStatusVO", description = "查询拥堵情况返回值")
public class RunningEvaluateCongestionStatusVO {
@ApiModel(value = "RunningEvaluateIndexStatusVO", description = "查询拥堵、失衡、溢出情况返回值")
public class RunningEvaluateIndexStatusVO {
@ApiModelProperty(value = "时间")
private String time;
@ApiModelProperty(value = "拥堵指数")
private Double congestionIndex;
@ApiModelProperty(value = "纵坐标数值")
private Double index;
}
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