Commit 124f721c authored by duanruiming's avatar duanruiming

[add] 绿波图优化;海信方案环图入库

parent 3980f854
package net.wanji.opt.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.opt.dto.SchemeGreenDirGreenTimeDTO;
/**
* @author duanruiming
* @date 2025/04/15 15:13
*/
public interface GreenChartSchemeRingPhaseMapper extends BaseMapper<SchemeGreenDirGreenTimeDTO> {
}
package net.wanji.opt.dto; package net.wanji.opt.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
...@@ -10,12 +14,18 @@ import java.util.Date; ...@@ -10,12 +14,18 @@ import java.util.Date;
* @date 2025/04/01 15:38 * @date 2025/04/01 15:38
*/ */
@Data @Data
@TableName("t_green_chart_scheme_ring_phase_hist")
public class SchemeGreenDirGreenTimeDTO { public class SchemeGreenDirGreenTimeDTO {
@TableField(value = "cross_id")
private String crossId; private String crossId;
@TableField(value = "scheme_no")
private Integer schemeNo; private Integer schemeNo;
private Integer offset; private Integer offset;
@TableField(value = "cycle_len")
private Integer cycleLen; private Integer cycleLen;
@TableField(value = "ring_no")
private Integer ringNo; private Integer ringNo;
@TableField(value = "phase_id")
private Integer phaseId; private Integer phaseId;
private Integer start; private Integer start;
private Integer end; private Integer end;
......
...@@ -47,8 +47,8 @@ public class HisenseGreenChartTask { ...@@ -47,8 +47,8 @@ public class HisenseGreenChartTask {
private GreenChartSchemeHistMapper greenChartSchemeHistMapper; private GreenChartSchemeHistMapper greenChartSchemeHistMapper;
//@Scheduled(fixedRate = 10 * 60 * 1000, initialDelay = 1 * 60 * 1000) @Scheduled(fixedRate = 10 * 60 * 1000, initialDelay = 1 * 60 * 1000)
@Scheduled(fixedRate = 1 * 60 * 1000, initialDelay = 30 * 1000) //@Scheduled(fixedRate = 1 * 60 * 1000, initialDelay = 30 * 1000)
public void getGreenChart() { public void getGreenChart() {
try { try {
ObjectMapper mapper = JacksonUtils.getInstance(); ObjectMapper mapper = JacksonUtils.getInstance();
...@@ -102,7 +102,7 @@ public class HisenseGreenChartTask { ...@@ -102,7 +102,7 @@ public class HisenseGreenChartTask {
GreenwaveRealtimePO greenwaveRealtimePO = realTimeMap.get(greenKey); GreenwaveRealtimePO greenwaveRealtimePO = realTimeMap.get(greenKey);
Double speed = Objects.isNull(greenwaveRealtimePO.getSpeed()) ? 0 : greenwaveRealtimePO.getSpeed() ; Double speed = Objects.isNull(greenwaveRealtimePO.getSpeed()) ? 0 : greenwaveRealtimePO.getSpeed() ;
// km/h速度换成m/s // km/h速度换成m/s
Double travelTime = totalDistance / speed / 3.6; Double travelTime = totalDistance / speed * 3.6;
List<Double> offsets = new ArrayList<>(); List<Double> offsets = new ArrayList<>();
List<Double> distances = new ArrayList<>(); List<Double> distances = new ArrayList<>();
// 正向红灯时间 // 正向红灯时间
...@@ -119,7 +119,7 @@ public class HisenseGreenChartTask { ...@@ -119,7 +119,7 @@ public class HisenseGreenChartTask {
GreenwaveRealtimePO backGreenwaveRealtimePO = realTimeMap.get(backGreenKey); GreenwaveRealtimePO backGreenwaveRealtimePO = realTimeMap.get(backGreenKey);
// km/h速度换成m/s // km/h速度换成m/s
Double backSpeed = Objects.isNull(backGreenwaveRealtimePO.getSpeed()) ? 0 : backGreenwaveRealtimePO.getSpeed(); Double backSpeed = Objects.isNull(backGreenwaveRealtimePO.getSpeed()) ? 0 : backGreenwaveRealtimePO.getSpeed();
Double backTravelTime = totalDistance / backSpeed / 3.6; Double backTravelTime = totalDistance / backSpeed * 3.6;
Map<String, List<List<Double>>> backCrossRedTimesMap = new LinkedHashMap<>(); Map<String, List<List<Double>>> backCrossRedTimesMap = new LinkedHashMap<>();
Map<String, List<List<Double>>> backCrossGreenTimesMap = new LinkedHashMap<>(); Map<String, List<List<Double>>> backCrossGreenTimesMap = new LinkedHashMap<>();
getCrossRedTimeMap(mapper, greenDirGreenTimeMap, backValue, indexOutDir, backTravelTime, backOffsets, backDistances, backCrossRedTimesMap, backCrossGreenTimesMap); getCrossRedTimeMap(mapper, greenDirGreenTimeMap, backValue, indexOutDir, backTravelTime, backOffsets, backDistances, backCrossRedTimesMap, backCrossGreenTimesMap);
...@@ -276,13 +276,13 @@ public class HisenseGreenChartTask { ...@@ -276,13 +276,13 @@ public class HisenseGreenChartTask {
Double speed = greenBeltChartDTO.getSpeed(); Double speed = greenBeltChartDTO.getSpeed();
List<Double> distances = greenBeltChartDTO.getDistances(); List<Double> distances = greenBeltChartDTO.getDistances();
Double distance = distances.get(i); Double distance = distances.get(i);
travelTime = distance / speed / 3.6; travelTime = distance / speed * 3.6;
} }
if (2 == type) { if (2 == type) {
Double speed = greenBeltChartDTO.getBackSpeed(); Double speed = greenBeltChartDTO.getBackSpeed();
List<Double> distances = greenBeltChartDTO.getBackDistances(); List<Double> distances = greenBeltChartDTO.getBackDistances();
Double distance = distances.get(i + 1); Double distance = distances.get(i + 1);
travelTime = distance / speed / 3.6; travelTime = distance / speed * 3.6;
} }
return travelTime; return travelTime;
} }
......
package net.wanji.opt.task;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.GreenCrossDirDTO;
import net.wanji.opt.cache.GreenCrossDirInfoCache;
import net.wanji.opt.common.RedisUtils;
import net.wanji.opt.dao.mapper.GreenChartSchemeRingPhaseMapper;
import net.wanji.opt.dto.RingPhaseInfoDTO;
import net.wanji.opt.dto.SchemeGreenDirGreenTimeDTO;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author duanruiming
* @date 2025/04/15 15:09
*/
@Component
@Slf4j
@Profile("test")
public class HisenseSchemeRingPhaseInfoTask {
@Resource
private RedisUtils redisUtils;
@Resource
private GreenChartSchemeRingPhaseMapper greenChartSchemeRingPhaseMapper;
@Scheduled(fixedRate = 1 * 60 * 1000, initialDelay = 1 * 60 * 1000)
public void getSchemeRingPhase() {
List<SchemeGreenDirGreenTimeDTO> schemeGreenDirGreenTimeDTOS = new ArrayList<>();
ObjectMapper mapper = JacksonUtils.getInstance();
try {
List<GreenCrossDirDTO> greenCrossDirCache = GreenCrossDirInfoCache.greenCrossDirCache;
if (!CollectionUtils.isEmpty(greenCrossDirCache)) {
for (GreenCrossDirDTO greenCrossDirDTO : greenCrossDirCache) {
Integer greenId = greenCrossDirDTO.getGreenId();
String greenCrossId = greenCrossDirDTO.getCrossId();
String greenDirStr = greenCrossDirDTO.getGreenDir();
// 海信环相位信息
String str = (String) redisUtils.getHash("utc-hisense-ring-phase", greenCrossId);
if (StringUtils.isBlank(str)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {});
// 遍历绿波路口协调方向
if (StringUtils.isNotBlank(greenDirStr)) {
String[] greenDirArray = greenDirStr.split(",");
for (String s : greenDirArray) {
// 协调方向
Integer greenDir = Integer.valueOf(s);
if (!CollectionUtils.isEmpty(ringPhaseInfoDTOS)) {
Map<Integer, List<RingPhaseInfoDTO>> ringMap = ringPhaseInfoDTOS.stream().collect(Collectors.groupingBy(RingPhaseInfoDTO::getRingNo));
for (Map.Entry<Integer, List<RingPhaseInfoDTO>> entry : ringMap.entrySet()) {
Integer ringNo = entry.getKey();
if (Objects.equals(0, ringNo)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseList = entry.getValue();
List<RingPhaseInfoDTO> sort = ringPhaseList.stream().sorted(Comparator.comparingInt(RingPhaseInfoDTO::getSort)).collect(Collectors.toList());
Integer start = 0;
SchemeGreenDirGreenTimeDTO schemeGreenDirGreenTimeDTO = new SchemeGreenDirGreenTimeDTO();
for (RingPhaseInfoDTO ringPhaseInfoDTO : sort) {
List<RingPhaseInfoDTO.DirTurn> dirTurnInfoList = ringPhaseInfoDTO.getDirTurnInfoList();
if (CollectionUtils.isEmpty(dirTurnInfoList)) {
continue;
}
Integer phaseId = ringPhaseInfoDTO.getPhaseId();
Integer greenTime = ringPhaseInfoDTO.getGreenTime();
Integer yellowTime = ringPhaseInfoDTO.getYellowTime();
Integer redTime = ringPhaseInfoDTO.getRedTime();
Integer schemeNo = ringPhaseInfoDTO.getSchemeNo();
Integer cycleLen = ringPhaseInfoDTO.getCycleLen();
Integer offset = ringPhaseInfoDTO.getOffset();
Date date = ringPhaseInfoDTO.getDate();
for (RingPhaseInfoDTO.DirTurn dirTurn : dirTurnInfoList) {
Integer dir = dirTurn.getDir();
Integer turn = dirTurn.getTurn();
// 如果路口信息与绿波协调方向相同
// 如果是红灯,作为开始时间,结束时间是start + greenTime + yellowTime
if (Objects.equals(dir, greenDir) && Objects.equals(2, turn)) {
// 黄灯做绿灯处理
schemeGreenDirGreenTimeDTO.setCrossId(greenCrossId);
schemeGreenDirGreenTimeDTO.setSchemeNo(schemeNo);
schemeGreenDirGreenTimeDTO.setDir(dir);
schemeGreenDirGreenTimeDTO.setPhaseId(phaseId);
schemeGreenDirGreenTimeDTO.setStart(start);
schemeGreenDirGreenTimeDTO.setRingNo(ringNo);
schemeGreenDirGreenTimeDTO.setCycleLen(cycleLen);
schemeGreenDirGreenTimeDTO.setOffset(offset);
Integer endTime = start + greenTime + yellowTime;
schemeGreenDirGreenTimeDTO.setEnd(endTime);
schemeGreenDirGreenTimeDTO.setDate(date);
schemeGreenDirGreenTimeDTOS.add(schemeGreenDirGreenTimeDTO);
} else { // 如果是非协调方向, 相位时间作为开始时间
start += greenTime + yellowTime + redTime;
}
}
}
}
}
}
}
}
//log.error("路口绿灯协调方向时间:{}", mapper.writeValueAsString(schemeGreenDirGreenTimeDTOS));
}
if (!CollectionUtils.isEmpty(schemeGreenDirGreenTimeDTOS)) {
for (SchemeGreenDirGreenTimeDTO schemeGreenDirGreenTimeDTO : schemeGreenDirGreenTimeDTOS) {
greenChartSchemeRingPhaseMapper.insert(schemeGreenDirGreenTimeDTO);
}
}
} catch (Exception e) {
log.error("方向环相位入库失败:{}", e);
//throw new RuntimeException(e);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.GreenChartSchemeRingPhaseMapper">
</mapper>
\ No newline at end of file
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