Commit 8de91809 authored by duanruiming's avatar duanruiming

[update] 海信灯态优化

parent 35a6f847
......@@ -66,6 +66,8 @@ public class CrossPhaseDirTurnCache implements CommandLineRunner {
String schemeNo = schemeIdNoMap.get(planId);
if (StringUtils.isNotBlank(schemeNo)) {
crossPhaseDirTurnPojo.setSchemeNo(Integer.valueOf(schemeNo));
} else {
crossPhaseDirTurnPojo.setSchemeNo(-1);
}
Integer phaseId = crossPhasePO.getId();
......@@ -79,7 +81,7 @@ public class CrossPhaseDirTurnCache implements CommandLineRunner {
Map<Integer, List<Integer>> 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).collect(Collectors.toList());
List<Integer> turnList = entry.getValue().stream().map(CrossLightsPO::getTurn).sorted().collect(Collectors.toList());
dirTurnMap.put(dir, turnList);
crossPhaseDirTurnPojo.setDirTurnMap(dirTurnMap);
}
......
package net.wanji.utc.hisense.common.enums;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/03/29 17:47
*/
public enum CrossLisghtsLaneDirEnum {
ONE(1, 5, "北"),
TWO(2, 6, "东北"),
THREE(3, 7, "东"),
FOUR(4, 8, "东南"),
FIVE(5, 1, "南"),
SIX(6, 2,"西南"),
SEVEN(7, 3, "西"),
EIGHT(8, 4,"西北");
private final int lightDir;
private final int laneDir;
private final String msg;
/**
* 通过灯组方向获取车道方向
*
* @param lightDir
* @return
*/
public static Integer getLaneDirByLightsDir(Integer lightDir) {
CrossLisghtsLaneDirEnum[] values = CrossLisghtsLaneDirEnum.values();
for (CrossLisghtsLaneDirEnum value : values) {
if (Objects.equals(value.getLightDir(), lightDir)) {
return value.getLaneDir();
}
}
return null;
}
/**
* 通过车道方向获取灯组方向
*
* @param laneDir
* @return
*/
public static Integer getLightsDirByLaneDir(Integer laneDir) {
CrossLisghtsLaneDirEnum[] values = CrossLisghtsLaneDirEnum.values();
for (CrossLisghtsLaneDirEnum value : values) {
if (Objects.equals(value.getLaneDir(), laneDir)) {
return value.getLightDir();
}
}
return null;
}
CrossLisghtsLaneDirEnum(int lightDir, int laneDir, String msg) {
this.lightDir = lightDir;
this.laneDir = laneDir;
this.msg = msg;
}
public int getLightDir() {
return lightDir;
}
public int getLaneDir() {
return laneDir;
}
public String getMsg() {
return msg;
}
}
......@@ -18,7 +18,7 @@ public enum DataBrainTurnEnum {
RIGHT(13, 2), //右转
STRAIGHT(11, 3), // 直行
TURN(31, 4),
OTHER(99, 99);
OTHER(99, 20); //行人
private Integer hisenseTurn;
private Integer wjTurn;
......
......@@ -8,11 +8,10 @@ import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.SignalStatusLogPO;
import net.wanji.databus.vo.LightsStatusVO;
import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.cache.CrossPhaseDirTurnCache;
import net.wanji.utc.hisense.cache.SignalDataCache;
import net.wanji.utc.hisense.common.enums.DataBrainControlModeEnum;
import net.wanji.utc.hisense.common.enums.DataBrainDirEnum;
import net.wanji.utc.hisense.common.enums.DataBrainLampStatusEnum;
import net.wanji.utc.hisense.common.enums.DataBrainTurnEnum;
import net.wanji.utc.hisense.common.enums.*;
import net.wanji.utc.hisense.pojo.CrossPhaseDirTurnPojo;
import net.wanji.utc.hisense.pojo.convert.HisenseLightStatusPojo;
import net.wanji.utc.hisense.service.SignalStatusService;
import org.apache.commons.lang.StringUtils;
......@@ -81,9 +80,6 @@ public class SignalStatusServiceImpl implements SignalStatusService {
int period = content.getPeriod();
int planId = content.getPlanId();
Long signalMachineStamp = content.getSignalMachineStamp();
if (StringUtils.equals(crossId, "13NF80B5QN0")) {
log.error("当前路口编号:{}, 周期倒计时:{},周期时间:{}", crossId, cycleCountDown, period);
}
lightsStatusVO.setCrossId(crossId);
lightsStatusVO.setSchemeId(String.valueOf(planId));
String runMode = String.valueOf(DataBrainControlModeEnum.getWjControlMode(hiControlMode));
......@@ -91,9 +87,6 @@ public class SignalStatusServiceImpl implements SignalStatusService {
lightsStatusVO.setCycleCountDown(cycleCountDown);
lightsStatusVO.setCycleLen(period);
lightsStatusVO.setSchemeStartTime(String.valueOf(signalMachineStamp));
// 保证不为空值
lightsStatusVO.setPhaseMap(Collections.emptyMap());
lightsStatusVO.setControlMode(runMode);
lightsStatusVO.setCode(hiCrossId);
......@@ -104,25 +97,33 @@ public class SignalStatusServiceImpl implements SignalStatusService {
if (!CollectionUtils.isEmpty(lampRealInfos)) {
Map<Integer, List<HisenseLightStatusPojo.ContentBody.LampRealInfos>> dirLampMap = lampRealInfos.stream().collect(Collectors.groupingBy(HisenseLightStatusPojo.ContentBody.LampRealInfos::getRoadDirection));
Map<String, Object> dirMap = new HashMap<>();
Map<Integer, List<Integer>> dirTurnMap = new HashMap<>();
for (Map.Entry<Integer, List<HisenseLightStatusPojo.ContentBody.LampRealInfos>> dirEntry : dirLampMap.entrySet()) {
Integer roadDirection = dirEntry.getKey();
Integer roadDirection = DataBrainDirEnum.getWjLightsDir(dirEntry.getKey());
List<HisenseLightStatusPojo.ContentBody.LampRealInfos> dirLampList = dirEntry.getValue();
Map<String, String> turnMap = new HashMap<>();
List<Integer> hisTurnList = new ArrayList<>();
for (HisenseLightStatusPojo.ContentBody.LampRealInfos lampRealInfo : dirLampList) {
String lampStatus = lampRealInfo.getLampStatus();
Integer countDown = lampRealInfo.getCountDown();
Integer roadFlowDirection = lampRealInfo.getRoadFlowDirection();
if (roadFlowDirection == 99) {
continue;
}
Integer wjTurn = DataBrainTurnEnum.getWjTurn(roadFlowDirection);
if (StringUtils.endsWithIgnoreCase(lampStatus, "23")) {
lightsStatusVO.setPhaseId("0");
lightsStatusVO.setCyclePhaseCountDown(countDown);
hisTurnList.add(wjTurn);
}
turnMap.put(String.valueOf(wjTurn), DataBrainLampStatusEnum.getWjLampStatus(lampStatus));
}
turnMap.put(String.valueOf(DataBrainTurnEnum.getWjTurn(roadFlowDirection)), DataBrainLampStatusEnum.getWjLampStatus(lampStatus));
dirMap.put(String.valueOf(roadDirection), turnMap);
// 获取当前绿灯方向转向
if (!CollectionUtils.isEmpty(hisTurnList)) {
dirTurnMap.put(roadDirection, hisTurnList);
}
dirMap.put(String.valueOf(DataBrainDirEnum.getWjLightsDir(roadDirection)), turnMap);
}
// 通过路口编号获取当前相位缓存
Integer currentPhaseNo = getCurrentPhagetseNo(crossId, planId, dirTurnMap);
lightsStatusVO.setPhaseId(String.valueOf(currentPhaseNo));
lightsStatusVO.setDirLampGroupMap(dirMap);
crossPriority.offer(lightsStatusVO);
if (crossPriority.size() > 100) {
......@@ -135,5 +136,33 @@ public class SignalStatusServiceImpl implements SignalStatusService {
}
}
/**
* @description 通过方向转向获取路口方案的相位号
*/
private static Integer getCurrentPhagetseNo(String crossId, int planId, Map<Integer, List<Integer>> hisDirTurnMap) {
Integer phaseNo = null;
List<CrossPhaseDirTurnPojo> crossPhaseDirTurnList = CrossPhaseDirTurnCache.getCrossPhaseDirTurnCache(crossId);
if (!CollectionUtils.isEmpty(crossPhaseDirTurnList)) {
List<CrossPhaseDirTurnPojo> schemeNoList = crossPhaseDirTurnList.stream().filter(po -> Objects.equals(po.getSchemeNo(), planId)).collect(Collectors.toList());
for (CrossPhaseDirTurnPojo crossPhaseDirTurnPojo : schemeNoList) {
Map<Integer, List<Integer>> dirTurnCache = crossPhaseDirTurnPojo.getDirTurnMap();
for (Map.Entry<Integer, List<Integer>> dirTurnCacheEntry : dirTurnCache.entrySet()) {
Integer dirCache = dirTurnCacheEntry.getKey();
for (Map.Entry<Integer, List<Integer>> hisEntry : hisDirTurnMap.entrySet()) {
Integer hisDir = hisEntry.getKey();
if (Objects.equals(dirCache, CrossLisghtsLaneDirEnum.getLightsDirByLaneDir(hisDir))) {
List<Integer> turnListCache = dirTurnCacheEntry.getValue();
if (hisEntry.getValue().stream().allMatch(turnListCache::contains)) {
phaseNo = crossPhaseDirTurnPojo.getPhaseNo();
}
}
}
}
}
}
log.error("当前路口:{},方案号:{},相位号:{}", crossId, planId, phaseNo);
return phaseNo;
}
}
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