Commit b13b8f7b authored by duanruiming's avatar duanruiming

[update] 优化海信灯态接入方式

parent aac17b1e
package net.wanji.utc.hisense.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.hisense.pojo.dto.CrossSchemePhaseCountDownDTO;
import net.wanji.utc.hisense.pojo.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 {
init();
}
public void init() {
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);
}
}
}
}
}
}
...@@ -21,7 +21,7 @@ public class SignalDataCache { ...@@ -21,7 +21,7 @@ public class SignalDataCache {
public static final Map<String, List<PhaseStageInfoPojo>> phaseStageInfoCache = new HashMap<>(); public static final Map<String, List<PhaseStageInfoPojo>> phaseStageInfoCache = new HashMap<>();
public static final Map<String, List<PhaseInfoPojo>> phaseInfoCache = new HashMap<>(); public static final Map<String, List<PhaseInfoPojo>> phaseInfoCache = new HashMap<>();
// 海信推送灯态数据 // 海信推送灯态数据
public static final Map<String, RunningLightsStatusPojo> runningStateInfoCache = new HashMap<>(); public static final Map<String, RunningLightsStatusPojo> runningStateInfoCacheUdp = new HashMap<>();
public static final Map<String, LightsStatusVO> runningStateInfoCache4DataBrain = new HashMap<>(); public static final Map<String, LightsStatusVO> runningStateInfoCache = new HashMap<>();
public static final Map<String, Long> runningStatusStampMap = new HashMap<>(); public static final Map<String, Long> runningStatusStampMap = new HashMap<>();
} }
...@@ -75,7 +75,7 @@ public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPack ...@@ -75,7 +75,7 @@ public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPack
RunningLightsStatusPojo pojo = (RunningLightsStatusPojo) resultPojo; RunningLightsStatusPojo pojo = (RunningLightsStatusPojo) resultPojo;
String signalCode = pojo.getCID(); String signalCode = pojo.getCID();
String crossId = signalMap.get(signalCode); String crossId = signalMap.get(signalCode);
Map<String, RunningLightsStatusPojo> cache = SignalDataCache.runningStateInfoCache; Map<String, RunningLightsStatusPojo> cache = SignalDataCache.runningStateInfoCacheUdp;
if (crossId != null) { if (crossId != null) {
cache.put(crossId, pojo); cache.put(crossId, pojo);
} }
......
...@@ -16,7 +16,7 @@ import org.springframework.stereotype.Service; ...@@ -16,7 +16,7 @@ import org.springframework.stereotype.Service;
public class GetRunningStateInfoService implements CommandResponseFactory { public class GetRunningStateInfoService implements CommandResponseFactory {
@Override @Override
public Object getCommandResponse(CommandPojo commandPojo) { public Object getCommandResponse(CommandPojo commandPojo) {
SignalDataCache.runningStateInfoCache.put(commandPojo.getCrossId(), (RunningLightsStatusPojo) commandPojo.getResponseMsg()); SignalDataCache.runningStateInfoCacheUdp.put(commandPojo.getCrossId(), (RunningLightsStatusPojo) commandPojo.getResponseMsg());
return commandPojo; return commandPojo;
} }
......
...@@ -13,7 +13,7 @@ import java.util.List; ...@@ -13,7 +13,7 @@ import java.util.List;
@Data @Data
@ApiModel(value = "来自滴滴海信灯态实体类") @ApiModel(value = "来自滴滴海信灯态实体类")
public class HisenseLightStatusPojo { public class HisenseLightStatusPojo {
private String headers; private Headers headers;
private String body; private String body;
...@@ -23,8 +23,6 @@ public class HisenseLightStatusPojo { ...@@ -23,8 +23,6 @@ public class HisenseLightStatusPojo {
private String name; private String name;
@ApiModelProperty(value = "滴滴数据大脑数据来源") @ApiModelProperty(value = "滴滴数据大脑数据来源")
private String from; private String from;
@ApiModelProperty(value = "唯一标识")
private String taskId;
} }
@Data @Data
...@@ -50,9 +48,9 @@ public class HisenseLightStatusPojo { ...@@ -50,9 +48,9 @@ public class HisenseLightStatusPojo {
"22:单点感应控制,23:打点自适应控制,31:线协调控制,41:区域协调控制,51:干预控制-手动控制," + "22:单点感应控制,23:打点自适应控制,31:线协调控制,41:区域协调控制,51:干预控制-手动控制," +
"52:干预控制-锁定阶段控制,53:干预控制-指定方案,54:干预控制-锁定相位控制") "52:干预控制-锁定阶段控制,53:干预控制-指定方案,54:干预控制-锁定相位控制")
private int controlMode; private int controlMode;
@ApiModelProperty(value = "路口编号,编号规则:6位行政区编号+5位数字,例如:64010400001") @ApiModelProperty(value = "海信定义路口编号")
private String crossId; private String crossId;
@ApiModelProperty(value = "信号机实时状态,0-正常1-掉线") @ApiModelProperty(value = "信号机实时状态,0-正常1-掉线")
private int crossRealStatus; private int crossRealStatus;
@ApiModelProperty(value = "周期剩余时间") @ApiModelProperty(value = "周期剩余时间")
private int cycleCountDown; private int cycleCountDown;
......
package net.wanji.utc.hisense.pojo.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.hisense.pojo.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;
}
...@@ -4,17 +4,21 @@ import com.fasterxml.jackson.core.type.TypeReference; ...@@ -4,17 +4,21 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.JacksonUtils; import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.po.CrossInfoPO; import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.SignalStatusLogPO; import net.wanji.databus.po.SignalStatusLogPO;
import net.wanji.databus.vo.LightsStatusVO; import net.wanji.databus.vo.LightsStatusVO;
import net.wanji.utc.hisense.cache.CrossInfoCache; import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.cache.CrossPhaseDirTurnCache; import net.wanji.utc.hisense.cache.CrossPhaseDirTurnCache;
import net.wanji.utc.hisense.cache.CrossSchemePhaseTimeCountCache;
import net.wanji.utc.hisense.cache.SignalDataCache; import net.wanji.utc.hisense.cache.SignalDataCache;
import net.wanji.utc.hisense.common.enums.*; import net.wanji.utc.hisense.common.enums.CrossLisghtsLaneDirEnum;
import net.wanji.utc.hisense.common.enums.DataBrainControlModeEnum;
import net.wanji.utc.hisense.pojo.CrossPhaseDirTurnPojo; import net.wanji.utc.hisense.pojo.CrossPhaseDirTurnPojo;
import net.wanji.utc.hisense.pojo.convert.HisenseLightStatusPojo; import net.wanji.utc.hisense.pojo.convert.HisenseLightStatusPojo;
import net.wanji.utc.hisense.pojo.dto.CrossSchemePhaseCountDownDTO;
import net.wanji.utc.hisense.pojo.dto.PhaseCountDownDTO;
import net.wanji.utc.hisense.service.SignalStatusService; import net.wanji.utc.hisense.service.SignalStatusService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -34,14 +38,22 @@ public class SignalStatusServiceImpl implements SignalStatusService { ...@@ -34,14 +38,22 @@ public class SignalStatusServiceImpl implements SignalStatusService {
return null; return null;
} }
@Override
public List<LightsStatusVO> lightStatus(String crossId) { public List<LightsStatusVO> lightStatus(String crossId) {
List<LightsStatusVO> lightsStatusVOS = new ArrayList<>(); List<LightsStatusVO> lightsStatusVOS = new ArrayList<>();
LightsStatusVO lightsStatusVO = SignalDataCache.runningStateInfoCache4DataBrain.get(crossId); Map<String, LightsStatusVO> runningStateInfoCache = SignalDataCache.runningStateInfoCache;
if (!runningStateInfoCache.isEmpty()) {
LightsStatusVO lightsStatusVO = runningStateInfoCache.get(crossId);
lightsStatusVOS.add(lightsStatusVO); lightsStatusVOS.add(lightsStatusVO);
return lightsStatusVOS; return lightsStatusVOS;
} }
return lightsStatusVOS;
}
/**
* @param hisenseLightStatusPojo
* @throws Exception
* @description 通过http形式接收海信灯态
*/
@Override @Override
public void receiveLightStatus(HisenseLightStatusPojo hisenseLightStatusPojo) throws Exception { public void receiveLightStatus(HisenseLightStatusPojo hisenseLightStatusPojo) throws Exception {
ObjectMapper jackson = JacksonUtils.getInstance(); ObjectMapper jackson = JacksonUtils.getInstance();
...@@ -67,9 +79,13 @@ public class SignalStatusServiceImpl implements SignalStatusService { ...@@ -67,9 +79,13 @@ public class SignalStatusServiceImpl implements SignalStatusService {
} }
SignalDataCache.runningStatusStampMap.put(crossId, signalMachineStamp); SignalDataCache.runningStatusStampMap.put(crossId, signalMachineStamp);
} }
int cycleCountDown = content.getCycleCountDown(); Date date = new Date();
Long time = date.getTime();
int offsetTime = (int) ((time - signalMachineStamp) / 1000);
int cycleCountDown = content.getCycleCountDown() - offsetTime;
int hiControlMode = content.getControlMode(); int hiControlMode = content.getControlMode();
int period = content.getPeriod(); int period = content.getPeriod();
int runTime = period - cycleCountDown;
int planId = (content.getPlanId() + 2) / 3; int planId = (content.getPlanId() + 2) / 3;
lightsStatusVO.setCrossId(crossId); lightsStatusVO.setCrossId(crossId);
lightsStatusVO.setSchemeId(String.valueOf(planId)); lightsStatusVO.setSchemeId(String.valueOf(planId));
...@@ -84,41 +100,31 @@ public class SignalStatusServiceImpl implements SignalStatusService { ...@@ -84,41 +100,31 @@ public class SignalStatusServiceImpl implements SignalStatusService {
lightsStatusVO.setManufacturerCode("Hisense"); lightsStatusVO.setManufacturerCode("Hisense");
lightsStatusVO.setPhasePlanId(String.valueOf(planId)); lightsStatusVO.setPhasePlanId(String.valueOf(planId));
List<HisenseLightStatusPojo.ContentBody.LampRealInfos> lampRealInfos = content.getLampRealInfos(); List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = CrossSchemePhaseTimeCountCache.crossSchemePhaseCountDownList;
if (!CollectionUtils.isEmpty(lampRealInfos)) { if (!CollectionUtils.isEmpty(crossSchemePhaseCountDownList)) {
Map<Integer, List<HisenseLightStatusPojo.ContentBody.LampRealInfos>> dirLampMap = lampRealInfos.stream().collect(Collectors.groupingBy(HisenseLightStatusPojo.ContentBody.LampRealInfos::getRoadDirection)); for (CrossSchemePhaseCountDownDTO dto : crossSchemePhaseCountDownList) {
Map<String, Object> dirMap = new HashMap<>(); String crossIdCache = dto.getCrossId();
Map<Integer, List<Integer>> dirTurnMap = new HashMap<>(); String schemeNoCache = dto.getSchemeNo();
for (Map.Entry<Integer, List<HisenseLightStatusPojo.ContentBody.LampRealInfos>> dirEntry : dirLampMap.entrySet()) { if (StringUtils.equalsIgnoreCase(crossIdCache, crossId) && StringUtils.equalsIgnoreCase(schemeNoCache, String.valueOf(planId))) {
Integer roadDirection = DataBrainDirEnum.getWjLightsDir(dirEntry.getKey()); List<PhaseCountDownDTO> phaseCountDownDTOList = dto.getPhaseCountDownDTOList();
List<HisenseLightStatusPojo.ContentBody.LampRealInfos> dirLampList = dirEntry.getValue(); int lastPhaseCountTime = 0;
Map<String, String> turnMap = new HashMap<>(); int phaseTimeCountDown = 0;
List<Integer> hisTurnList = new ArrayList<>(); String phaseNo = null;
for (HisenseLightStatusPojo.ContentBody.LampRealInfos lampRealInfo : dirLampList) { for (PhaseCountDownDTO phaseCountDownDTO : phaseCountDownDTOList) {
String lampStatus = lampRealInfo.getLampStatus(); phaseNo = phaseCountDownDTO.getPhaseNo();
Integer countDown = lampRealInfo.getCountDown(); Integer changePhaseTime = phaseCountDownDTO.getChangePhaseTime();
Integer roadFlowDirection = lampRealInfo.getRoadFlowDirection(); if (lastPhaseCountTime <= runTime && runTime < changePhaseTime) {
Integer wjTurn = DataBrainTurnEnum.getWjTurn(roadFlowDirection); phaseTimeCountDown = changePhaseTime - runTime;
if (StringUtils.endsWithIgnoreCase(lampStatus, "23")) { break;
lightsStatusVO.setCyclePhaseCountDown(countDown); }
lightsStatusVO.setCycleCountDown(countDown); lastPhaseCountTime = changePhaseTime;
hisTurnList.add(wjTurn); }
} lightsStatusVO.setPhaseId(phaseNo);
turnMap.put(String.valueOf(wjTurn), DataBrainLampStatusEnum.getWjLampStatus(lampStatus)); lightsStatusVO.setCyclePhaseCountDown(phaseTimeCountDown);
} }
dirMap.put(String.valueOf(roadDirection), turnMap); }
// 获取当前绿灯方向转向 }
if (!CollectionUtils.isEmpty(hisTurnList)) { SignalDataCache.runningStateInfoCache.put(crossId, lightsStatusVO);
dirTurnMap.put(roadDirection, hisTurnList);
}
}
// 通过路口编号获取当前相位缓存
Integer currentPhaseNo = getCurrentPhagetseNo(crossId, planId, dirTurnMap);
lightsStatusVO.setPhaseId(String.valueOf(currentPhaseNo));
lightsStatusVO.setDirLampGroupMap(dirMap);
SignalDataCache.runningStateInfoCache4DataBrain.put(crossId, lightsStatusVO);
}
} }
} }
} }
......
...@@ -7,12 +7,15 @@ import net.wanji.databus.dao.entity.CrossSchemePO; ...@@ -7,12 +7,15 @@ import net.wanji.databus.dao.entity.CrossSchemePO;
import net.wanji.databus.dao.mapper.CrossPhaseMapper; import net.wanji.databus.dao.mapper.CrossPhaseMapper;
import net.wanji.databus.dao.mapper.CrossSchemeMapper; import net.wanji.databus.dao.mapper.CrossSchemeMapper;
import net.wanji.databus.vo.LightsStatusVO; import net.wanji.databus.vo.LightsStatusVO;
import net.wanji.utc.hisense.cache.CrossPhaseDirTurnCache;
import net.wanji.utc.hisense.cache.SignalDataCache; import net.wanji.utc.hisense.cache.SignalDataCache;
import net.wanji.utc.hisense.pojo.CrossPhaseDirTurnPojo;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
...@@ -32,7 +35,7 @@ public class HisensePhaseCountDownTask { ...@@ -32,7 +35,7 @@ public class HisensePhaseCountDownTask {
@Scheduled(fixedRate = 1000, initialDelay = 1000) @Scheduled(fixedRate = 1000, initialDelay = 1000)
public void phaseTimeCountDown() { public void phaseTimeCountDown() {
Map<String, LightsStatusVO> runningStateInfoCache4DataBrain = SignalDataCache.runningStateInfoCache4DataBrain; Map<String, LightsStatusVO> runningStateInfoCache4DataBrain = SignalDataCache.runningStateInfoCache;
Map<String, Long> runningStatusStampMap = SignalDataCache.runningStatusStampMap; Map<String, Long> runningStatusStampMap = SignalDataCache.runningStatusStampMap;
if (!runningStateInfoCache4DataBrain.isEmpty()) { if (!runningStateInfoCache4DataBrain.isEmpty()) {
for (Map.Entry<String, LightsStatusVO> entry : runningStateInfoCache4DataBrain.entrySet()) { for (Map.Entry<String, LightsStatusVO> entry : runningStateInfoCache4DataBrain.entrySet()) {
...@@ -68,10 +71,61 @@ public class HisensePhaseCountDownTask { ...@@ -68,10 +71,61 @@ public class HisensePhaseCountDownTask {
} else { } else {
lightsStatusVO.setCyclePhaseCountDown(lightsStatusVO.getCyclePhaseCountDown() - 1); lightsStatusVO.setCyclePhaseCountDown(lightsStatusVO.getCyclePhaseCountDown() - 1);
} }
setDirLampGroupMap(lightsStatusVO);
runningStateInfoCache4DataBrain.put(crossId, lightsStatusVO); runningStateInfoCache4DataBrain.put(crossId, lightsStatusVO);
} }
} }
} }
}
public void setDirLampGroupMap(LightsStatusVO lightsStatusVO) {
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<>();
for (CrossPhaseDirTurnPojo phaseDirTurnPojo : crossPhaseDirTurnCache) {
String schemeNo = String.valueOf(phaseDirTurnPojo.getSchemeNo());
String phaseNo = String.valueOf(phaseDirTurnPojo.getPhaseNo());
if (StringUtils.equalsIgnoreCase(schemeNo, currentSchemeNo) && StringUtils.equalsIgnoreCase(currentPhaseNo, String.valueOf(phaseNo))) {
Map<Integer, List<Integer>> dirTurnMap = phaseDirTurnPojo.getDirTurnMap();
if (!dirTurnMap.isEmpty()) {
for (Map.Entry<Integer, List<Integer>> dirEntry : dirTurnMap.entrySet()) {
Integer dir = dirEntry.getKey();
List<Integer> turnList = dirEntry.getValue();
if (CollectionUtils.isEmpty(turnList)) {
continue;
}
HashMap<String, String> turnColor = new HashMap<>();
for (Integer turn : turnList) {
String turnStr = String.valueOf(turn);
if (cyclePhaseCountDown > 5) {
turnColor.put(turnStr, "green");
if (turn == 20) {
turnColor.put(turnStr, "red");
}
}
if (cyclePhaseCountDown <= 5 && cyclePhaseCountDown > 2) {
turnColor.put(turnStr, "yellow");
if (turn == 20) {
turnColor.put(turnStr, "red");
}
}
if (cyclePhaseCountDown < 2) {
turnColor.put(turnStr, "red");
if (turn == 20) {
turnColor.put(turnStr, "green");
}
}
}
dirLampGroupMap.put(String.valueOf(dir), turnColor);
}
}
}
lightsStatusVO.setDirLampGroupMap(dirLampGroupMap);
}
}
} }
} }
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