topic设备数据消息5次没有数据内容则增加告警,告警等级修改为“一般”,读到数据后自恢复
This commit is contained in:
@ -85,6 +85,8 @@ public interface IEmsAlarmRecordsService
|
||||
// topic 内没有数据,按照设备维度告警
|
||||
public void addEmptyDataAlarmRecord(String siteId, String deviceId);
|
||||
|
||||
public void deleteEmptyDataAlarmRecord(String siteId, String deviceId);
|
||||
|
||||
// 告警字段和告警信息
|
||||
public void initAlarmMatchInfo();
|
||||
|
||||
|
||||
@ -72,6 +72,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Matcher;
|
||||
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)");
|
||||
// 匹配DTDC+数字格式的正则(提取序号)
|
||||
private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)");
|
||||
private final Map<String, Integer> topicEmptyCounts = new ConcurrentHashMap<>();
|
||||
|
||||
@Autowired
|
||||
private EmsBatteryClusterMapper emsBatteryClusterMapper;
|
||||
@ -166,12 +168,27 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
||||
Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp);
|
||||
|
||||
log.info("deviceId:" + deviceId);
|
||||
String deviceNumber = siteId + deviceId;
|
||||
boolean isEmpty = checkJsonDataEmpty(jsonData);
|
||||
if (isEmpty) {
|
||||
// 增加失败计数
|
||||
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;
|
||||
}
|
||||
// 数据读取成功,重置计数器
|
||||
topicEmptyCounts.remove(deviceNumber);
|
||||
// 读取到数据后告警自恢复
|
||||
iEmsAlarmRecordsService.deleteEmptyDataAlarmRecord(siteId, deviceId);
|
||||
|
||||
// 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据
|
||||
redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj);
|
||||
@ -1891,12 +1908,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
||||
boolean flag = false;
|
||||
try {
|
||||
if (StringUtils.isEmpty(jsonData)) {
|
||||
flag = true;
|
||||
return true;
|
||||
}
|
||||
JsonNode jsonNode = objectMapper.readTree(jsonData);
|
||||
// 判断是否为空对象({})
|
||||
if (jsonNode.isObject() && jsonNode.isEmpty()) {
|
||||
flag = true;
|
||||
return true;
|
||||
}
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException(e);
|
||||
|
||||
@ -231,7 +231,7 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
|
||||
if (emsAlarmRecords != null) {
|
||||
return;
|
||||
}
|
||||
emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.EMERGENCY.getCode());
|
||||
emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.GENERAL.getCode());
|
||||
emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords);
|
||||
|
||||
// 存redis-防止重复插入-有效期一天
|
||||
@ -252,6 +252,21 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
|
||||
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() {
|
||||
String ticketNo = "";
|
||||
String nowDate = DateUtils.dateTime();
|
||||
|
||||
Reference in New Issue
Block a user