Commit 2c9b3651 authored by duanruiming's avatar duanruiming

Merge remote-tracking branch 'origin/master'

parents 3d1cfd73 b36ca044
package net.wanji.web.common.enums;
import lombok.Getter;
import lombok.Setter;
/**
* @author zhouleilei
* @date 2024/12/7 22:03
*/
public enum CrossDirChangeEnum {
ONE(1, 5,"北"),
TWO(2, 6,"东北"),
THREE(3, 7,"东"),
FOUR(4, 8,"东南"),
FIVE(5, 1,"南"),
SIX(6, 2,"西南"),
SEVEN(7, 3,"西"),
EIGHT(8, 4,"西北");
@Getter
@Setter
private final int code;
@Getter
@Setter
private final int dir;
@Getter
@Setter
private final String msg;
CrossDirChangeEnum(int code,int dir, String msg) {
this.code = code;
this.dir = dir;
this.msg = msg;
}
public static CrossDirChangeEnum getMsgByCode(int code) {
for (CrossDirChangeEnum value : CrossDirChangeEnum.values()) {
if (value.code == code) {
return value;
}
}
return null;
}
}
......@@ -15,10 +15,10 @@ import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.dto.*;
import net.wanji.databus.po.BaseCrossLightsPO;
import net.wanji.databus.po.CrossSchemeInfoPO;
import net.wanji.databus.po.SaveToUtcPO;
import net.wanji.databus.vo.*;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.web.common.enums.CrossDirChangeEnum;
import net.wanji.web.dto.*;
import net.wanji.web.po.RingPhasePO;
import net.wanji.web.service.FeignProxyService;
......@@ -642,53 +642,33 @@ public class PlanSendServiceImpl implements PlanSendService {
return ringPhasePO;
}
int schemeId = Integer.valueOf(content.getSchemeNo());
List<CrossSchemeInfoPO> crossSchemeInfoPOS = baseCrossSchemeMapper.selectSchemeInfoByCrossIdAndSchemeId(crossIdAndTimeDTO.getCrossId(), schemeId);
if (ObjectUtil.isNotEmpty(crossSchemeInfoPOS)) {
//根据相位号分组
LinkedHashMap<String, List<CrossSchemeInfoPO>> collect = crossSchemeInfoPOS.stream().collect(Collectors.groupingBy(CrossSchemeInfoPO::getPhaseNo, LinkedHashMap::new, Collectors.toList()));
Set<String> set = collect.keySet();
for (String s : set) {
List<CrossSchemeInfoPO> infoPOS = collect.get(s);
CrossSchemeInfoPO crossSchemeInfoPO = infoPOS.get(0);
SaveSchemeConfigDTO.PhaseListElement phaseListElement = new SaveSchemeConfigDTO.PhaseListElement();
phaseListElement.setPhaseId(Integer.valueOf(crossSchemeInfoPO.getPhaseId()));
phaseListElement.setPhaseNo(crossSchemeInfoPO.getPhaseNo());
phaseListElement.setGreenTime(Integer.valueOf(crossSchemeInfoPO.getGreenTime()));
phaseListElement.setYellowTime(Integer.valueOf(crossSchemeInfoPO.getYellowTime()));
phaseListElement.setRedTime(Integer.valueOf(crossSchemeInfoPO.getRedTime()));
List<SaveSchemeConfigDTO.DirListElement> dirListElements = new ArrayList<>();
Map<String, List<CrossSchemeInfoPO>> dircollect = infoPOS.stream().filter(x -> x.getDir() != null).collect(Collectors.groupingBy(CrossSchemeInfoPO::getDir));
if (ObjectUtil.isNotEmpty(dircollect)) {
Set<String> dirSet = dircollect.keySet();
for (String string : dirSet) {
List<CrossSchemeInfoPO> crossSchemeInfoPOS1 = dircollect.get(string);
CrossSchemeInfoPO po = crossSchemeInfoPOS1.get(0);
SaveSchemeConfigDTO.DirListElement dirListElement = new SaveSchemeConfigDTO.DirListElement();
dirListElement.setDir(Integer.valueOf(po.getDir()));
List<SaveSchemeConfigDTO.LaneListElement> laneList = new ArrayList<>();
Map<String, List<CrossSchemeInfoPO>> laneCollect = crossSchemeInfoPOS1.stream().filter(x -> x.getLandId() != null).collect(Collectors.groupingBy(CrossSchemeInfoPO::getLandId));
if (ObjectUtil.isNotEmpty(laneCollect)) {
Set<String> stringSet = laneCollect.keySet();
for (String s1 : stringSet) {
List<CrossSchemeInfoPO> crossSchemeInfoPOS2 = laneCollect.get(s1);
CrossSchemeInfoPO schemeInfoPO = crossSchemeInfoPOS2.get(0);
SaveSchemeConfigDTO.LaneListElement laneListElement = new SaveSchemeConfigDTO.LaneListElement();
laneListElement.setDirection(Integer.valueOf(schemeInfoPO.getDir()));
laneListElement.setLaneType(Integer.valueOf(schemeInfoPO.getLaneType()));
laneListElement.setLaneId(schemeInfoPO.getLandId());
laneListElement.setLightsId(Integer.valueOf(schemeInfoPO.getLightsId()));
laneList.add(laneListElement);
}
}
dirListElement.setLaneList(laneList);
dirListElements.add(dirListElement);
}
}
phaseListElement.setDirList(dirListElements);
oriPhaseList.add(phaseListElement);
//黃闪
if (schemeId == 85){
return ringPhasePO;
}
CrossIdBO crossIdBO = new CrossIdBO();
crossIdBO.setCrossId(crossIdAndTimeDTO.getCrossId());
SaveSchemeConfigDTO saveSchemeConfigDTO = schemeConfigServiceImpl.listSchemeConfig(crossIdBO);
List<SaveSchemeConfigDTO.PhaseScheme> phaseSchemeList = saveSchemeConfigDTO.getPhaseSchemeList();
if (ObjectUtil.isEmpty(phaseSchemeList)){
return ringPhasePO;
}
List<SaveSchemeConfigDTO.PhaseScheme> collected = phaseSchemeList.stream().filter(x -> x.getSchemeNo().equals(content.getSchemeNo())).collect(Collectors.toList());
SaveSchemeConfigDTO.PhaseScheme phaseScheme = collected.get(0);
SaveSchemeConfigDTO.RingListElement ringListElement = phaseScheme.getRingList().get(0);
List<SaveSchemeConfigDTO.GroupListElement> groupList = ringListElement.getGroupList();
SaveSchemeConfigDTO.GroupListElement groupListElement = groupList.get(0);
oriPhaseList = groupListElement.getPhaseList();
if (ObjectUtil.isNotEmpty(oriPhaseList)) {
//修改方向
oriPhaseList.forEach(x -> {
List<SaveSchemeConfigDTO.DirListElement> dirList = x.getDirList();
if (ObjectUtil.isNotNull(dirList)){
dirList.forEach(dir -> {
dir.setDir(CrossDirChangeEnum.getMsgByCode(dir.getDir()).getDir());
});
}
});
CrossSchemeRingsDTO crossSchemeRingsDTO = new CrossSchemeRingsDTO();
crossSchemeRingsDTO.setCrossId(crossIdAndTimeDTO.getCrossId());
crossSchemeRingsDTO.setPattern(String.valueOf(schemeId));
......
package net.wanji.opt.constant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* @ClassName EventAbnormalEnum
* @Description
* @Date 2021/4/15 11:13
* @Version 1.0
*/
public enum EventAbnormalEnum {
CROSS_PHASE_EMPTY(701,"相位空放" ),
CROSS_UNBALANCE(702,"路口失衡" ),
CROSS_OVERFLOW(703,"路口溢出" ),
CROSS_DEADLOCK(704,"路口死锁" ),
GREEN_WAVE_SLOW_RUN(705,"干线-缓行" ),
GREEN_WAVE_CONGEST(706,"干线-拥堵" ),
;
public final static double step_default = 1;
Integer type;
String desc;
EventAbnormalEnum(Integer type, String desc ) {
this.type = type;
this.desc = desc;
}
public Integer getType(){
return type;
}
public String getDesc() {
return desc;
}
public static EventAbnormalEnum getByType(String type){
for (EventAbnormalEnum abnormalEnum : EventAbnormalEnum.values()) {
if(abnormalEnum.getType().equals(type)){
return abnormalEnum;
}
}
return null;
}
}
......@@ -62,11 +62,12 @@ public class GreenwaveHistRestServer {
responseHeaders = {@ResponseHeader(name = "Content-Type", description = "application/json")})
})
public JsonViewObject findGreenWaveRunState(Integer greenId,@RequestParam(defaultValue ="2024-12-04 00:00:00") String startTime,
@RequestParam(defaultValue ="2024-12-05 00:00:00") String endTime) {
@RequestParam(defaultValue ="2024-12-05 00:00:00") String endTime,
@RequestParam(defaultValue ="705,706") String eventType) {
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
List<GreenWaveRunStateVO> list = greenwaveHistProvider.findGreenWaveRunState(greenId,startTime,endTime);
List<GreenWaveRunStateVO> list = greenwaveHistProvider.findGreenWaveRunState(greenId,null,startTime,endTime,eventType);
jsonView.success(list);
} catch (DubboProviderException e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
......
......@@ -4,6 +4,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.exception.DubboProviderException;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.bo.CrossIdBO;
......@@ -57,7 +58,12 @@ public class RunningEvaluateController {
@ApiResponse(code = 200, message = "OK", response = RunningEvaluateCrossEvaluateVO.class),
})
public JsonViewObject crossEvaluate(@RequestBody CrossIdAndStartEndDateBO bo) {
RunningEvaluateCrossEvaluateVO res = runningEvaluateService.crossEvaluate(bo);
RunningEvaluateCrossEvaluateVO res = null;
try {
res = runningEvaluateService.crossEvaluate(bo);
} catch (DubboProviderException e) {
e.printStackTrace();
}
return JsonViewObject.newInstance().success(res);
}
......
......@@ -78,5 +78,5 @@ public interface GreenwaveHistProvider extends BaseDubboInterface<GreenwaveHist>
* @param endTime
* @return
*/
List<GreenWaveRunStateVO> findGreenWaveRunState(Integer greenId, String startTime, String endTime) throws DubboProviderException;
List<GreenWaveRunStateVO> findGreenWaveRunState(Integer greenId,String crossId, String startTime, String endTime,String eventType) throws DubboProviderException;
}
package net.wanji.opt.service;
import net.wanji.common.framework.exception.DubboProviderException;
import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.bo.HeatMapBO;
......@@ -13,7 +14,7 @@ import java.util.List;
public interface RunningEvaluateService {
List<RunningEvaluateCrossListVO> crossList(CrossNameBO crossNameBO);
RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo);
RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo) throws DubboProviderException;
RunningEvaluateStatusVO congestionStatus(CrossIdAndStartEndDateBO bo);
......
......@@ -13,15 +13,18 @@ import net.wanji.opt.dao.mapper.GreenwaveHistoryMapper;
import net.wanji.opt.entity.GreenwaveHist;
import net.wanji.opt.service.GreenwaveHistProvider;
import net.wanji.opt.vo.GreenWaveRunStateVO;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
......@@ -247,13 +250,19 @@ public class GreenwaveHistProviderImpl extends BaseDubboInterfaceImpl<GreenwaveH
}
@Override
public List<GreenWaveRunStateVO> findGreenWaveRunState(Integer greenId, String startTime, String endTime) {
public List<GreenWaveRunStateVO> findGreenWaveRunState(Integer greenId,String crossId, String startTime, String endTime,String eventType) {
Map<String, Object> params = new HashMap<>();
params.put("greenId", greenId);
params.put("startDate", startTime);
params.put("endDate", endTime);
params.put("crossId", crossId);
if (Objects.nonNull(eventType)) {
String[] arr = StringUtils.split(eventType, ",");
params.put("eventTypeList", Arrays.asList(arr));
}
int[] stateList = new int[]{1, 2, 3};
int[] stateList = new int[]{704,705};
List<GreenWaveRunStateVO> list = greenwaveHistoryMapper.findGreenWaveRunState(params);
Map<Integer,GreenWaveRunStateVO> groupList = list.stream().collect(Collectors.toMap(o -> o.getState(), o -> o));
......
......@@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.framework.exception.DubboProviderException;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.common.utils.tool.TimeArrayUtil;
......@@ -26,7 +27,9 @@ import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import net.wanji.opt.bo.CrossNameBO;
import net.wanji.opt.bo.MetricsDetailBO;
import net.wanji.opt.common.KafkaConsumerUtil;
import net.wanji.opt.constant.EventAbnormalEnum;
import net.wanji.opt.dto.PhaseEmptyResult;
import net.wanji.opt.service.GreenwaveHistProvider;
import net.wanji.opt.service.RunningEvaluateService;
import net.wanji.opt.vo.*;
import org.jetbrains.annotations.NotNull;
......@@ -34,6 +37,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
......@@ -75,6 +79,9 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private final CrossTurnDataHistMapper crossTurnDataHistMapper;
private final CrossLaneDataHistMapper crossLaneDataHistMapper;
@Resource
private GreenwaveHistProvider greenwaveHistProvider;
SimpleDateFormat HOUR_SDF = new SimpleDateFormat("HH:mm");
SimpleDateFormat DAY_SDF = new SimpleDateFormat("yyyy-MM-dd");
......@@ -138,12 +145,18 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
}
@Override
public RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo) {
public RunningEvaluateCrossEvaluateVO crossEvaluate(CrossIdAndStartEndDateBO bo) throws DubboProviderException {
RunningEvaluateCrossEvaluateVO vo = new RunningEvaluateCrossEvaluateVO();
String crossId = bo.getCrossId();
List<CrossDataHistPO> crossDataHistPOList = buildCrossDataHistPOList(bo, crossId);
String startTime = net.wanji.common.utils.tool.DateUtil.formatDate(bo.getStartDate(),"yyyy-MM-dd HH:mm:ss");
String endTime = net.wanji.common.utils.tool.DateUtil.formatDate(bo.getEndDate(),"yyyy-MM-dd HH:mm:ss");
List<GreenWaveRunStateVO> runStateList = greenwaveHistProvider.findGreenWaveRunState(null,bo.getCrossId(), startTime,endTime ,"701,702,703");
Map<Integer,GreenWaveRunStateVO> groupList = runStateList.stream().collect(Collectors.toMap(o -> o.getState(), o -> o));
// 服务水平
double sumA = crossDataHistPOList.stream()
.filter(po -> isInTimeRange(po.getBatchTime()))
......@@ -160,63 +173,31 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
vo.setServiceLevel(serviceLevel);
List<CrossDataHistPO> congestionEventList = buildCongestionEvents(crossDataHistPOList); // 获取拥堵事件集合
vo.setCongestionTimes(congestionEventList.size());
int congestionSum = congestionEventList.stream()
.filter(Objects::nonNull)
.map(CrossDataHistPO::getDuration)
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.sum();
vo.setCongestionSum(congestionSum);
List<CrossDataHistPO> unbalanceEventList = buildUnbalanceEvents(crossDataHistPOList); // 获取失衡事件集合
vo.setUnbalanceTimes(unbalanceEventList.size());
int unbalanceSum = unbalanceEventList.stream()
.filter(Objects::nonNull)
.map(CrossDataHistPO::getDuration)
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.sum();
// List<CrossDataHistPO> congestionEventList = buildCongestionEvents(crossDataHistPOList); // 获取拥堵事件集合
// vo.setCongestionTimes(congestionEventList.size());
// int congestionSum = congestionEventList.stream()
// .filter(Objects::nonNull)
// .map(CrossDataHistPO::getDuration)
// .filter(Objects::nonNull)
// .mapToInt(Integer::intValue)
// .sum();
// vo.setCongestionSum(congestionSum);
vo.setUnbalanceTimes(groupList.get(EventAbnormalEnum.CROSS_UNBALANCE.getType())==null?0:groupList.get(EventAbnormalEnum.CROSS_UNBALANCE.getType()).getCount());
int unbalanceSum = groupList.get(EventAbnormalEnum.CROSS_UNBALANCE.getType())==null?0:groupList.get(EventAbnormalEnum.CROSS_UNBALANCE.getType()).getDuration();
vo.setUnbalanceSum(unbalanceSum);
List<CrossDataHistPO> spilloverEventList = buildSpilloverEvents(crossDataHistPOList); // 获取溢出事件集合
vo.setSpilloverTimes(spilloverEventList.size());
int spilloverSum = spilloverEventList.stream()
.filter(Objects::nonNull)
.map(CrossDataHistPO::getDuration)
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.sum();
vo.setSpilloverTimes(groupList.get(EventAbnormalEnum.CROSS_OVERFLOW.getType())==null?0:groupList.get(EventAbnormalEnum.CROSS_OVERFLOW.getType()).getCount());
int spilloverSum =groupList.get(EventAbnormalEnum.CROSS_OVERFLOW.getType())==null?0:groupList.get(EventAbnormalEnum.CROSS_OVERFLOW.getType()).getDuration();
vo.setSpilloverSum(spilloverSum);
// 相位空放指标
Date startDate = bo.getStartDate();
Date endDate = bo.getEndDate();
if (isZeros(endDate)) {
endDate = DateUtil.offsetDay(endDate, 1); // 包含最后一天
}
long startTime = startDate.getTime();
long endTime = endDate.getTime();
KafkaConsumerUtil kafkaConsumerUtil = new KafkaConsumerUtil(bootstrapServers, "empty-phase-evaluate");
List<PhaseEmptyResult> phaseEmptyResults =
kafkaConsumerUtil.consumeEmptyPhaseForTimeRange(emptyPhaseTopic, 0, startTime, endTime);
int emptyPhaseCount = (int) phaseEmptyResults.stream()
.filter(result -> result != null && crossId.equals(result.getCrossId()))
.count();
int emptyPhaseSum = phaseEmptyResults.stream()
.filter(result -> result != null && crossId.equals(result.getCrossId()))
.map(PhaseEmptyResult::getDuration)
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.sum();
int emptyPhaseCount = groupList.get(EventAbnormalEnum.CROSS_PHASE_EMPTY.getType())==null?0:groupList.get(EventAbnormalEnum.CROSS_PHASE_EMPTY.getType()).getCount();
int emptyPhaseSum = groupList.get(EventAbnormalEnum.CROSS_PHASE_EMPTY.getType())==null?0:groupList.get(EventAbnormalEnum.CROSS_PHASE_EMPTY.getType()).getDuration();
vo.setEmptyPhaseTimes(emptyPhaseCount);
vo.setEmptyPhaseSum(emptyPhaseSum);
Integer schemeProblems = calcSchemeProblems(
congestionEventList, unbalanceEventList, spilloverEventList, crossId); // 计算方案问题
vo.setSchemeProblems(schemeProblems);
return vo;
}
......
......@@ -17,12 +17,15 @@ public class GreenWaveRunStateVO {
@ApiModelProperty(value = "干线ID")
private Integer greenId;
@ApiModelProperty(value = "干线运行状态 1:畅通 2:缓行 3:拥堵")
@ApiModelProperty(value = "干线运行状态 701相位空放 702路口失衡 703路口溢出 704路口死锁 705干线-缓行 706干线-拥堵")
private int state;
@ApiModelProperty(value = "状态持续时长,单位秒")
private int duration;
@ApiModelProperty(value = "状态发送次数")
private int count;
@ApiModelProperty(value = "分析时段总时长,单位秒")
private int totalTime;
......
......@@ -173,12 +173,17 @@
</select>
<!-- 查看干线拥堵运行状态 -->
<select id="findGreenWaveRunState" resultType="net.wanji.opt.vo.GreenWaveRunStateVO">
select type as state,
select type as state,count(*) count,
SUM(TIMESTAMPDIFF(SECOND,start_time, end_time)) duration,
TIMESTAMPDIFF(SECOND,#{startDate}, #{endDate}) total_time
from t_event_info t
where <!-- type in (705,706) and --> start_time > #{startDate}
and start_time &lt; #{endDate}
where start_time > #{startDate} and start_time &lt; #{endDate}
<if test="eventTypeList!=null and eventTypeList.size>0">
and t.type in
<foreach collection="eventTypeList" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
GROUP BY type
</select>
......
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