Commit a06a8b5c authored by duanruiming's avatar duanruiming

[add] 优化灯态相位;步进恢复逻辑优化

parent 2de1e01e
...@@ -33,7 +33,7 @@ public class CrossPhaseDirTurnCache implements CommandLineRunner { ...@@ -33,7 +33,7 @@ public class CrossPhaseDirTurnCache implements CommandLineRunner {
private final CrossPhaseLightsMapper crossPhaseLightsMapper; private final CrossPhaseLightsMapper crossPhaseLightsMapper;
private final CrossLightsMapper crossLightsMapper; private final CrossLightsMapper crossLightsMapper;
private static final Map<String, List<CrossPhaseDirTurnPojo>> crossInfoMap = new HashMap<>(); public static final Map<String, List<CrossPhaseDirTurnPojo>> crossInfoMap = new HashMap<>();
public static List<CrossPhaseDirTurnPojo> getCrossPhaseDirTurnCache(String crossId) { public static List<CrossPhaseDirTurnPojo> getCrossPhaseDirTurnCache(String crossId) {
if (!crossInfoMap.isEmpty()) { if (!crossInfoMap.isEmpty()) {
......
...@@ -13,13 +13,18 @@ import lombok.RequiredArgsConstructor; ...@@ -13,13 +13,18 @@ import lombok.RequiredArgsConstructor;
import net.wanji.common.annotation.aspect.AspectLog; import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum; import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.dao.entity.CrossLightsPO;
import net.wanji.databus.dto.CrossIdDateTimeDTO; import net.wanji.databus.dto.CrossIdDateTimeDTO;
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.databus.vo.LightsStatusVO2; import net.wanji.databus.vo.LightsStatusVO2;
import net.wanji.utc.cache.CrossPhaseDirTurnCache;
import net.wanji.utc.common.constant.Constants; import net.wanji.utc.common.constant.Constants;
import net.wanji.utc.po.hk.CrossPhaseDirTurnPojo;
import net.wanji.utc.service.runninginfo.SignalStatusService; import net.wanji.utc.service.runninginfo.SignalStatusService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -31,6 +36,7 @@ import java.util.ArrayList; ...@@ -31,6 +36,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* 运行状态、告警、灯态信息接口 * 运行状态、告警、灯态信息接口
...@@ -79,52 +85,162 @@ public class SignalStatusController { ...@@ -79,52 +85,162 @@ public class SignalStatusController {
@ApiResponse(code = 200, message = "OK", response = LightsStatusVO.class) @ApiResponse(code = 200, message = "OK", response = LightsStatusVO.class)
}) })
public JsonViewObject lightStatusV2() throws Exception { public JsonViewObject lightStatusV2() throws Exception {
//List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus4StaticScheme(); List<LightsStatusVO2> collect = null;
List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus(); try {
List<LightsStatusVO2> listResult = new ArrayList<>(lightsStatusVOList.size()); //List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus4StaticScheme();
List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus();
List<LightsStatusVO2> listResult = new ArrayList<>(lightsStatusVOList.size());
for (LightsStatusVO lightsStatusVO : lightsStatusVOList) { for (LightsStatusVO lightsStatusVO : lightsStatusVOList) {
if (Objects.isNull(lightsStatusVO)) { if (Objects.isNull(lightsStatusVO)) {
continue; continue;
} }
Integer cyclePhaseCountDown = lightsStatusVO.getCyclePhaseCountDown(); Integer cyclePhaseCountDown = lightsStatusVO.getCyclePhaseCountDown();
LightsStatusVO2 lightsStatusVO2 = new LightsStatusVO2(); LightsStatusVO2 lightsStatusVO2 = new LightsStatusVO2();
BeanUtils.copyProperties(lightsStatusVO, lightsStatusVO2); BeanUtils.copyProperties(lightsStatusVO, lightsStatusVO2);
Map<String, Object> dirLampGroupMap = lightsStatusVO.getDirLampGroupMap(); Map<String, Object> dirLampGroupMap = lightsStatusVO.getDirLampGroupMap();
List<LightsStatusVO2.DirInfo> dirList = new ArrayList<>(); List<LightsStatusVO2.DirInfo> dirList = new ArrayList<>();
Map<String, Object> phaseMap = lightsStatusVO.getPhaseMap(); Map<String, Object> phaseMap = lightsStatusVO.getPhaseMap();
for (Map.Entry<String, Object> groupEntry : dirLampGroupMap.entrySet()) { for (Map.Entry<String, Object> groupEntry : dirLampGroupMap.entrySet()) {
LightsStatusVO2.DirInfo dirInfo = new LightsStatusVO2.DirInfo(); LightsStatusVO2.DirInfo dirInfo = new LightsStatusVO2.DirInfo();
String dir = groupEntry.getKey(); String dir = groupEntry.getKey();
Map<String, String> turnColorMap = (Map<String, String>) groupEntry.getValue(); Map<String, String> turnColorMap = (Map<String, String>) groupEntry.getValue();
List<LightsStatusVO2.TurnInfo> turnList = new ArrayList<>(); List<LightsStatusVO2.TurnInfo> turnList = new ArrayList<>();
for (Map.Entry<String, String> turnEntry : turnColorMap.entrySet()) { for (Map.Entry<String, String> turnEntry : turnColorMap.entrySet()) {
String turn = turnEntry.getKey(); String turn = turnEntry.getKey();
String color = turnEntry.getValue(); String color = turnEntry.getValue();
LightsStatusVO2.TurnInfo turnInfo = new LightsStatusVO2.TurnInfo(); LightsStatusVO2.TurnInfo turnInfo = new LightsStatusVO2.TurnInfo();
turnInfo.setTurn(String.valueOf(turn)); turnInfo.setTurn(String.valueOf(turn));
turnInfo.setColor(color); turnInfo.setColor(color);
String key = dir.concat(Constants.SEPARATOR_UNDER_LINE).concat(turn); String key = dir.concat(Constants.SEPARATOR_UNDER_LINE).concat(turn);
Object countDown = phaseMap.get(key); Object countDown = phaseMap.get(key);
if (Objects.isNull(countDown)) { if (Objects.isNull(countDown)) {
countDown = cyclePhaseCountDown; countDown = cyclePhaseCountDown;
}
if (Objects.isNull(cyclePhaseCountDown)) {
countDown = lightsStatusVO.getCycleCountDown();
}
turnInfo.setCountDown((int) countDown);
turnList.add(turnInfo);
} }
if (Objects.isNull(cyclePhaseCountDown)) { dirInfo.setDir(dir);
countDown = lightsStatusVO.getCycleCountDown(); dirInfo.setTurnList(turnList);
dirList.add(dirInfo);
}
lightsStatusVO2.setDirLampGroupMapList(dirList);
/**
* 处理灯态,获取当前相位号灯态
*/
//if (StringUtils.equals("13N0C0B5P30", lightsStatusVO.getCrossId())) {
List<LightsStatusVO2.DirInfo> curPhaseDirList = getCurPhaseDirList(lightsStatusVO2);
lightsStatusVO2.setCurPhaseLampGroupMapList(curPhaseDirList);
//}
listResult.add(lightsStatusVO2);
}
collect = listResult.stream().filter(vo -> StringUtils.equals(vo.getCrossId(), "13N0C0B5P30")).collect(Collectors.toList());
} catch (Exception e) {
throw new RuntimeException(e);
}
return JsonViewObject.newInstance().success(collect);
}
/**
* 通过当前灯态获取当前相位的灯态方向转向倒计时信息
* @param lightsStatusVO2
* @return
*/
private static List<LightsStatusVO2.DirInfo> getCurPhaseDirList(LightsStatusVO2 lightsStatusVO2) {
List<LightsStatusVO2.DirInfo> curPhaseList = new ArrayList<>();
try {
String crossId = lightsStatusVO2.getCrossId();
String schemeId = lightsStatusVO2.getSchemeId();
String phaseId = lightsStatusVO2.getPhaseId();
List<LightsStatusVO2.DirInfo> dirLampGroupMapList = lightsStatusVO2.getDirLampGroupMapList();
Map<String, List<CrossPhaseDirTurnPojo>> crossInfoMap = CrossPhaseDirTurnCache.crossInfoMap;
if (!crossInfoMap.isEmpty()) {
List<CrossPhaseDirTurnPojo> crossPhaseDirTurnPojos = crossInfoMap.get(crossId);
if (!CollectionUtils.isEmpty(crossPhaseDirTurnPojos)) {
for (CrossPhaseDirTurnPojo crossPhaseDirTurnPojo : crossPhaseDirTurnPojos) {
String curCrossId = crossPhaseDirTurnPojo.getCrossId();
Integer curSchemeNo = crossPhaseDirTurnPojo.getSchemeNo();
Integer curPhaseNo = crossPhaseDirTurnPojo.getPhaseNo();
if (StringUtils.equals(crossId, curCrossId) && Objects.equals(Integer.valueOf(schemeId), curSchemeNo)
&& Objects.equals(Integer.valueOf(phaseId), curPhaseNo)) {
Map<Integer, List<CrossLightsPO>> dirTurnMap = crossPhaseDirTurnPojo.getDirTurnMap();
if (!dirTurnMap.isEmpty()) {
for (Map.Entry<Integer, List<CrossLightsPO>> item : dirTurnMap.entrySet()) {
LightsStatusVO2.DirInfo dirInfo = new LightsStatusVO2.DirInfo();
Integer dir = item.getKey();
List<LightsStatusVO2.TurnInfo> turnList = new ArrayList<>();
List<CrossLightsPO> value = item.getValue();
if (!CollectionUtils.isEmpty(value)) {
for (CrossLightsPO crossLightsPO : value) {
Integer type = crossLightsPO.getType();
Integer curTurn = crossLightsPO.getTurn();
String color = "";
for (LightsStatusVO2.DirInfo info : dirLampGroupMapList) {
String statusDir = info.getDir();
if (StringUtils.equals(statusDir, String.valueOf(dir))) {
List<LightsStatusVO2.TurnInfo> statusTurnList = info.getTurnList();
for (LightsStatusVO2.TurnInfo turnInfo : statusTurnList) {
String statusTurn = turnInfo.getTurn();
if (StringUtils.equals(String.valueOf(curTurn), statusTurn)) {
color = turnInfo.getColor();
}
}
}
}
String turn = "";
// 过滤行人
if (Objects.equals(3, type)) {
continue;
}
if (Objects.equals(2, type)) {
for (int i = 1; i <= 2 ; i++) {
// 设置转向信息
LightsStatusVO2.TurnInfo turnInfo = new LightsStatusVO2.TurnInfo();
turnInfo.setTurn(String.valueOf(i));
turnInfo.setColor(color);
turnInfo.setCountDown(0);
turnList.add(turnInfo);
}
} else if (Objects.equals(1, type)){
turn = String.valueOf(curTurn);
LightsStatusVO2.TurnInfo turnInfo = new LightsStatusVO2.TurnInfo();
turnInfo.setTurn(turn);
turnInfo.setColor(color);
turnInfo.setCountDown(0);
turnList.add(turnInfo);
}
}
}
if (!CollectionUtils.isEmpty(turnList)) {
dirInfo.setDir(String.valueOf(dir));
dirInfo.setTurnList(turnList);
curPhaseList.add(dirInfo);
}
}
}
}
} }
turnInfo.setCountDown((int) countDown);
turnList.add(turnInfo);
} }
dirInfo.setDir(dir);
dirInfo.setTurnList(turnList);
dirList.add(dirInfo);
} }
lightsStatusVO2.setDirLampGroupMapList(dirList); } catch (Exception e) {
listResult.add(lightsStatusVO2); e.printStackTrace();
//log.error("获取当前相位灯态倒计时失败:", e);
} }
return JsonViewObject.newInstance().success(listResult);
return curPhaseList;
} }
@AspectLog(description = "灯态数据历史数据列表", operationType = BaseEnum.OperationTypeEnum.QUERY) @AspectLog(description = "灯态数据历史数据列表", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/lightStatusHist", produces = MediaType.APPLICATION_JSON) @PostMapping(value = "/lightStatusHist", produces = MediaType.APPLICATION_JSON)
@ApiOperation(value = "灯态数据历史数据列表", notes = "灯态数据历史数据列表", response = LightsStatusVO2.class, @ApiOperation(value = "灯态数据历史数据列表", notes = "灯态数据历史数据列表", response = LightsStatusVO2.class,
......
...@@ -215,7 +215,8 @@ public class CommandFaildTask { ...@@ -215,7 +215,8 @@ public class CommandFaildTask {
String ip = "localhost"; String ip = "localhost";
signalCommandLogPO.setIp(ip); signalCommandLogPO.setIp(ip);
log.info("定时任务返回 信息jsonViewObject:{}", jsonViewObject); log.info("定时任务返回 信息jsonViewObject:{}", jsonViewObject);
if (code == 200) { // 添加恢复逻辑,因为延迟问题,自动恢复四次后认为恢复成功
if (code == 200 && updateCount == 3) {
signalCommandLogPO.setCommandResult(1); signalCommandLogPO.setCommandResult(1);
signalCommandLogPO.setUpdateCount(0); signalCommandLogPO.setUpdateCount(0);
} else { } else {
......
...@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.utils.tool.JacksonUtils; import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.databus.dao.entity.CrossLightsPO;
import net.wanji.databus.dao.entity.CrossLightsStatusHistPO; import net.wanji.databus.dao.entity.CrossLightsStatusHistPO;
import net.wanji.databus.dao.entity.SignalCommandLogPO; import net.wanji.databus.dao.entity.SignalCommandLogPO;
import net.wanji.databus.dao.entity.SignalCommandPO; import net.wanji.databus.dao.entity.SignalCommandPO;
...@@ -18,9 +19,11 @@ import net.wanji.databus.vo.LightsStatusVO2; ...@@ -18,9 +19,11 @@ import net.wanji.databus.vo.LightsStatusVO2;
import net.wanji.feign.service.EHualuFeignClients; import net.wanji.feign.service.EHualuFeignClients;
import net.wanji.feign.service.UtcDTFeignClients; import net.wanji.feign.service.UtcDTFeignClients;
import net.wanji.feign.service.UtcHisenseFeignClients; import net.wanji.feign.service.UtcHisenseFeignClients;
import net.wanji.utc.cache.CrossPhaseDirTurnCache;
import net.wanji.utc.common.constant.Constants; import net.wanji.utc.common.constant.Constants;
import net.wanji.utc.common.typeenum.BasicEnum; import net.wanji.utc.common.typeenum.BasicEnum;
import net.wanji.utc.kafka.ProducerHandler; import net.wanji.utc.kafka.ProducerHandler;
import net.wanji.utc.po.hk.CrossPhaseDirTurnPojo;
import net.wanji.utc.service.runninginfo.HkLightsStatusService; import net.wanji.utc.service.runninginfo.HkLightsStatusService;
import net.wanji.utc.service.runninginfo.SignalStatusService; import net.wanji.utc.service.runninginfo.SignalStatusService;
import net.wanji.utc.util.RedisUtil; import net.wanji.utc.util.RedisUtil;
...@@ -265,6 +268,13 @@ public class SignalStatusTask { ...@@ -265,6 +268,13 @@ public class SignalStatusTask {
dirList.add(dirInfo); dirList.add(dirInfo);
} }
lightsStatusVO2.setDirLampGroupMapList(dirList); lightsStatusVO2.setDirLampGroupMapList(dirList);
/**
* 处理灯态,获取当前相位号灯态
*/
List<LightsStatusVO2.DirInfo> curPhaseDirList = getCurPhaseDirList(lightsStatusVO2);
lightsStatusVO2.setCurPhaseLampGroupMapList(curPhaseDirList);
listResult.add(lightsStatusVO2); listResult.add(lightsStatusVO2);
} }
} catch (Exception e) { } catch (Exception e) {
...@@ -274,6 +284,98 @@ public class SignalStatusTask { ...@@ -274,6 +284,98 @@ public class SignalStatusTask {
return listResult; return listResult;
} }
/**
* 通过当前灯态获取当前相位的灯态方向转向倒计时信息
* @param lightsStatusVO2
* @return
*/
private static List<LightsStatusVO2.DirInfo> getCurPhaseDirList(LightsStatusVO2 lightsStatusVO2) {
List<LightsStatusVO2.DirInfo> curPhaseList = new ArrayList<>();
try {
String crossId = lightsStatusVO2.getCrossId();
String schemeId = lightsStatusVO2.getSchemeId();
String phaseId = lightsStatusVO2.getPhaseId();
List<LightsStatusVO2.DirInfo> dirLampGroupMapList = lightsStatusVO2.getDirLampGroupMapList();
Map<String, List<CrossPhaseDirTurnPojo>> crossInfoMap = CrossPhaseDirTurnCache.crossInfoMap;
if (!crossInfoMap.isEmpty()) {
List<CrossPhaseDirTurnPojo> crossPhaseDirTurnPojos = crossInfoMap.get(crossId);
if (!CollectionUtils.isEmpty(crossPhaseDirTurnPojos)) {
for (CrossPhaseDirTurnPojo crossPhaseDirTurnPojo : crossPhaseDirTurnPojos) {
String curCrossId = crossPhaseDirTurnPojo.getCrossId();
Integer curSchemeNo = crossPhaseDirTurnPojo.getSchemeNo();
Integer curPhaseNo = crossPhaseDirTurnPojo.getPhaseNo();
if (StringUtils.equals(crossId, curCrossId) && Objects.equals(Integer.valueOf(schemeId), curSchemeNo)
&& Objects.equals(Integer.valueOf(phaseId), curPhaseNo)) {
Map<Integer, List<CrossLightsPO>> dirTurnMap = crossPhaseDirTurnPojo.getDirTurnMap();
if (!dirTurnMap.isEmpty()) {
for (Map.Entry<Integer, List<CrossLightsPO>> item : dirTurnMap.entrySet()) {
LightsStatusVO2.DirInfo dirInfo = new LightsStatusVO2.DirInfo();
Integer dir = item.getKey();
List<LightsStatusVO2.TurnInfo> turnList = new ArrayList<>();
List<CrossLightsPO> value = item.getValue();
if (!CollectionUtils.isEmpty(value)) {
for (CrossLightsPO crossLightsPO : value) {
Integer type = crossLightsPO.getType();
Integer curTurn = crossLightsPO.getTurn();
String color = "";
for (LightsStatusVO2.DirInfo info : dirLampGroupMapList) {
String statusDir = info.getDir();
if (StringUtils.equals(statusDir, String.valueOf(dir))) {
List<LightsStatusVO2.TurnInfo> statusTurnList = info.getTurnList();
for (LightsStatusVO2.TurnInfo turnInfo : statusTurnList) {
String statusTurn = turnInfo.getTurn();
if (StringUtils.equals(String.valueOf(curTurn), statusTurn)) {
color = turnInfo.getColor();
}
}
}
}
String turn = "";
// 过滤行人
if (Objects.equals(3, type)) {
continue;
}
if (Objects.equals(2, type)) {
for (int i = 1; i <= 2 ; i++) {
// 设置转向信息
LightsStatusVO2.TurnInfo turnInfo = new LightsStatusVO2.TurnInfo();
turnInfo.setTurn(String.valueOf(i));
turnInfo.setColor(color);
turnInfo.setCountDown(0);
turnList.add(turnInfo);
}
} else if (Objects.equals(1, type)){
turn = String.valueOf(curTurn);
LightsStatusVO2.TurnInfo turnInfo = new LightsStatusVO2.TurnInfo();
turnInfo.setTurn(turn);
turnInfo.setColor(color);
turnInfo.setCountDown(0);
turnList.add(turnInfo);
}
}
}
if (!CollectionUtils.isEmpty(turnList)) {
dirInfo.setDir(String.valueOf(dir));
dirInfo.setTurnList(turnList);
curPhaseList.add(dirInfo);
}
}
}
}
}
}
}
} catch (Exception e) {
log.error("获取当前相位灯态倒计时失败:", e);
}
return curPhaseList;
}
/** /**
* 设置方向转向信息实体 * 设置方向转向信息实体
* *
......
package net.wanji.databus.dao.entity; package net.wanji.databus.dao.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
...@@ -13,6 +14,8 @@ public class CrossLightsStatusHistPO { ...@@ -13,6 +14,8 @@ public class CrossLightsStatusHistPO {
private String crossId; private String crossId;
private Integer batchTime; private Integer batchTime;
private String lightsStatusJson; private String lightsStatusJson;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date gmtCreate; private Date gmtCreate;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date gmtModified; private Date gmtModified;
} }
...@@ -38,6 +38,8 @@ public class LightsStatusVO2 extends BaseCrossInfo { ...@@ -38,6 +38,8 @@ public class LightsStatusVO2 extends BaseCrossInfo {
private String schemeId; private String schemeId;
@ApiModelProperty(value = "灯组状态") @ApiModelProperty(value = "灯组状态")
private List<DirInfo> dirLampGroupMapList; private List<DirInfo> dirLampGroupMapList;
@ApiModelProperty(value = "当前相位灯组状态")
private List<DirInfo> curPhaseLampGroupMapList;
@ApiModelProperty(value = "数据上报时间戳") @ApiModelProperty(value = "数据上报时间戳")
@Field(type = FieldType.Keyword, name = "timeStamp") @Field(type = FieldType.Keyword, name = "timeStamp")
private String timeStamp; private String timeStamp;
......
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