Commit 3a049925 authored by duanruiming's avatar duanruiming

[update] opt优化

parent a0e43a4d
package net.wanji.opt.po.base;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author hfx
* @date 2023/01/12 13:29:39
* @desc 路口基础信息
*/
@Data
public class CrossInfoPO {
@ApiModelProperty(name = "路口ID",notes = "")
private String id;
@ApiModelProperty(name = "路口名称",notes = "")
private String name;
@ApiModelProperty(name = "路口类型",notes = "")
private Integer type;
@ApiModelProperty(name = "路口级别",notes = "")
private Integer level;
@ApiModelProperty(name = "行政区划代码",notes = "")
private Integer areaCode;
@ApiModelProperty(name = "路口位置",notes = "")
private String location;
@ApiModelProperty(name = "是否信控路口:1是;0否",notes = "")
private Integer isSignal;
@ApiModelProperty(name = "是否启动优化:1是;0否",notes = "")
private Integer isStart;
@ApiModelProperty(name = "是否下发方案:1是;0否",notes = "")
private Integer isSend;
}
package net.wanji.opt.service;
import net.wanji.opt.dto.CrossInfoDTO;
import net.wanji.opt.query.CrossQuery;
import java.util.List;
/**
* @author hfx
* @date 2023/1/12 15:12
......@@ -17,6 +12,6 @@ public interface CrossInfoService {
* 查询路口基础信息列表
* @return
*/
List<CrossInfoDTO> listCrossInfo(CrossQuery query);
// List<CrossInfoDTO> listCrossInfo(CrossQuery query);
}
package net.wanji.opt.service.impl;
import net.wanji.common.utils.tool.BeanListUtils;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dto.CrossInfoDTO;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.query.CrossQuery;
import net.wanji.opt.service.CrossInfoService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author hfx
* @date 2023/1/12 15:12
......@@ -20,14 +11,14 @@ import java.util.List;
@Service
public class CrossInfoServiceImpl implements CrossInfoService {
@Resource
CrossInfoMapper crossInfoMapper;
public List<CrossInfoDTO> listCrossInfo(CrossQuery query) {
// 获取数据库数据
List<CrossInfoPO> crossInfoPOList = crossInfoMapper.listCrossInfo(query);
return BeanListUtils.populateList(crossInfoPOList, new ArrayList<>(), CrossInfoDTO.class);
}
// @Resource
// CrossInfoMapper crossInfoMapper;
//
// public List<CrossInfoDTO> listCrossInfo(CrossQuery query) {
//
// // 获取数据库数据
// List<CrossInfoPO> crossInfoPOList = crossInfoMapper.listCrossInfo(query);
// return BeanListUtils.populateList(crossInfoPOList, new ArrayList<>(), CrossInfoDTO.class);
// }
}
package net.wanji.opt.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.framework.Constants;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.utils.tool.BeanListUtils;
import net.wanji.databus.dao.entity.RidInfoEntity;
import net.wanji.databus.dao.mapper.CrossDirDataRealtimeMapper;
import net.wanji.databus.dao.mapper.CrossTurnDataRealtimeMapper;
import net.wanji.databus.dto.CrossDirInfoDTO;
import net.wanji.databus.dto.CrossTurnInfoDTO;
import net.wanji.databus.entity.develop.servicedevelop.develop.StatusCodeEnum;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.pojo.vo.SignalStatusVO;
import net.wanji.databus.po.CrossDirDataRealtimePO;
import net.wanji.databus.po.CrossTurnDataRealtimePO;
import net.wanji.databus.vo.SchemeSendVO;
import net.wanji.databus.vo.SignalStatusVO;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.opt.cache.CrossDirTurnPhaseCache;
import net.wanji.opt.cache.CrossRidInfoCache;
......@@ -31,18 +38,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
import static net.wanji.opt.cache.CrossPhaseInfoCache.getCrossPhaseCacheByCrossId;
......@@ -54,19 +52,17 @@ import static net.wanji.opt.cache.CrossSchemeInfoCache.geteSchemePOCache;
* @desc CrossOptimizeServiceImpl
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Resource
CrossSchemeOptLogMapper crossSchemeOptLogMapper;
@Resource
UtcFeignClients utcFeignClients;
@Resource
CrossDirTurnPhaseCache crossDirTurnPhaseCache;
@Resource
CrossRidInfoCache crossRidInfoCache;
@Resource
SceneService sceneService;
private final CrossSchemeOptLogMapper crossSchemeOptLogMapper;
private final UtcFeignClients utcFeignClients;
private final CrossDirTurnPhaseCache crossDirTurnPhaseCache;
private final CrossRidInfoCache crossRidInfoCache;
private final SceneService sceneService;
private final CrossTurnDataRealtimeMapper crossTurnDataRealtimeMapper;
private final CrossDirDataRealtimeMapper crossDirDataRealtimeMapper;
@Value("${crossOptParam.maxVehheadDist}")
private Double maxVehheadDist;
......@@ -89,6 +85,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
try {
// todo 当前路口不是信控路口,需要跳过
// utcFeignClients.listCrossInfo()
// todo 系统管理,路口管理,信控标志关闭,优化下发也要关闭
// 相位配时信息,key: 路口编号_方向类型_转向类型,value: 相位配时信息
......@@ -98,7 +95,11 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
setTurnList(crossDataRealtimePOList, phaseMap);
// 获取所有信控路口转向实时数据,包括异常路口和正常路口
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtime = listTurnDataRealtime(crossDataRealtimePOList);
// Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap = listTurnDataRealtime(crossDataRealtimePOList);
List<CrossTurnDataRealtimePO> crossTurnDataRealtimePOS = crossTurnDataRealtimeMapper.selectList(new LambdaQueryWrapper<CrossTurnDataRealtimePO>());
ArrayList<CrossTurnDataRealtimeDTO> turnDataRealtimeList = new ArrayList<>();
BeanListUtils.populateList(crossTurnDataRealtimePOS, turnDataRealtimeList, CrossTurnDataRealtimeDTO.class);
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeMap = turnDataRealtimeList.stream().collect(Collectors.groupingBy(CrossTurnDataRealtimeDTO::getCrossId));
// 恢复优化路口原始方案:上一批次优化后,路口正常需要恢复原始方案
// todo 方案运行时间,恢复时当前时间是否在远方案运行时间内,否则phaseMap数据不准确
......@@ -107,15 +108,15 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
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);
spilloverOpt(abnormalCrossList, turnDataRealtimeMap, phaseMap);
}
abnormalCrossList = crossDataMap.get(CrossStatusEnum.CONGESTION.getCode()); // 拥堵
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
congestionOpt(abnormalCrossList, turnDataRealtime, phaseMap);
congestionOpt(abnormalCrossList, turnDataRealtimeMap, phaseMap);
}
abnormalCrossList = crossDataMap.get(CrossStatusEnum.UNBALANCE.getCode()); // 失衡
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
unbalanceOpt(abnormalCrossList, turnDataRealtime, phaseMap);
unbalanceOpt(abnormalCrossList, turnDataRealtimeMap, phaseMap);
}
} catch (Exception e) {
e.printStackTrace();
......@@ -155,16 +156,15 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
// 判断路口是否是绿波
// 路口拥堵进口方向,dir
List<String> optCrossDirList = getOptCrossInDirList(cross);
List<Integer> optCrossDirList = getOptCrossInDirList(crossId);
// 溢出当前路口方向转向减少时间 10s
// 计算路口各转向所需的通行时长(秒)
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(crossId);
for (String dir : optCrossDirList) {
for (Integer dir : optCrossDirList) {
for (CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO : crossTurnDataRealtimeDTOS) {
Integer inDir = crossTurnDataRealtimeDTO.getInDir();
String turnType = crossTurnDataRealtimeDTO.getTurnType();
if (Objects.equals(dir, String.valueOf(inDir))) {
if (Objects.equals(dir, inDir)) {
crossTurnDataRealtimeDTO.setPassTime(-10.0);
}
}
......@@ -179,8 +179,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
if (CollectionUtils.isEmpty(ridInfoEntities)) {
continue;
}
for (String dirTurn : optCrossDirList) {
Integer dir = Integer.valueOf(dirTurn);
for (Integer dir : optCrossDirList) {
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
Integer inDir = ridInfoEntity.getInDir();
if (!congestCrossMap.containsKey(ridInfoEntity.getEndCrossId()) && Objects.equals(inDir, dir)) {
......@@ -234,7 +233,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
// 路口拥堵方向转向,dir_turn
List<String> optCrossDirList = getOptCrossInDirList(cross);
List<Integer> optCrossDirList = getOptCrossInDirList(crossId);
// 判断当前路口是否已优化
if (CROSS_OPT.contains(crossId)) {
......@@ -248,9 +247,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
continue;
}
// 当前路口拥堵方向,优化当前路口方向的上游路口的直行和左转方向
for (String congestionDir : optCrossDirList) {
Integer intCongestionDir = Integer.valueOf(congestionDir);
// 拥堵路口对上游路口进行优化
for (Integer intCongestionDir : optCrossDirList) {
// 拥堵路口对上游路口进 行优化
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
String startCrossId = ridInfoEntity.getStartCrossId();
......@@ -328,33 +326,41 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
}
/**
* 当前路口异常转向列表 element:进口方向
*
* @param cross
* @return
*/
private static List<String> getOptCrossInDirList(CrossDataRealtimePO cross) {
List<String> crossIdDirList = new ArrayList<>();
List<CrossDirInfoDTO> dirList = cross.getDirList();
List<CrossTurnInfoDTO> turnList = cross.getTurnList();
if (!CollectionUtils.isEmpty(dirList) && !CollectionUtils.isEmpty(turnList)) {
for (CrossDirInfoDTO crossDirInfoDTO : dirList) {
Integer dirType = crossDirInfoDTO.getDirType();
Integer inOutType = crossDirInfoDTO.getInOutType();
for (CrossTurnInfoDTO crossTurnInfoDTO : turnList) {
Integer inDir = crossTurnInfoDTO.getInDir();
// 路口方向进口=驶入方向
if (Objects.equals(dirType, inDir) && Objects.equals(1, inOutType)) {
String str = String.valueOf(crossDirInfoDTO.getDirType());
if (!crossIdDirList.contains(str)) {
crossIdDirList.add(str);
}
}
}
}
}
return crossIdDirList;
// /**
// * 当前路口异常转向列表 element:进口方向
// *
// * @param cross
// * @return
// */
// private static List<String> getOptCrossInDirList(CrossDataRealtimePO cross) {
// List<String> crossIdDirList = new ArrayList<>();
// List<CrossDirInfoDTO> dirList = cross.getDirList();
// List<CrossTurnInfoDTO> turnList = cross.getTurnList();
// if (!CollectionUtils.isEmpty(dirList) && !CollectionUtils.isEmpty(turnList)) {
// for (CrossDirInfoDTO crossDirInfoDTO : dirList) {
// Integer dirType = crossDirInfoDTO.getDirType();
// Integer inOutType = crossDirInfoDTO.getInOutType();
// for (CrossTurnInfoDTO crossTurnInfoDTO : turnList) {
// Integer inDir = crossTurnInfoDTO.getInDir();
// // 路口方向进口=驶入方向
// if (Objects.equals(dirType, inDir) && Objects.equals(1, inOutType)) {
// String str = String.valueOf(crossDirInfoDTO.getDirType());
// if (!crossIdDirList.contains(str)) {
// crossIdDirList.add(str);
// }
// }
// }
// }
// }
// return crossIdDirList;
// }
private List<Integer> getOptCrossInDirList(String crossId) {
LambdaQueryWrapper<CrossDirDataRealtimePO> dirWrapper = new LambdaQueryWrapper<>();
dirWrapper.eq(CrossDirDataRealtimePO::getCrossId, crossId);
dirWrapper.eq(CrossDirDataRealtimePO::getInOutType, 1);
List<CrossDirDataRealtimePO> crossDirDataRealtimePOS = crossDirDataRealtimeMapper.selectList(dirWrapper);
List<Integer> optCrossDirList = crossDirDataRealtimePOS.stream().map(CrossDirDataRealtimePO::getDirType).collect(Collectors.toList());
return optCrossDirList;
}
/**
......@@ -389,8 +395,6 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
turnList.add(crossTurnInfoDTO);
}
}
crossDataRealtimeDTO.setDirList(dirList.stream().distinct().collect(Collectors.toList()));
crossDataRealtimeDTO.setTurnList(turnList);
}
}
......@@ -744,26 +748,26 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
*
* @return
*/
public Map<String, List<CrossTurnDataRealtimeDTO>> listTurnDataRealtime(List<CrossDataRealtimePO> abnormalCrossList) {
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeDTOList = new HashMap<>();
abnormalCrossList.forEach(entry -> {
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = new ArrayList<>();
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);
});
return turnDataRealtimeDTOList;
}
// public Map<String, List<CrossTurnDataRealtimeDTO>> listTurnDataRealtime(List<CrossDataRealtimePO> abnormalCrossList) {
// Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeDTOList = new HashMap<>();
//
// abnormalCrossList.forEach(entry -> {
// List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = new ArrayList<>();
// 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);
// });
//
// return turnDataRealtimeDTOList;
// }
/**
......
......@@ -10,16 +10,13 @@ import lombok.extern.slf4j.Slf4j;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.entity.RidInfoEntity;
import net.wanji.databus.dao.mapper.CrossDataHistMapper;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.dao.mapper.CrossDirDataHistMapper;
import net.wanji.databus.dao.mapper.RidInfoMapper;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.databus.po.CrossDirDataHistPO;
import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.vo.SchemeSendVO;
import net.wanji.opt.dao.mapper.CrossDirInfoMapper;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.CrossPhaseMapper;
import net.wanji.opt.dao.mapper.CrossSchemeMapper;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
......@@ -30,7 +27,6 @@ import net.wanji.opt.dto.OptDataExtend;
import net.wanji.opt.dto.SendManualDTO;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.dto.strategy.QuerySceneDTO;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.po.base.CrossPhasePO;
import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.po.base.CrossSchemePO;
......@@ -44,15 +40,7 @@ import net.wanji.opt.vo.SchemeOptSendVO;
import net.wanji.opt.vo.SchemeOptVO;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeSet;
import java.util.*;
import java.util.stream.Collectors;
/**
......
......@@ -13,13 +13,13 @@ import net.wanji.databus.bo.CrossDirDataHistAvgBO;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.dao.mapper.CrossDirDataHistMapper;
import net.wanji.databus.dao.mapper.CrossDirDataRealtimeMapper;
import net.wanji.databus.dao.mapper.CrossInfoMapper;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.databus.po.CrossDirDataRealtimePO;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
import net.wanji.opt.dto.CrossIdAndMinutesDTO;
import net.wanji.opt.dto.OptDataExtend;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.service.EvaluateService;
import net.wanji.opt.vo.EvaluateCrossDetailVO;
......
......@@ -9,39 +9,25 @@ import net.wanji.common.enums.EventAlarmEnum;
import net.wanji.common.enums.EventAlarmSourceEnum;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.entity.RidInfoEntity;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.dao.mapper.CrossDirDataHistMapper;
import net.wanji.databus.dao.mapper.CrossTurnDataRealtimeMapper;
import net.wanji.databus.dao.mapper.RidInfoMapper;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.databus.po.CrossDirDataHistPO;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.CrossTurnDataRealtimePO;
import net.wanji.databus.vo.AbnormalCrossListVO;
import net.wanji.opt.dao.mapper.CrossDirInfoMapper;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.trend.EventAlarmMapper;
import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.po.trend.EventAlarmPO;
import net.wanji.opt.service.TrendService;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossStats;
import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.EventAlarmVO;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
import net.wanji.opt.vo.*;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
......
......@@ -4,7 +4,7 @@ import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.exception.FeignServiceException;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.entity.develop.servicedevelop.develop.StatusCodeEnum;
import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.databus.vo.SchemeSendVO;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.opt.cache.CrossDirTurnPhaseCache;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
......
package net.wanji.opt.task;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.framework.Constants;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.opt.dto.CrossTurnDataRealtimeDTO;
import net.wanji.opt.dto.LaneInfoDTO;
import net.wanji.opt.kafka.ConsumerHandler;
import net.wanji.opt.po.kafka.LanePeriodicDataPO;
import net.wanji.opt.query.LaneQuery;
import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.impl.LaneInfoServiceImpl;
import org.springframework.beans.BeanUtils;
......@@ -92,40 +88,20 @@ public class CrossMonitorTask {
BeanUtils.copyProperties(po, dto);
dto.setCrossId(po.getCrossId());
dto.setStatus(status);
dto.setDirList(null);
dto.setTurnList(null);
dtoList.add(dto);
}
return dtoList;
}
/**
* 获取路口实时监测数据
* 获取路口实时监测数据,获取数据中心存入到数据库中的数据
* (暂定从数据中心kafka获取)
*
* @return
*/
public List<CrossDataRealtimePO> listCrossDataRealtime() {
// todo test数据
List<CrossDataRealtimePO> crossDataRealtimePOList = new ArrayList<>(1);
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId("14Q1409IRF0");
CrossDataRealtimePO crossDataRealtimePO1 = crossDataRealtimeMapper.selectByCrossId("14Q0S09IQB0");
crossDataRealtimePOList.add(crossDataRealtimePO);
crossDataRealtimePOList.add(crossDataRealtimePO1);
String lanePeriodicData = consumerHandler.getTopicMessage("JN040001LanePeriodicData");
LanePeriodicDataPO lanePeriodicDataPO = JSONObject.parseObject(lanePeriodicData, LanePeriodicDataPO.class);
// todo 对数据进行处理,可能主要是CrossTurnDataRealtimeDTO中的车间距,车时距等配置修改
CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO = new CrossTurnDataRealtimeDTO();
// 查询车道信息表
LaneQuery laneQuery = new LaneQuery();
List<LaneInfoDTO> laneInfoDTOS = laneInfoService.listLaneInfo(laneQuery);
// 将车道信息表转存路口实时数据CrossDataRealtimePO,转向数据CrossTurnDataRealtimeDTO,方向数据CrossDirDataHistPO
// 通过数据进行优化
return crossDataRealtimePOList;
List<CrossDataRealtimePO> crossDataRealtimePOS = crossDataRealtimeMapper.selectList(new LambdaQueryWrapper<>());
return crossDataRealtimePOS;
}
}
\ No newline at end of file
......@@ -3,7 +3,7 @@ package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.databus.vo.SchemeSendVO;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.CrossInfoMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="net.wanji.opt.po.base.CrossInfoPO">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="type" column="type"/>
<result property="level" column="level"/>
<result property="areaCode" column="area_code"/>
<result property="location" column="location"/>
<result property="isSignal" column="is_signal"/>
<result property="isStart" column="is_start"/>
<result property="isSend" column="is_send"/>
</resultMap>
<!-- 查询路口列表信息 -->
<select id="listCrossInfo" parameterType="net.wanji.opt.query.CrossQuery" resultMap="BaseResultMap">
select
id
,name
,type
,level
,area_code
,location
,is_signal
,is_start
,is_send
from
t_base_cross_info
where 1 = 1
<if test="isSignal != null and isSignal != '' ">
and is_signal = #{isSignal}
</if>
<if test="isStart != null and isStart != '' ">
and is_start = #{isStart}
</if>
<if test="isSend != null and isSend != '' ">
and is_send = #{isSend}
</if>
</select>
<select id="selectByCrossIds" resultType="net.wanji.opt.po.base.CrossInfoPO">
select
id,name,type,level,area_code,is_signal,is_start,is_send,location
from t_base_cross_info
where id IN
<foreach collection="crossIdList" item="crossId" separator="," open="(" close=")">
#{crossId}
</foreach>
</select>
<select id="selectById" resultType="net.wanji.opt.po.base.CrossInfoPO">
select
id,name,type,level,area_code,is_signal,is_start,is_send,location
from t_base_cross_info
where id = #{crossId}
</select>
<select id="selectByName" resultType="net.wanji.opt.po.base.CrossInfoPO">
select
id,name,type,level,area_code,is_signal,is_start,is_send,location
from t_base_cross_info
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%',#{name},'%')
</if>
</where>
order by id
</select>
<select id="selectAll" resultType="net.wanji.opt.po.base.CrossInfoPO">
select
id,name,type,level,area_code,is_signal,is_start,is_send,location
from t_base_cross_info
order by id
</select>
</mapper>
package net.wanji.opt.dao.mapper;
package net.wanji.databus.dao.mapper;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.query.CrossQuery;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.TBaseCrossInfo;
import net.wanji.databus.vo.CrossDeviceStatusInfoOutVO;
import net.wanji.databus.vo.CrossInfoVO;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -12,14 +15,14 @@ import java.util.List;
* @desc CrossInfoMapper
*/
@Repository
public interface CrossInfoMapper {
public interface CrossInfoMapper extends BaseMapper<TBaseCrossInfo> {
/**
* 查询路口列表信息
* @param query
* @return
*/
List<CrossInfoPO> listCrossInfo(CrossQuery query);
// List<CrossInfoPO> listCrossInfo(CrossQuery query);
List<CrossInfoPO> selectByCrossIds(List<String> crossIdList);
......@@ -28,4 +31,23 @@ public interface CrossInfoMapper {
List<CrossInfoPO> selectByName(String name);
List<CrossInfoPO> selectAll();
int deleteByPrimaryKey(String id);
@Override
int insert(TBaseCrossInfo record);
int insertSelective(TBaseCrossInfo record);
TBaseCrossInfo selectByPrimaryKey(String id);
int updateByPrimaryKeySelective(TBaseCrossInfo record);
int updateByPrimaryKey(TBaseCrossInfo record);
List<CrossInfoPO> selectAll(CrossInfoVO crossInfoVO);
Integer countSelectAll(CrossInfoVO crossInfoVO);
List<CrossDeviceStatusInfoOutVO> listCrossDeviceStatusInfo();
}
......@@ -4,11 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.databus.dto.CrossDirInfoDTO;
import net.wanji.databus.dto.CrossTurnInfoDTO;
import java.util.Date;
import java.util.List;
/**
* @author duanruiming
......@@ -18,84 +15,126 @@ import java.util.List;
@TableName("t_cross_data_realtime")
@ApiModel(value = "CrossDataRealtimePO", description = "路口实时数据")
public class CrossDataRealtimePO {
/** 路口编号 */
@ApiModelProperty(value = "路口编号",notes = "")
private String crossId ;
/** 路口状态:0正常;1失衡;2拥堵;3溢出;4死锁 */
@ApiModelProperty(value = "路口状态:0正常;1失衡;2拥堵;3溢出;4死锁",notes = "")
private Integer status ;
/** 拥堵类型:1常规;2异常 */
@ApiModelProperty(value = "拥堵类型:1常规;2异常",notes = "")
private Integer type ;
/** 交通指数(1~10) */
@ApiModelProperty(value = "交通指数(1~10)",notes = "")
private Double trafficIndex ;
/** 开始时间:yyyy-MM-dd HH;mm:ss */
@ApiModelProperty(value = "开始时间:yyyy-MM-dd HH:mm:ss",notes = "")
private Date startTime ;
@ApiModelProperty(value = "持续时间(单位:分钟)",notes = "")
private Integer duration ;
/** 是否失衡:0否;1是 */
@ApiModelProperty(value = "是否失衡:0否;1是",notes = "")
private Integer isUnbalance ;
/** 是否溢出:0否;1是 */
@ApiModelProperty(value = "是否溢出:0否;1是",notes = "")
private Integer isSpillover ;
/** 是否拥堵:0否;1是 */
@ApiModelProperty(value = "是否拥堵:0否;1是",notes = "")
private Integer isCongestion ;
/** 失衡指数 */
@ApiModelProperty(value = "失衡指数",notes = "")
private Double unbalanceIndex ;
/** 溢出指数 */
@ApiModelProperty(value = "溢出指数",notes = "")
private Double spilloverIndex ;
/** 拥堵指数 */
@ApiModelProperty(value = "拥堵指数",notes = "")
private Double congestionIndex ;
/** 路口失衡方向:1,2,3... */
@ApiModelProperty(value = "路口失衡方向:1,2,3...",notes = "")
private String unbalanceDirs ;
/** 路口溢出方向:1,2,3... */
@ApiModelProperty(value = "路口溢出方向:1,2,3...",notes = "")
private String spilloverDirs ;
/** 路口拥堵方向:1,2,3... */
@ApiModelProperty(value = "路口拥堵方向:1,2,3...",notes = "")
private String congestionDirs ;
/** 交通流量(辆) */
@ApiModelProperty(value = "交通流量(辆)",notes = "")
private Integer flow ;
/** 交通流率/h */
@ApiModelProperty(value = "交通流率/h",notes = "")
private Double flowRate ;
/** 平均速度(km/h) */
@ApiModelProperty(value = "平均速度(km/h)",notes = "")
private Double speed ;
/** 最大排队(米) */
@ApiModelProperty(value = "最大排队(米)",notes = "")
private Double queueLength ;
/** 停车次数(次) */
@ApiModelProperty(value = "停车次数(次)",notes = "")
private Double stopTimes ;
/** 延误时间(秒) */
@ApiModelProperty(value = "延误时间(秒)",notes = "")
private Integer delayTime ;
/** 饱和度 */
@ApiModelProperty(value = "饱和度",notes = "")
private Double sturation ;
/** 采集时间(10位时间戳) */
@ApiModelProperty(value = "采集时间(10位时间戳)",notes = "")
private Integer batchTime ;
/** 创建时间 */
@ApiModelProperty(value = "创建时间",notes = "")
private Date gmtCreate ;
/** 修改时间 */
@ApiModelProperty(value = "修改时间",notes = "")
private Date gmtModified ;
@ApiModelProperty(name = "路口方向列表",notes = "")
List<CrossDirInfoDTO> dirList;
@ApiModelProperty(name = "路口转向列表",notes = "")
List<CrossTurnInfoDTO> turnList;
/**
* 路口编号
*/
@ApiModelProperty(value = "路口编号", notes = "")
private String crossId;
/**
* 路口状态:0正常;1失衡;2拥堵;3溢出;4死锁
*/
@ApiModelProperty(value = "路口状态:0正常;1失衡;2拥堵;3溢出;4死锁", notes = "")
private Integer status;
/**
* 拥堵类型:1常规;2异常
*/
@ApiModelProperty(value = "拥堵类型:1常规;2异常", notes = "")
private Integer type;
/**
* 交通指数(1~10)
*/
@ApiModelProperty(value = "交通指数(1~10)", notes = "")
private Double trafficIndex;
/**
* 开始时间:yyyy-MM-dd HH;mm:ss
*/
@ApiModelProperty(value = "开始时间:yyyy-MM-dd HH:mm:ss", notes = "")
private Date startTime;
@ApiModelProperty(value = "持续时间(单位:分钟)", notes = "")
private Integer duration;
/**
* 是否失衡:0否;1是
*/
@ApiModelProperty(value = "是否失衡:0否;1是", notes = "")
private Integer isUnbalance;
/**
* 是否溢出:0否;1是
*/
@ApiModelProperty(value = "是否溢出:0否;1是", notes = "")
private Integer isSpillover;
/**
* 是否拥堵:0否;1是
*/
@ApiModelProperty(value = "是否拥堵:0否;1是", notes = "")
private Integer isCongestion;
/**
* 失衡指数
*/
@ApiModelProperty(value = "失衡指数", notes = "")
private Double unbalanceIndex;
/**
* 溢出指数
*/
@ApiModelProperty(value = "溢出指数", notes = "")
private Double spilloverIndex;
/**
* 拥堵指数
*/
@ApiModelProperty(value = "拥堵指数", notes = "")
private Double congestionIndex;
/**
* 路口失衡方向:1,2,3...
*/
@ApiModelProperty(value = "路口失衡方向:1,2,3...", notes = "")
private String unbalanceDirs;
/**
* 路口溢出方向:1,2,3...
*/
@ApiModelProperty(value = "路口溢出方向:1,2,3...", notes = "")
private String spilloverDirs;
/**
* 路口拥堵方向:1,2,3...
*/
@ApiModelProperty(value = "路口拥堵方向:1,2,3...", notes = "")
private String congestionDirs;
/**
* 交通流量(辆)
*/
@ApiModelProperty(value = "交通流量(辆)", notes = "")
private Integer flow;
/**
* 交通流率/h
*/
@ApiModelProperty(value = "交通流率/h", notes = "")
private Double flowRate;
/**
* 平均速度(km/h)
*/
@ApiModelProperty(value = "平均速度(km/h)", notes = "")
private Double speed;
/**
* 最大排队(米)
*/
@ApiModelProperty(value = "最大排队(米)", notes = "")
private Double queueLength;
/**
* 停车次数(次)
*/
@ApiModelProperty(value = "停车次数(次)", notes = "")
private Double stopTimes;
/**
* 延误时间(秒)
*/
@ApiModelProperty(value = "延误时间(秒)", notes = "")
private Integer delayTime;
/**
* 饱和度
*/
@ApiModelProperty(value = "饱和度", notes = "")
private Double sturation;
/**
* 采集时间(10位时间戳)
*/
@ApiModelProperty(value = "采集时间(10位时间戳)", notes = "")
private Integer batchTime;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间", notes = "")
private Date gmtCreate;
/**
* 修改时间
*/
@ApiModelProperty(value = "修改时间", notes = "")
private Date gmtModified;
}
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