topic设备数据消息5次没有数据内容则增加告警,告警等级修改为“一般”,读到数据后自恢复

This commit is contained in:
zq
2026-01-27 17:26:11 +08:00
parent 7199677d7b
commit 9f2c303047
3 changed files with 39 additions and 5 deletions

View File

@ -85,6 +85,8 @@ public interface IEmsAlarmRecordsService
// topic 内没有数据,按照设备维度告警 // topic 内没有数据,按照设备维度告警
public void addEmptyDataAlarmRecord(String siteId, String deviceId); public void addEmptyDataAlarmRecord(String siteId, String deviceId);
public void deleteEmptyDataAlarmRecord(String siteId, String deviceId);
// 告警字段和告警信息 // 告警字段和告警信息
public void initAlarmMatchInfo(); public void initAlarmMatchInfo();

View File

@ -72,6 +72,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -91,6 +92,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)"); private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)");
// 匹配DTDC+数字格式的正则(提取序号) // 匹配DTDC+数字格式的正则(提取序号)
private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)"); private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)");
private final Map<String, Integer> topicEmptyCounts = new ConcurrentHashMap<>();
@Autowired @Autowired
private EmsBatteryClusterMapper emsBatteryClusterMapper; private EmsBatteryClusterMapper emsBatteryClusterMapper;
@ -166,12 +168,27 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp);
log.info("deviceId:" + deviceId); log.info("deviceId:" + deviceId);
String deviceNumber = siteId + deviceId;
boolean isEmpty = checkJsonDataEmpty(jsonData); boolean isEmpty = checkJsonDataEmpty(jsonData);
if (isEmpty) { if (isEmpty) {
// 添加设备告警 // 增加失败计数
iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId); int failureCount = topicEmptyCounts.getOrDefault(deviceNumber, 0) + 1;
topicEmptyCounts.put(deviceNumber, failureCount);
log.warn("设备 {} topic内没有数据当前连续次数: {}", deviceId, failureCount);
// 连续5次失败触发报警
if (failureCount >= 5) {
// 添加设备告警
iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId);
log.error("设备 {} 连续 {} 次topic内没有数据触发告警", deviceNumber, failureCount);
}
return; return;
} }
// 数据读取成功,重置计数器
topicEmptyCounts.remove(deviceNumber);
// 读取到数据后告警自恢复
iEmsAlarmRecordsService.deleteEmptyDataAlarmRecord(siteId, deviceId);
// 存放mqtt原始每个设备最晚一次数据便于后面点位获取数据 // 存放mqtt原始每个设备最晚一次数据便于后面点位获取数据
redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj); redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj);
@ -1891,12 +1908,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
boolean flag = false; boolean flag = false;
try { try {
if (StringUtils.isEmpty(jsonData)) { if (StringUtils.isEmpty(jsonData)) {
flag = true; return true;
} }
JsonNode jsonNode = objectMapper.readTree(jsonData); JsonNode jsonNode = objectMapper.readTree(jsonData);
// 判断是否为空对象({} // 判断是否为空对象({}
if (jsonNode.isObject() && jsonNode.isEmpty()) { if (jsonNode.isObject() && jsonNode.isEmpty()) {
flag = true; return true;
} }
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
throw new RuntimeException(e); throw new RuntimeException(e);

View File

@ -231,7 +231,7 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
if (emsAlarmRecords != null) { if (emsAlarmRecords != null) {
return; return;
} }
emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.EMERGENCY.getCode()); emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.GENERAL.getCode());
emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords); emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords);
// 存redis-防止重复插入-有效期一天 // 存redis-防止重复插入-有效期一天
@ -252,6 +252,21 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
return emsAlarmRecords; return emsAlarmRecords;
} }
@Override
public void deleteEmptyDataAlarmRecord(String siteId, String topicDevice) {
String key = RedisKeyConstants.TOPIC_EMPTY_ALARM_RECORD + siteId + "_" + topicDevice;
EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key);
if (emsAlarmRecords == null) {
return;
}
emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode());
emsAlarmRecords.setUpdateTime(new Date());
emsAlarmRecords.setAlarmEndTime(new Date());
emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords);
redisCache.deleteObject(key);
}
private String createRandomTicketNo() { private String createRandomTicketNo() {
String ticketNo = ""; String ticketNo = "";
String nowDate = DateUtils.dateTime(); String nowDate = DateUtils.dateTime();