Commit 5a1eb2d0 authored by hanbing's avatar hanbing

[add] 新信号评价-运行评价-拥堵情况

parent c9bb6cd6
package net.wanji.web.service.impl;
import net.wanji.web.common.util.date.TimeArrayUtil;
import net.wanji.common.utils.tool.TimeArrayUtil;
import net.wanji.web.mapper.FlowQueueMapper;
import net.wanji.web.po.FlowQueuePO;
import net.wanji.web.service.SignalEvaluateService;
......
......@@ -5,10 +5,11 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.bo.RunningEvaluateCrossEvaluateBO;
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.RunningEvaluateCrossEvaluateVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -53,9 +54,21 @@ public class RunningEvaluateController {
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateCrossEvaluateVO.class),
})
public JsonViewObject crossEvaluate(@RequestBody RunningEvaluateCrossEvaluateBO bo) {
public JsonViewObject crossEvaluate(@RequestBody CrossIdAndStartEndDateBO bo) {
RunningEvaluateCrossEvaluateVO res = runningEvaluateService.crossEvaluate(bo);
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "拥堵情况", notes = "拥堵情况", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/congestionStatus",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateCongestionStatusVO.class),
})
public JsonViewObject congestionStatus(@RequestBody CrossIdAndStartEndDateBO bo) {
List<RunningEvaluateCongestionStatusVO> res = runningEvaluateService.congestionStatus(bo);
return JsonViewObject.newInstance().success(res);
}
}
\ No newline at end of file
package net.wanji.opt.service;
import net.wanji.databus.bo.RunningEvaluateCrossEvaluateBO;
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.RunningEvaluateCrossEvaluateVO;
import java.util.List;
......@@ -10,5 +11,8 @@ import java.util.List;
public interface RunningEvaluateService {
List<RunningEvaluateCrossListVO> crossList(CrossNameBO crossNameBO);
RunningEvaluateCrossEvaluateVO crossEvaluate(RunningEvaluateCrossEvaluateBO bo);
RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo);
List<RunningEvaluateCongestionStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo);
}
......@@ -3,7 +3,8 @@ package net.wanji.opt.service.impl;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.bo.RunningEvaluateCrossEvaluateBO;
import net.wanji.common.utils.tool.TimeArrayUtil;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.dao.entity.CrossSectionPO;
import net.wanji.databus.dao.mapper.BaseCrossSectionMapper;
import net.wanji.databus.dao.mapper.CrossDataHistMapper;
......@@ -13,10 +14,12 @@ 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.RunningEvaluateCrossEvaluateVO;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
......@@ -56,23 +59,17 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
}
@Override
public RunningEvaluateCrossEvaluateVO crossEvaluate(RunningEvaluateCrossEvaluateBO bo) {
public RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo) {
RunningEvaluateCrossEvaluateVO vo = new RunningEvaluateCrossEvaluateVO();
String crossId = bo.getCrossId();
Date startDate = bo.getStartDate();
Date endDate = bo.getEndDate();
endDate = DateUtil.offsetDay(endDate, 1); // 包含最后一天
List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId);
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
Double sturation = crossDataRealtimePO.getSturation();
String serviceLevel = CrossUtil.getServiceLevel(sturation);
vo.setServiceLevel(serviceLevel);
int startStamp = (int) (startDate.getTime() / 1000); // 10位时间戳
int endStamp = (int) (endDate.getTime() / 1000);
List<CrossDataHistPO> crossDataHistPOList = crossDataHistMapper.selectByCrossIdAndStartEnd(
crossId, startStamp, endStamp);
List<CrossDataHistPO> congestionEventList = buildCongestionEvents(crossDataHistPOList); // 获取拥堵事件集合
vo.setCongestionTimes(congestionEventList.size());
......@@ -87,6 +84,57 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return vo;
}
private List<CrossDataHistPO> buildCrossDataHistPOList(CrossIdAndStartEndDateBO bo, String crossId) {
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);
List<CrossDataHistPO> crossDataHistPOList = crossDataHistMapper.selectByCrossIdAndStartEnd(
crossId, startStamp, endStamp);
return crossDataHistPOList;
}
@Override
public List<RunningEvaluateCongestionStatusVO> congestionStatus(CrossIdAndStartEndDateBO bo) {
String crossId = bo.getCrossId();
List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId);
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<String> timeArray = TimeArrayUtil.getTimeArray();
for (String time : timeArray) {
RunningEvaluateCongestionStatusVO vo = new RunningEvaluateCongestionStatusVO();
vo.setTime(time);
List<CrossDataHistPO> subList = timePOMap.get(time.substring(0, 2)); // 保留小时字符串
if (subList != null) {
Double avgCongestionIndex = calcAvgCongestionIndex(subList);
vo.setCongestionIndex(avgCongestionIndex);
}
res.add(vo);
}
return res;
}
private Double calcAvgCongestionIndex(List<CrossDataHistPO> subList) {
double average = subList.stream()
.mapToDouble(CrossDataHistPO::getCongestionIndex)
.average()
.orElse(0.0);
DecimalFormat df = new DecimalFormat("#.00");
String formattedAverage = df.format(average);
return Double.parseDouble(formattedAverage);
}
private Integer calcSchemeProblems(List<CrossDataHistPO> congestionEventList,
List<CrossDataHistPO> unbalanceEventList,
List<CrossDataHistPO> spilloverEventList,
......
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
@ApiModel(value = "RunningEvaluateCongestionStatusVO", description = "查询拥堵情况返回值")
public class RunningEvaluateCongestionStatusVO {
@ApiModelProperty(value = "时间")
private String time;
@ApiModelProperty(value = "拥堵指数")
private Double congestionIndex;
}
package net.wanji.web.common.util.date;
package net.wanji.common.utils.tool;
import java.text.MessageFormat;
import java.util.ArrayList;
......
......@@ -7,7 +7,7 @@ import lombok.Data;
import java.util.Date;
@Data
public class RunningEvaluateCrossEvaluateBO {
public class CrossIdAndStartEndDateBO {
@ApiModelProperty(value = "路口ID")
private String crossId;
......
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