|
@@ -36,6 +36,10 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
public void pushAlarmMessage(SensorAlarm alarm) {
|
|
|
String deviceID = alarm.getDeviceId();
|
|
|
String alarmType = alarm.getAlarmType();
|
|
|
+ if (alarm.getType().equals("0") || alarm.getType().equals("1")) {
|
|
|
+// 将第一次预警时间存入redis
|
|
|
+ recordAlarmTime(deviceID, alarm.getSensorRoute(), alarm.getType());
|
|
|
+ }
|
|
|
Map<String, SensorAlarmUser> users = Optional.ofNullable(alarm.getAlarmUsers()).orElse(Collections.emptyList()) // 如果为 null 则返回空集合
|
|
|
.stream().filter(Objects::nonNull) // 过滤掉 null 的用户
|
|
|
.filter(user -> StrUtil.isNotBlank(user.getOpenId())) // 过滤掉 openId 为空的用户
|
|
@@ -49,17 +53,19 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
List<SensorAlarmUser> alarmUsers = users.values().stream().toList();
|
|
|
for (String openid : users.keySet()) {
|
|
|
SensorAlarmUser user = users.get(openid);
|
|
|
- if (hasExceededPushLimit(openid, deviceID,alarm.getSensorRoute(), alarmType)) {
|
|
|
+ if (hasExceededPushLimit(openid, deviceID, alarm.getSensorRoute(), alarmType)) {
|
|
|
log.info("用户 {} 对设备 {} 的告警类型 {} \n在过去{}分钟内推送次数超过限制,跳过推送", openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
|
|
|
continue;
|
|
|
}
|
|
|
// 只对当前人发送预警消息
|
|
|
alarm.setAlarmUsers(List.of(user));
|
|
|
+ recordPushTime(openid, deviceID, alarm.getSensorRoute(), alarmType);
|
|
|
for (NotificationChannel channel : alarm.getNotificationChannel()) {
|
|
|
MessagePushService pushService = pushServices.get(channel.name());
|
|
|
if (pushService != null) {
|
|
|
try {
|
|
|
boolean b = false;
|
|
|
+ Long firstAlarmTime;
|
|
|
switch (alarm.getType()) {
|
|
|
case "0":
|
|
|
b = pushService.sendAlarmMessage(alarm);
|
|
@@ -68,10 +74,18 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
b = pushService.sendOfflineMessage(alarm);
|
|
|
break;
|
|
|
case "2":
|
|
|
- b = pushService.sendAlarmRecoverMessage(alarm);
|
|
|
+ firstAlarmTime = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), "0");
|
|
|
+ b = pushService.sendAlarmRecoverMessage(alarm, firstAlarmTime);
|
|
|
+ if (b) {
|
|
|
+ delAlarmTime(deviceID, alarm.getSensorRoute(), "0");
|
|
|
+ }
|
|
|
break;
|
|
|
case "4":
|
|
|
- b = pushService.sendOnlineMessage(alarm);
|
|
|
+ firstAlarmTime = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), "1");
|
|
|
+ b = pushService.sendOnlineMessage(alarm, firstAlarmTime);
|
|
|
+ if (b) {
|
|
|
+ delAlarmTime(deviceID, alarm.getSensorRoute(), "1");
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
alarm.setNotified(b);
|
|
@@ -82,14 +96,35 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
log.warn("不支持的通知渠道: {}", channel.getChannelName());
|
|
|
}
|
|
|
}
|
|
|
- recordPushTime(openid, deviceID,alarm.getSensorRoute(), alarmType);
|
|
|
}
|
|
|
// 还原这条消息的发送所有人
|
|
|
alarm.setAlarmUsers(alarmUsers);
|
|
|
saveAlarmToDatabase(alarm);
|
|
|
}
|
|
|
|
|
|
- public boolean hasExceededPushLimit(String openid, String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
+ // 获取设备第一次报警时间
|
|
|
+ private Object getAlarmTime(String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
+ String key = generateAlarmHistoryKey(deviceID, sensorRoute, alarmType);
|
|
|
+ return redisTemplate.opsForList().index(key, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除设备第一次报警时间
|
|
|
+ private void delAlarmTime(String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
+ String key = generateAlarmHistoryKey(deviceID, sensorRoute, alarmType);
|
|
|
+ redisTemplate.delete(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 存储设备第一次报警时间
|
|
|
+ public void recordAlarmTime(String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
+ String alarmKey = generateAlarmHistoryKey(deviceID, sensorRoute, alarmType);
|
|
|
+ List<Object> pushTimes = redisTemplate.opsForList().range(alarmKey, 0, -1);
|
|
|
+ // 判断是否有报警数据
|
|
|
+ if (pushTimes.isEmpty()) {
|
|
|
+ redisTemplate.opsForList().rightPush(alarmKey, System.currentTimeMillis());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean hasExceededPushLimit(String openid, String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
String key = generatePushHistoryKey(openid, deviceID, sensorRoute, alarmType);
|
|
|
List<Object> pushTimes = redisTemplate.opsForList().range(key, 0, -1);
|
|
|
if (pushTimes == null || pushTimes.isEmpty()) {
|
|
@@ -100,7 +135,7 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
return pushTimes.size() >= JfcloudColdChainConstants.MESS_PUSH_MAX_PUSH_COUNT;
|
|
|
}
|
|
|
|
|
|
- public boolean hasExceededPushLimitLike(String openid, String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
+ public boolean hasExceededPushLimitLike(String openid, String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
String key = generatePushHistoryKey(openid, deviceID, sensorRoute, alarmType);
|
|
|
Set<String> keys = redisTemplate.keys(key);
|
|
|
if (keys == null || keys.isEmpty()) {
|
|
@@ -119,6 +154,7 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
}
|
|
|
|
|
|
private void recordPushTime(String openid, String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
+ log.info("数据存入redis数据库……");
|
|
|
String key = generatePushHistoryKey(openid, deviceID, sensorRoute, alarmType);
|
|
|
long currentTime = System.currentTimeMillis();
|
|
|
redisTemplate.opsForList().rightPush(key, currentTime);
|
|
@@ -137,4 +173,9 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
return JfcloudColdChainConstants.REDIS_PUSH_HISTORY_KEY_PREFIX
|
|
|
+ ":" + openid + ":" + deviceID + ":" + sensorRoute + ":" + alarmType;
|
|
|
}
|
|
|
+
|
|
|
+ private String generateAlarmHistoryKey(String deviceID, Integer sensorRoute, String alarmType) {
|
|
|
+ return JfcloudColdChainConstants.REDIS_ALARM_HISTORY_KEY_PREFIX
|
|
|
+ + ":" + deviceID + ":" + sensorRoute + ":" + alarmType;
|
|
|
+ }
|
|
|
}
|