Commit 1e879825 authored by hanbing's avatar hanbing

[update] 干线评价--修改干线方案获取方式

parent 64e0f480
package net.wanji.opt.bo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author Kent HAN
* @date 2023/6/9 13:52
*/
@Data
@ApiModel(value = "GreenwaveNameBO", description = "绿波名称")
public class GreenwaveNameBO {
@ApiModelProperty(value = "绿波名称")
private String greenwaveName;
}
...@@ -14,8 +14,8 @@ import java.util.Date; ...@@ -14,8 +14,8 @@ import java.util.Date;
@Data @Data
@ApiModel(value = "MainlineSchemeEvaluateBO", description = "干线方案评价") @ApiModel(value = "MainlineSchemeEvaluateBO", description = "干线方案评价")
public class MainlineSchemeEvaluateBO { public class MainlineSchemeEvaluateBO {
@ApiModelProperty(value = "绿波ID") @ApiModelProperty(value = "方案名称")
private Integer greenwaveId; private String greenwaveName;
@ApiModelProperty(value = "方向名称") @ApiModelProperty(value = "方向名称")
private String dirName; private String dirName;
......
...@@ -66,7 +66,7 @@ public class MainlineEvaluateController { ...@@ -66,7 +66,7 @@ public class MainlineEvaluateController {
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = MainlineSchemeAnalysisVO.class), @ApiResponse(code = 200, message = "OK", response = MainlineSchemeAnalysisVO.class),
}) })
public JsonViewObject mainlineSchemeAnalysis(@RequestBody MainlineSchemeAnalysisBO bo) { public JsonViewObject mainlineSchemeAnalysis(@RequestBody MainlineSchemeAnalysisBO bo) throws ParseException {
MainlineSchemeAnalysisVO res = mainlineEvaluateService.mainlineSchemeAnalysis(bo); MainlineSchemeAnalysisVO res = mainlineEvaluateService.mainlineSchemeAnalysis(bo);
return JsonViewObject.newInstance().success(res); return JsonViewObject.newInstance().success(res);
} }
......
...@@ -8,6 +8,7 @@ import net.wanji.databus.bo.CrossIdBO; ...@@ -8,6 +8,7 @@ import net.wanji.databus.bo.CrossIdBO;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.bo.GreenwaveIdAndTimeStampBO; import net.wanji.opt.bo.GreenwaveIdAndTimeStampBO;
import net.wanji.opt.bo.GreenwaveIdBO; import net.wanji.opt.bo.GreenwaveIdBO;
import net.wanji.opt.bo.GreenwaveNameBO;
import net.wanji.opt.bo.SaveGreenwaveStrategyBO; import net.wanji.opt.bo.SaveGreenwaveStrategyBO;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO; import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.EventAlarmDTO; import net.wanji.opt.dto.trend.EventAlarmDTO;
...@@ -73,8 +74,8 @@ public class TrendController { ...@@ -73,8 +74,8 @@ public class TrendController {
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenwaveDetailVO.class), @ApiResponse(code = 200, message = "OK", response = GreenwaveDetailVO.class),
}) })
public JsonViewObject greenwaveDetail(@RequestBody GreenwaveIdBO greenwaveIdBO) { public JsonViewObject greenwaveDetail(@RequestBody GreenwaveNameBO bo) {
GreenwaveDetailVO res = trendService.greenwaveDetail(greenwaveIdBO); GreenwaveDetailVO res = trendService.greenwaveDetail(bo);
return JsonViewObject.newInstance().success(res); return JsonViewObject.newInstance().success(res);
} }
......
package net.wanji.opt.dto;
import lombok.Data;
/**
* @author Kent HAN
* @date 2022/12/20 10:17
*/
@Data
public class GreenwaveInSectionDTO {
private boolean greenwaveInSection;
private String planName;
private Integer planId;
private String startTime;
private String endTime;
}
package net.wanji.opt.dto;
import lombok.Data;
import net.wanji.databus.dao.entity.GreenwaveHistPO;
import java.util.ArrayList;
import java.util.List;
/**
* 干线方案缓存
* @author Kent HAN
* @date 2022/12/20 10:17
*/
@Data
public class LineSchemeDTO {
// 绿波历史列表
private List<GreenwaveHistPO> greenwaveHistPOList = new ArrayList<>();
// 时段ID
private Integer sectionId;
// 计划ID
private Integer planId;
// 绿波ID
private Integer greenwaveId;
}
...@@ -14,7 +14,7 @@ public interface MainlineEvaluateService { ...@@ -14,7 +14,7 @@ public interface MainlineEvaluateService {
List<MainlineListVO> mainlineList(); List<MainlineListVO> mainlineList();
MainlineSchemeAnalysisVO mainlineSchemeAnalysis(MainlineSchemeAnalysisBO bo); MainlineSchemeAnalysisVO mainlineSchemeAnalysis(MainlineSchemeAnalysisBO bo) throws ParseException;
MainlineSchemeEvaluateVO mainlineSchemeEvaluate(MainlineSchemeEvaluateBO bo); MainlineSchemeEvaluateVO mainlineSchemeEvaluate(MainlineSchemeEvaluateBO bo);
......
...@@ -3,6 +3,7 @@ package net.wanji.opt.service; ...@@ -3,6 +3,7 @@ package net.wanji.opt.service;
import net.wanji.databus.bo.CrossIdBO; import net.wanji.databus.bo.CrossIdBO;
import net.wanji.opt.bo.GreenwaveIdAndTimeStampBO; import net.wanji.opt.bo.GreenwaveIdAndTimeStampBO;
import net.wanji.opt.bo.GreenwaveIdBO; import net.wanji.opt.bo.GreenwaveIdBO;
import net.wanji.opt.bo.GreenwaveNameBO;
import net.wanji.opt.bo.SaveGreenwaveStrategyBO; import net.wanji.opt.bo.SaveGreenwaveStrategyBO;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO; import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO; import net.wanji.opt.dto.trend.GreenwaveListDTO;
...@@ -32,7 +33,7 @@ public interface TrendService { ...@@ -32,7 +33,7 @@ public interface TrendService {
List<GreenwaveRunMonitorVO> greenwaveRunMonitor(GreenwaveIdBO greenwaveIdBO); List<GreenwaveRunMonitorVO> greenwaveRunMonitor(GreenwaveIdBO greenwaveIdBO);
GreenwaveDetailVO greenwaveDetail(GreenwaveIdBO greenwaveIdBO); GreenwaveDetailVO greenwaveDetail(GreenwaveNameBO greenwaveNameBO);
List<GreenwaveCrossMetricsVO> greenwaveCrossMetrics(GreenwaveIdAndTimeStampBO greenwaveIdAndTimeStampBO); List<GreenwaveCrossMetricsVO> greenwaveCrossMetrics(GreenwaveIdAndTimeStampBO greenwaveIdAndTimeStampBO);
......
...@@ -16,6 +16,8 @@ import net.wanji.opt.bo.*; ...@@ -16,6 +16,8 @@ import net.wanji.opt.bo.*;
import net.wanji.opt.dao.mapper.strategy.SceneStrategyMapper; import net.wanji.opt.dao.mapper.strategy.SceneStrategyMapper;
import net.wanji.opt.dao.mapper.strategy.StrategyMapper; import net.wanji.opt.dao.mapper.strategy.StrategyMapper;
import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper; import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper;
import net.wanji.opt.dto.GreenwaveInSectionDTO;
import net.wanji.opt.dto.LineSchemeDTO;
import net.wanji.opt.po.strategy.SceneStrategyPO; import net.wanji.opt.po.strategy.SceneStrategyPO;
import net.wanji.opt.po.strategy.StrategyPO; import net.wanji.opt.po.strategy.StrategyPO;
import net.wanji.opt.service.MainlineEvaluateService; import net.wanji.opt.service.MainlineEvaluateService;
...@@ -27,10 +29,10 @@ import org.springframework.stereotype.Service; ...@@ -27,10 +29,10 @@ import org.springframework.stereotype.Service;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.ToDoubleFunction; import java.util.function.ToDoubleFunction;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -56,17 +58,24 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -56,17 +58,24 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
private final StrategyMapper strategyMapper; private final StrategyMapper strategyMapper;
private final BaseCrossSectionMapper baseCrossSectionMapper; private final BaseCrossSectionMapper baseCrossSectionMapper;
private final RidInfoMapper ridInfoMapper; private final RidInfoMapper ridInfoMapper;
private final CrossPlanMapper crossPlanMapper;
private final BaseCrossPlanMapper baseCrossPlanMapper;
private final BaseCrossSchemeMapper baseCrossSchemeMapper;
SimpleDateFormat hourMinuteFormat = new SimpleDateFormat("HH:mm"); SimpleDateFormat hourMinuteFormat = new SimpleDateFormat("HH:mm");
SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat chineseDayFormat = new SimpleDateFormat("M月d日");
SimpleDateFormat dateHourMinuteFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); SimpleDateFormat dateHourMinuteFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 干线方案缓存 <干线名:干线方案对象>
public static Map<String, LineSchemeDTO> lineSchemeBuffer = new HashMap<>();
public MainlineEvaluateServiceImpl(@Qualifier("baseCrossDirInfoMapper") BaseCrossDirInfoMapper baseCrossDirInfoMapper, public MainlineEvaluateServiceImpl(@Qualifier("baseCrossDirInfoMapper") BaseCrossDirInfoMapper baseCrossDirInfoMapper,
@Qualifier("baseCrossTurnInfoMapper") BaseCrossTurnInfoMapper baseCrossTurnInfoMapper, @Qualifier("baseCrossTurnInfoMapper") BaseCrossTurnInfoMapper baseCrossTurnInfoMapper,
CrossBaseLaneInfoMapper crossBaseLaneInfoMapper, CrossBaseLaneInfoMapper crossBaseLaneInfoMapper,
@Qualifier("laneInfoMapper") LaneInfoMapper laneInfoMapper, @Qualifier("laneInfoMapper") LaneInfoMapper laneInfoMapper,
CrossDirDataHistMapper crossDirDataHistMapper, CrossDataHistMapper crossDataHistMapper, CrossTurnDataHistMapper crossTurnDataHistMapper, CrossLaneDataHistMapper crossLaneDataHistMapper, @Qualifier("greenwaveInfoMapper") GreenwaveInfoMapper greenwaveInfoMapper, @Qualifier("greenwaveHistMapper") GreenwaveHistMapper greenwaveHistMapper, @Qualifier("greenwaveCrossMapper") GreenwaveCrossMapper greenwaveCrossMapper, @Qualifier("baseCrossInfoMapper") BaseCrossInfoMapper baseCrossInfoMapper, @Qualifier("greenwaveSceneMapper") GreenwaveSceneMapper greenwaveSceneMapper, @Qualifier("sceneStrategyMapper") SceneStrategyMapper sceneStrategyMapper, @Qualifier("strategyMapper") StrategyMapper strategyMapper, @Qualifier("baseCrossSectionMapper") BaseCrossSectionMapper baseCrossSectionMapper, @Qualifier("ridInfoMapper") RidInfoMapper ridInfoMapper) { CrossDirDataHistMapper crossDirDataHistMapper, CrossDataHistMapper crossDataHistMapper, CrossTurnDataHistMapper crossTurnDataHistMapper, CrossLaneDataHistMapper crossLaneDataHistMapper, @Qualifier("greenwaveInfoMapper") GreenwaveInfoMapper greenwaveInfoMapper, @Qualifier("greenwaveHistMapper") GreenwaveHistMapper greenwaveHistMapper, @Qualifier("greenwaveCrossMapper") GreenwaveCrossMapper greenwaveCrossMapper, @Qualifier("baseCrossInfoMapper") BaseCrossInfoMapper baseCrossInfoMapper, @Qualifier("greenwaveSceneMapper") GreenwaveSceneMapper greenwaveSceneMapper, @Qualifier("sceneStrategyMapper") SceneStrategyMapper sceneStrategyMapper, @Qualifier("strategyMapper") StrategyMapper strategyMapper, @Qualifier("baseCrossSectionMapper") BaseCrossSectionMapper baseCrossSectionMapper, @Qualifier("ridInfoMapper") RidInfoMapper ridInfoMapper, CrossPlanMapper crossPlanMapper, @Qualifier("baseCrossPlanMapper") BaseCrossPlanMapper baseCrossPlanMapper, @Qualifier("baseCrossSchemeMapper") BaseCrossSchemeMapper baseCrossSchemeMapper) {
this.baseCrossDirInfoMapper = baseCrossDirInfoMapper; this.baseCrossDirInfoMapper = baseCrossDirInfoMapper;
this.baseCrossTurnInfoMapper = baseCrossTurnInfoMapper; this.baseCrossTurnInfoMapper = baseCrossTurnInfoMapper;
this.laneInfoMapper = laneInfoMapper; this.laneInfoMapper = laneInfoMapper;
...@@ -83,6 +92,9 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -83,6 +92,9 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
this.strategyMapper = strategyMapper; this.strategyMapper = strategyMapper;
this.baseCrossSectionMapper = baseCrossSectionMapper; this.baseCrossSectionMapper = baseCrossSectionMapper;
this.ridInfoMapper = ridInfoMapper; this.ridInfoMapper = ridInfoMapper;
this.crossPlanMapper = crossPlanMapper;
this.baseCrossPlanMapper = baseCrossPlanMapper;
this.baseCrossSchemeMapper = baseCrossSchemeMapper;
} }
@Override @Override
...@@ -579,12 +591,15 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -579,12 +591,15 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
} }
@Override @Override
public MainlineSchemeAnalysisVO mainlineSchemeAnalysis(MainlineSchemeAnalysisBO bo) { public MainlineSchemeAnalysisVO mainlineSchemeAnalysis(MainlineSchemeAnalysisBO bo) throws ParseException {
lineSchemeBuffer.clear();
String mainlineName = bo.getName(); String mainlineName = bo.getName();
Date poStartTime = bo.getStartTime(); Date poStartTime = bo.getStartTime();
Date poEndTime = bo.getEndTime(); Date poEndTime = bo.getEndTime();
String poStartTimeStr = sdf.format(poStartTime); String poStartTimeStr = sdf.format(poStartTime);
String poEndTimeStr = sdf.format(poEndTime); String poEndTimeStr = sdf.format(poEndTime);
int poStartTimeStamp = (int) (poStartTime.getTime() / 1000);
int poEndTimeStamp = (int) (poEndTime.getTime() / 1000);
// 根据时段查询所有发生的绿波 // 根据时段查询所有发生的绿波
List<GreenwaveHistPO> greenwaveHistPOList = greenwaveHistMapper List<GreenwaveHistPO> greenwaveHistPOList = greenwaveHistMapper
.selectByTimeSection(poStartTimeStr, poEndTimeStr); .selectByTimeSection(poStartTimeStr, poEndTimeStr);
...@@ -603,16 +618,93 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -603,16 +618,93 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
MainlineSchemeAnalysisVO res = new MainlineSchemeAnalysisVO(); MainlineSchemeAnalysisVO res = new MainlineSchemeAnalysisVO();
res.setSceneData(calcSceneData(filteredList)); res.setSceneData(calcSceneData(filteredList));
res.setCrossData(calcCrossData(filteredList)); res.setCrossData(calcCrossData(filteredList, lineSchemeBuffer));
res.setEvaluateData(calcEvaluateData(filteredList)); res.setEvaluateData(calcEvaluateData(filteredList, lineSchemeBuffer, poStartTimeStamp, poEndTimeStamp));
res.setGreenwaveData(buildGreenwaveData(filteredList)); // 时段合并
mergeLineSchemeBuffer(lineSchemeBuffer, mainlineName);
res.setGreenwaveData(buildGreenwaveData(lineSchemeBuffer));
return res; return res;
} }
private void mergeLineSchemeBuffer(Map<String, LineSchemeDTO> lineSchemeBuffer, String mainlineName) {
if (mainlineName.contains("转山西路至霞景路")) {
// 工作日合并07:00-09:00,09:00-16:00,21:30-23:59
// 周末和节假日合并13:30-20:00,21:30-23:59
Map<String, LineSchemeDTO> mergedRecords = new HashMap<>();
Iterator<String> iterator = lineSchemeBuffer.keySet().iterator();
while (iterator.hasNext()){
String key = iterator.next();
String[] keyParts = key.split(" ");
String timeRange = keyParts[keyParts.length - 1];
String[] times = timeRange.split("-");
int startTime = timeToInt(times[0]);
int endTime = timeToInt(times[1]);
boolean isWeekday = key.contains("工作日");
List<int[]> mergingPeriods = getMergingPeriods(isWeekday);
for (int[] mergingPeriod : mergingPeriods) {
if (isOverlapping(startTime, endTime, mergingPeriod[0], mergingPeriod[1])) {
startTime = Math.min(startTime, mergingPeriod[0]);
endTime = Math.max(endTime, mergingPeriod[1]);
String newKey = constructNewKey(key, intToTime(startTime), intToTime(endTime));
if (mergedRecords.containsKey(newKey)) {
LineSchemeDTO existingDto = mergedRecords.get(newKey);
existingDto.getGreenwaveHistPOList().addAll(lineSchemeBuffer.get(key).getGreenwaveHistPOList());
iterator.remove();
} else {
mergedRecords.put(newKey, lineSchemeBuffer.get(key));
iterator.remove();
}
}
}
}
lineSchemeBuffer.putAll(mergedRecords);
}
}
private int timeToInt(String time) {
String[] parts = time.split(":");
return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]);
}
private List<int[]> getMergingPeriods(boolean isWeekday) {
if (isWeekday) {
return Arrays.asList(
new int[] {timeToInt("07:00"), timeToInt("09:00")},
new int[] {timeToInt("09:00"), timeToInt("16:00")},
new int[] {timeToInt("21:30"), timeToInt("23:59")}
);
} else {
return Arrays.asList(
new int[] {timeToInt("13:30"), timeToInt("20:00")},
new int[] {timeToInt("21:30"), timeToInt("23:59")}
);
}
}
private boolean isOverlapping(int start1, int end1, int start2, int end2) {
return (start1 < end2 && end1 > start2);
}
private static String constructNewKey(String oldKey, String newStartTime, String newEndTime) {
String[] keyParts = oldKey.split(" ");
keyParts[keyParts.length - 1] = newStartTime + "-" + newEndTime;
return String.join(" ", keyParts);
}
private static String intToTime(int time) {
return String.format("%02d:%02d", time / 60, time % 60);
}
@Override @Override
public MainlineSchemeEvaluateVO mainlineSchemeEvaluate(MainlineSchemeEvaluateBO bo) { public MainlineSchemeEvaluateVO mainlineSchemeEvaluate(MainlineSchemeEvaluateBO bo) {
Integer greenwaveId = bo.getGreenwaveId(); String greenwaveName = bo.getGreenwaveName();
LineSchemeDTO lineSchemeDTO = lineSchemeBuffer.get(greenwaveName);
Integer greenwaveId = lineSchemeDTO.getGreenwaveId();
String dirName = bo.getDirName(); String dirName = bo.getDirName();
String metricName = bo.getMetricName(); String metricName = bo.getMetricName();
Date boStartTime = bo.getStartTime(); Date boStartTime = bo.getStartTime();
...@@ -620,11 +712,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -620,11 +712,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
MainlineSchemeEvaluateVO res = new MainlineSchemeEvaluateVO(); MainlineSchemeEvaluateVO res = new MainlineSchemeEvaluateVO();
GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectById(greenwaveId); String[] split = greenwaveName.split(" "); // 旅游路 东向西 转山西路至霞景路路段:正向绿波 工作日 07:00-09:00
Integer sectionId = greenwaveInfoPO.getSectionId(); String s = split[split.length - 1];
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId); String[] split1 = s.split("-");
String startHourMinuteStr = crossSectionPO.getStartTime(); String startHourMinuteStr = split1[0];
String endHourMinuteStr = crossSectionPO.getEndTime(); String endHourMinuteStr = split1[1];
res.setTimeSection(startHourMinuteStr + "-" + endHourMinuteStr); res.setTimeSection(startHourMinuteStr + "-" + endHourMinuteStr);
// 确定控制策略 // 确定控制策略
...@@ -664,7 +756,8 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -664,7 +756,8 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
String[] split = greenwaveName.split(" "); String[] split = greenwaveName.split(" ");
String dirStr = split[1]; String dirStr = split[1];
String[] split1 = dirStr.split("向"); String[] split1 = dirStr.split("向");
GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectByName(greenwaveName); String lineName = split[0] + " " + split[1] + " " + split[2];
GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectByName(lineName);
Integer dir = greenwaveInfoPO.getDir(); Integer dir = greenwaveInfoPO.getDir();
List<Integer> coordDirCodeList = new ArrayList<>(); List<Integer> coordDirCodeList = new ArrayList<>();
...@@ -1216,9 +1309,19 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1216,9 +1309,19 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
private List<GreenwaveDetailVO.GreenwaveCross> buildGreenwaveCrossList(Integer greenwaveId) { private List<GreenwaveDetailVO.GreenwaveCross> buildGreenwaveCrossList(Integer greenwaveId) {
List<GreenwaveDetailVO.GreenwaveCross> res = new ArrayList<>(); List<GreenwaveDetailVO.GreenwaveCross> res = new ArrayList<>();
List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId); List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId);
int size = greenwaveCrossList.size(); // 按唯一路口ID过滤
Map<String, GreenwaveCrossPO> uniqueCrossIdMap = greenwaveCrossList.stream()
.collect(Collectors.toMap(
GreenwaveCrossPO::getCrossId,
Function.identity(),
(existing, replacement) -> existing
));
List<GreenwaveCrossPO> filteredList = new ArrayList<>(uniqueCrossIdMap.values());
int size = filteredList.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
GreenwaveCrossPO greenwaveCrossPO = greenwaveCrossList.get(i); GreenwaveCrossPO greenwaveCrossPO = filteredList.get(i);
GreenwaveDetailVO.GreenwaveCross greenwaveCross = new GreenwaveDetailVO.GreenwaveCross(); GreenwaveDetailVO.GreenwaveCross greenwaveCross = new GreenwaveDetailVO.GreenwaveCross();
String crossId = greenwaveCrossPO.getCrossId(); String crossId = greenwaveCrossPO.getCrossId();
greenwaveCross.setCrossId(crossId); greenwaveCross.setCrossId(crossId);
...@@ -1244,19 +1347,19 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1244,19 +1347,19 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
return res; return res;
} }
private List<MainlineSchemeAnalysisVO.GreenwaveData> buildGreenwaveData(List<GreenwaveHistPO> filteredList) { private List<MainlineSchemeAnalysisVO.GreenwaveData> buildGreenwaveData(
Map<String, LineSchemeDTO> lineSchemeBuffer) {
List<MainlineSchemeAnalysisVO.GreenwaveData> res = new ArrayList<>(); List<MainlineSchemeAnalysisVO.GreenwaveData> res = new ArrayList<>();
List<GreenwaveHistPO> distinctList = filteredList.stream()
.filter(distinctByKey(GreenwaveHistPO::getGreenwaveName))
.collect(Collectors.toList());
for (GreenwaveHistPO greenwaveHistPO : distinctList) { for (Map.Entry<String, LineSchemeDTO> entry : lineSchemeBuffer.entrySet()) {
MainlineSchemeAnalysisVO.GreenwaveData greenwaveData = new MainlineSchemeAnalysisVO.GreenwaveData(); MainlineSchemeAnalysisVO.GreenwaveData greenwaveData = new MainlineSchemeAnalysisVO.GreenwaveData();
greenwaveData.setName(greenwaveHistPO.getGreenwaveName()); String lineSchemeName = entry.getKey();
greenwaveData.setGreenwaveId(greenwaveHistPO.getId()); greenwaveData.setName(lineSchemeName);
LineSchemeDTO value = entry.getValue();
Integer greenwaveId = greenwaveHistPO.getId(); Integer greenwaveId = value.getGreenwaveId();
greenwaveData.setDirList(buildDirList(greenwaveId)); greenwaveData.setGreenwaveId(greenwaveId);
greenwaveData.setDirList(buildDirList(lineSchemeName));
res.add(greenwaveData); res.add(greenwaveData);
} }
...@@ -1264,12 +1367,14 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1264,12 +1367,14 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
return res; return res;
} }
private List<MainlineSchemeAnalysisVO.DirectionList> buildDirList(Integer greenwaveId) { private List<MainlineSchemeAnalysisVO.DirectionList> buildDirList(String lineSchemeName) {
GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectById(greenwaveId); String[] split = lineSchemeName.split(" "); // 旅游路 东向西 转山西路至霞景路路段:正向绿波 工作日 19:00-20:00
String greenwaveName = split[0] + " " + split[1] + " " + split[2];
GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectByName(greenwaveName);
Integer greenwaveId = greenwaveInfoPO.getId();
List<MainlineSchemeAnalysisVO.DirectionList> res = new ArrayList<>(); List<MainlineSchemeAnalysisVO.DirectionList> res = new ArrayList<>();
String greenwaveName = greenwaveInfoPO.getName();
String[] split = greenwaveName.split(" ");
String dirName = split[1]; String dirName = split[1];
Integer coordinateDir = greenwaveInfoPO.getDir(); Integer coordinateDir = greenwaveInfoPO.getDir();
...@@ -1394,12 +1499,13 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1394,12 +1499,13 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
return input; return input;
} }
private <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { private List<String> calcEvaluateData(
Set<Object> seen = ConcurrentHashMap.newKeySet(); List<GreenwaveHistPO> filteredList, Map<String, LineSchemeDTO> lineSchemeBuffer, int poStartTimeStamp,
return t -> seen.add(keyExtractor.apply(t)); int poEndTimeStamp) {
} List<CrossDataHistPO> baseCrossDataHistPOList = crossDataHistMapper.selectByStartEnd(poStartTimeStamp, poEndTimeStamp);
List<GreenwaveCrossPO> baseGreenwaveCrossPOList = greenwaveCrossMapper.selectAll();
List<BaseCrossInfoPO> baseCrossInfoPOList = baseCrossInfoMapper.selectAll();
private List<String> calcEvaluateData(List<GreenwaveHistPO> filteredList) {
int qualified = 0; int qualified = 0;
int notQualified = 0; int notQualified = 0;
for (GreenwaveHistPO greenwaveHistPO : filteredList) { for (GreenwaveHistPO greenwaveHistPO : filteredList) {
...@@ -1414,25 +1520,32 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1414,25 +1520,32 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
// 确定评价 // 确定评价
// 获取时段 // 获取时段
Integer sectionId = greenwaveHistPO.getSectionId(); Date gmtModified = greenwaveHistPO.getGmtModified();
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId); String matchingKey = findKey(lineSchemeBuffer, greenwaveId, gmtModified);
String startHourMinuteStr = crossSectionPO.getStartTime(); Pattern pattern = Pattern.compile("(\\d{2}:\\d{2})-(\\d{2}:\\d{2})");
String endHourMinuteStr = crossSectionPO.getEndTime(); Matcher matcher = pattern.matcher(matchingKey);
matcher.find();
String startHourMinuteStr = matcher.group(1);
String endHourMinuteStr = matcher.group(2);
Date day = greenwaveHistPO.getGmtModified(); Date day = greenwaveHistPO.getGmtModified();
Date startDate = combineDateAndTime(day, startHourMinuteStr); Date startDate = combineDateAndTime(day, startHourMinuteStr);
Date endDate = combineDateAndTime(day, endHourMinuteStr); Date endDate = combineDateAndTime(day, endHourMinuteStr);
// 获取路口 // 获取路口
List<BaseCrossInfoPO> crossInfoPOList = getGreenwaveCross(greenwaveId); List<BaseCrossInfoPO> crossInfoPOList = getGreenwaveCross(
greenwaveId, baseGreenwaveCrossPOList, baseCrossInfoPOList);
// 获取路口历史数据 // 获取路口历史数据
List<String> crossIdList = crossInfoPOList.stream() List<String> crossIdList = crossInfoPOList.stream()
.map(BaseCrossInfoPO::getId) .map(BaseCrossInfoPO::getId)
.collect(Collectors.toList()); .collect(Collectors.toList());
int startTimeStamp = (int) (startDate.getTime() / 1000); int startTimeStamp = (int) (startDate.getTime() / 1000);
int endTimeStamp = (int) (endDate.getTime() / 1000); int endTimeStamp = (int) (endDate.getTime() / 1000);
List<CrossDataHistPO> crossDataHistPOList = crossDataHistMapper List<CrossDataHistPO> crossDataHistPOList = baseCrossDataHistPOList.stream()
.selectByCrossIdsAndTimestamp(crossIdList, startTimeStamp, endTimeStamp); .filter(po -> po.getBatchTime() >= startTimeStamp && po.getBatchTime() <= endTimeStamp)
.filter(po -> crossIdList.contains(po.getCrossId()))
.collect(Collectors.toList());
// 判断时段内的饱和度 // 判断时段内的饱和度
double saturation = crossDataHistPOList.stream() double saturation = crossDataHistPOList.stream()
.mapToDouble(CrossDataHistPO::getSturation) .mapToDouble(CrossDataHistPO::getSturation)
...@@ -1498,6 +1611,27 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1498,6 +1611,27 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
return res; return res;
} }
private String findKey(Map<String, LineSchemeDTO> lineSchemeBuffer, Integer greenwaveId, Date gmtModified) {
for (Map.Entry<String, LineSchemeDTO> entry : lineSchemeBuffer.entrySet()) {
String key = entry.getKey();
LineSchemeDTO lineSchemeDTO = entry.getValue();
if (lineSchemeDTO != null) {
List<GreenwaveHistPO> greenwaveHistPOList = lineSchemeDTO.getGreenwaveHistPOList();
if (greenwaveHistPOList != null) {
for (GreenwaveHistPO greenwaveHistPO : greenwaveHistPOList) {
if (greenwaveHistPO != null &&
Objects.equals(greenwaveHistPO.getId(), greenwaveId) &&
Objects.equals(greenwaveHistPO.getGmtModified(), gmtModified)) {
return key;
}
}
}
}
}
return null;
}
private StrategyPO getStrategyPO(Integer greenwaveId) { private StrategyPO getStrategyPO(Integer greenwaveId) {
GreenwaveScenePO greenwaveScenePO = greenwaveSceneMapper.selectByGreenwaveId(greenwaveId); GreenwaveScenePO greenwaveScenePO = greenwaveSceneMapper.selectByGreenwaveId(greenwaveId);
Integer sceneId = greenwaveScenePO.getSceneId(); Integer sceneId = greenwaveScenePO.getSceneId();
...@@ -1510,12 +1644,20 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1510,12 +1644,20 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
return strategyPO; return strategyPO;
} }
private List<BaseCrossInfoPO> getGreenwaveCross(Integer greenwaveId) { private List<BaseCrossInfoPO> getGreenwaveCross(
Integer greenwaveId, List<GreenwaveCrossPO> baseGreenwaveCrossPOList,
List<BaseCrossInfoPO> baseCrossInfoPOList) {
List<BaseCrossInfoPO> res = new ArrayList<>(); List<BaseCrossInfoPO> res = new ArrayList<>();
List<GreenwaveCrossPO> greenwaveCrosses = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId); List<GreenwaveCrossPO> greenwaveCrosses = baseGreenwaveCrossPOList.stream()
.filter(po -> Objects.equals(po.getId(), greenwaveId))
.collect(Collectors.toList());
for (GreenwaveCrossPO greenwaveCross : greenwaveCrosses) { for (GreenwaveCrossPO greenwaveCross : greenwaveCrosses) {
String crossId = greenwaveCross.getCrossId(); String crossId = greenwaveCross.getCrossId();
BaseCrossInfoPO baseCrossInfoPO = baseCrossInfoMapper.selectById(crossId); Optional<BaseCrossInfoPO> first = baseCrossInfoPOList.stream()
.filter(po -> Objects.equals(po.getId(), crossId))
.findFirst();
BaseCrossInfoPO baseCrossInfoPO = first.get();
res.add(baseCrossInfoPO); res.add(baseCrossInfoPO);
} }
return res; return res;
...@@ -1537,27 +1679,55 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1537,27 +1679,55 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
return calendar.getTime(); return calendar.getTime();
} }
private List<MainlineSchemeAnalysisVO.CrossData> calcCrossData(List<GreenwaveHistPO> filteredList) { private List<MainlineSchemeAnalysisVO.CrossData> calcCrossData(
List<GreenwaveHistPO> filteredList, Map<String, LineSchemeDTO> lineSchemeBuffer)
throws ParseException {
List<MainlineSchemeAnalysisVO.CrossData> res = new ArrayList<>(); List<MainlineSchemeAnalysisVO.CrossData> res = new ArrayList<>();
Map<String, Integer> crossTimesMap = new HashMap<>();
// 找出绿波对应的关键路口 // 找出绿波对应的关键路口
Map<Integer, String> greenwaveCrossMap = new HashMap<>(); List<GreenwaveCrossPO> baseGreenwaveCrossPOList = greenwaveCrossMapper.selectByKeyRoute();
for (GreenwaveHistPO greenwaveHistPO : filteredList) { List<CrossSectionPO> baseCrossSectionPOList = baseCrossSectionMapper.selectAll();
Integer greenwaveId = greenwaveHistPO.getId(); List<BaseCrossPlanPO> baseCrossPlanPOList = baseCrossPlanMapper.selectAll();
GreenwaveCrossPO greenwaveCrossPO = greenwaveCrossMapper.selectByGreenwaveIdAndKeyRoute(greenwaveId);
Integer greenId = greenwaveCrossPO.getGreenId();
String crossId = greenwaveCrossPO.getCrossId();
greenwaveCrossMap.put(greenId, crossId);
}
// 统计关键路口次数
Map<String, Integer> crossTimesMap = new HashMap<>();
for (GreenwaveHistPO greenwaveHistPO : filteredList) { for (GreenwaveHistPO greenwaveHistPO : filteredList) {
Integer greenwaveHistPOId = greenwaveHistPO.getId(); Integer histGreenwaveId = greenwaveHistPO.getId();
String crossId = greenwaveCrossMap.get(greenwaveHistPOId); Date histGreenwaveGmtModified = greenwaveHistPO.getGmtModified();
// 所有的关键路口
List<GreenwaveCrossPO> greenwaveCrossPOList = baseGreenwaveCrossPOList.stream()
.filter(po -> Objects.equals(po.getGreenId(), histGreenwaveId))
.collect(Collectors.toList());
for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOList) {
Integer sectionId = greenwaveCrossPO.getSectionId();
String crossId = greenwaveCrossPO.getCrossId();
// 判断绿波历史发生时间是否在时段内
GreenwaveInSectionDTO greenwaveInSectionDTO = isGreenwaveInSection(
histGreenwaveGmtModified, sectionId, baseCrossSectionPOList, baseCrossPlanPOList);
if (greenwaveInSectionDTO.isGreenwaveInSection()) {
crossTimesMap.put(crossId, crossTimesMap.getOrDefault(crossId, 0) + 1); crossTimesMap.put(crossId, crossTimesMap.getOrDefault(crossId, 0) + 1);
String greenwaveName = greenwaveHistPO.getGreenwaveName();
Integer greenwaveId = greenwaveHistPO.getId();
String planName = greenwaveInSectionDTO.getPlanName();
Integer planId = greenwaveInSectionDTO.getPlanId();
String startTime = greenwaveInSectionDTO.getStartTime();
String endTime = greenwaveInSectionDTO.getEndTime();
String lineSchemeName = greenwaveName + " " + planName + " " + startTime + "-" + endTime;
LineSchemeDTO lineSchemeDTO = lineSchemeBuffer.getOrDefault(lineSchemeName, new LineSchemeDTO());
List<GreenwaveHistPO> greenwaveHistPOList = lineSchemeDTO.getGreenwaveHistPOList();
greenwaveHistPOList.add(greenwaveHistPO);
lineSchemeDTO.setSectionId(sectionId);
lineSchemeDTO.setPlanId(planId);
lineSchemeDTO.setGreenwaveId(greenwaveId);
lineSchemeBuffer.put(lineSchemeName, lineSchemeDTO);
}
}
} }
// 统计关键路口次数
for (Map.Entry<String, Integer> entry : crossTimesMap.entrySet()) { for (Map.Entry<String, Integer> entry : crossTimesMap.entrySet()) {
MainlineSchemeAnalysisVO.CrossData crossData = new MainlineSchemeAnalysisVO.CrossData(); MainlineSchemeAnalysisVO.CrossData crossData = new MainlineSchemeAnalysisVO.CrossData();
String crossId = entry.getKey(); String crossId = entry.getKey();
...@@ -1571,6 +1741,96 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService { ...@@ -1571,6 +1741,96 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
return res; return res;
} }
private GreenwaveInSectionDTO isGreenwaveInSection(
Date histGreenwaveGmtModified, Integer sectionId, List<CrossSectionPO> baseCrossSectionPOList,
List<BaseCrossPlanPO> baseCrossPlanPOList)
throws ParseException {
GreenwaveInSectionDTO res = new GreenwaveInSectionDTO();
Optional<CrossSectionPO> optCrossSectionPO = baseCrossSectionPOList.stream()
.filter(po -> Objects.equals(po.getId(), sectionId))
.findFirst();
CrossSectionPO crossSectionPO = optCrossSectionPO.get();
Integer planId = crossSectionPO.getPlanId();
Optional<BaseCrossPlanPO> optBaseCrossPlanPO = baseCrossPlanPOList.stream()
.filter(po -> Objects.equals(po.getId(), planId))
.findFirst();
BaseCrossPlanPO baseCrossPlanPO = optBaseCrossPlanPO.get();
String name = baseCrossPlanPO.getName();
if (!name.contains("工作日") && !name.contains("周末")) {
// 特殊日期
Date nameDate = chineseDayFormat.parse(name);
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(histGreenwaveGmtModified);
int month1 = calendar1.get(Calendar.MONTH) + 1; // Calendar.MONTH is 0-based
int day1 = calendar1.get(Calendar.DAY_OF_MONTH);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(nameDate);
int month2 = calendar2.get(Calendar.MONTH) + 1; // Calendar.MONTH is 0-based
int day2 = calendar2.get(Calendar.DAY_OF_MONTH);
if (month1 == month2 && day1 == day2) {
res.setGreenwaveInSection(isGreenwaveHourMinuteInSection(histGreenwaveGmtModified, crossSectionPO, res));
res.setPlanName(name);
res.setPlanId(planId);
} else {
res.setGreenwaveInSection(false);
}
} else if (name.contains("工作日")) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(histGreenwaveGmtModified);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if(dayOfWeek >= Calendar.MONDAY && dayOfWeek <= Calendar.FRIDAY) {
// 判断小时分钟是否交叉
res.setGreenwaveInSection(isGreenwaveHourMinuteInSection(histGreenwaveGmtModified, crossSectionPO, res));
res.setPlanName(name);
res.setPlanId(planId);
} else {
res.setGreenwaveInSection(false);
}
} else if (name.contains("周末")) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(histGreenwaveGmtModified);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if(dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
// 判断小时分钟是否交叉
res.setGreenwaveInSection(isGreenwaveHourMinuteInSection(histGreenwaveGmtModified, crossSectionPO, res));
res.setPlanName(name);
res.setPlanId(planId);
} else {
res.setGreenwaveInSection(false);
}
}
return res;
}
private boolean isGreenwaveHourMinuteInSection
(Date histGreenwaveGmtModified, CrossSectionPO crossSectionPO, GreenwaveInSectionDTO res)
throws ParseException {
String startTime = crossSectionPO.getStartTime();
String endTime = crossSectionPO.getEndTime();
Date startDate = hourMinuteFormat.parse(startTime);
Date endDate = hourMinuteFormat.parse(endTime);
String histTimeStr = hourMinuteFormat.format(histGreenwaveGmtModified);
Date histTime = hourMinuteFormat.parse(histTimeStr);
res.setStartTime(startTime);
res.setEndTime(endTime);
return (histTime.equals(startDate) || histTime.after(startDate)) && histTime.before(endDate);
}
private List<MainlineSchemeAnalysisVO.DirectionData> calcSceneData(List<GreenwaveHistPO> filteredList) { private List<MainlineSchemeAnalysisVO.DirectionData> calcSceneData(List<GreenwaveHistPO> filteredList) {
List<MainlineSchemeAnalysisVO.DirectionData> res = new ArrayList<>(); List<MainlineSchemeAnalysisVO.DirectionData> res = new ArrayList<>();
......
...@@ -13,6 +13,7 @@ import net.wanji.databus.po.*; ...@@ -13,6 +13,7 @@ import net.wanji.databus.po.*;
import net.wanji.databus.vo.AbnormalCrossListVO; import net.wanji.databus.vo.AbnormalCrossListVO;
import net.wanji.opt.bo.GreenwaveIdAndTimeStampBO; import net.wanji.opt.bo.GreenwaveIdAndTimeStampBO;
import net.wanji.opt.bo.GreenwaveIdBO; import net.wanji.opt.bo.GreenwaveIdBO;
import net.wanji.opt.bo.GreenwaveNameBO;
import net.wanji.opt.bo.SaveGreenwaveStrategyBO; import net.wanji.opt.bo.SaveGreenwaveStrategyBO;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper; import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
import net.wanji.opt.dao.mapper.strategy.SceneMapper; import net.wanji.opt.dao.mapper.strategy.SceneMapper;
...@@ -21,6 +22,7 @@ import net.wanji.opt.dao.mapper.strategy.SceneStrategyMapper; ...@@ -21,6 +22,7 @@ import net.wanji.opt.dao.mapper.strategy.SceneStrategyMapper;
import net.wanji.opt.dao.mapper.strategy.StrategyMapper; import net.wanji.opt.dao.mapper.strategy.StrategyMapper;
import net.wanji.opt.dao.mapper.trend.EventAlarmMapper; import net.wanji.opt.dao.mapper.trend.EventAlarmMapper;
import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper; import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper;
import net.wanji.opt.dto.LineSchemeDTO;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO; import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO; import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.po.base.CrossSchemeOptLogPO; import net.wanji.opt.po.base.CrossSchemeOptLogPO;
...@@ -36,6 +38,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -36,6 +38,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -70,6 +73,7 @@ public class TrendServiceImpl implements TrendService { ...@@ -70,6 +73,7 @@ public class TrendServiceImpl implements TrendService {
private final GreenwaveSceneMapper greenwaveSceneMapper; private final GreenwaveSceneMapper greenwaveSceneMapper;
private final SceneStrategyMapper sceneStrategyMapper; private final SceneStrategyMapper sceneStrategyMapper;
private final SceneMapper sceneMapper; private final SceneMapper sceneMapper;
private final BaseCrossPlanMapper baseCrossPlanMapper;
// 用于计算路口状态,key为方向,value为状态 // 用于计算路口状态,key为方向,value为状态
private Map<Integer, Integer> preStatus = new HashMap<Integer, Integer>() {{ private Map<Integer, Integer> preStatus = new HashMap<Integer, Integer>() {{
...@@ -90,7 +94,7 @@ public class TrendServiceImpl implements TrendService { ...@@ -90,7 +94,7 @@ public class TrendServiceImpl implements TrendService {
CrossTurnDataRealtimeMapper crossTurnDataRealtimeMapper, CrossTurnDataRealtimeMapper crossTurnDataRealtimeMapper,
CrossDirDataHistMapper crossDirDataHistMapper, EventAlarmMapper eventAlarmMapper, CrossDirDataHistMapper crossDirDataHistMapper, EventAlarmMapper eventAlarmMapper,
RidInfoMapper ridInfoMapper, BaseCrossDirInfoMapper baseCrossDirInfoMapper, RidInfoMapper ridInfoMapper, BaseCrossDirInfoMapper baseCrossDirInfoMapper,
CrossSchemeOptLogMapper crossSchemeOptLogMapper, GreenwaveCrossMapper greenwaveCrossMapper, CrossDirDataRealtimeMapper crossDirDataRealtimeMapper, GreenwaveHistMapper greenwaveHistMapper, GreenwaveRealtimeMapper greenwaveRealtimeMapper, SceneStrategyIdeaMapper strategyIdeaMapper, StrategyMapper strategyMapper, BaseCrossSchedulesMapper baseCrossSchedulesMapper, BaseCrossSchedulesPlanMapper baseCrossSchedulesPlanMapper, BaseCrossSectionMapper baseCrossSectionMapper, BaseCrossSchemeMapper crossSchemeMapper, BaseCrossSchemeMapper baseCrossSchemeMapper, BaseCrossPhaseMapper baseCrossPhaseMapper, BaseCrossPhaseLightsMapper crossPhaseLightsMapper, BaseCrossLaneLightsMapper baseCrossLaneLightsMapper, CrossBaseLaneInfoMapper crossBaseLaneInfoMapper, CrossTurnDataHistMapper crossTurnDataHistMapper, @Qualifier("greenwaveSceneMapper") GreenwaveSceneMapper greenwaveSceneMapper, @Qualifier("sceneStrategyMapper") SceneStrategyMapper sceneStrategyMapper, @Qualifier("sceneMapper") SceneMapper sceneMapper) { CrossSchemeOptLogMapper crossSchemeOptLogMapper, GreenwaveCrossMapper greenwaveCrossMapper, CrossDirDataRealtimeMapper crossDirDataRealtimeMapper, GreenwaveHistMapper greenwaveHistMapper, GreenwaveRealtimeMapper greenwaveRealtimeMapper, SceneStrategyIdeaMapper strategyIdeaMapper, StrategyMapper strategyMapper, BaseCrossSchedulesMapper baseCrossSchedulesMapper, BaseCrossSchedulesPlanMapper baseCrossSchedulesPlanMapper, BaseCrossSectionMapper baseCrossSectionMapper, BaseCrossSchemeMapper crossSchemeMapper, BaseCrossSchemeMapper baseCrossSchemeMapper, BaseCrossPhaseMapper baseCrossPhaseMapper, BaseCrossPhaseLightsMapper crossPhaseLightsMapper, BaseCrossLaneLightsMapper baseCrossLaneLightsMapper, CrossBaseLaneInfoMapper crossBaseLaneInfoMapper, CrossTurnDataHistMapper crossTurnDataHistMapper, @Qualifier("greenwaveSceneMapper") GreenwaveSceneMapper greenwaveSceneMapper, @Qualifier("sceneStrategyMapper") SceneStrategyMapper sceneStrategyMapper, @Qualifier("sceneMapper") SceneMapper sceneMapper, @Qualifier("baseCrossPlanMapper") BaseCrossPlanMapper baseCrossPlanMapper) {
this.greenwaveInfoMapper = greenwaveInfoMapper; this.greenwaveInfoMapper = greenwaveInfoMapper;
this.baseCrossInfoMapper = baseCrossInfoMapper; this.baseCrossInfoMapper = baseCrossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper; this.crossDataRealtimeMapper = crossDataRealtimeMapper;
...@@ -117,6 +121,7 @@ public class TrendServiceImpl implements TrendService { ...@@ -117,6 +121,7 @@ public class TrendServiceImpl implements TrendService {
this.greenwaveSceneMapper = greenwaveSceneMapper; this.greenwaveSceneMapper = greenwaveSceneMapper;
this.sceneStrategyMapper = sceneStrategyMapper; this.sceneStrategyMapper = sceneStrategyMapper;
this.sceneMapper = sceneMapper; this.sceneMapper = sceneMapper;
this.baseCrossPlanMapper = baseCrossPlanMapper;
} }
@Override @Override
...@@ -371,8 +376,11 @@ public class TrendServiceImpl implements TrendService { ...@@ -371,8 +376,11 @@ public class TrendServiceImpl implements TrendService {
} }
@Override @Override
public GreenwaveDetailVO greenwaveDetail(GreenwaveIdBO greenwaveIdBO) { public GreenwaveDetailVO greenwaveDetail(GreenwaveNameBO greenwaveNameBO) {
Integer greenwaveId = greenwaveIdBO.getGreenwaveId(); String greenwaveName = greenwaveNameBO.getGreenwaveName();
LineSchemeDTO lineSchemeDTO = MainlineEvaluateServiceImpl.lineSchemeBuffer.get(greenwaveName);
Integer greenwaveId = lineSchemeDTO.getGreenwaveId();
GreenwaveDetailVO res = new GreenwaveDetailVO(); GreenwaveDetailVO res = new GreenwaveDetailVO();
GreenwaveRealtimePO greenwaveRealtimePO = greenwaveRealtimeMapper.selectById(greenwaveId); GreenwaveRealtimePO greenwaveRealtimePO = greenwaveRealtimeMapper.selectById(greenwaveId);
GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectById(greenwaveId); GreenwaveInfoPO greenwaveInfoPO = greenwaveInfoMapper.selectById(greenwaveId);
...@@ -408,7 +416,7 @@ public class TrendServiceImpl implements TrendService { ...@@ -408,7 +416,7 @@ public class TrendServiceImpl implements TrendService {
.collect(Collectors.toList()); .collect(Collectors.toList());
res.setStrategySelected(collect); res.setStrategySelected(collect);
// 绿波路口信息 // 绿波路口信息
List<GreenwaveDetailVO.GreenwaveCross> greenwaveCrossList = buildGreenwaveCrossList(greenwaveId); List<GreenwaveDetailVO.GreenwaveCross> greenwaveCrossList = buildGreenwaveCrossList(greenwaveId, greenwaveName);
res.setGreenwaveCrossList(greenwaveCrossList); res.setGreenwaveCrossList(greenwaveCrossList);
// 绿波带 // 绿波带
if (dir == 0) { // 正向 if (dir == 0) { // 正向
...@@ -573,19 +581,29 @@ public class TrendServiceImpl implements TrendService { ...@@ -573,19 +581,29 @@ public class TrendServiceImpl implements TrendService {
return greenwavePoint; return greenwavePoint;
} }
private List<GreenwaveDetailVO.GreenwaveCross> buildGreenwaveCrossList(Integer greenwaveId) { private List<GreenwaveDetailVO.GreenwaveCross> buildGreenwaveCrossList(Integer greenwaveId, String greenwaveName) {
List<GreenwaveDetailVO.GreenwaveCross> res = new ArrayList<>(); List<GreenwaveDetailVO.GreenwaveCross> res = new ArrayList<>();
List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId); List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveId);
Map<String, GreenwaveCrossPO> uniqueCrossIdMap = greenwaveCrossList.stream()
.collect(Collectors.toMap(
GreenwaveCrossPO::getCrossId,
Function.identity(),
(existing, replacement) -> existing
));
List<GreenwaveCrossPO> filteredList = new ArrayList<>(uniqueCrossIdMap.values());
filteredList.sort(Comparator.comparing(GreenwaveCrossPO::getSort));
// 相对相位差列表 // 相对相位差列表
List<Integer> relativeOffsets = greenwaveCrossList.stream() List<Integer> relativeOffsets = filteredList.stream()
.map(GreenwaveCrossPO::getOffset) .map(GreenwaveCrossPO::getOffset)
.collect(Collectors.toList()); .collect(Collectors.toList());
// 绝对相位差列表 // 绝对相位差列表
List<Integer> absoluteOffsets = buildAbsoluteOffsets(relativeOffsets); List<Integer> absoluteOffsets = buildAbsoluteOffsets(relativeOffsets);
int size = greenwaveCrossList.size(); int size = filteredList.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
GreenwaveCrossPO greenwaveCrossPO = greenwaveCrossList.get(i); GreenwaveCrossPO greenwaveCrossPO = filteredList.get(i);
GreenwaveDetailVO.GreenwaveCross greenwaveCross = new GreenwaveDetailVO.GreenwaveCross(); GreenwaveDetailVO.GreenwaveCross greenwaveCross = new GreenwaveDetailVO.GreenwaveCross();
String crossId = greenwaveCrossPO.getCrossId(); String crossId = greenwaveCrossPO.getCrossId();
greenwaveCross.setCrossId(crossId); greenwaveCross.setCrossId(crossId);
...@@ -610,8 +628,15 @@ public class TrendServiceImpl implements TrendService { ...@@ -610,8 +628,15 @@ public class TrendServiceImpl implements TrendService {
greenwaveCross.setOffset(greenwaveCrossPO.getOffset()); greenwaveCross.setOffset(greenwaveCrossPO.getOffset());
// 获取当前方案 // 获取当前方案
Integer sectionId = greenwaveCrossPO.getSectionId(); String[] split = greenwaveName.split(" "); // 旅游路 东向西 转山西路至霞景路路段:正向绿波 工作日 19:00-20:00
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId); String s = split[4];
String[] split1 = s.split("-");
String startTime = split1[0];
// 获取 planId
String planName = split[3];
BaseCrossPlanPO baseCrossPlanPO = baseCrossPlanMapper.selectByCrossIdAndName(crossId, planName);
Integer planId = baseCrossPlanPO.getId();
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectbyStartTimeCrossIdPlanId(startTime, crossId, planId);
if (crossSectionPO == null) { if (crossSectionPO == null) {
throw new RuntimeException("无当前时段方案信息"); throw new RuntimeException("无当前时段方案信息");
} }
......
...@@ -15,7 +15,4 @@ public class GreenwaveHistPO extends GreenwaveRealtimePO{ ...@@ -15,7 +15,4 @@ public class GreenwaveHistPO extends GreenwaveRealtimePO{
@ApiModelProperty(value = "协调方向:0正向;1反向;2双向") @ApiModelProperty(value = "协调方向:0正向;1反向;2双向")
private Integer dir; private Integer dir;
@ApiModelProperty(value = "时段ID")
private Integer sectionId;
} }
...@@ -30,4 +30,6 @@ public interface BaseCrossPlanMapper { ...@@ -30,4 +30,6 @@ public interface BaseCrossPlanMapper {
List<BaseCrossPlanPO> selectByCrossId(String crossId); List<BaseCrossPlanPO> selectByCrossId(String crossId);
BaseCrossPlanPO selectByCrossIdAndPlanNo(@Param("crossId") String crossId, @Param("planNo") String planNo); BaseCrossPlanPO selectByCrossIdAndPlanNo(@Param("crossId") String crossId, @Param("planNo") String planNo);
List<BaseCrossPlanPO> selectAll();
} }
...@@ -30,4 +30,12 @@ public interface BaseCrossSectionMapper { ...@@ -30,4 +30,12 @@ public interface BaseCrossSectionMapper {
List<CrossSectionPO> selectByCrossId(String crossId); List<CrossSectionPO> selectByCrossId(String crossId);
List<CrossSectionPO> selectByCrossIdPlanIdAndSchemeId(String crossId, Integer planId, Integer schemeId); List<CrossSectionPO> selectByCrossIdPlanIdAndSchemeId(String crossId, Integer planId, Integer schemeId);
CrossSectionPO selectByEndTimePlanId(String endTime, Integer planId);
CrossSectionPO selectByStartTimePlanId(String startTime, Integer planId);
List<CrossSectionPO> selectAll();
CrossSectionPO selectbyStartTimeCrossIdPlanId(String startTime, String crossId, Integer planId);
} }
...@@ -30,4 +30,7 @@ public interface CrossDataHistMapper extends BaseMapper<CrossDataHistPO> { ...@@ -30,4 +30,7 @@ public interface CrossDataHistMapper extends BaseMapper<CrossDataHistPO> {
Integer selectCrossEmergencyCount(String crossId, int startStamp, int endStamp); Integer selectCrossEmergencyCount(String crossId, int startStamp, int endStamp);
List<CrossDataHistPO> selectByCrossIdsAndTimestamp(List<String> crossIdList, int startTimeStamp, int endTimeStamp); List<CrossDataHistPO> selectByCrossIdsAndTimestamp(List<String> crossIdList, int startTimeStamp, int endTimeStamp);
List<CrossDataHistPO> selectByStartEnd(int startStamp, int endStamp);
} }
...@@ -22,4 +22,5 @@ public interface CrossPlanMapper { ...@@ -22,4 +22,5 @@ public interface CrossPlanMapper {
List<CrossPlanPO> selectByCrossIdAndPlanNo(@Param("crossId") String crossId, @Param("planNo")Integer planNo); List<CrossPlanPO> selectByCrossIdAndPlanNo(@Param("crossId") String crossId, @Param("planNo")Integer planNo);
CrossPlanPO selectById(Integer planId);
} }
...@@ -13,5 +13,9 @@ import java.util.List; ...@@ -13,5 +13,9 @@ import java.util.List;
public interface GreenwaveCrossMapper { public interface GreenwaveCrossMapper {
List<GreenwaveCrossPO> selectByGreenwaveId(Integer id); List<GreenwaveCrossPO> selectByGreenwaveId(Integer id);
GreenwaveCrossPO selectByGreenwaveIdAndKeyRoute(Integer greenwaveId); List<GreenwaveCrossPO> selectByGreenwaveIdAndKeyRoute(Integer greenwaveId);
List<GreenwaveCrossPO> selectByKeyRoute();
List<GreenwaveCrossPO> selectAll();
} }
...@@ -77,5 +77,11 @@ ...@@ -77,5 +77,11 @@
where cross_id = #{crossId} and plan_no = #{planNo} where cross_id = #{crossId} and plan_no = #{planNo}
</select> </select>
<select id="selectAll" resultType="net.wanji.databus.dao.entity.BaseCrossPlanPO">
select
id,plan_no,name,cross_id,gmt_create,gmt_modified
from t_base_cross_plan
</select>
</mapper> </mapper>
...@@ -81,5 +81,28 @@ ...@@ -81,5 +81,28 @@
where cross_id = #{crossId} and plan_id = #{planId} and scheme_id = #{schemeId} where cross_id = #{crossId} and plan_id = #{planId} and scheme_id = #{schemeId}
</select> </select>
<select id="selectByEndTimePlanId" resultType="net.wanji.databus.dao.entity.CrossSectionPO">
select <include refid="Base_Column_list"/>
from t_base_cross_section
where end_time = #{endTime} and plan_id = #{planId}
</select>
<select id="selectByStartTimePlanId" resultType="net.wanji.databus.dao.entity.CrossSectionPO">
select <include refid="Base_Column_list"/>
from t_base_cross_section
where start_time = #{startTime} and plan_id = #{planId}
</select>
<select id="selectAll" resultType="net.wanji.databus.dao.entity.CrossSectionPO">
select <include refid="Base_Column_list"/>
from t_base_cross_section
</select>
<select id="selectbyStartTimeCrossIdPlanId" resultType="net.wanji.databus.dao.entity.CrossSectionPO">
select <include refid="Base_Column_list"/>
from t_base_cross_section
where start_time = #{startTime} and cross_id = #{crossId} and plan_id = #{planId}
</select>
</mapper> </mapper>
...@@ -124,4 +124,12 @@ ...@@ -124,4 +124,12 @@
order by batch_time order by batch_time
</select> </select>
<select id="selectByStartEnd" resultType="net.wanji.databus.po.CrossDataHistPO">
select <include refid="Base_Column_List"></include>
from t_cross_data_hist
where batch_time <![CDATA[ >= ]]> #{startStamp}
and batch_time <![CDATA[ <= ]]> #{endStamp}
order by batch_time
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -48,5 +48,12 @@ ...@@ -48,5 +48,12 @@
from t_cross_plan from t_cross_plan
where cross_id = #{crossId} and plan_no = #{planNo} where cross_id = #{crossId} and plan_no = #{planNo}
</select> </select>
<select id="selectById" resultType="net.wanji.databus.dao.entity.CrossPlanPO">
select
id,plan_no,name,cross_id,gmt_create,gmt_modified
from t_cross_plan
where id = #{planId}
</select>
</mapper> </mapper>
...@@ -19,5 +19,16 @@ ...@@ -19,5 +19,16 @@
where green_id = #{id} and is_key_route = 1 where green_id = #{id} and is_key_route = 1
</select> </select>
<select id="selectByKeyRoute" resultType="net.wanji.databus.dao.entity.GreenwaveCrossPO">
select <include refid="Base_Column_List"/>
from t_greenwave_cross
where is_key_route = 1
</select>
<select id="selectAll" resultType="net.wanji.databus.dao.entity.GreenwaveCrossPO">
select <include refid="Base_Column_List"/>
from t_greenwave_cross
</select>
</mapper> </mapper>
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