Commit 1d1a19ea authored by duanruiming's avatar duanruiming

[update] 优化告警数据和页面统计联动4

parent b9bb2ea4
package net.wanji.web.task; package net.wanji.web.task;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
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.BeanMapUtils; import net.wanji.common.utils.tool.BeanMapUtils;
import net.wanji.databus.cache.BaseCrossInfoCache;
import net.wanji.databus.dao.mapper.BaseCrossInfoMapper; import net.wanji.databus.dao.mapper.BaseCrossInfoMapper;
import net.wanji.databus.po.BaseCrossInfoPO; import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.vo.SignalStatusVO; import net.wanji.databus.vo.SignalStatusVO;
import net.wanji.feign.service.UtcFeignClients; import net.wanji.feign.service.UtcFeignClients;
import net.wanji.web.common.constant.Constant;
import net.wanji.web.entity.TCrossControlHist; import net.wanji.web.entity.TCrossControlHist;
import net.wanji.web.entity.TDeviceStatusInfo; import net.wanji.web.entity.TDeviceStatusInfo;
import net.wanji.web.entity.TDeviceStatusLog; import net.wanji.web.entity.TDeviceStatusLog;
import net.wanji.web.mapper.ControlHistMapper; import net.wanji.web.mapper.ControlHistMapper;
import net.wanji.web.mapper.TDeviceStatusLogMapper; import net.wanji.web.mapper.TDeviceStatusLogMapper;
import net.wanji.web.mapper.TDeviceStatusMapper; import net.wanji.web.mapper.TDeviceStatusMapper;
import net.wanji.web.service.SituationDetectionService; import net.wanji.web.vo.situationDetection.CommonEventAlarmOutVo;
import net.wanji.web.websocket.WebSocketServer;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
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.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -41,16 +46,15 @@ public class SignalStatusTask { ...@@ -41,16 +46,15 @@ public class SignalStatusTask {
private final TDeviceStatusLogMapper tDeviceStatusLogMapper; private final TDeviceStatusLogMapper tDeviceStatusLogMapper;
private final BaseCrossInfoMapper baseCrossInfoMapper; private final BaseCrossInfoMapper baseCrossInfoMapper;
private final CommonEventWarnTask commonEventWarnTask; private final CommonEventWarnTask commonEventWarnTask;
@Autowired private final BaseCrossInfoCache baseCrossInfoCache;
SituationDetectionService situationDetectionService;
@Scheduled(fixedRate = 30 * 1000) @Scheduled(fixedRate = 30 * 1000)
@Transactional @Transactional
public void syncSignalStatus() { public void syncSignalStatus() {
try { try {
// 先对比数据,推送告警事件,然后修改状态 long start = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
commonEventWarnTask.pushEvenWarnData(); log.info("===当前时间:{}", LocalDateTime.now());
JsonViewObject jsonViewObject = utcFeignClients.runningStatusAlarm(); JsonViewObject jsonViewObject = utcFeignClients.runningStatusAlarm();
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("定时任务同步信号机设备状态utcService调用异常"); log.error("定时任务同步信号机设备状态utcService调用异常");
...@@ -61,14 +65,11 @@ public class SignalStatusTask { ...@@ -61,14 +65,11 @@ public class SignalStatusTask {
List<SignalStatusVO> content = BeanMapUtils.mapsToObjects(source, SignalStatusVO.class); List<SignalStatusVO> content = BeanMapUtils.mapsToObjects(source, SignalStatusVO.class);
List<String> crossIdList = content.stream().map(SignalStatusVO::getCrossId).collect(Collectors.toList()); List<String> crossIdList = content.stream().map(SignalStatusVO::getCrossId).collect(Collectors.toList());
// 信号机状态信息 // 信号机状态信息
List<BaseCrossInfoPO> baseCrossInfoPOList = new ArrayList<>(); List<BaseCrossInfoPO> baseCrossInfoPOS = baseCrossInfoCache.getCrossInfoCache();
if (!CollectionUtils.isEmpty(crossIdList)) { List<CommonEventAlarmOutVo> results = new ArrayList<>();
baseCrossInfoPOList = baseCrossInfoMapper.selectByCrossIds(crossIdList);
}
List<BaseCrossInfoPO> finalBaseCrossInfoPOList = baseCrossInfoPOList;
content.forEach(signalStatusVO -> { content.forEach(signalStatusVO -> {
String crossId = signalStatusVO.getCrossId(); String crossId = signalStatusVO.getCrossId();
String name = getSignalName(finalBaseCrossInfoPOList, crossId); String name = getSignalName(baseCrossInfoPOS, crossId);
Integer currentSignalStatus = signalStatusVO.getStatus() == null ? 0 : signalStatusVO.getStatus(); Integer currentSignalStatus = signalStatusVO.getStatus() == null ? 0 : signalStatusVO.getStatus();
Integer currentFaultType = signalStatusVO.getFaultType() == null ? 0 : signalStatusVO.getFaultType(); Integer currentFaultType = signalStatusVO.getFaultType() == null ? 0 : signalStatusVO.getFaultType();
// 信号机在线,但是故障,数据库状态为2 // 信号机在线,但是故障,数据库状态为2
...@@ -77,23 +78,26 @@ public class SignalStatusTask { ...@@ -77,23 +78,26 @@ public class SignalStatusTask {
} }
// 更新数据库状态 // 更新数据库状态
updateSignalStatus(signalStatusVO, crossId, name, currentSignalStatus, currentFaultType); updateSignalStatus(signalStatusVO, crossId, name, currentSignalStatus, currentFaultType, results);
insertControlHist(signalStatusVO); insertControlHist(signalStatusVO);
log.info("更新信号机状态成功,{}", currentSignalStatus); log.info("更新信号机状态成功,{}", currentSignalStatus);
}); });
extracted(); long end = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
log.info("===定时任务消费时间:{}s", end - start);
// 无告警数据不推送
if (!CollectionUtils.isEmpty(results)) {
JsonViewObject warnData = JsonViewObject.newInstance();
LocalDateTime now = LocalDateTime.now();
warnData.setTimestamp(now.toInstant(ZoneOffset.of("+8")).toEpochMilli());
warnData.setContent(results);
WebSocketServer.sendTopicInfo2All(JSONObject.toJSONString(warnData), Constant.WEBSOCKET_TOPIC_EVENT_WARN);
}
} catch (Exception e) { } catch (Exception e) {
log.error("定时任务同步信号机设备状态远程utcService调用异常", e); log.error("定时任务同步信号机设备状态远程utcService调用异常", e);
} }
} }
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void extracted() {
Map<String, Map<String, Integer>> stringMapMap = situationDetectionService.allDeviceStatus(null);
log.info("当前设备在线数量:{}", stringMapMap.toString());
}
private static String getSignalName(List<BaseCrossInfoPO> finalBaseCrossInfoPOList, String crossId) { private static String getSignalName(List<BaseCrossInfoPO> finalBaseCrossInfoPOList, String crossId) {
String name = null; String name = null;
for (BaseCrossInfoPO baseCrossInfoPO : finalBaseCrossInfoPOList) { for (BaseCrossInfoPO baseCrossInfoPO : finalBaseCrossInfoPOList) {
...@@ -114,7 +118,7 @@ public class SignalStatusTask { ...@@ -114,7 +118,7 @@ public class SignalStatusTask {
* @param currentSignalStatus * @param currentSignalStatus
* @param currentFaultType * @param currentFaultType
*/ */
private void updateSignalStatus(SignalStatusVO signalStatusVO, String crossId, String name, Integer currentSignalStatus, Integer currentFaultType) { private void updateSignalStatus(SignalStatusVO signalStatusVO, String crossId, String name, Integer currentSignalStatus, Integer currentFaultType, List<CommonEventAlarmOutVo> results) {
LambdaQueryWrapper<TDeviceStatusInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TDeviceStatusInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotEmpty(crossId)) { if (StringUtils.isNotEmpty(crossId)) {
lambdaQueryWrapper.eq(TDeviceStatusInfo::getCode, crossId); lambdaQueryWrapper.eq(TDeviceStatusInfo::getCode, crossId);
...@@ -126,6 +130,8 @@ public class SignalStatusTask { ...@@ -126,6 +130,8 @@ public class SignalStatusTask {
tDeviceStatusInfo.setGmtCreate(new Date()); // 实时数据,创建和修改时间一致 tDeviceStatusInfo.setGmtCreate(new Date()); // 实时数据,创建和修改时间一致
tDeviceStatusMapper.updateById(tDeviceStatusInfo); tDeviceStatusMapper.updateById(tDeviceStatusInfo);
insertDeviceStatusLog(signalStatusVO, crossId, currentSignalStatus, currentFaultType, name); insertDeviceStatusLog(signalStatusVO, crossId, currentSignalStatus, currentFaultType, name);
// 信号机状态发生改变,进行告警通知
buildSignalWarnData(results, crossId, currentSignalStatus, currentFaultType, name);
} }
} else { } else {
TDeviceStatusInfo deviceStatusInfo = new TDeviceStatusInfo(); TDeviceStatusInfo deviceStatusInfo = new TDeviceStatusInfo();
...@@ -191,4 +197,40 @@ public class SignalStatusTask { ...@@ -191,4 +197,40 @@ public class SignalStatusTask {
int status = tDeviceStatusInfo.getStatus() == 2 ? 1 : tDeviceStatusInfo.getStatus(); int status = tDeviceStatusInfo.getStatus() == 2 ? 1 : tDeviceStatusInfo.getStatus();
return currentSignalStatus != status || currentFaultType != tDeviceStatusInfo.getFaultType(); return currentSignalStatus != status || currentFaultType != tDeviceStatusInfo.getFaultType();
} }
/**
* 构建告警推送数据,放入results统一推送
*
* @param results
* @param crossId
* @param currentStatus
* @param currentFaultType
* @param crossName
*/
private void buildSignalWarnData(List<CommonEventAlarmOutVo> results, String crossId, Integer currentStatus, Integer currentFaultType, String crossName) {
try {
CommonEventAlarmOutVo commonEventAlarmOutVo = new CommonEventAlarmOutVo();
commonEventAlarmOutVo.setEventType(3);
commonEventAlarmOutVo.setEventId(crossId);
commonEventAlarmOutVo.setEventName(crossName);
if (currentStatus == 0) {
commonEventAlarmOutVo.setStatus("11");
commonEventAlarmOutVo.setEventDesc(crossName.concat("信号机离线"));
} else if (currentStatus == 1) {
commonEventAlarmOutVo.setStatus(String.valueOf(0));
commonEventAlarmOutVo.setEventDesc(crossName.concat("信号机上线"));
} else {
commonEventAlarmOutVo.setStatus(String.valueOf(currentFaultType));
commonEventAlarmOutVo.setEventDesc(crossName.concat("信号机故障"));
}
LocalDateTime now = LocalDateTime.now();
String formatNow = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(now);
commonEventAlarmOutVo.setStartTime(formatNow);
String coordinate = baseCrossInfoCache.getCoordinateByCrossId(crossId);
commonEventAlarmOutVo.setCoordinate(coordinate);
results.add(commonEventAlarmOutVo);
} catch (Exception e) {
log.error("构建信号机告警数据失败", e);
}
}
} }
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