Commit ada82b8f authored by duanruiming's avatar duanruiming

[add] 通过方案自动加载灯态接口

parent 04a76264
......@@ -26,7 +26,7 @@ public class CrossInfoCache implements CommandLineRunner {
@Resource
private ManufacturerInfoMapper manufacturerInfoMapper;
private static List<CrossInfoPO> crossInfoList = new ArrayList<>();
public static List<CrossInfoPO> crossInfoList = new ArrayList<>();
/**
* 通过路口编号获取厂商编码
......
package net.wanji.utc.cache;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.entity.CrossLightsPO;
import net.wanji.databus.dao.entity.CrossPhaseLightsPO;
import net.wanji.databus.dao.entity.CrossPhasePO;
import net.wanji.databus.dao.entity.CrossSchemePO;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.utc.po.hk.CrossPhaseDirTurnPojo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author duanruiming
* @date 2023/09/11 17:42
*/
@Slf4j
@Component
@SuppressWarnings("unchecked")
@RequiredArgsConstructor
public class CrossPhaseDirTurnCache implements CommandLineRunner {
private final CrossInfoMapper crossInfoMapper;
private final CrossPhaseMapper crossPhaseMapper;
private final CrossSchemeMapper crossSchemeMapper;
private final CrossPhaseLightsMapper crossPhaseLightsMapper;
private final CrossLightsMapper crossLightsMapper;
private static final Map<String, List<CrossPhaseDirTurnPojo>> crossInfoMap = new HashMap<>();
public static List<CrossPhaseDirTurnPojo> getCrossPhaseDirTurnCache(String crossId) {
if (!crossInfoMap.isEmpty()) {
return crossInfoMap.get(crossId);
}
return null;
}
@Override
public void run(String... args) throws Exception {
init();
}
public void init() {
List<CrossInfoPO> crossInfoPOList = crossInfoMapper.selectAll();
if (!CollectionUtils.isEmpty(crossInfoPOList)) {
for (CrossInfoPO crossInfoPO : crossInfoPOList) {
String crossId = crossInfoPO.getId();
List<CrossSchemePO> crossSchemePOS = crossSchemeMapper.selectByCrossId(crossId);
Map<Integer, String> schemeIdNoMap = crossSchemePOS.stream().collect(Collectors.toMap(CrossSchemePO::getId, CrossSchemePO::getSchemeNo));
List<CrossPhasePO> crossPhasePOS = crossPhaseMapper.selectByCrossId(crossId);
if (!CollectionUtils.isEmpty(crossPhasePOS)) {
List<CrossPhaseDirTurnPojo> results = new ArrayList<>();
for (CrossPhasePO crossPhasePO : crossPhasePOS) {
CrossPhaseDirTurnPojo crossPhaseDirTurnPojo = new CrossPhaseDirTurnPojo();
String phaseNo = crossPhasePO.getPhaseNo();
crossPhaseDirTurnPojo.setCrossId(crossId);
crossPhaseDirTurnPojo.setPhaseNo(Integer.valueOf(phaseNo));
Integer planId = crossPhasePO.getPlanId();
String schemeNo = schemeIdNoMap.get(planId);
if (StringUtils.isNotBlank(schemeNo)) {
crossPhaseDirTurnPojo.setSchemeNo(Integer.valueOf(schemeNo));
} else {
crossPhaseDirTurnPojo.setSchemeNo(-1);
}
Integer phaseId = crossPhasePO.getId();
List<CrossPhaseLightsPO> crossPhaseLightsPOList = crossPhaseLightsMapper.selectByCrossId(crossId);
List<Integer> phaseLightsList = crossPhaseLightsPOList.stream()
.filter(po -> Objects.equals(po.getPhaseId(), phaseId))
.map(CrossPhaseLightsPO::getLightsId).collect(Collectors.toList());
List<CrossLightsPO> crossLightsPOS = crossLightsMapper.selectByCrossId(crossId);
Map<Integer, List<CrossLightsPO>> phaseDirMap = crossLightsPOS.stream().filter(po -> phaseLightsList.contains(po.getId())).collect(Collectors.groupingBy(CrossLightsPO::getDir));
Map<Integer, List<CrossLightsPO>> dirTurnMap = new HashMap<>();
for (Map.Entry<Integer, List<CrossLightsPO>> entry : phaseDirMap.entrySet()) {
Integer dir = entry.getKey();
// List<Integer> turnList = entry.getValue().stream().map(CrossLightsPO::getTurn).sorted().collect(Collectors.toList());
// dirTurnMap.put(dir, turnList);
dirTurnMap.put(dir, entry.getValue());
crossPhaseDirTurnPojo.setDirTurnMap(dirTurnMap);
}
results.add(crossPhaseDirTurnPojo);
}
crossInfoMap.put(crossId, results);
}
}
}
}
}
package net.wanji.utc.cache;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.entity.CrossPhasePO;
import net.wanji.databus.dao.entity.CrossSchemePO;
import net.wanji.databus.dao.mapper.CrossInfoMapper;
import net.wanji.databus.dao.mapper.CrossPhaseMapper;
import net.wanji.databus.dao.mapper.CrossSchemeMapper;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.utc.dto.CrossSchemePhaseCountDownDTO;
import net.wanji.utc.dto.PhaseCountDownDTO;
import org.springframework.boot.CommandLineRunner;
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 2023/09/22 14:19
*/
@Slf4j
@Component
@SuppressWarnings("unchecked")
@RequiredArgsConstructor
public class CrossSchemePhaseTimeCountCache implements CommandLineRunner {
public static final List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = new ArrayList<>();
@Resource
private CrossPhaseMapper crossPhaseMapper;
@Resource
private CrossSchemeMapper crossSchemeMapper;
@Resource
private CrossInfoMapper crossInfoMapper;
@Override
public void run(String... args) throws Exception {
try {
init();
} catch (Exception e) {
log.error("路口方案相位倒计时缓存加载失败", e);
throw new Exception(e);
}
}
public void init() throws Exception {
List<CrossInfoPO> crossInfoPOList = crossInfoMapper.selectAll();
if (!CollectionUtils.isEmpty(crossInfoPOList)) {
for (CrossInfoPO crossInfoPO : crossInfoPOList) {
String crossId = crossInfoPO.getId();
List<CrossPhasePO> crossPhasePOS = crossPhaseMapper.selectByCrossId(crossId);
if (!CollectionUtils.isEmpty(crossPhasePOS)) {
Map<Integer, List<CrossPhasePO>> schemeIdListMap = crossPhasePOS.stream().collect(Collectors.groupingBy(CrossPhasePO::getPlanId));
for (Map.Entry<Integer, List<CrossPhasePO>> entry : schemeIdListMap.entrySet()) {
Integer schemeId = entry.getKey();
CrossSchemePhaseCountDownDTO crossSchemePhaseCountDownDTO = new CrossSchemePhaseCountDownDTO();
CrossSchemePO crossSchemePO = crossSchemeMapper.selectSchemePOById(schemeId);
if (Objects.isNull(crossSchemePO)) {
continue;
}
Integer cycle = crossSchemePO.getCycle();
String schemeNo = crossSchemePO.getSchemeNo();
List<CrossPhasePO> schemeNoList = entry.getValue();
if (!CollectionUtils.isEmpty(schemeNoList)) {
List<CrossPhasePO> phaseSortList = schemeNoList.stream().sorted(Comparator.comparingInt(CrossPhasePO::getSort)).collect(Collectors.toList());
Integer changePhaseTime = 0;
List<PhaseCountDownDTO> phaseCountDownDTOS = new ArrayList<>(phaseSortList.size());
for (CrossPhasePO crossPhasePO : phaseSortList) {
String phaseNo = crossPhasePO.getPhaseNo();
Integer phaseTime = crossPhasePO.getPhaseTime();
Integer yellowTime = crossPhasePO.getYellowTime();
Integer redTime = crossPhasePO.getRedTime();
changePhaseTime += phaseTime;
PhaseCountDownDTO phaseCountDownDTO = new PhaseCountDownDTO();
phaseCountDownDTO.setPhaseNo(phaseNo);
phaseCountDownDTO.setPhaseTime(phaseTime);
phaseCountDownDTO.setChangePhaseTime(changePhaseTime);
phaseCountDownDTO.setYellowTime(yellowTime);
phaseCountDownDTO.setRedTime(redTime);
phaseCountDownDTOS.add(phaseCountDownDTO);
}
crossSchemePhaseCountDownDTO.setPhaseCountDownDTOList(phaseCountDownDTOS);
}
crossSchemePhaseCountDownDTO.setCrossId(crossId);
crossSchemePhaseCountDownDTO.setSchemeNo(schemeNo);
crossSchemePhaseCountDownList.add(crossSchemePhaseCountDownDTO);
}
}
}
}
}
}
......@@ -74,7 +74,7 @@ public class SignalStatusController {
@ApiResponse(code = 200, message = "OK", response = LightsStatusVO.class)
})
public JsonViewObject lightStatusV2() throws Exception {
List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus();
List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus4StaticScheme();
List<LightsStatusVO2> listResult = new ArrayList<>(lightsStatusVOList.size());
for (LightsStatusVO lightsStatusVO : lightsStatusVOList) {
......@@ -87,13 +87,13 @@ public class SignalStatusController {
LightsStatusVO2.DirInfo dirInfo = new LightsStatusVO2.DirInfo();
String dir = groupEntry.getKey();
Map<String, Integer> turnDountMap = (Map<String, Integer>) phaseMap.get(dir);
Map<String, String> turnColorMap = (Map<String, String>)groupEntry.getValue();
Map<Integer, String> turnColorMap = (Map<Integer, String>) groupEntry.getValue();
List<LightsStatusVO2.TurnInfo> turnList = new ArrayList<>();
for (Map.Entry<String, String> turnEntry : turnColorMap.entrySet()) {
String turn = turnEntry.getKey();
for (Map.Entry<Integer, String> turnEntry : turnColorMap.entrySet()) {
Integer turn = turnEntry.getKey();
String color = turnEntry.getValue();
LightsStatusVO2.TurnInfo turnInfo = new LightsStatusVO2.TurnInfo();
turnInfo.setTurn(turn);
turnInfo.setTurn(String.valueOf(turn));
turnInfo.setColor(color);
Integer countDown = turnDountMap.get(turn);
turnInfo.setCountDown(countDown);
......
package net.wanji.utc.dto;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/09/22 14:26
*/
@Data
public class CrossSchemePhaseCountDownDTO {
private String crossId;
private String schemeNo;
private List<PhaseCountDownDTO> phaseCountDownDTOList;
}
package net.wanji.utc.dto;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/09/22 14:23
*/
@Data
public class PhaseCountDownDTO {
private String phaseNo;
private Integer changePhaseTime;
private Integer phaseTime;
private Integer yellowTime;
private Integer redTime;
}
package net.wanji.utc.po.hk;
import lombok.Data;
import net.wanji.databus.dao.entity.CrossLightsPO;
import java.util.List;
import java.util.Map;
/**
* @author duanruiming
* @date 2023/09/12 10:24
*/
@Data
public class CrossPhaseDirTurnPojo {
private String crossId;
private Integer phaseNo;
private Integer schemeNo;
private Map<Integer, List<CrossLightsPO>> dirTurnMap;
}
......@@ -21,9 +21,8 @@ public interface SignalStatusService {
List<SignalStatusLogPO> runningStatusAlarm(String crossId);
List<LightsStatusVO> lightStatus() throws Exception;
List<LightsStatusVO> lightStatus4StaticScheme() throws Exception;
List<LightsStatusVO> lightStatus(String crossId) throws Exception;
List<LightsStatusVO> lightStatusHist(String crossId, Integer batchTime, Integer endBatchTime) throws Exception;
}
......@@ -22,16 +22,14 @@ import net.wanji.utc.service.runninginfo.HkLightsStatusService;
import net.wanji.utc.service.runninginfo.HkRunningStatusService;
import net.wanji.utc.service.runninginfo.SignalStatusService;
import net.wanji.utc.service.runninginfo.WanJiCommonRunningStatusService;
import net.wanji.utc.task.SignalStatus4StaticSchemeTask;
import net.wanji.utc.util.ListUtil;
import net.wanji.utc.util.RedisUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -153,6 +151,16 @@ public class SignalStatusServiceImpl implements SignalStatusService {
return resList;
}
@Override
public List<LightsStatusVO> lightStatus4StaticScheme() throws Exception {
Map<String, LightsStatusVO> runningStateInfoCache = SignalStatus4StaticSchemeTask.runningStateInfoCache;
List<LightsStatusVO> result = new ArrayList<>();
for (Map.Entry<String, LightsStatusVO> entry : runningStateInfoCache.entrySet()) {
result.add(entry.getValue());
}
return result;
}
private List<BaseCrossInfo> getBaseCrossInfoList(BasicEnum.ManufacturerEnum manufacturerEnum) {
// 查询路口信息
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectByCode(manufacturerEnum.getCode());
......@@ -181,7 +189,8 @@ public class SignalStatusServiceImpl implements SignalStatusService {
for (CrossLightsStatusHistPO crossLightsStatusHistPO : crossLightsStatusHistPOS) {
String lightsStatusJson = crossLightsStatusHistPO.getLightsStatusJson();
ObjectMapper instance = JacksonUtils.getInstance();
List<LightsStatusVO> lightsStatusVOS = instance.readValue(lightsStatusJson, new TypeReference<List<LightsStatusVO>>() {});
List<LightsStatusVO> lightsStatusVOS = instance.readValue(lightsStatusJson, new TypeReference<List<LightsStatusVO>>() {
});
if (!CollectionUtils.isEmpty(lightsStatusVOS)) {
LightsStatusVO lightsStatusVO = lightsStatusVOS.get(0);
result.add(lightsStatusVO);
......
package net.wanji.utc.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.Constants;
import net.wanji.common.utils.tool.DateUtil;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.CrossPhaseMapper;
import net.wanji.databus.dao.mapper.CrossSchedulesMapper;
import net.wanji.databus.dao.mapper.CrossSchemeMapper;
import net.wanji.databus.dao.mapper.CrossSectionMapper;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.vo.LightsStatusVO;
import net.wanji.utc.cache.CrossInfoCache;
import net.wanji.utc.cache.CrossPhaseDirTurnCache;
import net.wanji.utc.cache.CrossSchemePhaseTimeCountCache;
import net.wanji.utc.dto.CrossSchemePhaseCountDownDTO;
import net.wanji.utc.dto.PhaseCountDownDTO;
import net.wanji.utc.po.hk.CrossPhaseDirTurnPojo;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* @author duanruiming
* @description 从信号机方案模拟信号机灯态
* @date 2023/12/01 10:28
*/
@Component
@Slf4j
public class SignalStatus4StaticSchemeTask {
public static final Map<String, LightsStatusVO> currentCrossLightStatusCache = new HashMap<>();
public static final Map<String, LightsStatusVO> runningStateInfoCache = new ConcurrentHashMap<>();
@Resource
private CrossSchedulesMapper crossSchedulesMapper;
@Resource
private CrossSectionMapper crossSectionMapper;
@Resource
private CrossSchemeMapper crossSchemeMapper;
@Resource
private CrossPhaseMapper crossPhaseMapper;
@Scheduled(fixedRate = 1000)
public void signalStatusCountDown() throws Exception {
try {
if (!currentCrossLightStatusCache.isEmpty()) {
for (Map.Entry<String, LightsStatusVO> entry : currentCrossLightStatusCache.entrySet()) {
String crossId = entry.getKey();
LightsStatusVO lightsStatusVO = entry.getValue();
long timeStamp = Long.parseLong(lightsStatusVO.getTimeStamp());
String schemeStartTime = lightsStatusVO.getSchemeStartTime();
String phaseId = lightsStatusVO.getPhaseId();
String schemeId = lightsStatusVO.getSchemeId();
CrossSchemePO crossSchemePO = crossSchemeMapper.selectByCrossIdAndSchemeNo(crossId, Integer.valueOf(schemeId));
executeNextPeriod(crossId, lightsStatusVO, phaseId, crossSchemePO);
// 当前方案下一周期
setDirLampGroupMap(lightsStatusVO);
if (Objects.nonNull(lightsStatusVO.getDirLampGroupMap())) {
// 当前时间戳自动加1s
lightsStatusVO.setTimeStamp(String.valueOf(timeStamp + 1000));
// 红灯倒计时
getRedCountDown(crossId, lightsStatusVO, schemeId);
runningStateInfoCache.put(crossId, lightsStatusVO);
}
}
}
} catch (Exception e) {
log.error("定时任务计算路口相位灯态倒计时异常", e);
throw new Exception(e);
}
}
/**
* 每隔1分钟获取路口方案号
*
* @throws Exception
*/
@Scheduled(fixedRate = 60 * 1000)
public void getStaticCrossRunningLightStatus() throws Exception {
try {
List<CrossInfoPO> crossInfoList = CrossInfoCache.crossInfoList;
for (CrossInfoPO crossInfoPO : crossInfoList) {
String crossId = crossInfoPO.getId();
String code = crossInfoPO.getCode();
LightsStatusVO lightsStatusVO = new LightsStatusVO();
List<CrossSectionPO> crossSectionPOS = crossSectionMapper.selectByCrossId(crossId);
List<CrossSchedulesPO> crossSchedulesPOS = crossSchedulesMapper.selectByCrossIds(Arrays.asList(crossId));
if (!CollectionUtils.isEmpty(crossSchedulesPOS)) {
Map<Integer, List<CrossSchedulesPO>> schedulesMap = crossSchedulesPOS.stream().collect(Collectors.groupingBy(CrossSchedulesPO::getPlanId));
// 判断当前执行的调度,获取日计划号
Date date = new Date();
LocalTime currentTime = LocalTime.parse(DateUtil.getTime());
Integer currentPlanId = getCurrentPlanId(schedulesMap, date);
Integer schemeId = getCurrentSchemeId(crossSectionPOS, currentTime, currentPlanId);
CrossSchemePO crossSchemePO = crossSchemeMapper.selectSchemePOById(schemeId);
if (Objects.nonNull(crossSchemePO)) {
String schemeNo = crossSchemePO.getSchemeNo();
if (StringUtils.isNotBlank(schemeNo)) {
List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = CrossSchemePhaseTimeCountCache.crossSchemePhaseCountDownList;
for (CrossSchemePhaseCountDownDTO crossSchemePhaseCountDownDTO : crossSchemePhaseCountDownList) {
if (StringUtils.equalsIgnoreCase(schemeNo, crossSchemePhaseCountDownDTO.getSchemeNo()) &&
StringUtils.equalsIgnoreCase(crossId, crossSchemePhaseCountDownDTO.getCrossId())) {
lightsStatusVO.setCrossId(crossId);
lightsStatusVO.setCyclePhaseCountDown(crossSchemePO.getCycle());
lightsStatusVO.setCycleCountDown(crossSchemePO.getCycle());
lightsStatusVO.setSchemeId(schemeNo);
lightsStatusVO.setCycleLen(crossSchemePO.getCycle());
lightsStatusVO.setPhaseId("1");
String currentTimeStr = String.valueOf(date.getTime());
lightsStatusVO.setTimeStamp(currentTimeStr);
lightsStatusVO.setCode(code);
lightsStatusVO.setRunMode("11");
lightsStatusVO.setControlMode("11");
currentCrossLightStatusCache.put(crossId, lightsStatusVO);
}
}
}
}
}
}
} catch (Exception e) {
log.error("获取当前路口运行方案号失败:", e);
throw new Exception(e);
}
}
private static Integer getCurrentSchemeId(List<CrossSectionPO> crossSectionPOS, LocalTime currentTime, Integer currentPlanId) {
if (!CollectionUtils.isEmpty(crossSectionPOS)) {
List<CrossSectionPO> currentPlanIdSectionList = crossSectionPOS.stream().filter(po -> Objects.equals(currentPlanId, po.getPlanId())).collect(Collectors.toList());
for (CrossSectionPO crossSectionPO : currentPlanIdSectionList) {
Integer schemeId = crossSectionPO.getSchemeId();
LocalTime startTime = LocalTime.parse(crossSectionPO.getStartTime());
LocalTime endTime = LocalTime.parse(crossSectionPO.getEndTime());
// 过滤非当前时段数据
if (currentTime.isAfter(startTime) && currentTime.isBefore(endTime)) {
return schemeId;
}
}
}
return 0;
}
private static Integer getCurrentPlanId(Map<Integer, List<CrossSchedulesPO>> schedulesMap, Date currentDate) {
for (Map.Entry<Integer, List<CrossSchedulesPO>> entry : schedulesMap.entrySet()) {
Integer planId = entry.getKey();
List<CrossSchedulesPO> schedulesPOS = entry.getValue();
if (!CollectionUtils.isEmpty(schedulesPOS)) {
for (CrossSchedulesPO schedulesPO : schedulesPOS) {
Integer isSpectialDay = schedulesPO.getWeek(); // 0 为特殊日期
Date specialDate = schedulesPO.getSpecialDate();
String specialDate4DB = DateUtil.format(specialDate, Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND);
String currentDateStr = DateUtil.format(currentDate, Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND);
if (Objects.equals(0, isSpectialDay)) {
if (StringUtils.equalsIgnoreCase(currentDateStr.substring(0, 10), specialDate4DB.substring(0, 10))) {
return planId;
}
}
Integer week4DB = schedulesPO.getWeek();
int weekCurrent = DateUtil.getWeek(currentDate);
if (week4DB == weekCurrent) {
return planId;
}
}
}
}
return 0;
}
private static void getRedCountDown(String crossId, LightsStatusVO lightsStatusVO, String schemeId) {
Map<String, Object> phaseMap = new HashMap<>();
List<CrossPhaseDirTurnPojo> crossPhaseDirTurnCache = CrossPhaseDirTurnCache.getCrossPhaseDirTurnCache(crossId);
List<PhaseCountDownDTO> phaseCountDownList = getPhaseCountDownList(crossId, schemeId);
if (!CollectionUtils.isEmpty(phaseCountDownList)) {
for (PhaseCountDownDTO phaseCountDownDTO : phaseCountDownList) {
Integer changePhaseTime = phaseCountDownDTO.getChangePhaseTime();
Integer phaseTime = phaseCountDownDTO.getPhaseTime();
Integer cycleLen = lightsStatusVO.getCycleLen();
Integer cycleCountDown = lightsStatusVO.getCycleCountDown();
String currenPhaseId = lightsStatusVO.getPhaseId();
int runtime = cycleLen - cycleCountDown;
int redCountDown = 0;
if (!CollectionUtils.isEmpty(crossPhaseDirTurnCache)) {
for (CrossPhaseDirTurnPojo dirTurnPojo : crossPhaseDirTurnCache) {
if (StringUtils.equalsIgnoreCase(schemeId, String.valueOf(dirTurnPojo.getSchemeNo()))) {
if (!StringUtils.equalsIgnoreCase(currenPhaseId, String.valueOf(dirTurnPojo.getPhaseNo()))) {
Map<Integer, List<CrossLightsPO>> dirTurnMap = dirTurnPojo.getDirTurnMap();
for (Map.Entry<Integer, List<CrossLightsPO>> dirEntry : dirTurnMap.entrySet()) {
Integer dir = dirEntry.getKey();
Map<Integer, Integer> turnCountDown = new HashMap<>();
List<CrossLightsPO> lightsPOS = dirEntry.getValue();
if (!CollectionUtils.isEmpty(lightsPOS)) {
// 忽略行人
List<CrossLightsPO> person = lightsPOS.stream().filter(po -> po.getTurn() == 20).collect(Collectors.toList());
if (person.size() == lightsPOS.size()) {
continue;
}
Integer type = lightsPOS.get(0).getType();
redCountDown = changePhaseTime - runtime - phaseTime;
if (redCountDown <= 0) {
redCountDown = cycleLen - runtime;
}
//if (redCountDown <= 0) {
// redCountDown = 1;
//}
if (type == 2) { // 圆饼灯
List<Integer> dirList = Arrays.asList(1, 2, 3);
for (Integer commonTurn : dirList) {
turnCountDown.put(commonTurn, redCountDown);
}
} else {
Map<Integer, List<CrossLightsPO>> turnMap = lightsPOS.stream().collect(Collectors.groupingBy(CrossLightsPO::getTurn));
for (Map.Entry<Integer, List<CrossLightsPO>> turnEntry : turnMap.entrySet()) {
Integer turn = turnEntry.getKey();
List<CrossLightsPO> value = turnEntry.getValue();
for (CrossLightsPO lightsPO : value) {
if (lightsPO.getTurn() != 20) {
turnCountDown.put(turn, redCountDown);
}
}
}
}
}
setPhaseMap(phaseMap, dir, turnCountDown);
}
} else {
Integer cyclePhaseCountDown = lightsStatusVO.getCyclePhaseCountDown();
Map<Integer, List<CrossLightsPO>> dirTurnMap = dirTurnPojo.getDirTurnMap();
for (Map.Entry<Integer, List<CrossLightsPO>> dirEntry : dirTurnMap.entrySet()) {
Integer dir = dirEntry.getKey();
Map<Integer, Integer> turnCountDown = new HashMap<>();
List<CrossLightsPO> lightsPOS = dirEntry.getValue();
if (!CollectionUtils.isEmpty(lightsPOS)) {
// 忽略行人
List<CrossLightsPO> person = lightsPOS.stream().filter(po -> po.getTurn() == 20).collect(Collectors.toList());
if (person.size() == lightsPOS.size()) {
continue;
}
Integer type = lightsPOS.get(0).getType();
redCountDown = cyclePhaseCountDown;
if (type == 2) { // 圆饼灯
List<Integer> dirList = Arrays.asList(1, 2, 3);
for (Integer commonTurn : dirList) {
turnCountDown.put(commonTurn, redCountDown);
}
} else {
Map<Integer, List<CrossLightsPO>> turnMap = lightsPOS.stream().collect(Collectors.groupingBy(CrossLightsPO::getTurn));
for (Map.Entry<Integer, List<CrossLightsPO>> turnEntry : turnMap.entrySet()) {
Integer turn = turnEntry.getKey();
List<CrossLightsPO> value = turnEntry.getValue();
for (CrossLightsPO lightsPO : value) {
if (lightsPO.getTurn() != 20) {
turnCountDown.put(turn, redCountDown);
}
}
}
}
}
setPhaseMap(phaseMap, dir, turnCountDown);
}
}
}
}
}
}
}
lightsStatusVO.setPhaseMap(phaseMap);
}
/**
* 统一方向转向倒计时
*
* @param phaseMap
* @param dir
* @param turnCountDown
*/
private static void setPhaseMap(Map<String, Object> phaseMap, Integer dir, Map<Integer, Integer> turnCountDown) {
String dirStr = String.valueOf(dir);
if (!phaseMap.isEmpty() && Objects.nonNull(phaseMap.get(dirStr))) {
Map<Integer, Integer> turnCountDownCache = (Map<Integer, Integer>) phaseMap.get(dirStr);
turnCountDown.putAll(turnCountDownCache);
phaseMap.put(String.valueOf(dir), turnCountDown);
} else {
phaseMap.put(String.valueOf(dir), turnCountDown);
}
}
/**
* @param crossId
* @param lightsStatusVO
* @param crossSchemePO
* @description 通过日计划缓存,切换下一个时段方案
*/
private void executeNextSectionScheme(String crossId, LightsStatusVO lightsStatusVO, CrossSchemePO crossSchemePO) throws Exception {
if (Objects.nonNull(crossSchemePO)) {
List<CrossPhasePO> nextSchemePhaseList = crossPhaseMapper.selectByCrossIdAndPlanId(crossId, String.valueOf(crossSchemePO.getId()));
Integer phaseTime = 0;
String phaseId = null;
if (!CollectionUtils.isEmpty(nextSchemePhaseList)) {
for (CrossPhasePO crossPhasePO : nextSchemePhaseList) {
if (Objects.equals(1, crossPhasePO.getSort())) {
phaseTime = crossPhasePO.getPhaseTime();
phaseId = crossPhasePO.getPhaseNo();
}
}
}
lightsStatusVO.setPhaseId(phaseId);
lightsStatusVO.setCyclePhaseCountDown(phaseTime);
}
}
/**
* @param crossId
* @param lightsStatusVO
* @param phaseId
* @param crossSchemePO
* @description 切换下一方案周期
*/
private void executeNextPeriod(String crossId, LightsStatusVO lightsStatusVO, String phaseId, CrossSchemePO crossSchemePO) throws Exception {
if (lightsStatusVO.getCyclePhaseCountDown() <= 1 && Objects.nonNull(crossSchemePO)) {
List<CrossPhasePO> crossPhasePOS = crossPhaseMapper.selectByCrossIdAndPlanId(crossId, String.valueOf(crossSchemePO.getId()));
Integer nextPhaseTime = 0;
String nextPhaseId = "0";
if (!CollectionUtils.isEmpty(crossPhasePOS)) {
for (int i = 0; i < crossPhasePOS.size(); i++) {
if (StringUtils.equalsIgnoreCase(phaseId, crossPhasePOS.get(i).getPhaseNo())) {
if (i == crossPhasePOS.size() - 1) {
nextPhaseTime = crossPhasePOS.get(0).getPhaseTime();
nextPhaseId = "1";
} else {
nextPhaseTime = crossPhasePOS.get(i + 1).getPhaseTime();
nextPhaseId = crossPhasePOS.get(i + 1).getPhaseNo();
}
}
}
}
lightsStatusVO.setPhaseId(nextPhaseId);
lightsStatusVO.setCyclePhaseCountDown(nextPhaseTime);
} else {
lightsStatusVO.setCyclePhaseCountDown(lightsStatusVO.getCyclePhaseCountDown() - 1);
Integer cycleCountDown = lightsStatusVO.getCycleCountDown();
lightsStatusVO.setCycleCountDown(--cycleCountDown);
}
}
/**
* @param lightsStatusVO
* @description 通过当前周期倒计时方案相位灯态
*/
public void setDirLampGroupMap(LightsStatusVO lightsStatusVO) throws Exception {
String crossId = lightsStatusVO.getCrossId();
String currentSchemeNo = lightsStatusVO.getSchemeId();
String currentPhaseNo = lightsStatusVO.getPhaseId();
Integer cyclePhaseCountDown = lightsStatusVO.getCyclePhaseCountDown();
List<CrossPhaseDirTurnPojo> crossPhaseDirTurnCache = CrossPhaseDirTurnCache.getCrossPhaseDirTurnCache(crossId);
if (!CollectionUtils.isEmpty(crossPhaseDirTurnCache)) {
Map<String, Object> dirLampGroupMap = new HashMap<>();
setPhaseLampColor(crossId, currentSchemeNo, currentPhaseNo, cyclePhaseCountDown, crossPhaseDirTurnCache, dirLampGroupMap);
// 海信,箭头灯变圆饼灯
for (Map.Entry<String, Object> arrowEntry : dirLampGroupMap.entrySet()) {
String dir = arrowEntry.getKey();
Map<Integer, String> turnColor = (Map<Integer, String>) arrowEntry.getValue();
if (!turnColor.isEmpty() && !turnColor.containsKey(1)) {
// 如果不包含左转, 左转灯色为直行
String straightColor = turnColor.get(2);
turnColor.put(1, straightColor);
dirLampGroupMap.put(dir, turnColor);
}
}
lightsStatusVO.setDirLampGroupMap(dirLampGroupMap);
}
}
private void setPhaseLampColor(String crossId, String currentSchemeNo, String currentPhaseNo, Integer cyclePhaseCountDown, List<CrossPhaseDirTurnPojo> crossPhaseDirTurnCache, Map<String, Object> dirLampGroupMap) throws Exception {
for (CrossPhaseDirTurnPojo phaseDirTurnPojo : crossPhaseDirTurnCache) {
String schemeNo = String.valueOf(phaseDirTurnPojo.getSchemeNo());
String phaseNo = String.valueOf(phaseDirTurnPojo.getPhaseNo());
if (StringUtils.equalsIgnoreCase(schemeNo, currentSchemeNo)) {
if (!StringUtils.equalsIgnoreCase(currentPhaseNo, String.valueOf(phaseNo))) {
// 相位红灯
Map<Integer, List<CrossLightsPO>> dirTurnMap = phaseDirTurnPojo.getDirTurnMap();
if (!dirTurnMap.isEmpty()) {
for (Map.Entry<Integer, List<CrossLightsPO>> entry : dirTurnMap.entrySet()) {
String dir = String.valueOf(entry.getKey());
Map<Integer, String> turnColor = null;
if (!dirLampGroupMap.containsKey(dir)) {
turnColor = new HashMap<>();
} else {
turnColor = (Map<Integer, String>) dirLampGroupMap.get(dir);
}
List<CrossLightsPO> value = entry.getValue();
int type = 1;
for (CrossLightsPO crossLightsPO : value) {
Integer turn = crossLightsPO.getTurn();
type = crossLightsPO.getType();
// 搭接相位跳过绿灯变红灯
if (turnColor.containsKey(turn) && turnColor.get(turn).equals("green")) {
continue;
}
turnColor.put(turn, "red");
}
if (type == 2) {
setAllTurnColor(turnColor, "red"); //红灯时,圆饼灯操作
}
turnColor.put(3, "green");
dirLampGroupMap.put(dir, turnColor);
}
}
} else {
// 相位绿灯
PhaseCountDownDTO phaseCountDownDTO = getPhaseCountDownDTO(crossId, schemeNo, phaseNo);
if (Objects.isNull(phaseCountDownDTO)) {
continue;
}
Integer yellowTime = phaseCountDownDTO.getYellowTime();
Integer redTime = phaseCountDownDTO.getRedTime();
Map<Integer, List<CrossLightsPO>> dirTurnMap = phaseDirTurnPojo.getDirTurnMap();
if (!dirTurnMap.isEmpty()) {
setDirTurnColor(cyclePhaseCountDown, dirLampGroupMap, yellowTime, redTime, dirTurnMap);
}
}
}
}
}
private static void setDirTurnColor(Integer cyclePhaseCountDown, Map<String, Object> dirLampGroupMap,
Integer yellowTime, Integer redTime, Map<Integer, List<CrossLightsPO>> dirTurnMap) throws Exception {
for (Map.Entry<Integer, List<CrossLightsPO>> dirEntry : dirTurnMap.entrySet()) {
String dir = String.valueOf(dirEntry.getKey());
List<CrossLightsPO> lightsList = dirEntry.getValue();
if (CollectionUtils.isEmpty(lightsList)) {
continue;
}
Map<Integer, String> turnColor = null;
if (!dirLampGroupMap.containsKey(dir)) {
turnColor = new HashMap<>();
} else {
turnColor = (Map<Integer, String>) dirLampGroupMap.get(dir);
}
Integer type = 2; // 灯组类型:1箭头;2圆饼;3行人;
String color = null;
for (CrossLightsPO crossLightsPO : lightsList) {
type = crossLightsPO.getType();
Integer turn = crossLightsPO.getTurn();
color = setTurnColor(cyclePhaseCountDown, yellowTime, redTime, turnColor, color, turn);
turnColor.put(turn, color);
}
if (type == 2) {
setAllTurnColor(turnColor, color);
}
dirLampGroupMap.put(dir, turnColor);
}
}
private static String setTurnColor(Integer cyclePhaseCountDown, Integer yellowTime, Integer redTime,
Map<Integer, String> turnColor, String color, Integer turn) throws Exception {
if (cyclePhaseCountDown > yellowTime + redTime) {
color = "green";
if (turn == 20) {
turnColor.put(turn, "red");
}
}
if (cyclePhaseCountDown <= yellowTime + redTime && cyclePhaseCountDown > redTime) {
color = "yellow";
if (turn == 20) {
turnColor.put(turn, "red");
}
}
if (cyclePhaseCountDown <= redTime) {
color = "red";
if (turn == 20) {
turnColor.put(turn, "green");
}
}
return color;
}
/**
* 两秒倒计时,全场红
*
* @param turnColor
* @param type
* @param color
*/
private static void setAllTurnColorRed(Map<Integer, String> turnColor, Integer type, String color) throws Exception {
List<Integer> allTurn = Arrays.asList(1, 2, 3);
for (Integer turnStr : allTurn) {
if (!turnColor.containsKey(turnStr)) {
turnColor.put(turnStr, "red");
}
}
for (Map.Entry<Integer, String> entry : turnColor.entrySet()) {
entry.setValue("red");
}
}
/**
* 圆饼灯设置所有方向灯色
*
* @param turnColor
* @param color
*/
private static void setAllTurnColor(Map<Integer, String> turnColor, String color) throws Exception {
List<Integer> allTurn = Arrays.asList(1, 2);
for (Integer turn : allTurn) {
if (!turnColor.containsKey(turn)) {
turnColor.put(turn, color);
}
}
turnColor.put(3, "green"); // 右转常绿
}
/**
* @param crossId
* @param schemeNo
* @param phaseNo
* @return
* @description 获取路口方案相位倒计时
*/
private PhaseCountDownDTO getPhaseCountDownDTO(String crossId, String schemeNo, String phaseNo) {
List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = CrossSchemePhaseTimeCountCache.crossSchemePhaseCountDownList;
if (!CollectionUtils.isEmpty(crossSchemePhaseCountDownList)) {
for (CrossSchemePhaseCountDownDTO dto : crossSchemePhaseCountDownList) {
if (Objects.equals(crossId, dto.getCrossId()) && Objects.equals(schemeNo, dto.getSchemeNo())) {
List<PhaseCountDownDTO> phaseCountDownDTOList = dto.getPhaseCountDownDTOList();
if (!CollectionUtils.isEmpty(phaseCountDownDTOList)) {
for (PhaseCountDownDTO phaseCountDownDTO : phaseCountDownDTOList) {
if (Objects.equals(phaseNo, phaseCountDownDTO.getPhaseNo())) {
return phaseCountDownDTO;
}
}
}
}
}
}
return null;
}
private static List<PhaseCountDownDTO> getPhaseCountDownList(String crossId, String schemeNo) {
List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = CrossSchemePhaseTimeCountCache.crossSchemePhaseCountDownList;
if (!CollectionUtils.isEmpty(crossSchemePhaseCountDownList)) {
for (CrossSchemePhaseCountDownDTO dto : crossSchemePhaseCountDownList) {
if (Objects.equals(crossId, dto.getCrossId()) && Objects.equals(schemeNo, dto.getSchemeNo())) {
List<PhaseCountDownDTO> phaseCountDownDTOList = dto.getPhaseCountDownDTOList();
if (!CollectionUtils.isEmpty(phaseCountDownDTOList)) {
return phaseCountDownDTOList;
}
}
}
}
return Collections.emptyList();
}
}
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