Commit b187b9b7 authored by duanruiming's avatar duanruiming

[add] 海信方案环相位

parent a981bb1b
package net.wanji.opt.cache;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.entity.GreenCrossDirDTO;
import net.wanji.databus.dao.mapper.GreenwaveCrossMapper;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author duanruiming
* @date 2025/04/01 14:18
*/
@Component
@Slf4j
public class GreenCrossDirInfoCache implements CommandLineRunner {
@Resource
private GreenwaveCrossMapper greenwaveCrossMapper;
public static List<GreenCrossDirDTO> greenCrossDirCache = new ArrayList<>();
@Override
public void run(String... args) throws Exception {
try {
init();
} catch (Exception e) {
log.error("缓存加载失败:", e);
throw new RuntimeException(e);
}
}
public void init() {
try {
List<GreenCrossDirDTO> greenCrossDirDTOS = greenwaveCrossMapper.selectAllGreenCrossDir();
greenCrossDirCache.addAll(greenCrossDirDTOS);
} catch (Exception e) {
log.error("缓存加载失败:", e);
throw new RuntimeException(e);
}
}
}
package net.wanji.opt.dto;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2025/03/28 14:41
*/
@Data
public class RingPhaseInfoDTO {
private Integer schemeNo;
private Integer offset;
private Integer cycleLen;
private Integer ringNo;
private Integer phaseId;
private Integer sort;
private Integer phaseTime;
private Integer redTime;
private Integer yellowTime;
private Integer greenTime;
private Integer minGTime;
private Integer maxGTime;
/**
* 字段 Direction 和 ChannelDim 都表示相位的放行方向,但 Direction 不包含行人放行
* 信息,因此,建议使用 ChannelDim 字段,保留 Direction 字段仅为兼容之前版本。
*/
private Integer direction;
private Integer channel;
private Integer concurrent;
private Integer phaseStatus;
private List<DirTurn> dirTurnInfoList;
/**
* 转换后万集的方向转向,不包含行人
*/
@Data
public static class DirTurn {
private Integer dir;
private Integer turn;
}
}
package net.wanji.opt.dto;
import lombok.Data;
/**
* @author duanruiming
* @date 2025/04/01 15:38
*/
@Data
public class SchemeGreenDirGreenTimeDTO {
private String crossId;
private Integer schemeNo;
private Integer ringNo;
private Integer phaseId;
private Integer start;
private Integer end;
private Integer dir;
}
...@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component; ...@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Component //@Component
@Slf4j @Slf4j
public class GreenWaveWeekDataTask implements ApplicationRunner { public class GreenWaveWeekDataTask implements ApplicationRunner {
@Resource @Resource
......
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.tool.redistool.RedisUtil;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.dao.entity.GreenCrossDirDTO;
import net.wanji.databus.dao.mapper.GreenwaveCrossMapper;
import net.wanji.opt.cache.GreenCrossDirInfoCache;
import net.wanji.opt.common.RedisUtils;
import net.wanji.opt.dto.RingPhaseInfoDTO;
import net.wanji.opt.dto.SchemeGreenDirGreenTimeDTO;
import net.wanji.opt.vo.GreenwaveDetailVO;
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/01 11:18
* @description 海信通过reids缓存方案相位信息,设置绿波时序图
*/
@Component
@Slf4j
public class HisenseGreenChartTask {
@Resource
private RedisUtils redisUtils;
@Scheduled(fixedRate = 60 * 1000, initialDelay = 1 * 60 * 1000)
public void getGreenChart() {
try {
ObjectMapper mapper = JacksonUtils.getInstance();
// 绿波路口数据
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>>() {});
log.info("当前路口:{}, 环相位信息:{}", greenCrossId, str);
// 遍历绿波路口协调方向
if (StringUtils.isNotBlank(greenDirStr)) {
String[] greenDirArray = greenDirStr.split(",");
List<SchemeGreenDirGreenTimeDTO> schemeGreenDirGreenTimeDTOS = new ArrayList<>();
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();
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);
Integer endTime = start + greenTime + yellowTime;
schemeGreenDirGreenTimeDTO.setEnd(endTime);
schemeGreenDirGreenTimeDTOS.add(schemeGreenDirGreenTimeDTO);
} else { // 如果是非协调方向, 相位时间作为开始时间
start += greenTime + yellowTime + redTime;
}
log.error("当前路口:{}, 相位:{}, 协调方向:{},开始:{}, 结束:{}", greenCrossId, phaseId, greenDir, start, schemeGreenDirGreenTimeDTO.getEnd());
}
}
}
}
}
log.error("路口绿灯协调方向时间:{}", mapper.writeValueAsString(schemeGreenDirGreenTimeDTOS));
}
}
}
log.error("路口绿灯协调方向时间:{}", "333");
} catch (Exception e) {
log.error("通过海信方案处理绿波波定时任务失败:{}", e);
//throw new RuntimeException(e);
}
}
}
package net.wanji.databus.dao.entity;
import lombok.Data;
/**
* @author duanruiming
* @date 2025/04/01 14:13
*/
@Data
public class GreenCrossDirDTO {
private Integer greenId;
private String crossId;
private String greenDir;
}
package net.wanji.databus.dao.mapper; package net.wanji.databus.dao.mapper;
import net.wanji.databus.dao.entity.GreenCrossDirDTO;
import net.wanji.databus.dao.entity.GreenwaveCrossPO; import net.wanji.databus.dao.entity.GreenwaveCrossPO;
import net.wanji.databus.dao.entity.GreenwaveCrossPOExt; import net.wanji.databus.dao.entity.GreenwaveCrossPOExt;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -28,4 +29,11 @@ public interface GreenwaveCrossMapper { ...@@ -28,4 +29,11 @@ public interface GreenwaveCrossMapper {
* @return * @return
*/ */
List<GreenwaveCrossPOExt> selectAllGreeenCross(); List<GreenwaveCrossPOExt> selectAllGreeenCross();
/**
* 查询所有绿波路口绿波方向
* @return
*/
List<GreenCrossDirDTO> selectAllGreenCrossDir();
} }
...@@ -67,5 +67,10 @@ ...@@ -67,5 +67,10 @@
WHERE t1.green_id = t4.id WHERE t1.green_id = t4.id
</select> </select>
<select id="selectAllGreenCrossDir" resultType="net.wanji.databus.dao.entity.GreenCrossDirDTO">
select t2.green_id, t2.cross_id, t1.green_dir from t_greenwave_info t1
left join t_greenwave_cross t2 on t1.id = t2.green_id
</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