Commit 5a1eb2d0 authored by hanbing's avatar hanbing

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

parent c9bb6cd6
package net.wanji.web.service.impl; 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.mapper.FlowQueueMapper;
import net.wanji.web.po.FlowQueuePO; import net.wanji.web.po.FlowQueuePO;
import net.wanji.web.service.SignalEvaluateService; import net.wanji.web.service.SignalEvaluateService;
......
...@@ -5,10 +5,11 @@ import io.swagger.annotations.ApiOperation; ...@@ -5,10 +5,11 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject; 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.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.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;
...@@ -53,9 +54,21 @@ public class RunningEvaluateController { ...@@ -53,9 +54,21 @@ public class RunningEvaluateController {
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateCrossEvaluateVO.class), @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); RunningEvaluateCrossEvaluateVO res = runningEvaluateService.crossEvaluate(bo);
return JsonViewObject.newInstance().success(res); 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; 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.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.RunningEvaluateCrossEvaluateVO; import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import java.util.List; import java.util.List;
...@@ -10,5 +11,8 @@ import java.util.List; ...@@ -10,5 +11,8 @@ import java.util.List;
public interface RunningEvaluateService { public interface RunningEvaluateService {
List<RunningEvaluateCrossListVO> crossList(CrossNameBO crossNameBO); 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; ...@@ -3,7 +3,8 @@ 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.utils.tool.CrossUtil; 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.entity.CrossSectionPO;
import net.wanji.databus.dao.mapper.BaseCrossSectionMapper; import net.wanji.databus.dao.mapper.BaseCrossSectionMapper;
import net.wanji.databus.dao.mapper.CrossDataHistMapper; import net.wanji.databus.dao.mapper.CrossDataHistMapper;
...@@ -13,10 +14,12 @@ import net.wanji.databus.po.CrossDataRealtimePO; ...@@ -13,10 +14,12 @@ 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.RunningEvaluateCrossEvaluateVO; import net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -56,23 +59,17 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -56,23 +59,17 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
} }
@Override @Override
public RunningEvaluateCrossEvaluateVO crossEvaluate(RunningEvaluateCrossEvaluateBO bo) { public RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo) {
RunningEvaluateCrossEvaluateVO vo = new RunningEvaluateCrossEvaluateVO(); RunningEvaluateCrossEvaluateVO vo = new RunningEvaluateCrossEvaluateVO();
String crossId = bo.getCrossId(); String crossId = bo.getCrossId();
Date startDate = bo.getStartDate(); List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId);
Date endDate = bo.getEndDate();
endDate = DateUtil.offsetDay(endDate, 1); // 包含最后一天
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId); CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
Double sturation = crossDataRealtimePO.getSturation(); Double sturation = crossDataRealtimePO.getSturation();
String serviceLevel = CrossUtil.getServiceLevel(sturation); String serviceLevel = CrossUtil.getServiceLevel(sturation);
vo.setServiceLevel(serviceLevel); 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); // 获取拥堵事件集合 List<CrossDataHistPO> congestionEventList = buildCongestionEvents(crossDataHistPOList); // 获取拥堵事件集合
vo.setCongestionTimes(congestionEventList.size()); vo.setCongestionTimes(congestionEventList.size());
...@@ -87,6 +84,57 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService { ...@@ -87,6 +84,57 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return vo; 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, private Integer calcSchemeProblems(List<CrossDataHistPO> congestionEventList,
List<CrossDataHistPO> unbalanceEventList, List<CrossDataHistPO> unbalanceEventList,
List<CrossDataHistPO> spilloverEventList, 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.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
......
...@@ -7,7 +7,7 @@ import lombok.Data; ...@@ -7,7 +7,7 @@ import lombok.Data;
import java.util.Date; import java.util.Date;
@Data @Data
public class RunningEvaluateCrossEvaluateBO { public class CrossIdAndStartEndDateBO {
@ApiModelProperty(value = "路口ID") @ApiModelProperty(value = "路口ID")
private String crossId; 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