Commit 684eef49 authored by duanruiming's avatar duanruiming

[update] 实时监控异常优化

parent 44545b62
......@@ -81,7 +81,10 @@ public class CrossTurnDataRealtimeDTO {
currentVehheadTime = 2.8;
}
// 排队车辆
Double queuedVehicles = entity.getQueueLength() / currentVehheadDist;
Double queuedVehicles = null;
if (Objects.nonNull(entity.getQueueLength())) {
queuedVehicles = entity.getQueueLength() / currentVehheadDist;
}
// 通行时长
Double calPassTime = queuedVehicles * currentVehheadTime;
return calPassTime;
......
......@@ -2,8 +2,11 @@ package net.wanji.opt.po.trend;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.dto.CrossDirInfoDTO;
import net.wanji.opt.dto.CrossTurnInfoDTO;
import java.util.Date;
import java.util.List;
/**
* @author hfx
......@@ -87,4 +90,10 @@ public class CrossDataRealtimePO {
/** 修改时间 */
@ApiModelProperty(value = "修改时间",notes = "")
private Date gmtModified ;
@ApiModelProperty(name = "路口方向列表",notes = "")
List<CrossDirInfoDTO> dirList;
@ApiModelProperty(name = "路口转向列表",notes = "")
List<CrossTurnInfoDTO> turnList;
}
package net.wanji.opt.service;
import net.wanji.opt.dto.CrossDataRealtimeDTO;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import java.util.List;
......@@ -16,7 +16,7 @@ public interface CrossOptimizeService {
* 路口实时优化
* @return
*/
String realtimeOptimize(List<CrossDataRealtimeDTO> abnormalCrossList);
String realtimeOptimize(List<CrossDataRealtimePO> abnormalCrossList);
/**
* 路口方案优化
......
......@@ -6,7 +6,6 @@ import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.enums.WeekEnum;
import net.wanji.common.framework.Constants;
import net.wanji.common.utils.tool.BeanListUtils;
import net.wanji.common.utils.tool.DateUtil;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.RidInfoEntity;
......@@ -23,6 +22,7 @@ import net.wanji.opt.dto.*;
import net.wanji.opt.po.base.CrossPhasePO;
import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.po.base.CrossSchemePO;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.CrossSchedulesService;
import net.wanji.opt.service.CrossSchemeService;
......@@ -66,7 +66,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Override
@Transactional
public String realtimeOptimize(List<CrossDataRealtimeDTO> abnormalCrossList) {
public String realtimeOptimize(List<CrossDataRealtimePO> abnormalCrossList) {
try {
// 相位配时信息,key:路口编号_方向类型_转向类型,value 相位配时信息
......@@ -79,7 +79,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
// 恢复优化路口原始方案:上一批次优化后,路口正常需要恢复原始方案
restoreOptCrossOriSchema(abnormalCrossList, phaseMap);
Map<Integer, List<CrossDataRealtimeDTO>> crossDataMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getStatus));
Map<Integer, List<CrossDataRealtimePO>> crossDataMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getStatus));
abnormalCrossList = crossDataMap.get(CrossStatusEnum.SPILLOVER.getCode()); // 溢出
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
spilloverOpt(abnormalCrossList, turnDataRealtime, phaseMap);
......@@ -106,13 +106,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* @param turnDataRealtimeMap
* @param phaseMap
*/
private void spilloverOpt(List<CrossDataRealtimeDTO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
private void spilloverOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
Map<String, List<CrossDataRealtimeDTO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getCrossId));
Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId));
String crossId;
for (CrossDataRealtimeDTO cross : abnormalCrossList) {
for (CrossDataRealtimePO cross : abnormalCrossList) {
crossId = cross.getCrossId();
// 判断信号机是否在线 todo 是否某些故障也不需要优化
......@@ -178,13 +178,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* @param turnDataRealtimeMap
* @param phaseMap
*/
private void congestionOpt(List<CrossDataRealtimeDTO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
private void congestionOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
Map<String, List<CrossDataRealtimeDTO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getCrossId));
Map<String, List<CrossDataRealtimePO>> congestCrossMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimePO::getCrossId));
String crossId;
for (CrossDataRealtimeDTO cross : abnormalCrossList) {
for (CrossDataRealtimePO cross : abnormalCrossList) {
crossId = cross.getCrossId();
// 判断信号机是否在线 todo 是否某些故障也不需要优化
......@@ -246,7 +246,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* @param cross
* @return
*/
private static List<String> getOptCrossDirTurnList(CrossDataRealtimeDTO cross) {
private static List<String> getOptCrossDirTurnList(CrossDataRealtimePO cross) {
List<String> crossIdDirTurnList = new ArrayList<>();
List<CrossDirInfoDTO> dirList = cross.getDirList();
List<CrossTurnInfoDTO> turnList = cross.getTurnList();
......@@ -274,8 +274,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* @param abnormalCrossList
* @param phaseMap
*/
private static void setTurnList(List<CrossDataRealtimeDTO> abnormalCrossList, Map<String, CrossPhaseDTO> phaseMap) {
for (CrossDataRealtimeDTO crossDataRealtimeDTO : abnormalCrossList) {
private static void setTurnList(List<CrossDataRealtimePO> abnormalCrossList, Map<String, CrossPhaseDTO> phaseMap) {
for (CrossDataRealtimePO crossDataRealtimeDTO : abnormalCrossList) {
List<CrossTurnInfoDTO> turnList = new ArrayList<>();
List<CrossDirInfoDTO> dirList = new ArrayList<>();
for (Map.Entry<String, CrossPhaseDTO> entry : phaseMap.entrySet()) {
......@@ -296,6 +296,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
crossTurnInfoDTO.setTurnType(turn);
crossTurnInfoDTO.setInDir(Integer.valueOf(dir));
crossTurnInfoDTO.setCrossId(crossId);
turnList.add(crossTurnInfoDTO);
}
}
......@@ -309,8 +310,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
*
* @param abnormalCrossList
*/
private void restoreOptCrossOriSchema(List<CrossDataRealtimeDTO> abnormalCrossList, Map<String, CrossPhaseDTO> phaseMap) throws Exception {
List<String> abnormalCrossIdList = abnormalCrossList.stream().map(CrossDataRealtimeDTO::getCrossId).collect(Collectors.toList());
private void restoreOptCrossOriSchema(List<CrossDataRealtimePO> abnormalCrossList, Map<String, CrossPhaseDTO> phaseMap) throws Exception {
List<String> abnormalCrossIdList = abnormalCrossList.stream().map(CrossDataRealtimePO::getCrossId).collect(Collectors.toList());
for (String optCrossId : CROSS_OPT) {
if (!abnormalCrossIdList.contains(optCrossId)) {
// 下发原始方案
......@@ -331,11 +332,11 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* @param turnDataRealtimeMap 路口转向实时数据
* @param phaseMap 路口相位配时数据
*/
private void unbalanceOpt(List<CrossDataRealtimeDTO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
private void unbalanceOpt(List<CrossDataRealtimePO> abnormalCrossList, Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap,
Map<String, CrossPhaseDTO> phaseMap) throws Exception {
String crossId;
for (CrossDataRealtimeDTO cross : abnormalCrossList) {
for (CrossDataRealtimePO cross : abnormalCrossList) {
crossId = cross.getCrossId();
// 判断信号机是否在线 todo 是否某些故障也不需要优化
......@@ -427,11 +428,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
crossSchemeOptLogPO.setOriGreenTime(crossPhaseDTO.getGreenTime());
}
}
insertList.add(crossSchemeOptLogPO);
}
// crossSchemeOptLogMapper.insertBatch(insertList);
crossSchemeOptLogMapper.insertBatch(insertList);
}
/**
......@@ -455,28 +454,51 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
SchemeSendVO schemeSendVO = new SchemeSendVO();
List<SchemeSendVO.Pattern> patternList = new ArrayList<>();
BeanListUtils.populateList(crossSchemePOS, patternList, SchemeSendVO.Pattern.class);
schemeSendVO.setPatternList(patternList);
schemeSendVO.setCrossCode(crossId);
List<SchemeSendVO.Pattern.Ring> rings = new ArrayList<>();
ringNoPhasePOMap.entrySet().forEach(entry -> {
SchemeSendVO.Pattern.Ring ring = new SchemeSendVO.Pattern.Ring();
List<SchemeSendVO.Pattern.Ring.Phase> phaseList = new ArrayList<>();
List<CrossPhasePO> value = entry.getValue();
BeanListUtils.populateList(value, phaseList, SchemeSendVO.Pattern.Ring.Phase.class);
ring.setRingNo(String.valueOf(entry.getKey()));
// 在原始方案基础绿灯时间+可优化时间
if (!CollectionUtils.isEmpty(phaseTimeOptResultMap)) {
phaseList.forEach(phaseInfo -> {
Integer optTime = phaseTimeOptResultMap.get(phaseInfo.getPhaseNo());
String greenTime = phaseInfo.getGreenTime();
phaseInfo.setGreenTime(greenTime + optTime);
});
}
ring.setPhaseList(phaseList);
rings.add(ring);
});
crossSchemePOS.forEach(crossSchemePO -> {
SchemeSendVO.Pattern pattern = new SchemeSendVO.Pattern();
pattern.setPatternName("实时监测优化方案".concat(crossSchemePO.getSchemeNo()));
pattern.setPatternNo(String.valueOf(crossSchemePO.getId()));
pattern.setCycle(String.valueOf(crossSchemePO.getCycle()));
pattern.setOffset(String.valueOf(crossSchemePO.getOffset()));
pattern.setCoordPhase(String.valueOf(crossSchemePO.getCoordPhase()));
List<SchemeSendVO.Pattern.Ring> rings = new ArrayList<>();
ringNoPhasePOMap.entrySet().forEach(entry -> {
SchemeSendVO.Pattern.Ring ring = new SchemeSendVO.Pattern.Ring();
List<SchemeSendVO.Pattern.Ring.Phase> phaseList = new ArrayList<>();
List<CrossPhasePO> value = entry.getValue();
value.forEach(crossPhasePO -> {
SchemeSendVO.Pattern.Ring.Phase phase = new SchemeSendVO.Pattern.Ring.Phase();
phase.setPhaseNo(crossPhasePO.getPhaseNo());
phase.setPhaseName(crossPhasePO.getName());
phase.setSort(String.valueOf(crossPhasePO.getSort()));
phase.setControlMode(String.valueOf(crossPhasePO.getControlMode()));
phase.setMinGreenTime(String.valueOf(crossPhasePO.getMinGreenTime()));
phase.setMaxGreenTime(String.valueOf(crossPhasePO.getMaxGreenTime()));
phase.setPhaseTime(String.valueOf(crossPhasePO.getPhaseTime()));
phase.setGreenTime(String.valueOf(crossPhasePO.getGreenTime()));
phase.setGreenFlashTime(String.valueOf(crossPhasePO.getGreenFlashTime()));
phase.setPedFlashTime(String.valueOf(crossPhasePO.getPedFlashTime()));
phase.setYellowTime(String.valueOf(crossPhasePO.getYellowTime()));
phase.setRedTime(String.valueOf(crossPhasePO.getRedTime()));
phaseList.add(phase);
// 在原始方案基础绿灯时间+可优化时间
if (!phaseTimeOptResultMap.isEmpty()) {
phaseList.forEach(phaseInfo -> {
Integer optTime = phaseTimeOptResultMap.get(phaseInfo.getPhaseNo());
String greenTime = phaseInfo.getGreenTime();
phaseInfo.setGreenTime(greenTime + optTime);
});
}
});
ring.setRingNo(String.valueOf(entry.getKey()));
ring.setPhaseList(phaseList);
rings.add(ring);
});
pattern.setRings(rings);
patternList.add(pattern);
}
);
schemeSendVO.setCrossCode(crossId);
schemeSendVO.setPatternList(patternList);
......@@ -652,11 +674,19 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
crossId = section.getCrossId();
CrossSchemeDTO scheme = schemeMap.get(section.getSchemeId()); // 方案信息
if (Objects.isNull(scheme.getPhaseInfos())) {
log.error("{}-路口, {}-方案,方案中相位信息不能为空", crossId, scheme.getId());
throw new Exception("方案中相位信息不能为空");
}
for (CrossPhaseDTO phase : scheme.getPhaseInfos()) { // 相位信息列表
for (CrossLightsDTO lights : phase.getLightsInfos()) { // 灯组信息列表
dir = lights.getDir();
if (Objects.isNull(lights.getLaneInfos())) {
log.error("{}-路口, {}-方案,{}-灯组,灯组中车道信息不能为空", crossId, scheme.getId(), lights.getId());
throw new Exception("灯组中车道信息不能为空");
}
for (LaneInfoDTO lane : lights.getLaneInfos()) {
// 车道转向转换为转向类型,并去重
turnArr = TurnConvertEnum.getCodeByKey(lane.getTurn()).split(Constants.SystemParam.SEPARATOR_UNDER_LINE);
......@@ -725,25 +755,20 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
*
* @return
*/
public Map<String, List<CrossTurnDataRealtimeDTO>> listTurnDataRealtime(List<CrossDataRealtimeDTO> abnormalCrossList) {
public Map<String, List<CrossTurnDataRealtimeDTO>> listTurnDataRealtime(List<CrossDataRealtimePO> abnormalCrossList) {
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeDTOList = new HashMap<>();
Map<String, List<CrossDataRealtimeDTO>> abnormalCrossGroupMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getCrossId));
abnormalCrossGroupMap.entrySet().forEach(entry -> {
String crossId = entry.getKey();
List<CrossDataRealtimeDTO> realTimeData = entry.getValue();
abnormalCrossList.forEach(entry -> {
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = new ArrayList<>();
realTimeData.forEach(realData -> {
List<CrossTurnInfoDTO> turnList = realData.getTurnList();
turnList.forEach(crossTurnInfoDTO -> {
CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO = new CrossTurnDataRealtimeDTO();
BeanUtils.copyProperties(realData, crossTurnDataRealtimeDTO);
crossTurnDataRealtimeDTO.setTurnType(crossTurnInfoDTO.getTurnType());
crossTurnDataRealtimeDTO.setInDir(crossTurnInfoDTO.getInDir());
crossTurnDataRealtimeDTO.setOutDir(crossTurnInfoDTO.getOutDir());
crossTurnDataRealtimeDTOS.add(crossTurnDataRealtimeDTO);
});
String crossId = entry.getCrossId();
List<CrossTurnInfoDTO> turnList = entry.getTurnList();
turnList.forEach(crossTurnInfoDTO -> {
CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO = new CrossTurnDataRealtimeDTO();
BeanUtils.copyProperties(entry, crossTurnDataRealtimeDTO);
crossTurnDataRealtimeDTO.setTurnType(crossTurnInfoDTO.getTurnType());
crossTurnDataRealtimeDTO.setInDir(crossTurnInfoDTO.getInDir());
crossTurnDataRealtimeDTO.setOutDir(crossTurnInfoDTO.getOutDir());
crossTurnDataRealtimeDTOS.add(crossTurnDataRealtimeDTO);
});
turnDataRealtimeDTOList.put(crossId, crossTurnDataRealtimeDTOS);
});
......
......@@ -4,7 +4,6 @@ import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.framework.Constants;
import net.wanji.opt.dao.mapper.trend.CrossDataRealtimeMapper;
import net.wanji.opt.dto.CrossDataRealtimeDTO;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.CrossOptimizeService;
import org.springframework.beans.BeanUtils;
......@@ -46,7 +45,7 @@ public class CrossMonitorTask {
// }
// 获取所有信控路口异常数据(失衡/拥堵/溢出/死锁)
List<CrossDataRealtimeDTO> abnormalCrossList = listAbnormalCross(crossDataRealtimePOList);
List<CrossDataRealtimePO> abnormalCrossList = listAbnormalCross(crossDataRealtimePOList);
log.info("加载异常路口:{}条", abnormalCrossList.size());
// if(abnormalCrossList.isEmpty()) {
// return ;
......@@ -62,15 +61,15 @@ public class CrossMonitorTask {
*
* @return
*/
public List<CrossDataRealtimeDTO> listAbnormalCross(List<CrossDataRealtimePO> crossDataRealtimePOList) {
public List<CrossDataRealtimePO> listAbnormalCross(List<CrossDataRealtimePO> crossDataRealtimePOList) {
List<CrossDataRealtimeDTO> dtoList = new ArrayList<>();
CrossDataRealtimeDTO dto = null;
List<CrossDataRealtimePO> dtoList = new ArrayList<>();
CrossDataRealtimePO dto = null;
int status = 0;
for (CrossDataRealtimePO po : crossDataRealtimePOList) {
// 获取失衡、拥堵、溢出路口数据
if (Constants.SystemParam.NO.equals(po.getIsSpillover()) || Constants.SystemParam.NO.equals(po.getIsCongestion()) || Constants.SystemParam.NO.equals(po.getIsUnbalance())) {
if (Constants.SystemParam.NO.equals(po.getIsSpillover()) && Constants.SystemParam.NO.equals(po.getIsCongestion()) && Constants.SystemParam.NO.equals(po.getIsUnbalance())) {
continue;
}
......@@ -81,7 +80,7 @@ public class CrossMonitorTask {
} else if (Constants.SystemParam.YES.equals(po.getIsUnbalance())) { // 失衡
status = CrossStatusEnum.UNBALANCE.getCode();
}
dto = new CrossDataRealtimeDTO();
dto = new CrossDataRealtimePO();
BeanUtils.copyProperties(po, dto);
dto.setCrossId(po.getCrossId());
dto.setStatus(status);
......
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