Commit a28ed26e authored by duanruiming's avatar duanruiming

[update] 优化海信灯态

parent 629c69ce
package net.wanji.utc.hisense; package net.wanji.utc.hisense;
import net.wanji.utc.hisense.netty.NettyClient;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
...@@ -29,6 +30,6 @@ public class HisenseApplication implements CommandLineRunner { ...@@ -29,6 +30,6 @@ public class HisenseApplication implements CommandLineRunner {
@Override @Override
public void run(String... args) throws Exception { public void run(String... args) throws Exception {
// NettyClient.connection(localPort, remoteProt); NettyClient.connection(localPort, remoteProt);
} }
} }
...@@ -63,11 +63,11 @@ public class SignalStatusController { ...@@ -63,11 +63,11 @@ public class SignalStatusController {
return jsonViewObject.success(lightsStatusVOList); return jsonViewObject.success(lightsStatusVOList);
} }
@AspectLog(description = "从滴滴数据大脑接收海信灯态", operationType = BaseEnum.OperationTypeEnum.QUERY) @AspectLog(description = "接收海信灯态", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/receiveLightStatus", produces = MediaType.APPLICATION_JSON) @PostMapping(value = "/receiveLightStatus", produces = MediaType.APPLICATION_JSON)
@ApiOperation(value = "接收海信灯态", notes = "接收海信灯态", response = LightsStatusVO.class, produces = MediaType.APPLICATION_JSON) @ApiOperation(value = "接收海信灯态", notes = "接收海信灯态", response = LightsStatusVO.class, produces = MediaType.APPLICATION_JSON)
public JsonViewObject receiveLightStatus(@RequestBody HisenseLightStatusPojo hisenseLightStatusPojo) throws Exception{ public JsonViewObject receiveLightStatus(@RequestBody List<HisenseLightStatusPojo> hisenseLightStatusPojos) throws Exception{
signalStatusService.receiveLightStatus(hisenseLightStatusPojo); signalStatusService.receiveLightStatus(hisenseLightStatusPojos);
JsonViewObject jsonViewObject = JsonViewObject.newInstance(); JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success("海信灯态接收成功"); return jsonViewObject.success("海信灯态接收成功");
} }
......
...@@ -6,7 +6,6 @@ import io.netty.channel.SimpleChannelInboundHandler; ...@@ -6,7 +6,6 @@ import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.DatagramPacket;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.spring.ServiceBeanContext; import net.wanji.common.framework.spring.ServiceBeanContext;
import net.wanji.databus.dao.mapper.CrossInfoMapper;
import net.wanji.databus.po.CrossInfoPO; import net.wanji.databus.po.CrossInfoPO;
import net.wanji.utc.hisense.cache.CrossInfoCache; import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.cache.SignalDataCache; import net.wanji.utc.hisense.cache.SignalDataCache;
...@@ -18,38 +17,16 @@ import net.wanji.utc.hisense.netty.response.CommandResponseFactory; ...@@ -18,38 +17,16 @@ import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo; import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo;
import net.wanji.utc.hisense.pojo.netty.MessageResultPojo; import net.wanji.utc.hisense.pojo.netty.MessageResultPojo;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@Slf4j @Slf4j
@Component @Component
public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPacket> { public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
// 信号机ID和路口ID映射
private static final Map<String, String> signalMap = new HashMap<>();
@Autowired
private CrossInfoMapper crossInfoMapper;
@PostConstruct
public void init() {
List<CrossInfoPO> crossInfoPOList = crossInfoMapper.selectAll();
for (CrossInfoPO crossInfoPO : crossInfoPOList) {
String crossId = crossInfoPO.getId();
String signalCode = crossInfoPO.getCode();
signalMap.put(signalCode, crossId);
}
}
@Resource
private CrossInfoCache crossInfoCache;
/** /**
* 读取消息 * 读取消息
...@@ -74,20 +51,16 @@ public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPack ...@@ -74,20 +51,16 @@ public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPack
// 直接set灯态缓存 // 直接set灯态缓存
RunningLightsStatusPojo pojo = (RunningLightsStatusPojo) resultPojo; RunningLightsStatusPojo pojo = (RunningLightsStatusPojo) resultPojo;
String signalCode = pojo.getCID(); String signalCode = pojo.getCID();
String crossId = signalMap.get(signalCode); CrossInfoPO crossInfoPO = CrossInfoCache.getCrossInfoBySignalCode(signalCode);
Map<String, RunningLightsStatusPojo> cache = SignalDataCache.runningStateInfoCacheUdp; if (Objects.nonNull(crossInfoPO)) {
if (crossId != null) { Map<String, RunningLightsStatusPojo> cache = SignalDataCache.runningStateInfoCacheUdp;
cache.put(crossId, pojo); cache.put(crossInfoPO.getId(), pojo);
} }
return; return;
} }
Object bean = ServiceBeanContext.getBean(className);
CommandResponseFactory commandResponseFactory = ServiceBeanContext.getBean(className); CommandResponseFactory commandResponseFactory = ServiceBeanContext.getBean(className);
String key = StringUtils.join("/", remote.getHostString(), ":", remote.getPort(), "/", resultPojo.getClass().getSimpleName());
String key = StringUtils.join("/", remote.getHostString(), ":", remote.getPort(), "/",
resultPojo.getClass().getSimpleName());
CommandPojo commandPojo = getCommandPojo(key, resultPojo); CommandPojo commandPojo = getCommandPojo(key, resultPojo);
Object hexResult = commandResponseFactory.getCommandResponse(commandPojo); Object hexResult = commandResponseFactory.getCommandResponse(commandPojo);
if (Objects.nonNull(hexResult)) { if (Objects.nonNull(hexResult)) {
......
...@@ -21,5 +21,5 @@ public interface SignalStatusService { ...@@ -21,5 +21,5 @@ public interface SignalStatusService {
List<SignalStatusLogPO> runningStatusAlarm(String crossId); List<SignalStatusLogPO> runningStatusAlarm(String crossId);
List<LightsStatusVO> lightStatus(String crossId); List<LightsStatusVO> lightStatus(String crossId);
void receiveLightStatus(HisenseLightStatusPojo hisenseLightStatusPojo) throws Exception; void receiveLightStatus(List<HisenseLightStatusPojo> hisenseLightStatusPojos) throws Exception;
} }
...@@ -39,6 +39,12 @@ public class SignalStatusServiceImpl implements SignalStatusService { ...@@ -39,6 +39,12 @@ public class SignalStatusServiceImpl implements SignalStatusService {
return null; return null;
} }
/**
* http 形式
* @param crossId
* @return
*/
@Override
public List<LightsStatusVO> lightStatus(String crossId) { public List<LightsStatusVO> lightStatus(String crossId) {
List<LightsStatusVO> lightsStatusVOS = new ArrayList<>(); List<LightsStatusVO> lightsStatusVOS = new ArrayList<>();
Map<String, LightsStatusVO> runningStateInfoCache = SignalDataCache.runningStateInfoCache; Map<String, LightsStatusVO> runningStateInfoCache = SignalDataCache.runningStateInfoCache;
...@@ -50,82 +56,149 @@ public class SignalStatusServiceImpl implements SignalStatusService { ...@@ -50,82 +56,149 @@ public class SignalStatusServiceImpl implements SignalStatusService {
return lightsStatusVOS; return lightsStatusVOS;
} }
// @Override
// public List<LightsStatusVO> lightStatus(String crossId) {
// List<LightsStatusVO> lightsStatusVOS = new ArrayList<>();
// Map<String, RunningLightsStatusPojo> runningStateInfoCache = SignalDataCache.runningStateInfoCacheUdp;
// if (!runningStateInfoCache.isEmpty()) {
// RunningLightsStatusPojo runningLightsStatusPojo = runningStateInfoCache.get(crossId);
// LightsStatusVO lightsStatusVO = new LightsStatusVO();
// lightsStatusVO.setCrossId(crossId);
// String runMode = String.valueOf(ControlModelEnum.getWjControlMode(runningLightsStatusPojo.getCCT()));
// lightsStatusVO.setRunMode(runMode);
// lightsStatusVO.setCycleLen(runningLightsStatusPojo.getCC());
// // 相位剩余时长
// List<RunningLightsStatusPojo.Phase> phaseList = runningLightsStatusPojo.getPHASE();
// Integer phaseId = 0;
// Integer phaseCountDown = 0;
// for (RunningLightsStatusPojo.Phase phase : phaseList) {
// Integer ls = phase.getLS();
// if (Objects.equals(ls, 1)) { // 当前相位绿灯
// phaseId = phase.getPHN();
// phaseCountDown = phase.getPCD();
// }
// }
// lightsStatusVO.setCycleCountDown(phaseCountDown);
// lightsStatusVO.setPhaseId(String.valueOf(phaseId));
// lightsStatusVO.setSchemeId(String.valueOf(runningLightsStatusPojo.getPLN()));
//
// RunningLightsStatusPojo.Channel channel = runningLightsStatusPojo.getCHANNEL();
// Map<String, Object> dirLampGroupMap = new HashMap<>();
// List<Integer> scs = channel.getSCS();
// if (!CollectionUtils.isEmpty(scs)) {
// for (int i = 0; i < scs.size(); i++) {
// Map<Integer, String> turnColorMap = new HashMap<>();
// String lightsColor = String.valueOf(scs.get(i));
// String wjLightColor = PhaseLightColorEnum.getWjLightColor(lightsColor);
// Integer turn = null;
// turn = CommonUtils.getTurnByLightsId(i);
//
// // 复杂路口处理
//// Map<String, Map<Integer, Integer>> cacheMap = ComplexCrossCache.getCacheMap();
//// if (cacheMap.containsKey(crossId)) {
//// Map<Integer, Integer> innerMap = cacheMap.get(crossId);
//// if (innerMap.containsKey(i)) {
//// turn = innerMap.get(i);
//// }
//// }
//
// turnColorMap.put(turn, wjLightColor);
// String dir = String.valueOf(CommonUtils.getDirByLightsId(i));
// if (dirLampGroupMap.isEmpty() || Objects.isNull(dirLampGroupMap.get(dir))) {
// dirLampGroupMap.put(dir, turnColorMap);
// } else {
// Map<Integer, String> currentTurnColorMap = (Map<Integer, String>) dirLampGroupMap.get(dir);
// currentTurnColorMap.put(turn, wjLightColor);
// dirLampGroupMap.put(dir, currentTurnColorMap);
// }
// }
// }
// lightsStatusVO.setDirLampGroupMap(dirLampGroupMap);
// lightsStatusVOS.add(lightsStatusVO);
// }
// return lightsStatusVOS;
// }
/** /**
* @param hisenseLightStatusPojo * @param hisenseLightStatusPojos
* @throws Exception * @throws Exception
* @description 通过http形式接收海信灯态 * @description 通过http形式接收海信灯态
*/ */
@Override @Override
public void receiveLightStatus(HisenseLightStatusPojo hisenseLightStatusPojo) throws Exception { public void receiveLightStatus(List<HisenseLightStatusPojo> hisenseLightStatusPojos) throws Exception {
ObjectMapper jackson = JacksonUtils.getInstance(); ObjectMapper jackson = JacksonUtils.getInstance();
String bodyStr = hisenseLightStatusPojo.getBody(); if (!CollectionUtils.isEmpty(hisenseLightStatusPojos)) {
List<HisenseLightStatusPojo.Body> bodies = jackson.readValue(bodyStr, new TypeReference<List<HisenseLightStatusPojo.Body>>() {}); for (HisenseLightStatusPojo hisenseLightStatusPojo : hisenseLightStatusPojos) {
if (!CollectionUtils.isEmpty(bodies)) { String bodyStr = hisenseLightStatusPojo.getBody();
for (HisenseLightStatusPojo.Body body : bodies) { List<HisenseLightStatusPojo.Body> bodies = jackson.readValue(bodyStr, new TypeReference<List<HisenseLightStatusPojo.Body>>() {});
HisenseLightStatusPojo.ContentBody content = body.getContent(); if (!CollectionUtils.isEmpty(bodies)) {
LightsStatusVO lightsStatusVO = new LightsStatusVO(); for (HisenseLightStatusPojo.Body body : bodies) {
String hiCrossId = content.getCrossId(); HisenseLightStatusPojo.ContentBody content = body.getContent();
CrossInfoPO crossInfo = CrossInfoCache.getCrossInfoBySignalCode(hiCrossId); LightsStatusVO lightsStatusVO = new LightsStatusVO();
Long signalMachineStamp = content.getSignalMachineStamp(); String hiCrossId = content.getCrossId();
if (Objects.isNull(crossInfo)) { CrossInfoPO crossInfo = CrossInfoCache.getCrossInfoBySignalCode(hiCrossId);
continue; Long signalMachineStamp = content.getSignalMachineStamp();
} if (Objects.isNull(crossInfo)) {
String crossId = crossInfo.getId(); continue;
Long lastSignalMachineStamp = SignalDataCache.runningStatusStampMap.get(crossId); }
if (Objects.isNull(lastSignalMachineStamp)) { String crossId = crossInfo.getId();
SignalDataCache.runningStatusStampMap.put(crossId, signalMachineStamp); Long lastSignalMachineStamp = SignalDataCache.runningStatusStampMap.get(crossId);
} else { if (Objects.isNull(lastSignalMachineStamp)) {
if (lastSignalMachineStamp >= signalMachineStamp) { SignalDataCache.runningStatusStampMap.put(crossId, signalMachineStamp);
continue; } else {
} if (lastSignalMachineStamp >= signalMachineStamp) {
SignalDataCache.runningStatusStampMap.put(crossId, signalMachineStamp); continue;
} }
Date date = new Date(); SignalDataCache.runningStatusStampMap.put(crossId, signalMachineStamp);
Long time = date.getTime(); }
int offsetTime = (int) ((time - signalMachineStamp) / 1000); Date date = new Date();
int cycleCountDown = content.getCycleCountDown() - offsetTime; Long time = date.getTime();
int hiControlMode = content.getControlMode(); int offsetTime = (int) ((time - signalMachineStamp) / 1000);
int period = content.getPeriod(); int cycleCountDown = content.getCycleCountDown() - offsetTime;
int runTime = period - cycleCountDown; int hiControlMode = content.getControlMode();
int planId = (content.getPlanId() + 2) / 3; int period = content.getPeriod();
lightsStatusVO.setCrossId(crossId); int runTime = period - cycleCountDown;
lightsStatusVO.setSchemeId(String.valueOf(planId)); int planId = (content.getPlanId() + 2) / 3;
String runMode = String.valueOf(DataBrainControlModeEnum.getWjControlMode(hiControlMode)); lightsStatusVO.setCrossId(crossId);
lightsStatusVO.setRunMode(runMode); lightsStatusVO.setSchemeId(String.valueOf(planId));
lightsStatusVO.setCycleCountDown(cycleCountDown); String runMode = String.valueOf(DataBrainControlModeEnum.getWjControlMode(hiControlMode));
lightsStatusVO.setCycleLen(period); lightsStatusVO.setRunMode(runMode);
lightsStatusVO.setSchemeStartTime(String.valueOf(signalMachineStamp)); lightsStatusVO.setCycleCountDown(cycleCountDown);
lightsStatusVO.setPhaseMap(Collections.emptyMap()); lightsStatusVO.setCycleLen(period);
lightsStatusVO.setControlMode(runMode); lightsStatusVO.setSchemeStartTime(String.valueOf(signalMachineStamp));
lightsStatusVO.setCode(hiCrossId); lightsStatusVO.setPhaseMap(Collections.emptyMap());
lightsStatusVO.setManufacturerCode("Hisense"); lightsStatusVO.setControlMode(runMode);
lightsStatusVO.setPhasePlanId(String.valueOf(planId)); lightsStatusVO.setCode(hiCrossId);
lightsStatusVO.setManufacturerCode("Hisense");
lightsStatusVO.setPhasePlanId(String.valueOf(planId));
List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = CrossSchemePhaseTimeCountCache.crossSchemePhaseCountDownList; List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = CrossSchemePhaseTimeCountCache.crossSchemePhaseCountDownList;
if (!CollectionUtils.isEmpty(crossSchemePhaseCountDownList)) { if (!CollectionUtils.isEmpty(crossSchemePhaseCountDownList)) {
for (CrossSchemePhaseCountDownDTO dto : crossSchemePhaseCountDownList) { for (CrossSchemePhaseCountDownDTO dto : crossSchemePhaseCountDownList) {
String crossIdCache = dto.getCrossId(); String crossIdCache = dto.getCrossId();
String schemeNoCache = dto.getSchemeNo(); String schemeNoCache = dto.getSchemeNo();
if (StringUtils.equalsIgnoreCase(crossIdCache, crossId) && StringUtils.equalsIgnoreCase(schemeNoCache, String.valueOf(planId))) { if (StringUtils.equalsIgnoreCase(crossIdCache, crossId) && StringUtils.equalsIgnoreCase(schemeNoCache, String.valueOf(planId))) {
List<PhaseCountDownDTO> phaseCountDownDTOList = dto.getPhaseCountDownDTOList(); List<PhaseCountDownDTO> phaseCountDownDTOList = dto.getPhaseCountDownDTOList();
int lastPhaseCountTime = 0; int lastPhaseCountTime = 0;
int phaseTimeCountDown = 0; int phaseTimeCountDown = 0;
String phaseNo = null; String phaseNo = null;
for (PhaseCountDownDTO phaseCountDownDTO : phaseCountDownDTOList) { for (PhaseCountDownDTO phaseCountDownDTO : phaseCountDownDTOList) {
phaseNo = phaseCountDownDTO.getPhaseNo(); phaseNo = phaseCountDownDTO.getPhaseNo();
Integer changePhaseTime = phaseCountDownDTO.getChangePhaseTime(); Integer changePhaseTime = phaseCountDownDTO.getChangePhaseTime();
if (lastPhaseCountTime <= runTime && runTime < changePhaseTime) { if (lastPhaseCountTime <= runTime && runTime < changePhaseTime) {
phaseTimeCountDown = changePhaseTime - runTime; phaseTimeCountDown = changePhaseTime - runTime;
break; break;
}
lastPhaseCountTime = changePhaseTime;
}
lightsStatusVO.setPhaseId(phaseNo);
lightsStatusVO.setCyclePhaseCountDown(phaseTimeCountDown);
} }
lastPhaseCountTime = changePhaseTime;
} }
lightsStatusVO.setPhaseId(phaseNo);
lightsStatusVO.setCyclePhaseCountDown(phaseTimeCountDown);
} }
SignalDataCache.runningStateInfoCache.put(crossId, lightsStatusVO);
} }
} }
SignalDataCache.runningStateInfoCache.put(crossId, lightsStatusVO);
} }
} }
} }
......
...@@ -47,11 +47,12 @@ public class HisensePhaseCountDownTask { ...@@ -47,11 +47,12 @@ public class HisensePhaseCountDownTask {
Long lastPhaseTimeStamp = runningStatusStampMap.get(crossId); Long lastPhaseTimeStamp = runningStatusStampMap.get(crossId);
String phaseId = lightsStatusVO.getPhaseId(); String phaseId = lightsStatusVO.getPhaseId();
String schemeId = lightsStatusVO.getSchemeId(); String schemeId = lightsStatusVO.getSchemeId();
if (Objects.nonNull(lastPhaseTimeStamp) && StringUtils.equalsIgnoreCase(schemeStartTime, String.valueOf(lastPhaseTimeStamp))) { if (Objects.nonNull(lastPhaseTimeStamp) && !StringUtils.equalsIgnoreCase(schemeStartTime, String.valueOf(lastPhaseTimeStamp))) {
CrossSchemePO crossSchemePO = crossSchemeMapper.selectByCrossIdAndSchemeNo(crossId, Integer.valueOf(schemeId)); CrossSchemePO crossSchemePO = crossSchemeMapper.selectByCrossIdAndSchemeNo(crossId, Integer.valueOf(schemeId));
// 通过时段表,切换方案 凌晨00:00 如果切换下一个日期方案,可能RefreshCacheTask还没执行 // 通过时段表,切换方案 凌晨00:00 如果切换下一个日期方案,可能RefreshCacheTask还没执行
String nextSectionSchemeNo = CrossRunSchemeCache.currentRunSchemeNoCache.get(crossId); String nextSectionSchemeNo = CrossRunSchemeCache.currentRunSchemeNoCache.get(crossId);
if (!StringUtils.equalsIgnoreCase(nextSectionSchemeNo, schemeId)) { String currentTime = String.valueOf(new Date().getTime());
if (StringUtils.equalsIgnoreCase(schemeStartTime, currentTime)) {
crossSchemePO = crossSchemeMapper.selectByCrossIdAndSchemeNo(crossId, Integer.valueOf(nextSectionSchemeNo)); crossSchemePO = crossSchemeMapper.selectByCrossIdAndSchemeNo(crossId, Integer.valueOf(nextSectionSchemeNo));
executeNextSectionScheme(crossId, lightsStatusVO, "1", crossSchemePO); executeNextSectionScheme(crossId, lightsStatusVO, "1", crossSchemePO);
lightsStatusVO.setCycleLen(crossSchemePO.getCycle()); lightsStatusVO.setCycleLen(crossSchemePO.getCycle());
......
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