Commit c21f74ae authored by zhoushiguang's avatar zhoushiguang

Merge remote-tracking branch 'origin/master'

parents 1eb81bc8 43740846
...@@ -102,7 +102,7 @@ public class GreenwaveInducesHistController { ...@@ -102,7 +102,7 @@ public class GreenwaveInducesHistController {
greenwaveDirDTO.setStrategyName(o.getStrategyName()); greenwaveDirDTO.setStrategyName(o.getStrategyName());
greenwaveDirDTO.setMinSpeed(o.getMinSpeed()); greenwaveDirDTO.setMinSpeed(o.getMinSpeed());
greenwaveDirDTO.setMinSpeed(o.getMaxSpeed()); greenwaveDirDTO.setMaxSpeed(o.getMaxSpeed());
if (Objects.nonNull(o.getControlOptTimes()) && o.getControlOptTimes().split("\\|").length > 0) { if (Objects.nonNull(o.getControlOptTimes()) && o.getControlOptTimes().split("\\|").length > 0) {
try { try {
String startTime = DateUtil.format(DateUtil.parse(o.getControlOptTimes().split("\\|")[0], Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND), Constants.DATE_FORMAT.E_DATE_FORMAT_TIME); String startTime = DateUtil.format(DateUtil.parse(o.getControlOptTimes().split("\\|")[0], Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND), Constants.DATE_FORMAT.E_DATE_FORMAT_TIME);
...@@ -117,13 +117,13 @@ public class GreenwaveInducesHistController { ...@@ -117,13 +117,13 @@ public class GreenwaveInducesHistController {
} }
//获取诱导屏列表 //获取诱导屏列表
List<InduceDTO> induceDTOList = new ArrayList<>(); List<InduceDTO> induceDTOList = new ArrayList<>();
greenwaveInducesList.stream().filter(l -> Objects.nonNull(l.getGreenId()) && l.getGreenId().equals(o.getGreenId())).forEach(n -> { greenwaveInducesList.stream().filter(l -> Objects.nonNull(l.getGreenId()) && l.getGreenId().equals(o.getGreenId()) && Objects.nonNull(l.getDir()) && l.getDir().equals(o.getDir())).forEach(n -> {
InduceDTO induceDTO = new InduceDTO(); InduceDTO induceDTO = new InduceDTO();
induceDTO.setId(n.getId()); induceDTO.setId(n.getId());
induceDTO.setEquipCode(n.getEquipCode()); induceDTO.setEquipCode(n.getEquipCode());
induceDTO.setStatus(o.getStatus()); induceDTO.setStatus(o.getStatus());
//获取屏幕的设备信息 //获取屏幕的设备信息
List<DeviceInduces> deviceInduces = deviceInducesList.stream().filter(m -> Objects.nonNull(m.getEquipCode()) && m.getEquipCode().equals(n.getEquipCode())).collect(Collectors.toList());// 过滤条件// 收集结果 List<DeviceInduces> deviceInduces = deviceInducesList.stream().filter(m -> Objects.nonNull(m.getEquipCode()) && m.getEquipCode().equals(n.getEquipCode()) ).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(deviceInduces) && deviceInduces.size() > 0) { if (Objects.nonNull(deviceInduces) && deviceInduces.size() > 0) {
induceDTO.setEquipName(deviceInduces.get(0).getEquipName()); induceDTO.setEquipName(deviceInduces.get(0).getEquipName());
induceDTO.setRidDir(n.getDir());// induceDTO.setRidDir(n.getDir());//
...@@ -195,7 +195,7 @@ public class GreenwaveInducesHistController { ...@@ -195,7 +195,7 @@ public class GreenwaveInducesHistController {
greenwaveDirDTO.setStrategyId(o.getStrategyId()); greenwaveDirDTO.setStrategyId(o.getStrategyId());
greenwaveDirDTO.setStrategyName(o.getStrategyName()); greenwaveDirDTO.setStrategyName(o.getStrategyName());
greenwaveDirDTO.setMinSpeed(o.getMinSpeed()); greenwaveDirDTO.setMinSpeed(o.getMinSpeed());
greenwaveDirDTO.setMinSpeed(o.getMaxSpeed()); greenwaveDirDTO.setMaxSpeed(o.getMaxSpeed());
if (Objects.nonNull(o.getControlOptTimes()) && o.getControlOptTimes().split("\\|").length > 0) { if (Objects.nonNull(o.getControlOptTimes()) && o.getControlOptTimes().split("\\|").length > 0) {
try { try {
String startTime = DateUtil.format(DateUtil.parse(o.getControlOptTimes().split("\\|")[0], Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND), Constants.DATE_FORMAT.E_DATE_FORMAT_TIME); String startTime = DateUtil.format(DateUtil.parse(o.getControlOptTimes().split("\\|")[0], Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND), Constants.DATE_FORMAT.E_DATE_FORMAT_TIME);
...@@ -210,7 +210,7 @@ public class GreenwaveInducesHistController { ...@@ -210,7 +210,7 @@ public class GreenwaveInducesHistController {
} }
//获取诱导屏列表 //获取诱导屏列表
List<InduceDTO> induceDTOList = new ArrayList<>(); List<InduceDTO> induceDTOList = new ArrayList<>();
greenwaveInducesList.stream().filter(l -> Objects.nonNull(l.getGreenId()) && l.getGreenId().equals(o.getGreenId())).forEach(n -> { greenwaveInducesList.stream().filter(l -> Objects.nonNull(l.getGreenId()) && l.getGreenId().equals(o.getGreenId()) && Objects.nonNull(l.getDir()) && l.getDir().equals(o.getDir())).forEach(n -> {
InduceDTO induceDTO = new InduceDTO(); InduceDTO induceDTO = new InduceDTO();
induceDTO.setId(n.getId()); induceDTO.setId(n.getId());
induceDTO.setEquipCode(n.getEquipCode()); induceDTO.setEquipCode(n.getEquipCode());
......
...@@ -8,6 +8,7 @@ import net.wanji.common.framework.rest.JsonViewObject; ...@@ -8,6 +8,7 @@ import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO; import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.service.signalopt.GreenBeltInfoService; import net.wanji.opt.service.signalopt.GreenBeltInfoService;
import net.wanji.opt.vo.GreenBeltFlowStopTimeVO; import net.wanji.opt.vo.GreenBeltFlowStopTimeVO;
import net.wanji.opt.vo.GreenBeltKeyCrossFlowTimeVO;
import net.wanji.opt.vo.GreenBeltSpeedWidthVO; import net.wanji.opt.vo.GreenBeltSpeedWidthVO;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -61,4 +62,20 @@ public class GreenBeltController { ...@@ -61,4 +62,20 @@ public class GreenBeltController {
} }
return JsonViewObject.newInstance().success(greenBeltFlowStopTimeVOS); return JsonViewObject.newInstance().success(greenBeltFlowStopTimeVOS);
} }
@ApiOperation(value = "绿波关键路口流量绿信比", notes = "优化监测-绿波关键路口流量绿信比", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@GetMapping(value = "/greenBeltKeyCrossFlowTime")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AddOrUpdateSceneDTO.class),
})
public JsonViewObject greenBeltKeyCrossFlowTime(Integer greenId) {
List<GreenBeltKeyCrossFlowTimeVO> greenBeltKeyCrossFlowTimeVOS = Collections.EMPTY_LIST;
try {
greenBeltKeyCrossFlowTimeVOS = greenBeltInfoService.greenBeltKeyCrossFlowTime(greenId);
} catch (Exception e) {
JsonViewObject.newInstance().fail("绿波带宽曲线异常");
}
return JsonViewObject.newInstance().success(greenBeltKeyCrossFlowTimeVOS);
}
} }
...@@ -45,6 +45,8 @@ public class StrategyGreenOptHistEntity { ...@@ -45,6 +45,8 @@ public class StrategyGreenOptHistEntity {
private Double greenWidthTime; private Double greenWidthTime;
@TableField("cross_green_detail") @TableField("cross_green_detail")
private String crossGreenDetail; private String crossGreenDetail;
@TableField("key_cross")
private String keyCross;
@TableField("create_time") @TableField("create_time")
private Date createTime; private Date createTime;
@TableField("modify_time") @TableField("modify_time")
......
...@@ -536,6 +536,7 @@ public class TrendServiceImpl implements TrendService { ...@@ -536,6 +536,7 @@ public class TrendServiceImpl implements TrendService {
greenWaveRunMonitorVO.setHour(hourSub); greenWaveRunMonitorVO.setHour(hourSub);
greenWaveRunMonitorVO.setAvgSpeed(greenwaveHistPOExt.getAvgSpeed()); greenWaveRunMonitorVO.setAvgSpeed(greenwaveHistPOExt.getAvgSpeed());
greenWaveRunMonitorVO.setCongestionIndex(greenwaveHistPOExt.getCongestionIndex()); greenWaveRunMonitorVO.setCongestionIndex(greenwaveHistPOExt.getCongestionIndex());
greenWaveRunMonitorVO.setTravelTime((int) (greenwaveHistPOExt.getTrvalTime() / 60));
res.add(greenWaveRunMonitorVO); res.add(greenWaveRunMonitorVO);
} }
return res; return res;
......
package net.wanji.opt.service.signalopt; package net.wanji.opt.service.signalopt;
import net.wanji.opt.vo.GreenBeltFlowStopTimeVO; import net.wanji.opt.vo.GreenBeltFlowStopTimeVO;
import net.wanji.opt.vo.GreenBeltKeyCrossFlowTimeVO;
import net.wanji.opt.vo.GreenBeltSpeedWidthVO; import net.wanji.opt.vo.GreenBeltSpeedWidthVO;
import java.util.List; import java.util.List;
...@@ -12,4 +13,5 @@ import java.util.List; ...@@ -12,4 +13,5 @@ import java.util.List;
public interface GreenBeltInfoService { public interface GreenBeltInfoService {
List<GreenBeltFlowStopTimeVO> greenBeltCrossDetailHist(Integer greenId) throws Exception; List<GreenBeltFlowStopTimeVO> greenBeltCrossDetailHist(Integer greenId) throws Exception;
List<GreenBeltSpeedWidthVO> greenBeltSpeedWidth(Integer greenId) throws Exception; List<GreenBeltSpeedWidthVO> greenBeltSpeedWidth(Integer greenId) throws Exception;
List<GreenBeltKeyCrossFlowTimeVO> greenBeltKeyCrossFlowTime(Integer greenId) throws Exception;
} }
package net.wanji.opt.service.signalopt.impl; package net.wanji.opt.service.signalopt.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.Constants;
import net.wanji.common.utils.tool.DateUtil; import net.wanji.common.utils.tool.DateUtil;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.GreenwaveHistPO;
import net.wanji.databus.dao.mapper.CrossDataHistMapper; import net.wanji.databus.dao.mapper.CrossDataHistMapper;
import net.wanji.databus.dao.mapper.GreenwaveHistMapper;
import net.wanji.databus.dao.mapper.GreenwaveInfoMapper; import net.wanji.databus.dao.mapper.GreenwaveInfoMapper;
import net.wanji.databus.po.CrossDataHistPO; import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.opt.dao.mapper.StrategyControlInfoMapper; import net.wanji.opt.common.enums.GreenBeltDirEnum;
import net.wanji.opt.dao.mapper.StrategyGreenOptHistMapper; import net.wanji.opt.dao.mapper.StrategyGreenOptHistMapper;
import net.wanji.opt.po.StrategyGreenOptHistEntity; import net.wanji.opt.po.StrategyGreenOptHistEntity;
import net.wanji.opt.service.signalopt.GreenBeltInfoService; import net.wanji.opt.service.signalopt.GreenBeltInfoService;
import net.wanji.opt.synthesis.pojo.StrategyControlDataEntity;
import net.wanji.opt.vo.GreenBeltFlowStopTimeVO; import net.wanji.opt.vo.GreenBeltFlowStopTimeVO;
import net.wanji.opt.vo.GreenBeltInfoVO;
import net.wanji.opt.vo.GreenBeltKeyCrossFlowTimeVO;
import net.wanji.opt.vo.GreenBeltSpeedWidthVO; import net.wanji.opt.vo.GreenBeltSpeedWidthVO;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.ParseException; import java.text.DecimalFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.ZoneOffset; import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -39,28 +48,129 @@ public class GreenBeltServiceImpl implements GreenBeltInfoService { ...@@ -39,28 +48,129 @@ public class GreenBeltServiceImpl implements GreenBeltInfoService {
private CrossDataHistMapper crossDataHistMapper; private CrossDataHistMapper crossDataHistMapper;
@Resource @Resource
private StrategyGreenOptHistMapper strategyGreenOptHistMapper; private StrategyGreenOptHistMapper strategyGreenOptHistMapper;
@Resource
private GreenwaveHistMapper greenwaveHistMapper;
@Override @Override
public List<GreenBeltSpeedWidthVO> greenBeltSpeedWidth(Integer greenId) throws Exception { public List<GreenBeltKeyCrossFlowTimeVO> greenBeltKeyCrossFlowTime(Integer greenId) throws Exception {
try { ObjectMapper mapper = JacksonUtils.getInstance();
DecimalFormat df = new DecimalFormat("#.00");
List<GreenBeltKeyCrossFlowTimeVO> tempResult = new ArrayList<>();
List<GreenBeltKeyCrossFlowTimeVO> results = new ArrayList<>();
LocalDate currentDate = LocalDate.now();
LocalTime startTime = LocalTime.MIDNIGHT;
LocalDateTime startOfDay = LocalDateTime.of(currentDate, startTime);
// 绿波优化数据
LambdaQueryWrapper<StrategyGreenOptHistEntity> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<StrategyGreenOptHistEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StrategyGreenOptHistEntity::getGreenId, greenId); queryWrapper.eq(StrategyGreenOptHistEntity::getGreenId, greenId);
queryWrapper.ge(StrategyGreenOptHistEntity::getControlTime, startOfDay);
List<StrategyGreenOptHistEntity> entities = strategyGreenOptHistMapper.selectList(queryWrapper);
// 随机路口编号,通过路口编号查询时间轴
String tempCrossId = "";
if (!CollectionUtils.isEmpty(entities)) {
for (StrategyGreenOptHistEntity entity : entities) {
GreenBeltKeyCrossFlowTimeVO vo = new GreenBeltKeyCrossFlowTimeVO();
String keyCross = entity.getKeyCross();
vo.setCrossId(keyCross);
vo.setDirName(entity.getDir());
Date controlTime = get5MinuteDate(entity.getControlTime());
vo.setStartTime(controlTime);
String crossGreenDetail = entity.getCrossGreenDetail();
Integer cycle = entity.getCycle();
List<GreenBeltInfoVO.CrossGreenDetail> crossGreenDetails = mapper.readValue(crossGreenDetail, new TypeReference<List<GreenBeltInfoVO.CrossGreenDetail>>() {
});
if (!CollectionUtils.isEmpty(crossGreenDetails)) {
List<GreenBeltInfoVO.CrossGreenDetail> keyCrossDetail = crossGreenDetails.stream().filter(details -> StringUtils.equalsIgnoreCase(keyCross, details.getCrossId())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(keyCrossDetail)) {
GreenBeltInfoVO.CrossGreenDetail curKeyCross = keyCrossDetail.get(0);
tempCrossId = curKeyCross.getCrossId();
Double phaseStartTime = curKeyCross.getPhaseStartTime();
Double phaseEndTime = curKeyCross.getPhaseEndTime();
Double greenTimeRatio = Double.parseDouble(df.format(phaseEndTime - phaseStartTime / cycle));
vo.setGreenTimeRatio(greenTimeRatio);
}
}
tempResult.add(vo);
}
// 关键路口历史数据
LambdaQueryWrapper<CrossDataHistPO> histQuery = new LambdaQueryWrapper<>();
histQuery.eq(CrossDataHistPO::getCrossId, tempCrossId);
histQuery.ge(CrossDataHistPO::getStartTime, startOfDay);
List<CrossDataHistPO> crossDataHistPOS = crossDataHistMapper.selectList(histQuery);
if (!CollectionUtils.isEmpty(crossDataHistPOS)) {
for (CrossDataHistPO crossDataHistPO : crossDataHistPOS) {
Date crossStartTime = crossDataHistPO.getStartTime();
String format = DateUtil.format(crossStartTime, Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND);
Date minuteDate = get5MinuteDate(format);
Integer flow = crossDataHistPO.getFlow();
GreenBeltKeyCrossFlowTimeVO resultVO = new GreenBeltKeyCrossFlowTimeVO();
resultVO.setStartTime(minuteDate);
resultVO.setFlow(0);
resultVO.setGreenTimeRatio(0.0);
resultVO.setCrossId(tempCrossId);
for (GreenBeltKeyCrossFlowTimeVO result : tempResult) {
if (StringUtils.equalsIgnoreCase(tempCrossId, result.getCrossId())
&& minuteDate.getTime() == result.getStartTime().getTime()) {
resultVO.setFlow(flow);
resultVO.setGreenTimeRatio(result.getGreenTimeRatio());
}
}
results.add(resultVO);
}
}
}
return results;
}
@Override
public List<GreenBeltSpeedWidthVO> greenBeltSpeedWidth(Integer greenId) throws Exception {
try {
List<GreenBeltSpeedWidthVO> results = new ArrayList<>();
LocalDate currentDate = LocalDate.now(); LocalDate currentDate = LocalDate.now();
LocalTime startTime = LocalTime.MIDNIGHT; LocalTime startTime = LocalTime.MIDNIGHT;
LocalDateTime startOfDay = LocalDateTime.of(currentDate, startTime); LocalDateTime startOfDay = LocalDateTime.of(currentDate, startTime);
LambdaQueryWrapper<GreenwaveHistPO> greenWrapper = new LambdaQueryWrapper<>();
greenWrapper.eq(GreenwaveHistPO::getGreenId, greenId);
greenWrapper.ge(GreenwaveHistPO::getStartTime, startOfDay);
// 绿波历史数据
List<GreenwaveHistPO> greenwaveHistPOS = greenwaveHistMapper.selectList(greenWrapper);
// 绿波优化数据
LambdaQueryWrapper<StrategyGreenOptHistEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StrategyGreenOptHistEntity::getGreenId, greenId);
queryWrapper.ge(StrategyGreenOptHistEntity::getControlTime, startOfDay); queryWrapper.ge(StrategyGreenOptHistEntity::getControlTime, startOfDay);
List<StrategyGreenOptHistEntity> entities = strategyGreenOptHistMapper.selectList(queryWrapper); List<StrategyGreenOptHistEntity> entities = strategyGreenOptHistMapper.selectList(queryWrapper);
List<GreenBeltSpeedWidthVO> results = new ArrayList<>(); if (!CollectionUtils.isEmpty(greenwaveHistPOS) && !CollectionUtils.isEmpty(entities)) {
if (!CollectionUtils.isEmpty(entities)) { for (GreenwaveHistPO histPO : greenwaveHistPOS) {
Integer curGreenId = histPO.getGreenId();
Date curStartTime = histPO.getStartTime();
String curStartTimeStr = DateUtil.format(curStartTime, Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND);
Date startTimeminuteDate = get5MinuteDate(curStartTimeStr);
String roadDirection = histPO.getRoadDirection();
Double speed = histPO.getSpeed();
for (StrategyGreenOptHistEntity entity : entities) { for (StrategyGreenOptHistEntity entity : entities) {
GreenBeltSpeedWidthVO greenBeltSpeedWidthVO = new GreenBeltSpeedWidthVO(); Integer optGreenId = entity.getGreenId();
Date date = DateUtil.parse(entity.getControlTime(), "yyyy-MM-dd HH:mm:ss"); String controlTime = entity.getControlTime();
greenBeltSpeedWidthVO.setStartTime(date); String dir = entity.getDir();
greenBeltSpeedWidthVO.setSpeed(entity.getMaxSpeed()); Date minuteDate = get5MinuteDate(controlTime);
greenBeltSpeedWidthVO.setWidth(entity.getGreenWidthTime()); Double greenWidthTime = entity.getGreenWidthTime();
results.add(greenBeltSpeedWidthVO); if (Objects.equals(curGreenId, optGreenId) && StringUtils.equalsIgnoreCase(dir, roadDirection)
&& minuteDate.getTime() == startTimeminuteDate.getTime()) {
GreenBeltSpeedWidthVO vo = new GreenBeltSpeedWidthVO();
vo.setStartTime(curStartTime);
vo.setSpeed(speed);
vo.setWidth(greenWidthTime);
vo.setDirName(GreenBeltDirEnum.getDesc(dir));
results.add(vo);
}
} }
} }
}
return results; return results;
} catch (Exception e) { } catch (Exception e) {
log.error("绿波带宽曲线异常:", e); log.error("绿波带宽曲线异常:", e);
...@@ -68,6 +178,26 @@ public class GreenBeltServiceImpl implements GreenBeltInfoService { ...@@ -68,6 +178,26 @@ public class GreenBeltServiceImpl implements GreenBeltInfoService {
} }
} }
/**
* 将下发时间按五分钟取整
*
* @param controlTime
* @return
*/
public static Date get5MinuteDate(String controlTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(controlTime, formatter);
// 获取当前分钟
int minute = dateTime.getMinute();
// 计算需要补充的分钟数(如果 minute % 5 != 0)
int minutesToAdd = (5 - minute % 5) % 5;
// 添加这些分钟并返回新的时间
LocalDateTime localDateTime = dateTime.plusMinutes(minutesToAdd).withSecond(0).withNano(0);
ZoneId zoneId = ZoneId.systemDefault();
Date minuteDate = Date.from(localDateTime.atZone(zoneId).toInstant());
return minuteDate;
}
@Override @Override
public List<GreenBeltFlowStopTimeVO> greenBeltCrossDetailHist(Integer greenId) throws Exception { public List<GreenBeltFlowStopTimeVO> greenBeltCrossDetailHist(Integer greenId) throws Exception {
try { try {
...@@ -75,7 +205,7 @@ public class GreenBeltServiceImpl implements GreenBeltInfoService { ...@@ -75,7 +205,7 @@ public class GreenBeltServiceImpl implements GreenBeltInfoService {
long currentTimeMillis = System.currentTimeMillis(); long currentTimeMillis = System.currentTimeMillis();
int startSecond = (int) (currentTimeMillis / 1000 - 3600); int startSecond = (int) (currentTimeMillis / 1000 - 3600);
int endSecond = (int) (currentTimeMillis / 1000); int endSecond = (int) (currentTimeMillis / 1000);
List<CrossDataHistPO> crossDataHistPOS = crossDataHistMapper.selectByCrossIdsAndTimestamp(crossIds, startSecond , endSecond); List<CrossDataHistPO> crossDataHistPOS = crossDataHistMapper.selectByCrossIdsAndTimestamp(crossIds, startSecond, endSecond);
if (!CollectionUtils.isEmpty(crossDataHistPOS)) { if (!CollectionUtils.isEmpty(crossDataHistPOS)) {
List<GreenBeltFlowStopTimeVO> results = new ArrayList<>(); List<GreenBeltFlowStopTimeVO> results = new ArrayList<>();
Map<Date, List<CrossDataHistPO>> startTimeMap = crossDataHistPOS.stream().collect(Collectors.groupingBy(CrossDataHistPO::getStartTime)); Map<Date, List<CrossDataHistPO>> startTimeMap = crossDataHistPOS.stream().collect(Collectors.groupingBy(CrossDataHistPO::getStartTime));
......
package net.wanji.opt.task; package net.wanji.opt.task;
import com.alibaba.druid.support.json.JSONUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
...@@ -95,25 +96,27 @@ public class InducesMonitorTask { ...@@ -95,25 +96,27 @@ public class InducesMonitorTask {
* #绿波调度计划扫描周期 * #绿波调度计划扫描周期
* 5 分钟 300000 * 5 分钟 300000
*/ */
@Scheduled(fixedRate = 300000) @Scheduled(fixedRate = 30000)
public void refresh() throws Exception { public void refresh() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
AtomicLong synCount = new AtomicLong(); AtomicLong synCount = new AtomicLong();
try { try {
log.info("每5分钟刷新绿波优化下发数据..................."); log.info("每5分钟刷新绿波优化下发数据...................");
List<GreenwaveInfoPO> greenwaveInfoPOList=greenwaveInfoMapper.selectAll(); List<GreenwaveInfoPO> greenwaveInfoPOList=greenwaveInfoMapper.selectAll();
List<GreenwaveInducesHist> greenwaveInducesHistss = greenwaveInducesHistService.list();
for(GreenwaveInfoPO greenwaveInfoPO :greenwaveInfoPOList) { for(GreenwaveInfoPO greenwaveInfoPO :greenwaveInfoPOList) {
AtomicBoolean flag = new AtomicBoolean(false);//是否已发布优化 AtomicBoolean flag = new AtomicBoolean(false);//是否已发布优化
AtomicReference<Integer> strategyId=new AtomicReference<Integer>(0); AtomicReference<Integer> strategyId=new AtomicReference<Integer>(0);
//1、查询所有绿波带路口信息,获取路口下的绿波策略计划 //1、查询所有绿波带路口信息,获取路口下的绿波策略计划
List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveInfoPO.getId()); List<GreenwaveCrossPO> greenwaveCrossList = greenwaveCrossMapper.selectByGreenwaveId(greenwaveInfoPO.getId());
greenwaveCrossList.stream().forEach(o -> { greenwaveCrossList.stream().forEach(o -> {
//System.out.println("绿波路口--->"+o.getGreenwaveName()+"=="+o.getCrossId()); //System.out.println("绿波路口--->"+greenwaveInfoPO.getId()+"=="+o.getCrossId());
//创建路口策略列表 //创建路口策略列表
List<StrategyPlanInfoEntity> strategyPlanInfoEntityList = strategyPlanInfoMapper.selectByCrossId(o.getCrossId()); List<StrategyPlanInfoEntity> strategyPlanInfoEntityList = strategyPlanInfoMapper.selectByCrossId(o.getCrossId());
//strategyPlanInfoEntityList.stream().filter(x->Objects.nonNull(x.getCrossId()) && x.getCrossId().equals(o.getCrossId()) ).forEach(x-> //strategyPlanInfoEntityList.stream().filter(x->Objects.nonNull(x.getCrossId()) && x.getCrossId().equals(o.getCrossId()) ).forEach(x->
for (StrategyPlanInfoEntity strategyPlanInfoEntity : strategyPlanInfoEntityList) { for (StrategyPlanInfoEntity strategyPlanInfoEntity : strategyPlanInfoEntityList) {
//System.out.println("策略计划--->"+x.getCrossId()+"=="+x.getPlanDetails()); System.out.println("策略计划--->"+greenwaveInfoPO.getId()+"=="+strategyPlanInfoEntity.getPlanDetails());
//2、检查绿波时段,判断是否在绿波时段内,如果不在,则判断是否执行过上屏操作,如果执行过,则调用下屏服务(此出屏幕自动处理,无需逻辑) //2、检查绿波时段,判断是否在绿波时段内,如果不在,则判断是否执行过上屏操作,如果执行过,则调用下屏服务(此出屏幕自动处理,无需逻辑)
//[{"dailyPlanId":1,"weeks":[1,2,3,4,5]}] //[{"dailyPlanId":1,"weeks":[1,2,3,4,5]}]
List<StrategyControlDetailList.ExecutePlan.PlanDetail> planDetails = new ArrayList<>(); List<StrategyControlDetailList.ExecutePlan.PlanDetail> planDetails = new ArrayList<>();
...@@ -151,8 +154,7 @@ public class InducesMonitorTask { ...@@ -151,8 +154,7 @@ public class InducesMonitorTask {
// 判断当前时间是否在范围内 // 判断当前时间是否在范围内
if (LocalTime.now().isAfter(startTime) && LocalTime.now().isBefore(endTime)) { if (LocalTime.now().isAfter(startTime) && LocalTime.now().isBefore(endTime)) {
System.out.println("当前时间在范围内: " + LocalTime.now()); System.out.println("当前时间在范围内: " + LocalTime.now());
//3、如果在绿波时段内,未上屏,则获取固定配时绿波信息 //System.out.println("绿波路口--->"+greenwaveInfoPO.getId()+"=="+o.getCrossId());
//4、获取优化绿波方案,如果不存在,则执行固定绿波方案
flag.set(true); flag.set(true);
strategyId.set(p.getDailyPlanId()); strategyId.set(p.getDailyPlanId());
} }
...@@ -164,19 +166,21 @@ public class InducesMonitorTask { ...@@ -164,19 +166,21 @@ public class InducesMonitorTask {
} }
} }
}); });
//3、如果在绿波时段内,未上屏,则获取固定配时绿波信息
//4、获取优化绿波方案,如果不存在,则执行固定绿波方案
//如果在绿波时段内,未上屏,则获取固定配时绿波信息 //如果在绿波时段内,未上屏,则获取固定配时绿波信息
if (flag.get()) { if (flag.get()) {
List<StrategyGreenOptHistEntity> strategyGreenOptHistEntitiesList = strategyGreenOptHistMapper.selectByGreenId(String.valueOf(greenwaveInfoPO.getId())).stream().distinct().collect(Collectors.toList()); List<StrategyGreenOptHistEntity> strategyGreenOptHistEntitiesList = strategyGreenOptHistMapper.selectByGreenId(String.valueOf(greenwaveInfoPO.getId())).stream().distinct().collect(Collectors.toList());
if (Objects.nonNull(strategyGreenOptHistEntitiesList)) { if (Objects.nonNull(strategyGreenOptHistEntitiesList)) {
for (StrategyGreenOptHistEntity greenOptHistEntity : strategyGreenOptHistEntitiesList) { for (StrategyGreenOptHistEntity greenOptHistEntity : strategyGreenOptHistEntitiesList) {
LambdaQueryWrapper<GreenwaveInducesHist> greenwaveInducesHistQueryWrapper = new LambdaQueryWrapper<>(); // LambdaQueryWrapper<GreenwaveInducesHist> greenwaveInducesHistQueryWrapper = new LambdaQueryWrapper<>();
greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getGreenId, greenwaveInfoPO.getId()); // greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getGreenId, greenwaveInfoPO.getId());
greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getDir, getDir(greenOptHistEntity.getDir())); // greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getDir, getDir(greenOptHistEntity.getDir()));
List<GreenwaveInducesHist> greenwaveInducesHistList = greenwaveInducesHistService.list(greenwaveInducesHistQueryWrapper); List<GreenwaveInducesHist> greenwaveInducesHistList=greenwaveInducesHistss.stream().filter(g->g.getGreenId().equals(greenwaveInfoPO.getId()) && g.getDir().equals(getDir(greenOptHistEntity.getDir()))).collect(Collectors.toList());
GreenwaveInducesHist greenwaveInducesHist=null; GreenwaveInducesHist greenwaveInducesHist=null;
if (Objects.isNull(greenwaveInducesHistList) || greenwaveInducesHistList.size()<1) { if (Objects.isNull(greenwaveInducesHistList) || greenwaveInducesHistList.size()<1) {
greenwaveInducesHist = new GreenwaveInducesHist(); greenwaveInducesHist = new GreenwaveInducesHist();
greenwaveInducesHist.setCreateTime(new Date()); greenwaveInducesHist.setCreateTime(greenOptHistEntity.getCreateTime());
greenwaveInducesHist.setGreenId(greenwaveInfoPO.getId()); greenwaveInducesHist.setGreenId(greenwaveInfoPO.getId());
greenwaveInducesHist.setDir(getDir(greenOptHistEntity.getDir())); greenwaveInducesHist.setDir(getDir(greenOptHistEntity.getDir()));
}else{ }else{
...@@ -232,21 +236,21 @@ public class InducesMonitorTask { ...@@ -232,21 +236,21 @@ public class InducesMonitorTask {
} }
} }
greenwaveInducesHist.setStatus(1); greenwaveInducesHist.setStatus(1);
greenwaveInducesHist.setModifyTime(greenOptHistEntity.getCreateTime());
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} catch (TemplateException e) { } catch (TemplateException e) {
log.info("发送上屏信息异常" + e.getMessage()); log.info("发送上屏信息异常" + e.getMessage());
} }
greenwaveInducesHist.setModifyTime(greenOptHistEntity.getCreateTime());
greenwaveInducesHistService.saveOrUpdate(greenwaveInducesHist); greenwaveInducesHistService.saveOrUpdate(greenwaveInducesHist);
synCount.getAndIncrement(); synCount.getAndIncrement();
log.info("同步绿波状态信息成功->" + greenwaveInfoPO.getName()+greenOptHistEntity.getDir()); log.info("同步绿波状态信息成功->" + greenwaveInfoPO.getName()+greenwaveInducesHist.getDir());
} }
} }
} }
//如果没有绿波方案则调用下屏服务 //如果没有绿波方案则调用下屏服务
if (!flag.get()) { else{
LambdaQueryWrapper<GreenwaveInducesHist> greenwaveInducesHistQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<GreenwaveInducesHist> greenwaveInducesHistQueryWrapper = new LambdaQueryWrapper<>();
greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getGreenId, greenwaveInfoPO.getId()); greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getGreenId, greenwaveInfoPO.getId());
List<GreenwaveInducesHist> greenwaveInducesHistList = greenwaveInducesHistService.list(greenwaveInducesHistQueryWrapper); List<GreenwaveInducesHist> greenwaveInducesHistList = greenwaveInducesHistService.list(greenwaveInducesHistQueryWrapper);
...@@ -281,7 +285,7 @@ public class InducesMonitorTask { ...@@ -281,7 +285,7 @@ public class InducesMonitorTask {
n.setStatus(0); n.setStatus(0);
n.setModifyTime(new Date()); n.setModifyTime(new Date());
greenwaveInducesHistService.saveOrUpdate(n); greenwaveInducesHistService.saveOrUpdate(n);
log.info("同步绿波状态信息(下屏)->" + greenwaveInfoPO.getName()); log.info("同步绿波状态信息(下屏)->" + greenwaveInfoPO.getName()+"####"+n.getDir());
synCount.getAndIncrement(); synCount.getAndIncrement();
}); });
} }
......
package net.wanji.opt.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author duanruiming
* @date 2024/12/06 13:37
*/
@Data
@ApiModel(value = "优化监测-绿波关键路口流量绿信比实体")
public class GreenBeltKeyCrossFlowTimeVO {
@ApiModelProperty("路口编号")
private String crossId;
@ApiModelProperty("时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
private Date startTime;
@ApiModelProperty("干线方向")
private String dirName;
@ApiModelProperty("流量")
private Integer flow;
@ApiModelProperty("绿信比")
private Double greenTimeRatio;
}
...@@ -18,7 +18,9 @@ public class GreenBeltSpeedWidthVO { ...@@ -18,7 +18,9 @@ public class GreenBeltSpeedWidthVO {
@ApiModelProperty("时间") @ApiModelProperty("时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
private Date startTime; private Date startTime;
@ApiModelProperty("流量") @ApiModelProperty("干线方向")
private String dirName;
@ApiModelProperty("速度")
private Double speed; private Double speed;
@ApiModelProperty("带宽") @ApiModelProperty("带宽")
private Double width; private Double width;
......
...@@ -15,4 +15,6 @@ public class GreenwaveRunMonitorVO { ...@@ -15,4 +15,6 @@ public class GreenwaveRunMonitorVO {
private Integer avgSpeed; private Integer avgSpeed;
@ApiModelProperty(value = "拥堵指数") @ApiModelProperty(value = "拥堵指数")
private Double congestionIndex; private Double congestionIndex;
@ApiModelProperty(value = "行程时间")
private Integer travelTime;
} }
...@@ -52,9 +52,16 @@ ...@@ -52,9 +52,16 @@
<select id="findByMap" resultType="net.wanji.databus.dao.entity.GreenwaveInfoPO" parameterType="java.util.Map"> <select id="findByMap" resultType="net.wanji.databus.dao.entity.GreenwaveInfoPO" parameterType="java.util.Map">
SELECT <include refid="Base_Column_List"></include> SELECT <include refid="Base_Column_List"></include>
FROM t_greenwave_info WHERE 1=1 FROM t_greenwave_info WHERE 1=1
<include refid="sql_query"/>
<if test="keyword != null and keyword != ''"> <if test="keyword != null and keyword != ''">
AND ( locate(#{keyword,jdbcType=VARCHAR}, `name`)>0 ) AND ( locate(#{keyword,jdbcType=VARCHAR}, `name`)>0 )
</if> </if>
</select> </select>
<sql id="sql_query">
<if test="greenId != null ">
<![CDATA[ and `id` = #{greenId} ]]>
</if>
</sql>
</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