Commit 1e676e4c authored by duanruiming's avatar duanruiming

[update] 信号机状态,实时灯态

parent f2972a92
package net.wanji.com.cache;
import net.wanji.com.pojo.dtconvert.PhaseInfoPojo;
import net.wanji.com.pojo.dtconvert.PhaseStageInfoPojo;
import net.wanji.com.pojo.dtconvert.SchemeInfoPojo;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author duanruiming
* @date 2023/06/19 15:28
*/
@Component
public class SignalDataCache {
public static final Map<String, List<SchemeInfoPojo>> schemeInfoCache = new HashMap<>();
public static final Map<String, List<PhaseStageInfoPojo>> phaseStageInfoCache = new HashMap<>();
public static final Map<String, List<PhaseInfoPojo>> phaseInfoCache = new HashMap<>();
}
......@@ -23,13 +23,13 @@ public class Constants {
public static final String COMMAND_LIGHT_CONFIG = "0302";
public static final String COMMAND_LIGHT_STATUS = "0303";
public static final String COMMAND_PHASE_STAGE_CONFIG = "0602";
public static final String COMMAND_PHASE_STAGE_STATUS= "0603";
public static final String COMMAND_SCHME_CONFIG = "0902";
public static final String COMMAND_DAILYPLAN_CONFIG = "0b02";
public static final String COMMAND_SCHEDULE_CONFIG = "0c02";
public static final String COMMAND_DEVICE_STATUS = "0d01";
public static final String COMMAND_RUNNING_STATUS = "0d02";
public static final String COMMAND_FAULT_LIST = "1002";
public static final String COMMAND_FAULT_LIST = "1001";
/**
* 通过发送报文内容,添加报文长度,crc校验,报文头尾
......
......@@ -11,13 +11,14 @@ import org.apache.commons.lang3.StringUtils;
public enum CommandResultSign {
HEARTBEAT("80", "heartBeatService"),
GET_DEVICE_INFO("2001", "getDeviceInfoService"),
GET_DEVICE_INFO("0d0120", "getDeviceInfoService"),
GET_SIGNAL_BASE_INFO("2002","getBaseInfoService"),
GET_LIGHTS_GROUP_INFO("030220", "getLightsGroupInfoService"),
GET_LIGHTS_STATUS_INFO("030320", "getLightsStatusInfoService"),
GET_PHASE_INFO("040220", "getPhaseInfoService"),
GET_DETECTOR_INFO("2005", "getDetectorInfoService"),
GET_STAGE_INFO("060220", "getStageInfoService"),
GET_STAGE_STATUS("060320", "getStageStatusService"),
GET_PHASE_SECURITY_INFO("2007", "getPhaseSecurityInfoService"),
GET_SCHEME_INFO("090220", "getSchemeInfoService"),
GET_DAILY_PLAN_INFO("0b0220", "getDailyPlanInfoService"),
......
package net.wanji.com.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
/**
* @author duanruiming
* @date 2023/06/19 10:07
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum ControlTypeEnum {
FIXED_CYCLE(1, "0021", "定周期"),
GREEN_WAVE(2, "0032", "全红"),
YELLOW_CONTROL(3, "0031", "黄闪"),
RED_CONTROL(4, "0015", "锁定 --> 中心手动控制"),
CLOSED_CONTROL(5, "0012", "中心优化"),
SELF_CONTROL(6, "0013", "MEC优化"),
FULL_INDUCTION(7, "0021", "现场手动");
private Integer wjControl;
private String dtControlHex;
private String message;
public static Integer getWjControlType(String dtControlHex) {
for (ControlTypeEnum value : ControlTypeEnum.values()) {
if (StringUtils.equals(dtControlHex, value.getDtControlHex())) {
return value.getWjControl();
}
}
return null;
}
}
package net.wanji.com.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
/**
* @author duanruiming
* @date 2023/06/19 16:27
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum PhaseLightColorEnum {
LIGHT_OFF("01", "off", "关灯"),
LIGHT_RED("10", "red", "红灯"),
LIGHT_RED_FLASH("11", "red", "红闪"),
LIGHT_RED_FAST_FLASH("12", "red", "红快闪"),
LIGHT_GREEN("20", "green", "绿灯"),
LIGHT_GREEN_FLASH("21", "green", "绿闪"),
LIGHT_GREEN_FAST_FLASH("22", "green", "率快闪"),
LIGHT_YELLOW("30", "yellow", "黄灯"),
LIGHT_YELLOW_FLASH("31", "yellow", "黄闪"),
LIGHT_YELLOW_FAST_FLASH("32", "yellow", "黄快闪"),
LIGHT_RED_YELLOW("40", "redYellow", "红黄灯");
private String dtLightColor;
private String wjLightColor;
private String message;
public static String getWjLightColor(String dtLightColor) {
for (PhaseLightColorEnum value : PhaseLightColorEnum.values()) {
if (StringUtils.equals(dtLightColor, value.getDtLightColor())) {
return value.getWjLightColor();
}
}
return null;
}
}
......@@ -42,11 +42,9 @@ public class SignalStatusController {
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SignalStatusLogPO.class)
})
public JsonViewObject runningStatusAlarm() {
List<SignalStatusLogPO> signalStatusLogPOList = signalStatusService.runningStatusAlarm();
signalStatusService.runningStatusAlarm("12F7L08J8S0");
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(signalStatusLogPOList);
public JsonViewObject runningStatusAlarm(String crossId) {
List<SignalStatusLogPO> signalStatusLogPOList = signalStatusService.runningStatusAlarm(crossId);
return JsonViewObject.newInstance().success(signalStatusLogPOList);
}
......@@ -57,8 +55,8 @@ public class SignalStatusController {
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = LightsStatusVO.class)
})
public JsonViewObject lightStatus() {
List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus();
public JsonViewObject lightStatus(String crossId) {
List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus(crossId);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(lightsStatusVOList);
}
......
package net.wanji.com.netty.response.impl.get;
import net.wanji.com.netty.pojo.CommandPojo;
import net.wanji.com.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/06/19 14:27
*/
@Service
public class GetStageStatusService implements CommandResponseFactory {
@Override
public String getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.com.pojo.dtconvert;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/06/19 14:29
*/
@Data
public class PhaseStageStatusPojo {
private Integer phaseStageId;
// 10 未放行 20 正在放行 30 过渡
private String phaseStageStatus;
private Integer runningTime;
private Integer remainTime;
}
......@@ -11,8 +11,6 @@ import java.util.List;
*/
public interface SignalStatusService extends BeanMarkService {
List<SignalStatusLogPO> runningStatusAlarm();
/**
* todo 提供给其他平台,需要确认以厂商还是以路口形式推送数据
*
......@@ -21,7 +19,5 @@ public interface SignalStatusService extends BeanMarkService {
*/
List<SignalStatusLogPO> runningStatusAlarm(String crossId);
List<LightsStatusVO> lightStatus();
List<LightsStatusVO> lightStatus(String crossId);
}
......@@ -2,10 +2,13 @@ package net.wanji.com.service.controller.impl;
import cn.hutool.core.util.HexUtil;
import net.wanji.com.cache.CrossInfoCache;
import net.wanji.com.cache.SignalDataCache;
import net.wanji.com.common.constants.Constants;
import net.wanji.com.common.enums.ControlModelEnum;
import net.wanji.com.common.enums.ControlTypeEnum;
import net.wanji.com.common.enums.PhaseLightColorEnum;
import net.wanji.com.netty.NettyClient;
import net.wanji.com.pojo.dtconvert.FaultInfoPojo;
import net.wanji.com.pojo.dtconvert.RunningStatusPojo;
import net.wanji.com.pojo.dtconvert.*;
import net.wanji.com.pojo.netty.MessageResultPojo;
import net.wanji.com.service.controller.SignalStatusService;
import net.wanji.common.enums.BaseEnum;
......@@ -14,11 +17,11 @@ import net.wanji.databus.po.SignalStatusLogPO;
import net.wanji.databus.vo.LightsStatusVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author duanruiming
......@@ -35,17 +38,31 @@ public class DTSignalStatusServiceImpl implements SignalStatusService {
return BaseEnum.VendorTypeEnum.DT.getNick();
}
@Override
public List<SignalStatusLogPO> runningStatusAlarm() {
return null;
}
@Override
public List<SignalStatusLogPO> runningStatusAlarm(String crossId) {
List<FaultInfoPojo> faultInfoPojos = getFaultInfoPojos(crossId);
List<String> lightsStatus = getLightsStausInfoPojos(crossId);
List<FaultInfoPojo> faultInfoPojos = getFaultInfoPojos(crossId);
List<RunningStatusPojo> runningStatusPojos = getRunningStatusPojos(crossId);
return null;
return getSignalStatus(crossId, faultInfoPojos, runningStatusPojos);
}
private List<SignalStatusLogPO> getSignalStatus(String crossId, List<FaultInfoPojo> faultInfoPojos, List<RunningStatusPojo> runningStatusPojos) {
List<SignalStatusLogPO> signalStatusLogPOS = new ArrayList<>();
for (RunningStatusPojo runningStatusPojo : runningStatusPojos) {
SignalStatusLogPO signalStatusLogPO = new SignalStatusLogPO();
signalStatusLogPO.setCrossId(crossId);
signalStatusLogPO.setSignalId(crossId);
signalStatusLogPO.setStatus(1);
if (CollectionUtils.isEmpty(faultInfoPojos)) {
signalStatusLogPO.setFaultType(0);
} else {
signalStatusLogPO.setFaultType(1);
}
signalStatusLogPO.setControlType(ControlTypeEnum.getWjControlType(runningStatusPojo.getControlMode()));
signalStatusLogPOS.add(signalStatusLogPO);
}
return signalStatusLogPOS;
}
private List<RunningStatusPojo> getRunningStatusPojos(String crossId) {
......@@ -90,7 +107,7 @@ public class DTSignalStatusServiceImpl implements SignalStatusService {
String body = hexMessageResult.substring(32, hexMessageResult.length() - 2);
int lightsStatusSize = body.length() / 14;
for (int i = 0; i < lightsStatusSize; i++) {
String param = body.substring(i * 14 + 8, i * 14 +10);
String param = body.substring(i * 14 + 8, i * 14 + 10);
if (!StringUtils.equalsIgnoreCase("00", param)) {
lightsStatusList.add(param);
}
......@@ -99,12 +116,6 @@ public class DTSignalStatusServiceImpl implements SignalStatusService {
return lightsStatusList;
}
public static void main(String[] args) {
String message = String.format("010001000000010001%s010105%s020000", Constants.COMMAND_QUERY, Constants.COMMAND_FAULT_LIST);
String faultHex = Constants.buildMessage(message);
System.err.println(faultHex);
}
private List<FaultInfoPojo> getFaultInfoPojos(String crossId) {
CrossInfoPO crossInfoPO = crossInfoCache.getCrossInfoCache().get(crossId);
String message = String.format(Constants.COMMAND_COMMON, Constants.COMMAND_QUERY, Constants.COMMAND_FAULT_LIST);
......@@ -128,12 +139,103 @@ public class DTSignalStatusServiceImpl implements SignalStatusService {
}
@Override
public List<LightsStatusVO> lightStatus() {
return null;
public List<LightsStatusVO> lightStatus(String crossId) {
List<String> lightsStatus = getLightsStausInfoPojos(crossId);
List<PhaseStageStatusPojo> phaseStageStatusPojos = getePhaseStageStatus(crossId);
List<RunningStatusPojo> runningStatusPojos = getRunningStatusPojos(crossId);
return getLightsStatusVOs(crossId, lightsStatus, phaseStageStatusPojos, runningStatusPojos);
}
@Override
public List<LightsStatusVO> lightStatus(String crossId) {
return null;
private List<PhaseStageStatusPojo> getePhaseStageStatus(String crossId) {
List<PhaseStageStatusPojo> phaseStageStatusPojos = new ArrayList<>();
CrossInfoPO crossInfoPO = crossInfoCache.getCrossInfoCache().get(crossId);
String message = String.format(Constants.COMMAND_COMMON, Constants.COMMAND_QUERY, Constants.COMMAND_PHASE_STAGE_STATUS);
String stageStatusSign = Constants.COMMAND_PHASE_STAGE_STATUS.concat(Constants.COMMAND_QUERY_REPLY);
String stageStatusHex = Constants.buildMessage(message);
MessageResultPojo resultPojo = NettyClient.sendMessage(crossInfoPO.getIp(), crossInfoPO.getPort(), stageStatusHex, stageStatusSign, 300);
if (Objects.nonNull(resultPojo) && StringUtils.isNotBlank(resultPojo.getHexMessageResult())) {
String hexMessageResult = resultPojo.getHexMessageResult();
String body = hexMessageResult.substring(32, hexMessageResult.length() - 2);
int size = body.length() / 14;
String matchStr = "0603%s%s";
int index = 0;
for (int i = 0; i < size; i++) {
PhaseStageStatusPojo phaseStageStatusPojo = new PhaseStageStatusPojo();
for (int j = 2; j < 5; j++) {
String currentMatchStr = String.format(matchStr, String.format("%02x", j), String.format("%02x", i + 1));
index = body.indexOf(currentMatchStr) + 8;
if (j == 2) {
String stageStatus = body.substring(index, index + 2);
phaseStageStatusPojo.setPhaseStageStatus(stageStatus);
}
if (j == 3) {
phaseStageStatusPojo.setRunningTime(HexUtil.hexToInt(body.substring(index, index + 4)));
}
if (j == 4) {
phaseStageStatusPojo.setRemainTime(HexUtil.hexToInt(body.substring(index, index + 4)));
}
}
phaseStageStatusPojo.setPhaseStageId(i + 1);
phaseStageStatusPojos.add(phaseStageStatusPojo);
}
}
return phaseStageStatusPojos.stream().filter(phaseStageStatusPojo -> !StringUtils.equals(phaseStageStatusPojo.getPhaseStageStatus(), "10")).collect(Collectors.toList());
}
private List<LightsStatusVO> getLightsStatusVOs(String crossId, List<String> lightsStatus, List<PhaseStageStatusPojo> phaseStageStatusPojos, List<RunningStatusPojo> runningStatusPojos) {
List<LightsStatusVO> lightsStatusVOS = new ArrayList<>(runningStatusPojos.size());
for (RunningStatusPojo runningStatusPojo : runningStatusPojos) {
LightsStatusVO lightsStatusVO = new LightsStatusVO();
String controlModel = String.valueOf(ControlModelEnum.getWjControlMode(runningStatusPojo.getControlMode().substring(2, 4)));
lightsStatusVO.setCrossId(crossId);
lightsStatusVO.setRunMode(controlModel);
lightsStatusVO.setControlMode(controlModel);
PhaseStageStatusPojo phaseStageStatusPojo = null;
if (!CollectionUtils.isEmpty(phaseStageStatusPojos)) {
phaseStageStatusPojo = phaseStageStatusPojos.get(0);
}
lightsStatusVO.setCycleCountDown(phaseStageStatusPojo.getRemainTime()); // 相位剩余时长
Integer currentSchemeId = runningStatusPojo.getSchemeId();
Integer currentPhaseStageId = runningStatusPojo.getPhaseStageId();
List<SchemeInfoPojo> schemeInfoPojos = SignalDataCache.schemeInfoCache.get(crossId);
if (!CollectionUtils.isEmpty(schemeInfoPojos)) {
for (SchemeInfoPojo schemeInfoPojo : schemeInfoPojos) {
if (Objects.equals(schemeInfoPojo.getSchemeId(), currentSchemeId)) {
lightsStatusVO.setPlanId(String.valueOf(currentSchemeId));
lightsStatusVO.setCycleLen(schemeInfoPojo.getCycle());
List<SchemeInfoPojo.SchemeStagePojo> stageInfoList = SchemeInfoPojo.getStageInfoList(schemeInfoPojo);
List<PhaseStageInfoPojo> phaseStageInfoPojos = SignalDataCache.phaseStageInfoCache.get(crossId);
if (!CollectionUtils.isEmpty(phaseStageInfoPojos)) {
for (PhaseStageInfoPojo phaseStageInfoPojo : phaseStageInfoPojos) {
if (Objects.equals(phaseStageInfoPojo.getPhaseStageId(), currentPhaseStageId)) {
List<Integer> phaseList = phaseStageInfoPojo.getPhaseList();
String phaseId = StringUtils.join(phaseList, "|");
lightsStatusVO.setPhaseId(phaseId);
}
}
}
Map<String, Object> dirLampGroupMap = new HashMap<>();
if (!CollectionUtils.isEmpty(lightsStatus)) {
for (int i = 0; i < lightsStatus.size(); i++) {
String wjLightColor = PhaseLightColorEnum.getWjLightColor(lightsStatus.get(i));
List<PhaseInfoPojo> phaseInfoPojos = SignalDataCache.phaseInfoCache.get(crossId);
if (!CollectionUtils.isEmpty(phaseInfoPojos)) {
for (PhaseInfoPojo phaseInfoPojo : phaseInfoPojos) {
if (Objects.equals(phaseInfoPojo.getLightsId(), i + 1)) {
Integer phaseId = phaseInfoPojo.getPhaseId();
dirLampGroupMap.put(String.valueOf(phaseId), wjLightColor);
}
}
}
}
}
lightsStatusVO.setDirLampGroupMap(dirLampGroupMap);
}
}
}
lightsStatusVOS.add(lightsStatusVO);
}
return lightsStatusVOS;
}
}
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.HexUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.com.cache.CrossInfoCache;
import net.wanji.com.cache.SignalDataCache;
import net.wanji.com.common.constants.Constants;
import net.wanji.com.common.enums.ControlModelEnum;
import net.wanji.com.netty.NettyClient;
......@@ -39,6 +40,7 @@ import java.util.stream.Collectors;
public class DTStaticInfoServiceImpl implements StaticInfoService {
private final CrossInfoCache crossInfoCache;
private final SignalDataCache signalDataCache;
@Override
public String getBeanMark() {
......@@ -189,16 +191,17 @@ public class DTStaticInfoServiceImpl implements StaticInfoService {
String schemeSign = Constants.COMMAND_SCHME_CONFIG.concat(Constants.COMMAND_QUERY_REPLY);
String schemeHex = Constants.buildMessage(message);
MessageResultPojo resultPojo = NettyClient.sendMessage(crossInfo.getIp(), crossInfo.getPort(), schemeHex, schemeSign, 300);
return getSchemeInfoPojos(resultPojo);
return getSchemeInfoPojos(crossInfo, resultPojo);
}
private List<SchemeInfoPojo> getSchemeInfoPojos(MessageResultPojo resultPojo) {
private List<SchemeInfoPojo> getSchemeInfoPojos(CrossInfoPO crossInfo, MessageResultPojo resultPojo) {
List<SchemeInfoPojo> schemeInfoPojos = new ArrayList<>();
if (Objects.nonNull(resultPojo) && StringUtils.isNotBlank(resultPojo.getHexMessageResult())) {
String hexMessageResult = resultPojo.getHexMessageResult();
Map<Integer, List<String>> schemeIdParamMap = getSchemeIdParamMap(hexMessageResult);
schemeInfoPojos = paramMapConvert(schemeIdParamMap);
}
SignalDataCache.schemeInfoCache.put(crossInfo.getId(), schemeInfoPojos);
return schemeInfoPojos;
}
......@@ -289,10 +292,10 @@ public class DTStaticInfoServiceImpl implements StaticInfoService {
String phaseStageSign = Constants.COMMAND_PHASE_STAGE_CONFIG.concat(Constants.COMMAND_QUERY_REPLY);
String phaseStageHex = Constants.buildMessage(message);
MessageResultPojo resultPojo = NettyClient.sendMessage(crossInfo.getIp(), crossInfo.getPort(), phaseStageHex, phaseStageSign, 300);
return getPhaseStageInfoPojos(resultPojo);
return getPhaseStageInfoPojos(crossInfo, resultPojo);
}
private List<PhaseStageInfoPojo> getPhaseStageInfoPojos(MessageResultPojo resultPojo) {
private List<PhaseStageInfoPojo> getPhaseStageInfoPojos(CrossInfoPO crossInfo, MessageResultPojo resultPojo) {
List<PhaseStageInfoPojo> phaseStageInfoPojos = new ArrayList<>();
if (Objects.nonNull(resultPojo) && StringUtils.isNotBlank(resultPojo.getHexMessageResult())) {
String hexMessageResult = resultPojo.getHexMessageResult();
......@@ -322,6 +325,7 @@ public class DTStaticInfoServiceImpl implements StaticInfoService {
phaseStageInfoPojos.add(phaseStageInfoPojo);
}
}
SignalDataCache.phaseStageInfoCache.put(crossInfo.getId(), phaseStageInfoPojos);
return phaseStageInfoPojos;
}
......@@ -362,10 +366,10 @@ public class DTStaticInfoServiceImpl implements StaticInfoService {
String phaseHex = Constants.buildMessage(message);
MessageResultPojo resultPojo = NettyClient.sendMessage(crossInfo.getIp(), crossInfo.getPort(), phaseHex, phaseResultSign, 300);
Map<Integer, List<String>> phaseIdParamsMap = getHexPhaseParamMap(resultPojo);
return getPhaseInfoPojos(phaseIdParamsMap);
return getPhaseInfoPojos(crossInfo, phaseIdParamsMap);
}
private static List<PhaseInfoPojo> getPhaseInfoPojos(Map<Integer, List<String>> phaseIdParamsMap) {
private static List<PhaseInfoPojo> getPhaseInfoPojos(CrossInfoPO crossInfo, Map<Integer, List<String>> phaseIdParamsMap) {
List<PhaseInfoPojo> phaseInfoPojos = new ArrayList<>();
for (Map.Entry<Integer, List<String>> item : phaseIdParamsMap.entrySet()) {
PhaseInfoPojo phaseInfoPojo = new PhaseInfoPojo();
......@@ -395,7 +399,9 @@ public class DTStaticInfoServiceImpl implements StaticInfoService {
}
}
// 过滤掉未配置的相位
return phaseInfoPojos.stream().filter(phaseInfoPojo -> phaseInfoPojo.getRedTime() != 0).collect(Collectors.toList());
List<PhaseInfoPojo> filter = phaseInfoPojos.stream().filter(phaseInfoPojo -> phaseInfoPojo.getRedTime() != 0).collect(Collectors.toList());
SignalDataCache.phaseInfoCache.put(crossInfo.getId(), filter);
return filter;
}
private static Map<Integer, List<String>> getHexPhaseParamMap(MessageResultPojo resultPojo) {
......
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