|
@@ -59,8 +59,14 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
List<SensorAlarmUser> alarmUsers = new ArrayList<>(users.values().stream().toList());
|
|
List<SensorAlarmUser> alarmUsers = new ArrayList<>(users.values().stream().toList());
|
|
|
- for (String openid : users.keySet()) {
|
|
|
|
|
- SensorAlarmUser user = users.get(openid);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ List<String> openIdList = alarmUsers.stream().map(SensorAlarmUser::getOpenId)
|
|
|
|
|
+ .filter(openId -> openId != null && !openId.trim().isEmpty()) // 过滤空值
|
|
|
|
|
+ .distinct() // 去重
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ for (String openId : users.keySet()) {
|
|
|
|
|
+
|
|
|
|
|
+ SensorAlarmUser user = users.get(openId);
|
|
|
// ✅ 1️⃣ 首先判断该设备或该路是否处于预警延期(禁用)状态
|
|
// ✅ 1️⃣ 首先判断该设备或该路是否处于预警延期(禁用)状态
|
|
|
if (deviceAlertDelayService.isAlertDelayed(deviceID, alarm.getSensorRoute()).getDelay()) {
|
|
if (deviceAlertDelayService.isAlertDelayed(deviceID, alarm.getSensorRoute()).getDelay()) {
|
|
|
log.info("设备 {} 第 {} 路处于延期预警状态(单路禁用),跳过推送", deviceID, alarm.getSensorRoute());
|
|
log.info("设备 {} 第 {} 路处于延期预警状态(单路禁用),跳过推送", deviceID, alarm.getSensorRoute());
|
|
@@ -70,15 +76,21 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
// ✅ 2️⃣ 再判断该用户是否超出推送频率限制
|
|
// ✅ 2️⃣ 再判断该用户是否超出推送频率限制
|
|
|
- if (hasExceededPushLimit(openid, deviceID, alarm.getSensorRoute(), alarmType)) {
|
|
|
|
|
|
|
+ if (hasExceededPushLimit(openId, deviceID, alarm.getSensorRoute(), alarmType)) {
|
|
|
log.info("用户 {} 对设备 {} 的告警类型 {} 在过去 {} 分钟内推送次数超过限制,跳过推送",
|
|
log.info("用户 {} 对设备 {} 的告警类型 {} 在过去 {} 分钟内推送次数超过限制,跳过推送",
|
|
|
- openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
|
|
|
|
|
|
|
+ openId, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
|
|
|
delAlarmTime(deviceID, alarm.getSensorRoute(), alarmType);
|
|
delAlarmTime(deviceID, alarm.getSensorRoute(), alarmType);
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 对每个用户进行判断,是否超过总体最大推送次数
|
|
|
|
|
+ if (hasExceededPushRegionLimit(openId, alarm.getSensorCode(), alarm.getSensorRoute(), alarm.getType())) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 只对当前人发送预警消息
|
|
// 只对当前人发送预警消息
|
|
|
alarm.setAlarmUsers(List.of(user));
|
|
alarm.setAlarmUsers(List.of(user));
|
|
|
- recordPushTime(openid, deviceID, alarm.getSensorRoute(), alarmType);
|
|
|
|
|
|
|
+ recordPushTime(openId, deviceID, alarm.getSensorRoute(), alarmType);
|
|
|
log.info("{}拥有的通知渠道:{}", alarm.getSensorCode(), alarm.getNotificationChannel());
|
|
log.info("{}拥有的通知渠道:{}", alarm.getSensorCode(), alarm.getNotificationChannel());
|
|
|
for (NotificationChannel channel : alarm.getNotificationChannel()) {
|
|
for (NotificationChannel channel : alarm.getNotificationChannel()) {
|
|
|
MessagePushService pushService = pushServices.get(channel.name());
|
|
MessagePushService pushService = pushServices.get(channel.name());
|
|
@@ -86,12 +98,6 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
try {
|
|
try {
|
|
|
boolean b = false;
|
|
boolean b = false;
|
|
|
Long firstAlarmTime;
|
|
Long firstAlarmTime;
|
|
|
- for (SensorAlarmUser alarmUser : alarmUsers) {
|
|
|
|
|
- // 获取redis中记录的告警次数
|
|
|
|
|
- if (hasExceededPushRegionLimit(alarmUser.getOpenId(), alarm.getSensorCode(), alarm.getSensorRoute(), alarm.getType())) {
|
|
|
|
|
- alarmUsers.remove(alarmUser);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
switch (alarm.getType()) {
|
|
switch (alarm.getType()) {
|
|
|
case "0":
|
|
case "0":
|
|
|
log.info("发送设备 {} 第 {} 路 {} 告警消息", deviceID, alarm.getSensorRoute(), alarm.getAlarmType());
|
|
log.info("发送设备 {} 第 {} 路 {} 告警消息", deviceID, alarm.getSensorRoute(), alarm.getAlarmType());
|
|
@@ -190,7 +196,7 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
* @param alarmType 告警类型(0:数据异常, 1:设备离线, 2:恢复通知, 4:其他类型)
|
|
* @param alarmType 告警类型(0:数据异常, 1:设备离线, 2:恢复通知, 4:其他类型)
|
|
|
* @return true-超过限制, false-未超过限制
|
|
* @return true-超过限制, false-未超过限制
|
|
|
*/
|
|
*/
|
|
|
- public boolean hasExceededPushRegionLimit(String openid, String sensorCode, Integer sensorRoute, String alarmType) {
|
|
|
|
|
|
|
+ public boolean hasExceededPushRegionLimit(String openId, String sensorCode, Integer sensorRoute, String alarmType) {
|
|
|
// 获取监控目标区域的配置信息
|
|
// 获取监控目标区域的配置信息
|
|
|
MonitorTargetRegion monitorTargetRegion = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(sensorCode, sensorRoute);
|
|
MonitorTargetRegion monitorTargetRegion = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(sensorCode, sensorRoute);
|
|
|
if (monitorTargetRegion == null) {
|
|
if (monitorTargetRegion == null) {
|
|
@@ -199,7 +205,7 @@ public class RedisSensorAlarmMessagePushService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 生成Redis存储的键
|
|
// 生成Redis存储的键
|
|
|
- String key = generatePushHistoryCountKey(openid, sensorCode, sensorRoute, alarmType);
|
|
|
|
|
|
|
+ String key = generatePushHistoryCountKey(openId, sensorCode, sensorRoute, alarmType);
|
|
|
|
|
|
|
|
// 从Redis获取推送历史计数
|
|
// 从Redis获取推送历史计数
|
|
|
Object countObj = redisTemplate.opsForValue().get(key);
|
|
Object countObj = redisTemplate.opsForValue().get(key);
|