Commit 3838cf4d authored by duanruiming's avatar duanruiming

Merge remote-tracking branch 'origin/master'

parents dd756b7b 2ac30c82
...@@ -140,22 +140,38 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -140,22 +140,38 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
List<CrossDataHistPO> crossPOList = crossDataHistMapper.selectByCrossIdAndStartEnd( List<CrossDataHistPO> crossPOList = crossDataHistMapper.selectByCrossIdAndStartEnd(
crossId, startTimeStamp, endTimeStamp); crossId, startTimeStamp, endTimeStamp);
for (String timeStr : timeList) { for (String timeStr : timeList) {
Date startDatetime = calcDate(timeStr, startTime); // 解析 timeStr 为 Calendar 对象
String[] timeParts = timeStr.split(":");
int hour = Integer.parseInt(timeParts[0]);
int minute = Integer.parseInt(timeParts[1]);
Calendar startTimeCal = Calendar.getInstance();
startTimeCal.set(Calendar.HOUR_OF_DAY, hour);
startTimeCal.set(Calendar.MINUTE, minute);
startTimeCal.set(Calendar.SECOND, 0);
startTimeCal.set(Calendar.MILLISECOND, 0);
// 计算结束时间
Calendar endTimeCal = (Calendar) startTimeCal.clone();
endTimeCal.add(Calendar.MINUTE, minutes);
// 过滤 crossPOList 中的记录
List<CrossDataHistPO> filteredList = crossPOList.stream()
.filter(crossPO -> {
// 将 batchTime 转换为小时和分钟
Calendar batchTimeCal = Calendar.getInstance();
batchTimeCal.setTimeInMillis(crossPO.getBatchTime() * 1000L); // 将时间戳转换为毫秒
String batchTimeStr = hourMinuteFormat.format(batchTimeCal.getTime());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String endTimeStr = hourMinuteFormat.format(endTimeCal.getTime());
return (batchTimeStr.compareTo(timeStr) >= 0 && batchTimeStr.compareTo(endTimeStr) <= 0);
})
.collect(Collectors.toList());
MainlineEvaluateBottomCurveVO vo = new MainlineEvaluateBottomCurveVO(); MainlineEvaluateBottomCurveVO vo = new MainlineEvaluateBottomCurveVO();
vo.setMetricTime(timeStr); vo.setMetricTime(timeStr);
// 计算 endDatetime
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDatetime);
calendar.add(Calendar.MINUTE, minutes);
Date endDatetime = calendar.getTime();
// 转换为 10 位时间戳
int startTimeStampPart = (int) (startDatetime.getTime() / 1000);
int endTimeStampPart = (int) (endDatetime.getTime() / 1000);
// 使用流式编程进行筛选
List<CrossDataHistPO> filteredList = crossPOList.stream()
.filter(po -> po.getBatchTime() >= startTimeStampPart && po.getBatchTime() <= endTimeStampPart)
.collect(Collectors.toList());
if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) { if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) {
double v = filteredList.stream() double v = filteredList.stream()
.mapToDouble(CrossDataHistPO::getNoStopRate) .mapToDouble(CrossDataHistPO::getNoStopRate)
...@@ -229,8 +245,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -229,8 +245,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId, startTimeStamp, endTimeStamp); crossId, startTimeStamp, endTimeStamp);
for (String timeStr : timeList) { for (String timeStr : timeList) {
Date startDatetime = calcDate(timeStr, startTime);
for (String dirStr : scopeList) { for (String dirStr : scopeList) {
int index = dirStr.indexOf("进口"); int index = dirStr.indexOf("进口");
String dirName = dirStr.substring(0, index); String dirName = dirStr.substring(0, index);
...@@ -240,20 +254,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -240,20 +254,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
vo.setMetricTime(timeStr); vo.setMetricTime(timeStr);
vo.setScopeName(dirStr); vo.setScopeName(dirStr);
// 计算 endDatetime // 解析 timeStr 为 Calendar 对象
Calendar calendar = Calendar.getInstance(); String[] timeParts = timeStr.split(":");
calendar.setTime(startDatetime); int hour = Integer.parseInt(timeParts[0]);
calendar.add(Calendar.MINUTE, minutes); int minute = Integer.parseInt(timeParts[1]);
Date endDatetime = calendar.getTime();
// 转换为 10 位时间戳 Calendar startTimeCal = Calendar.getInstance();
int startTimeStampPart = (int) (startDatetime.getTime() / 1000); startTimeCal.set(Calendar.HOUR_OF_DAY, hour);
int endTimeStampPart = (int) (endDatetime.getTime() / 1000); startTimeCal.set(Calendar.MINUTE, minute);
// 使用流式编程进行筛选 startTimeCal.set(Calendar.SECOND, 0);
startTimeCal.set(Calendar.MILLISECOND, 0);
// 计算结束时间
Calendar endTimeCal = (Calendar) startTimeCal.clone();
endTimeCal.add(Calendar.MINUTE, minutes);
// 过滤 poList 中的记录
List<CrossDirDataHistPO> filteredList = dirPOList.stream() List<CrossDirDataHistPO> filteredList = dirPOList.stream()
.filter(po -> po.getDirType().equals(dirCode)) .filter(po -> po.getDirType().equals(dirCode))
.filter(po -> po.getInOutType().equals(1)) .filter(po -> po.getInOutType().equals(1))
.filter(po -> po.getBatchTime() >= startTimeStampPart .filter(po -> {
&& po.getBatchTime() <= endTimeStampPart) // 将 batchTime 转换为小时和分钟
Calendar batchTimeCal = Calendar.getInstance();
batchTimeCal.setTimeInMillis(po.getBatchTime() * 1000L); // 将时间戳转换为毫秒
String batchTimeStr = hourMinuteFormat.format(batchTimeCal.getTime());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String endTimeStr = hourMinuteFormat.format(endTimeCal.getTime());
return (batchTimeStr.compareTo(timeStr) >= 0 && batchTimeStr.compareTo(endTimeStr) <= 0);
})
.collect(Collectors.toList()); .collect(Collectors.toList());
if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) { if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) {
double v = filteredList.stream() double v = filteredList.stream()
...@@ -322,8 +351,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -322,8 +351,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId, endTimeStamp, startTimeStamp); crossId, endTimeStamp, startTimeStamp);
for (String timeStr : timeList) { for (String timeStr : timeList) {
Date startDatetime = calcDate(timeStr, startTime);
for (String turnStr : scopeList) { for (String turnStr : scopeList) {
int index = turnStr.indexOf("进口"); int index = turnStr.indexOf("进口");
String dirName = turnStr.substring(0, index); String dirName = turnStr.substring(0, index);
...@@ -335,20 +362,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -335,20 +362,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
vo.setMetricTime(timeStr); vo.setMetricTime(timeStr);
vo.setScopeName(turnStr); vo.setScopeName(turnStr);
// 计算 endDatetime // 解析 timeStr 为 Calendar 对象
Calendar calendar = Calendar.getInstance(); String[] timeParts = timeStr.split(":");
calendar.setTime(startDatetime); int hour = Integer.parseInt(timeParts[0]);
calendar.add(Calendar.MINUTE, minutes); int minute = Integer.parseInt(timeParts[1]);
Date endDatetime = calendar.getTime();
// 转换为 10 位时间戳 Calendar startTimeCal = Calendar.getInstance();
int startTimeStampPart = (int) (startDatetime.getTime() / 1000); startTimeCal.set(Calendar.HOUR_OF_DAY, hour);
int endTimeStampPart = (int) (endDatetime.getTime() / 1000); startTimeCal.set(Calendar.MINUTE, minute);
// 使用流式编程进行筛选 startTimeCal.set(Calendar.SECOND, 0);
startTimeCal.set(Calendar.MILLISECOND, 0);
// 计算结束时间
Calendar endTimeCal = (Calendar) startTimeCal.clone();
endTimeCal.add(Calendar.MINUTE, minutes);
// 过滤 poList 中的记录
List<CrossTurnDataHistPO> filteredList = dirPOList.stream() List<CrossTurnDataHistPO> filteredList = dirPOList.stream()
.filter(po -> po.getInDir().equals(dirCode)) .filter(po -> po.getInDir().equals(dirCode))
.filter(po -> po.getTurnType().equals(turnCode)) .filter(po -> po.getTurnType().equals(turnCode))
.filter(po -> po.getBatchTime() >= startTimeStampPart .filter(po -> {
&& po.getBatchTime() <= endTimeStampPart) // 将 batchTime 转换为小时和分钟
Calendar batchTimeCal = Calendar.getInstance();
batchTimeCal.setTimeInMillis(po.getBatchTime() * 1000L); // 将时间戳转换为毫秒
String batchTimeStr = hourMinuteFormat.format(batchTimeCal.getTime());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String endTimeStr = hourMinuteFormat.format(endTimeCal.getTime());
return (batchTimeStr.compareTo(timeStr) >= 0 && batchTimeStr.compareTo(endTimeStr) <= 0);
})
.collect(Collectors.toList()); .collect(Collectors.toList());
if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) { if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) {
double v = filteredList.stream() double v = filteredList.stream()
...@@ -417,8 +459,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -417,8 +459,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId, endTimeStamp, startTimeStamp); crossId, endTimeStamp, startTimeStamp);
for (String timeStr : timeList) { for (String timeStr : timeList) {
Date startDatetime = calcDate(timeStr, startTime);
for (String laneStr : scopeList) { for (String laneStr : scopeList) {
int indexOfJinKou = laneStr.indexOf("进口"); int indexOfJinKou = laneStr.indexOf("进口");
int indexOfCheDao = laneStr.indexOf("车道"); int indexOfCheDao = laneStr.indexOf("车道");
...@@ -434,20 +474,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -434,20 +474,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
vo.setMetricTime(timeStr); vo.setMetricTime(timeStr);
vo.setScopeName(laneStr); vo.setScopeName(laneStr);
// 计算 endDatetime // 解析 timeStr 为 Calendar 对象
Calendar calendar = Calendar.getInstance(); String[] timeParts = timeStr.split(":");
calendar.setTime(startDatetime); int hour = Integer.parseInt(timeParts[0]);
calendar.add(Calendar.MINUTE, minutes); int minute = Integer.parseInt(timeParts[1]);
Date endDatetime = calendar.getTime();
// 转换为 10 位时间戳 Calendar startTimeCal = Calendar.getInstance();
int startTimeStampPart = (int) (startDatetime.getTime() / 1000); startTimeCal.set(Calendar.HOUR_OF_DAY, hour);
int endTimeStampPart = (int) (endDatetime.getTime() / 1000); startTimeCal.set(Calendar.MINUTE, minute);
// 筛选方向、车道序号 startTimeCal.set(Calendar.SECOND, 0);
startTimeCal.set(Calendar.MILLISECOND, 0);
// 计算结束时间
Calendar endTimeCal = (Calendar) startTimeCal.clone();
endTimeCal.add(Calendar.MINUTE, minutes);
// 过滤 poList 中的记录
List<CrossLaneDataHistPOExt> filteredList = lanePOList.stream() List<CrossLaneDataHistPOExt> filteredList = lanePOList.stream()
.filter(po -> po.getDir().equals(dirCode)) .filter(po -> po.getDir().equals(dirCode))
.filter(po -> po.getSort().equals(laneSort)) .filter(po -> po.getSort().equals(laneSort))
.filter(po -> po.getBatchTime() >= startTimeStampPart .filter(po -> {
&& po.getBatchTime() <= endTimeStampPart) // 将 batchTime 转换为小时和分钟
Calendar batchTimeCal = Calendar.getInstance();
batchTimeCal.setTimeInMillis(po.getBatchTime() * 1000L); // 将时间戳转换为毫秒
String batchTimeStr = hourMinuteFormat.format(batchTimeCal.getTime());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String endTimeStr = hourMinuteFormat.format(endTimeCal.getTime());
return (batchTimeStr.compareTo(timeStr) >= 0 && batchTimeStr.compareTo(endTimeStr) <= 0);
})
.collect(Collectors.toList()); .collect(Collectors.toList());
if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) { if (Objects.equals(metricCode, StrategyAndMetricsEnum.Metrics.NO_STOP_RATE.getCode())) {
...@@ -920,10 +975,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -920,10 +975,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId, nonCoordDirCodeList, boStartDayStr, boEndDayStr, startHourMinute, endHourMinute); crossId, nonCoordDirCodeList, boStartDayStr, boEndDayStr, startHourMinute, endHourMinute);
// 计算非协调方向指标(排队长度) // 计算非协调方向指标(排队长度)
int nonCoordValue = (int) (crossDirDataHistPOList.stream() double nonCoordValueDouble = (crossDirDataHistPOList.stream()
.mapToDouble(CrossDirDataHistPO::getQueueLength) .mapToDouble(CrossDirDataHistPO::getQueueLength)
.average() .max()
.orElse(0.0)); .orElse(0.0));
int nonCoordValue = (int) Math.round(nonCoordValueDouble);
return nonCoordValue; return nonCoordValue;
} }
...@@ -938,10 +994,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -938,10 +994,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId, coordDirCodeList, boStartDayStr, boEndDayStr, startHourMinute, endHourMinute); crossId, coordDirCodeList, boStartDayStr, boEndDayStr, startHourMinute, endHourMinute);
// 计算协调方向指标(不停车通过率) // 计算协调方向指标(不停车通过率)
int coordValue = (int) (crossDirDataHistPOList.stream() double coordValueDouble = (crossDirDataHistPOList.stream()
.mapToDouble(CrossDirDataHistPO::getNoStopRate) .mapToDouble(CrossDirDataHistPO::getNoStopRate)
.average() .average()
.orElse(0.0) * 100); .orElse(0.0) * 100);
int coordValue = (int) Math.round(coordValueDouble);
return coordValue; return coordValue;
} }
...@@ -1501,13 +1558,8 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1501,13 +1558,8 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
} }
private String reverseDirName(String input, String character) { private String reverseDirName(String input, String character) {
int index = input.indexOf(character); String[] split = input.split(character);
if (index != -1) { return split[1] + character + split[0];
String part1 = input.substring(index + character.length()); // Part after "向"
String part2 = input.substring(0, index + character.length()); // Part before and including "向"
return part1 + part2;
}
return input;
} }
private List<String> calcEvaluateData( private List<String> calcEvaluateData(
...@@ -1886,16 +1938,26 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1886,16 +1938,26 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
} }
private List<String> buildTimeList(Date startTime, Date endTime, Integer minutes) { private List<String> buildTimeList(Date startTime, Date endTime, Integer minutes) {
// 用于存储时间区间的列表
List<String> timeList = new ArrayList<>(); List<String> timeList = new ArrayList<>();
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.setTime(startTime); cal.setTime(startTime);
long timeDifference = endTime.getTime() - startTime.getTime();
boolean exceeds24Hours = timeDifference > (24 * 60 * 60 * 1000);
Set<String> timeSet = new HashSet<>();
while (cal.getTime().before(endTime) || cal.getTime().equals(endTime)) { while (cal.getTime().before(endTime) || cal.getTime().equals(endTime)) {
String formattedTime = hourMinuteFormat.format(cal.getTime()); String formattedTime = hourMinuteFormat.format(cal.getTime());
if (exceeds24Hours) {
if (timeSet.contains(formattedTime)) {
// 如果 startTime 和 endTime 时间差大于24小时,则 timeList 只保留第一条重复元素之前的元素
break;
}
timeSet.add(formattedTime);
}
timeList.add(formattedTime); timeList.add(formattedTime);
// 增加指定分钟数
cal.add(Calendar.MINUTE, minutes); cal.add(Calendar.MINUTE, minutes);
} }
return timeList; return timeList;
......
...@@ -361,8 +361,6 @@ public class TrendServiceImpl implements TrendService { ...@@ -361,8 +361,6 @@ public class TrendServiceImpl implements TrendService {
public List<GreenwaveRunMonitorVO> greenwaveRunMonitor(GreenwaveIdBO greenwaveIdBO) { public List<GreenwaveRunMonitorVO> greenwaveRunMonitor(GreenwaveIdBO greenwaveIdBO) {
List<GreenwaveRunMonitorVO> res = new ArrayList<>(); List<GreenwaveRunMonitorVO> res = new ArrayList<>();
Date nowTime = new Date(); Date nowTime = new Date();
// todo 测试用,固定当前时间
nowTime = DateUtil.parse("2023-06-09 15:00:00","yyyy-MM-dd HH:mm:ss");
List<GreenwaveHistPOExt> extList = greenwaveHistMapper.selectRunMonitor(nowTime); List<GreenwaveHistPOExt> extList = greenwaveHistMapper.selectRunMonitor(nowTime);
for (GreenwaveHistPOExt greenwaveHistPOExt : extList) { for (GreenwaveHistPOExt greenwaveHistPOExt : extList) {
GreenwaveRunMonitorVO greenWaveRunMonitorVO = new GreenwaveRunMonitorVO(); GreenwaveRunMonitorVO greenWaveRunMonitorVO = new GreenwaveRunMonitorVO();
...@@ -741,17 +739,28 @@ public class TrendServiceImpl implements TrendService { ...@@ -741,17 +739,28 @@ public class TrendServiceImpl implements TrendService {
@Override @Override
public List<GreenwaveCrossMetricsVO> greenwaveCrossMetrics(GreenwaveIdAndTimeStampBO greenwaveIdAndTimeStampBO) { public List<GreenwaveCrossMetricsVO> greenwaveCrossMetrics(GreenwaveIdAndTimeStampBO greenwaveIdAndTimeStampBO) {
List<GreenwaveCrossMetricsVO> res = new ArrayList<>(); List<GreenwaveCrossMetricsVO> res = new ArrayList<>();
Long timeStamp = greenwaveIdAndTimeStampBO.getTimeStamp();
Integer greenwaveId = greenwaveIdAndTimeStampBO.getGreenwaveId(); Integer greenwaveId = greenwaveIdAndTimeStampBO.getGreenwaveId();
Long timeStamp = greenwaveIdAndTimeStampBO.getTimeStamp(); GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectById(greenwaveId);
// todo 测试用,时间戳设定为 1676082600 String greenwaveName = greenwaveInfoPO.getName(); // 旅游路 东向西 转山西路至霞景路路段:正向绿波
timeStamp = 1676082600L; String[] split = greenwaveName.split(" ");
String[] split1 = split[1].split("向"); // 东向西
String dirName1 = split1[0];
String dirName2 = split1[1];
List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId); List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId);
int crossListSize = greenwaveCrossList.size(); // 根据路口ID去重,并按路口顺序号排序
int lastCrossIndex = crossListSize - 1; Map<String, GreenwaveCrossPO> uniqueMap = greenwaveCrossList.stream()
for (int i = 0; i < crossListSize; i++) { .collect(Collectors.toMap(
GreenwaveCrossPO greenwaveCrossPO = greenwaveCrossList.get(i); GreenwaveCrossPO::getCrossId, // 使用crossId作为键
Function.identity(), // 使用对象本身作为值
(existing, replacement) -> existing)); // 如果有重复的key, 保留第一个
// 从uniqueMap中获取去重后的记录列表
List<GreenwaveCrossPO> uniqueList = new ArrayList<>(uniqueMap.values());
for (GreenwaveCrossPO greenwaveCrossPO : uniqueList) {
GreenwaveCrossMetricsVO greenwaveCrossMetricsVO = new GreenwaveCrossMetricsVO(); GreenwaveCrossMetricsVO greenwaveCrossMetricsVO = new GreenwaveCrossMetricsVO();
String crossId = greenwaveCrossPO.getCrossId(); String crossId = greenwaveCrossPO.getCrossId();
greenwaveCrossMetricsVO.setCrossId(crossId); greenwaveCrossMetricsVO.setCrossId(crossId);
...@@ -759,57 +768,93 @@ public class TrendServiceImpl implements TrendService { ...@@ -759,57 +768,93 @@ public class TrendServiceImpl implements TrendService {
if (baseCrossInfoPO != null) { if (baseCrossInfoPO != null) {
greenwaveCrossMetricsVO.setCrossName(baseCrossInfoPO.getName()); greenwaveCrossMetricsVO.setCrossName(baseCrossInfoPO.getName());
} }
String currentCrossId = crossId; List<Integer> coordDirList = new ArrayList<Integer>();
long currentSeconds = timeStamp; int direction = greenwaveInfoPO.getDir();
long preSeconds = currentSeconds - 60 * 5; if (direction == 0) { // 正向
// 获取当前方案 Integer dirCode = BaseEnum.SignalDirectionEnum.getCodeByName(dirName1);
Integer sectionId = greenwaveCrossPO.getSectionId(); dirCode = convertDirCode(dirName1, crossId, dirCode);
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId); coordDirList.add(dirCode);
Integer schemeId = crossSectionPO.getSchemeId(); } else if (direction == 2) { // 反向
// 获取协调相位对应的车道集合 Integer dirCode = BaseEnum.SignalDirectionEnum.getCodeByName(dirName2);
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(schemeId); dirCode = convertDirCode(dirName2, crossId, dirCode);
Integer coordPhaseID = baseCrossSchemePO.getCoordPhase(); coordDirList.add(dirCode);
List<CrossPhaseLightsPO> crossPhaseLightsPOList = crossPhaseLightsMapper.selectByPhaseId(coordPhaseID); } else { // 双向
List<Integer> lightIds = crossPhaseLightsPOList.stream() Integer dirCode1 = BaseEnum.SignalDirectionEnum.getCodeByName(dirName1);
.map(CrossPhaseLightsPO::getLightsId) dirCode1 = convertDirCode(dirName1, crossId, dirCode1);
.collect(Collectors.toList()); coordDirList.add(dirCode1);
List<CrossLaneLightsPO> crossLaneLightsPOList = baseCrossLaneLightsMapper.selectByLightIds(lightIds); Integer dirCode2 = BaseEnum.SignalDirectionEnum.getCodeByName(dirName2);
List<String> laneIds = crossLaneLightsPOList.stream() dirCode2 = convertDirCode(dirName1, crossId, dirCode2);
.map(CrossLaneLightsPO::getLaneId) coordDirList.add(dirCode2);
.collect(Collectors.toList()); }
List<CrossBaseLaneInfoPO> lanePOList = crossBaseLaneInfoMapper.selectBatchIds(laneIds);
// 构造方向+转向列表 int currentSeconds = (int) (timeStamp / 1000);
List<List<Integer>> dirTurnList = new ArrayList<>(); int preSeconds = (int) (currentSeconds - 60 * 5);
for (CrossBaseLaneInfoPO lanePO : lanePOList) { List<CrossDirDataHistPO> crossDirDataHistPOList =
Integer dir = lanePO.getDir(); crossDirDataHistMapper.selectByCrossIdAndStartEnd(crossId, preSeconds, currentSeconds);
Integer turn = lanePO.getTurn();
List<Integer> dirTurn = new ArrayList<>(); greenwaveCrossMetricsVO.setNoparkPassRate(calcNoparkPassRate(crossDirDataHistPOList, coordDirList));
dirTurn.add(dir); greenwaveCrossMetricsVO.setUncoordinatePhaseQueue(
dirTurn.add(turn); calcUncoordinatePhaseQueue(crossDirDataHistPOList, coordDirList));
dirTurnList.add(dirTurn); Double nextCrossLen = greenwaveCrossPO.getNextCrossLen();
} greenwaveCrossMetricsVO.setTrvalTime(calcTravelTime(crossDirDataHistPOList, coordDirList, nextCrossLen));
// 计算指标
List<CrossTurnDataHistPO> listForNoPark = new ArrayList<>();
for (List<Integer> dirTurn : dirTurnList) {
Integer dir = dirTurn.get(0);
Integer turnInt = dirTurn.get(1);
String turn = TurnConvertEnum.getCodeByKey(turnInt);
CrossTurnDataHistPO noPark =
crossTurnDataHistMapper.selectNoPark(currentCrossId, dir, turn, currentSeconds, preSeconds);
if (noPark != null) {
listForNoPark.add(noPark);
}
}
List<CrossTurnDataHistPO> allPO =
crossTurnDataHistMapper.selectByCrossId(currentCrossId, currentSeconds, preSeconds);
List<CrossTurnDataHistPO> listForPhaseQueue = getPhaseQueueList(listForNoPark, allPO);
setMetrics(greenwaveCrossMetricsVO, greenwaveCrossPO, listForNoPark, listForPhaseQueue);
res.add(greenwaveCrossMetricsVO); res.add(greenwaveCrossMetricsVO);
} }
return res; return res;
} }
private Integer calcTravelTime(List<CrossDirDataHistPO> crossDirDataHistPOList, List<Integer> coordDirList,
Double nextCrossLen) {
double average = crossDirDataHistPOList.stream()
.filter(po -> po.getInOutType() == 1 && coordDirList.contains(po.getDirType()))
.mapToDouble(CrossDirDataHistPO::getSpeed)
.average()
.orElse(0.0);
if (average != 0.0) {
return (int) (nextCrossLen / average);
} else {
return 0;
}
}
private Integer calcUncoordinatePhaseQueue(
List<CrossDirDataHistPO> crossDirDataHistPOList, List<Integer> coordDirList) {
double average = crossDirDataHistPOList.stream()
.filter(po -> po.getInOutType() == 1 && !coordDirList.contains(po.getDirType()))
.mapToDouble(CrossDirDataHistPO::getQueueLength)
.average()
.orElse(0.0);
return (int) average;
}
private Integer calcNoparkPassRate(List<CrossDirDataHistPO> crossDirDataHistPOList, List<Integer> coordDirList) {
double average = crossDirDataHistPOList.stream()
.filter(po -> po.getInOutType() == 1 && coordDirList.contains(po.getDirType()))
.mapToDouble(CrossDirDataHistPO::getNoStopRate)
.average()
.orElse(0.0);
return (int) (average * 100);
}
private Integer convertDirCode(String dirStr, String crossId, Integer dirCode) {
if (Objects.equals(crossId, "13NF80B5QN0")) {
// 霞景路方向转换
if (Objects.equals(dirStr, "东")) {
dirCode = 2; // 东北
} else if (Objects.equals(dirStr, "西")) {
dirCode = 6; // 西南
}
} else if (Objects.equals(crossId, "13NGH0B5RC0")) {
// 洪山路方向转换
if (Objects.equals(dirStr, "西")) {
dirCode = 6; // 西南
}
}
return dirCode;
}
private List<CrossTurnDataHistPO> getPhaseQueueList( private List<CrossTurnDataHistPO> getPhaseQueueList(
List<CrossTurnDataHistPO> listForNoPark, List<CrossTurnDataHistPO> allPO) { List<CrossTurnDataHistPO> listForNoPark, List<CrossTurnDataHistPO> allPO) {
// 去除协调相位,用于计算非协调相位二次排队 // 去除协调相位,用于计算非协调相位二次排队
...@@ -1010,7 +1055,22 @@ public class TrendServiceImpl implements TrendService { ...@@ -1010,7 +1055,22 @@ public class TrendServiceImpl implements TrendService {
private List<GreenWaveCrossMonitorVO> buildRes(List<GreenwaveCrossPO> greenwaveCrossPOList) { private List<GreenWaveCrossMonitorVO> buildRes(List<GreenwaveCrossPO> greenwaveCrossPOList) {
List<GreenWaveCrossMonitorVO> res = new ArrayList<>(); List<GreenWaveCrossMonitorVO> res = new ArrayList<>();
for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOList) {
// 根据路口ID去重,并按路口顺序号排序
Map<String, GreenwaveCrossPO> uniqueMap = greenwaveCrossPOList.stream()
.collect(Collectors.toMap(
GreenwaveCrossPO::getCrossId, // 使用crossId作为键
Function.identity(), // 使用对象本身作为值
(existing, replacement) -> existing)); // 如果有重复的key, 保留第一个
// 从uniqueMap中获取去重后的记录列表
List<GreenwaveCrossPO> uniqueList = new ArrayList<>(uniqueMap.values());
// 根据sort属性对uniqueList进行排序
uniqueList.sort(Comparator.comparingInt(GreenwaveCrossPO::getSort));
for (GreenwaveCrossPO greenwaveCrossPO : uniqueList) {
GreenWaveCrossMonitorVO greenWaveCrossMonitorVO = new GreenWaveCrossMonitorVO(); GreenWaveCrossMonitorVO greenWaveCrossMonitorVO = new GreenWaveCrossMonitorVO();
String crossId = greenwaveCrossPO.getCrossId(); String crossId = greenwaveCrossPO.getCrossId();
...@@ -1041,8 +1101,6 @@ public class TrendServiceImpl implements TrendService { ...@@ -1041,8 +1101,6 @@ public class TrendServiceImpl implements TrendService {
List<AbnormalCrossDetailVO.DirDataElement> dirData = new ArrayList<>(); List<AbnormalCrossDetailVO.DirDataElement> dirData = new ArrayList<>();
// 获取当前时间之前40分钟的10位时间戳 // 获取当前时间之前40分钟的10位时间戳
long currentSeconds = DateUtil.currentSeconds(); long currentSeconds = DateUtil.currentSeconds();
// todo 测试,当前时间固定为 1676082536
currentSeconds = 1676082536;
long preSeconds = currentSeconds - 40 * 60; long preSeconds = currentSeconds - 40 * 60;
List<CrossDirDataHistPO> crossDirDataHistPOList = List<CrossDirDataHistPO> crossDirDataHistPOList =
crossDirDataHistMapper.selectByCrossIdAndTimestamp(crossId, preSeconds); crossDirDataHistMapper.selectByCrossIdAndTimestamp(crossId, preSeconds);
......
...@@ -78,10 +78,7 @@ ...@@ -78,10 +78,7 @@
on t1.cross_id = t2.id on t1.cross_id = t2.id
<where> <where>
<if test="status != null"> <if test="status != null">
and (t1.status = #{status} and t1.status = #{status}
<if test="status == 1"> and t1.is_unbalance = 1 </if>
<if test="status == 2"> and t1.is_congestion = 1 </if>
<if test="status == 3"> and t1.is_spillover = 1 </if>)
</if> </if>
<if test="name != null and name != ''"> <if test="name != null and name != ''">
and t2.name like concat('%',#{name},'%') and t2.name like concat('%',#{name},'%')
......
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