Commit 7e048636 authored by duanruiming's avatar duanruiming

[update] UTC模拟灯态优化

parent e5dc6b07
......@@ -9,7 +9,8 @@ public class BasicEnum {
public enum ManufacturerEnum {
HK("海康", "HK"),
DT("东土", "DT"),
HISENSE("海信", "HISENSE");
HISENSE("海信", "HISENSE"),
STATIC("静态方案灯态", "STATIC");
private String nick;
private String code;
......
......@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.databus.dao.entity.CrossLightsStatusHistPO;
import net.wanji.databus.dao.mapper.CrossInfoMapper;
......@@ -37,6 +38,7 @@ import java.util.stream.Collectors;
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class SignalStatusServiceImpl implements SignalStatusService {
private final ManufacturerInfoMapper manufacturerInfoMapper;
private final CrossInfoMapper crossInfoMapper;
......@@ -51,36 +53,41 @@ public class SignalStatusServiceImpl implements SignalStatusService {
@Transactional
public List<SignalStatusLogPO> runningStatusAlarm() throws Exception {
List<SignalStatusLogPO> resList = new ArrayList<>();
BasicEnum.ManufacturerEnum[] manufacturerEnums = BasicEnum.ManufacturerEnum.values();
for (BasicEnum.ManufacturerEnum manufacturerEnum : manufacturerEnums) {
List<BaseCrossInfo> baseCrossInfoList = getBaseCrossInfoList(manufacturerEnum);
if (baseCrossInfoList == null) {
continue;
}
List<SignalStatusLogPO> signalStatusLogPOList = new ArrayList<>();
if (manufacturerEnum.getCode().equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
// 海康
// 3.2.5信号机运行状态和告警信息
resList.addAll(hkRunningStatusService.getHkRunningStatus(baseCrossInfoList));
} else if (manufacturerEnum.getCode().equals(BasicEnum.ManufacturerEnum.DT.getCode())) {
// todo 其他厂商
List<String> crossIdList = baseCrossInfoList.stream().map(BaseCrossInfo::getCrossId).collect(Collectors.toList());
resList.addAll(wanJiRunningStatusService.runningStatus(crossIdList));
}
// 更新Redis
if (null != signalStatusLogPOList) {
for (SignalStatusLogPO signalStatusLogPO : signalStatusLogPOList) {
String field = manufacturerEnum.getCode() + Constants.SEPARATOR_UNDER_LINE +
signalStatusLogPO.getSignalId();
redisUtil.setHash(RedisKeyConst.KEY_PREFIX + RedisKeyConst.TELESEME_STATUS, field,
signalStatusLogPO.getStatus() + "");
try {
BasicEnum.ManufacturerEnum[] manufacturerEnums = BasicEnum.ManufacturerEnum.values();
for (BasicEnum.ManufacturerEnum manufacturerEnum : manufacturerEnums) {
List<BaseCrossInfo> baseCrossInfoList = getBaseCrossInfoList(manufacturerEnum);
if (baseCrossInfoList == null) {
continue;
}
List<SignalStatusLogPO> signalStatusLogPOList = new ArrayList<>();
if (manufacturerEnum.getCode().equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
// 海康
// 3.2.5信号机运行状态和告警信息
resList.addAll(hkRunningStatusService.getHkRunningStatus(baseCrossInfoList));
} else if (manufacturerEnum.getCode().equals(BasicEnum.ManufacturerEnum.DT.getCode())) {
// todo 其他厂商
List<String> crossIdList = baseCrossInfoList.stream().map(BaseCrossInfo::getCrossId).collect(Collectors.toList());
resList.addAll(wanJiRunningStatusService.runningStatus(crossIdList));
}
// 更新日志数据库
if (ListUtil.isNotEmpty(signalStatusLogPOList)) {
signalStatusLogMapper.insertBatch(signalStatusLogPOList);
resList.addAll(signalStatusLogPOList);
// 更新Redis
if (null != signalStatusLogPOList) {
for (SignalStatusLogPO signalStatusLogPO : signalStatusLogPOList) {
String field = manufacturerEnum.getCode() + Constants.SEPARATOR_UNDER_LINE +
signalStatusLogPO.getSignalId();
redisUtil.setHash(RedisKeyConst.KEY_PREFIX + RedisKeyConst.TELESEME_STATUS, field,
signalStatusLogPO.getStatus() + "");
}
// 更新日志数据库
if (ListUtil.isNotEmpty(signalStatusLogPOList)) {
signalStatusLogMapper.insertBatch(signalStatusLogPOList);
resList.addAll(signalStatusLogPOList);
}
}
}
} catch (Exception e) {
log.error("运行状态、告警服务异常", e);
throw new Exception(e);
}
return resList;
}
......
......@@ -12,6 +12,7 @@ import net.wanji.utc.cache.CrossInfoCache;
import net.wanji.utc.cache.UtcFeignClientCache;
import net.wanji.utc.service.runninginfo.WanJiCommonRunningStatusService;
import net.wanji.utc.util.HttpRestUtil;
import net.wanji.utc.util.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -37,6 +38,9 @@ public class WanJiCommonRunningStatusServiceImpl implements WanJiCommonRunningSt
List<SignalStatusLogPO> result = new ArrayList<>();
for (String crossId : crossIdList) {
String manufacturerIdCode = crossInfoCache.getManufacturerCodeByCrossId(crossId);
if (StringUtils.isEmpty(manufacturerIdCode)) {
continue;
}
JsonViewObject jsonViewObject = utcFeignClientCache.getUtcFeignClientService(manufacturerIdCode).runningStatusAlarm(crossId);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
throw new Exception("获取运行状态、告警数据远程服务调用异常,异常信息" + jsonViewObject.getMessage());
......
......@@ -105,6 +105,10 @@ public class SignalStatus4StaticSchemeTask {
if (Objects.nonNull(crossSchemePO)) {
String schemeNo = crossSchemePO.getSchemeNo();
if (StringUtils.isNotBlank(schemeNo)) {
if (isNotNextSchemeNo(crossSchemePO)) {
continue;
}
List<CrossSchemePhaseCountDownDTO> crossSchemePhaseCountDownList = CrossSchemePhaseTimeCountCache.crossSchemePhaseCountDownList;
for (CrossSchemePhaseCountDownDTO crossSchemePhaseCountDownDTO : crossSchemePhaseCountDownList) {
if (StringUtils.equalsIgnoreCase(schemeNo, crossSchemePhaseCountDownDTO.getSchemeNo()) &&
......@@ -133,6 +137,21 @@ public class SignalStatus4StaticSchemeTask {
}
}
private boolean isNotNextSchemeNo(CrossSchemePO crossSchemePO) {
if (Objects.nonNull(crossSchemePO)) {
String schemeNo = crossSchemePO.getSchemeNo();
String crossId = crossSchemePO.getCrossId();
LightsStatusVO lightsStatusVO = currentCrossLightStatusCache.get(crossId);
if (Objects.nonNull(lightsStatusVO)) {
String currentSchemeNo = lightsStatusVO.getSchemeId();
if (StringUtils.equalsIgnoreCase(schemeNo, currentSchemeNo)) {
return true;
}
}
}
return false;
}
private static Integer getCurrentSchemeId(List<CrossSectionPO> crossSectionPOS, LocalTime currentTime, Integer currentPlanId) {
if (!CollectionUtils.isEmpty(crossSectionPOS)) {
List<CrossSectionPO> currentPlanIdSectionList = crossSectionPOS.stream().filter(po -> Objects.equals(currentPlanId, po.getPlanId())).collect(Collectors.toList());
......@@ -178,7 +197,7 @@ public class SignalStatus4StaticSchemeTask {
}
private static void getRedCountDown(String crossId, LightsStatusVO lightsStatusVO, String schemeId) {
private static void getRedCountDown(String crossId, LightsStatusVO lightsStatusVO, String schemeId) throws Exception {
Map<String, Object> phaseMap = new HashMap<>();
List<CrossPhaseDirTurnPojo> crossPhaseDirTurnCache = CrossPhaseDirTurnCache.getCrossPhaseDirTurnCache(crossId);
List<PhaseCountDownDTO> phaseCountDownList = getPhaseCountDownList(crossId, schemeId);
......@@ -351,7 +370,11 @@ public class SignalStatus4StaticSchemeTask {
} else {
lightsStatusVO.setCyclePhaseCountDown(lightsStatusVO.getCyclePhaseCountDown() - 1);
Integer cycleCountDown = lightsStatusVO.getCycleCountDown();
lightsStatusVO.setCycleCountDown(--cycleCountDown);
if (cycleCountDown >= 2) {
lightsStatusVO.setCycleCountDown(--cycleCountDown);
} else {
lightsStatusVO.setCycleCountDown(lightsStatusVO.getCycleLen());
}
}
}
......
......@@ -86,53 +86,56 @@ public class SignalStatusTask {
Map<String, List<Map.Entry<String, RealTimeDataWebSocket>>> crossEntryMap = getCrossEntryMap(evenWarnWebSocketMap);
for (Map.Entry<String, List<Map.Entry<String, RealTimeDataWebSocket>>> entry : crossEntryMap.entrySet()) {
//commonThreadPoolExecutor.execute(() -> {
ObjectMapper mapper = JacksonUtils.getInstance();
String crossId = entry.getKey();
List<LightsStatusVO> lightsStatusVOS = null;
CrossInfoPO crossInfoPO = crossInfoMapper.selectByPrimaryKey(crossId);
if (Objects.isNull(crossInfoPO)) {
continue;
}
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(crossInfoPO.getManufacturerId());
try {
if (StringUtils.equals(BasicEnum.ManufacturerEnum.HK.getCode(), manufacturerInfoPO.getCode())) {
lightsStatusVOS = hkLightsStatusService.getHkLightsStatus(crossId);
} else if (StringUtils.equals(BasicEnum.ManufacturerEnum.DT.getCode(), manufacturerInfoPO.getCode())){
JsonViewObject jsonViewObject = utcDTFeignClients.lightStatus(crossId);
lightsStatusVOS = mapper.convertValue(jsonViewObject.getContent(), new TypeReference<List<LightsStatusVO>>() {});
} else if (StringUtils.endsWithIgnoreCase(BasicEnum.ManufacturerEnum.HISENSE.getCode(), manufacturerInfoPO.getCode())){
JsonViewObject jsonViewObject = utcHisenseFeignClients.lightStatus(crossId);
lightsStatusVOS = mapper.convertValue(jsonViewObject.getContent(), new TypeReference<List<LightsStatusVO>>() {});
ObjectMapper mapper = JacksonUtils.getInstance();
String crossId = entry.getKey();
List<LightsStatusVO> lightsStatusVOS = null;
CrossInfoPO crossInfoPO = crossInfoMapper.selectByPrimaryKey(crossId);
if (Objects.isNull(crossInfoPO)) {
continue;
}
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(crossInfoPO.getManufacturerId());
try {
if (StringUtils.equals(BasicEnum.ManufacturerEnum.HK.getCode(), manufacturerInfoPO.getCode())) {
lightsStatusVOS = hkLightsStatusService.getHkLightsStatus(crossId);
} else if (StringUtils.equals(BasicEnum.ManufacturerEnum.DT.getCode(), manufacturerInfoPO.getCode())) {
JsonViewObject jsonViewObject = utcDTFeignClients.lightStatus(crossId);
lightsStatusVOS = mapper.convertValue(jsonViewObject.getContent(), new TypeReference<List<LightsStatusVO>>() {
});
} else if (StringUtils.endsWithIgnoreCase(BasicEnum.ManufacturerEnum.HISENSE.getCode(), manufacturerInfoPO.getCode())) {
JsonViewObject jsonViewObject = utcHisenseFeignClients.lightStatus(crossId);
lightsStatusVOS = mapper.convertValue(jsonViewObject.getContent(), new TypeReference<List<LightsStatusVO>>() {
});
} else if (StringUtils.endsWithIgnoreCase(BasicEnum.ManufacturerEnum.STATIC.getCode(), manufacturerInfoPO.getCode())) {
LightsStatusVO lightsStatusVO = SignalStatus4StaticSchemeTask.currentCrossLightStatusCache.get(crossId);
if (Objects.nonNull(lightsStatusVO)) {
lightsStatusVOS = new ArrayList<>();
lightsStatusVOS.add(lightsStatusVO);
}
} catch (Exception e) {
log.error("灯态异常");
//throw new Exception(e);
//lightsStatusVOS = new ArrayList<>();
//LightsStatusVO lightsStatusVO = SignalStatus4StaticSchemeTask.currentCrossLightStatusCache.get(crossId);
//lightsStatusVOS.add(lightsStatusVO);
}
} catch (Exception e) {
log.error("获取厂商灯态异常", e);
}
List<Map.Entry<String, RealTimeDataWebSocket>> value = entry.getValue();
if (!CollectionUtils.isEmpty(lightsStatusVOS)) {
for (LightsStatusVO lightsStatusVO : lightsStatusVOS) {
if (Objects.equals(lightsStatusVO.getCrossId(), crossId)) {
calculateContolCountDown(crossId, lightsStatusVO);
try { // 相同路口不同websocket统一发送灯态
String json = mapper.writeValueAsString(lightsStatusVOS);
for (Map.Entry<String, RealTimeDataWebSocket> socketEntry : value) {
String crossIdStr = socketEntry.getKey();
RealTimeDataWebSocket webSocket = socketEntry.getValue();
webSocket.sendInfo(json, crossIdStr);
}
insertIntoHist(crossId, json);
produceListMap.put(crossId, lightsStatusVOS);
} catch (Exception e) {
log.error("RealTimeDataWebSocket发送异常,异常信息:", e);
List<Map.Entry<String, RealTimeDataWebSocket>> value = entry.getValue();
if (!CollectionUtils.isEmpty(lightsStatusVOS)) {
for (LightsStatusVO lightsStatusVO : lightsStatusVOS) {
if (Objects.equals(lightsStatusVO.getCrossId(), crossId)) {
calculateContolCountDown(crossId, lightsStatusVO);
try { // 相同路口不同websocket统一发送灯态
String json = mapper.writeValueAsString(lightsStatusVOS);
for (Map.Entry<String, RealTimeDataWebSocket> socketEntry : value) {
String crossIdStr = socketEntry.getKey();
RealTimeDataWebSocket webSocket = socketEntry.getValue();
webSocket.sendInfo(json, crossIdStr);
}
insertIntoHist(crossId, json);
produceListMap.put(crossId, lightsStatusVOS);
} catch (Exception e) {
log.error("RealTimeDataWebSocket发送异常,异常信息:", e);
}
}
}
}
//});
}
sendKafka();
......@@ -157,6 +160,7 @@ public class SignalStatusTask {
/**
* 计算控制倒计时
*
* @param crossId
* @param lightsStatusVO
*/
......@@ -186,7 +190,7 @@ public class SignalStatusTask {
String[] split = crossIdStr.split(",");
crossId = split[0];
}
List<Map.Entry<String, RealTimeDataWebSocket>> socketList = new ArrayList<>();
List<Map.Entry<String, RealTimeDataWebSocket>> socketList = new ArrayList<>();
if (tempMap.containsKey(crossId)) {
socketList = tempMap.get(crossId);
socketList.add(item);
......@@ -200,8 +204,9 @@ public class SignalStatusTask {
/**
* 插入路口灯态历史表
*
* @param crossId 路口ID
* @param json 灯态JSON字符串
* @param json 灯态JSON字符串
* @throws Exception 异常处理
*/
private void insertIntoHist(String crossId, String json) throws Exception {
......
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