Commit 7b036473 authored by hanbing's avatar hanbing

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

parent 5a1eb2d0
...@@ -9,7 +9,7 @@ import net.wanji.databus.bo.CrossIdAndStartEndDateBO; ...@@ -9,7 +9,7 @@ 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.RunningEvaluateCongestionStatusVO; import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO; import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
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;
...@@ -64,10 +64,22 @@ public class RunningEvaluateController { ...@@ -64,10 +64,22 @@ public class RunningEvaluateController {
@PostMapping(value = "/congestionStatus", @PostMapping(value = "/congestionStatus",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateCongestionStatusVO.class), @ApiResponse(code = 200, message = "OK", response = RunningEvaluateIndexStatusVO.class),
}) })
public JsonViewObject congestionStatus(@RequestBody CrossIdAndStartEndDateBO bo) { 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); return JsonViewObject.newInstance().success(res);
} }
......
...@@ -3,7 +3,7 @@ package net.wanji.opt.service; ...@@ -3,7 +3,7 @@ package net.wanji.opt.service;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO; 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.vo.RunningEvaluateCongestionStatusVO; import net.wanji.opt.vo.RunningEvaluateIndexStatusVO;
import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO; import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import java.util.List; import java.util.List;
...@@ -13,6 +13,7 @@ public interface RunningEvaluateService { ...@@ -13,6 +13,7 @@ public interface RunningEvaluateService {
RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo); 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; ...@@ -2,6 +2,7 @@ package net.wanji.opt.service.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
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;
...@@ -14,8 +15,9 @@ import net.wanji.databus.po.CrossDataRealtimePO; ...@@ -14,8 +15,9 @@ import net.wanji.databus.po.CrossDataRealtimePO;
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.RunningEvaluateService; 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 net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
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;
...@@ -36,7 +38,9 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -36,7 +38,9 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private final CrossDataHistMapper crossDataHistMapper; private final CrossDataHistMapper crossDataHistMapper;
private final BaseCrossSectionMapper baseCrossSectionMapper; 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.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.crossDataHistMapper = crossDataHistMapper; this.crossDataHistMapper = crossDataHistMapper;
this.baseCrossSectionMapper = baseCrossSectionMapper; this.baseCrossSectionMapper = baseCrossSectionMapper;
...@@ -96,26 +100,56 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -96,26 +100,56 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
} }
@Override @Override
public List<RunningEvaluateCongestionStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo) { public List<RunningEvaluateIndexStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo) {
String crossId = bo.getCrossId(); 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> 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"); 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对象
return sdf.format(date); // 将Date对象转换为"HH"格式的字符串 return sdf.format(date); // 将Date对象转换为"HH"格式的字符串
})); }));
// 构造结果集 // 构造结果集
List<RunningEvaluateCongestionStatusVO> res = new ArrayList<>(); List<RunningEvaluateIndexStatusVO> res = new ArrayList<>();
List<String> timeArray = TimeArrayUtil.getTimeArray(); List<String> timeArray = TimeArrayUtil.getTimeArray();
for (String time : timeArray) { for (String time : timeArray) {
RunningEvaluateCongestionStatusVO vo = new RunningEvaluateCongestionStatusVO(); RunningEvaluateIndexStatusVO vo = new RunningEvaluateIndexStatusVO();
vo.setTime(time); vo.setTime(time);
List<CrossDataHistPO> subList = timePOMap.get(time.substring(0, 2)); // 保留小时字符串 List<CrossDataHistPO> subList = timePOMap.get(time.substring(0, 2)); // 保留小时字符串
if (subList != null) { if (subList != null) {
Double avgCongestionIndex = calcAvgCongestionIndex(subList); Double avgCongestionIndex = calcAvgIndex(subList, status);
vo.setCongestionIndex(avgCongestionIndex); vo.setIndex(avgCongestionIndex);
} }
res.add(vo); res.add(vo);
...@@ -123,12 +157,21 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -123,12 +157,21 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return res; return res;
} }
private Double calcAvgCongestionIndex(List<CrossDataHistPO> subList) { private Double calcAvgIndex(List<CrossDataHistPO> subList, int status) {
Double average = 0.0;
double average = subList.stream() if (status == CrossStatusEnum.CONGESTION.getCode()) {
average = subList.stream()
.mapToDouble(CrossDataHistPO::getCongestionIndex) .mapToDouble(CrossDataHistPO::getCongestionIndex)
.average() .average()
.orElse(0.0); .orElse(0.0);
} else if (status == CrossStatusEnum.UNBALANCE.getCode()) {
average = subList.stream()
.mapToDouble(CrossDataHistPO::getUnbalanceIndex)
.average()
.orElse(0.0);
}
DecimalFormat df = new DecimalFormat("#.00"); DecimalFormat df = new DecimalFormat("#.00");
String formattedAverage = df.format(average); String formattedAverage = df.format(average);
...@@ -177,15 +220,15 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -177,15 +220,15 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private List<CrossDataHistPO> buildSpilloverEvents(List<CrossDataHistPO> crossDataHistPOList) { private List<CrossDataHistPO> buildSpilloverEvents(List<CrossDataHistPO> crossDataHistPOList) {
return buildEvents(crossDataHistPOList, 3); return buildEvents(crossDataHistPOList, CrossStatusEnum.SPILLOVER.getCode());
} }
private List<CrossDataHistPO> buildUnbalanceEvents(List<CrossDataHistPO> crossDataHistPOList) { private List<CrossDataHistPO> buildUnbalanceEvents(List<CrossDataHistPO> crossDataHistPOList) {
return buildEvents(crossDataHistPOList, 1); return buildEvents(crossDataHistPOList, CrossStatusEnum.UNBALANCE.getCode());
} }
private List<CrossDataHistPO> buildCongestionEvents(List<CrossDataHistPO> crossDataHistPOList) { 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) { private List<CrossDataHistPO> buildEvents(List<CrossDataHistPO> crossDataHistPOList, int status) {
......
...@@ -7,13 +7,13 @@ import lombok.NoArgsConstructor; ...@@ -7,13 +7,13 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@Data @Data
@ApiModel(value = "RunningEvaluateCongestionStatusVO", description = "查询拥堵情况返回值") @ApiModel(value = "RunningEvaluateIndexStatusVO", description = "查询拥堵、失衡、溢出情况返回值")
public class RunningEvaluateCongestionStatusVO { public class RunningEvaluateIndexStatusVO {
@ApiModelProperty(value = "时间") @ApiModelProperty(value = "时间")
private String time; private String time;
@ApiModelProperty(value = "拥堵指数") @ApiModelProperty(value = "纵坐标数值")
private Double congestionIndex; 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