diff --git a/agri-quartz/src/main/java/com/agri/quartz/task/AgriTempTask.java b/agri-quartz/src/main/java/com/agri/quartz/task/AgriTempTask.java index 65d2dcd..39e666e 100644 --- a/agri-quartz/src/main/java/com/agri/quartz/task/AgriTempTask.java +++ b/agri-quartz/src/main/java/com/agri/quartz/task/AgriTempTask.java @@ -21,12 +21,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -/** - * // 1、查询大棚所有imei - * // 2、查询所有设备最新的温湿度数据 - * // 3、判断谁不存在 - * // 4、发送不存在的告警 - */ @Component public class AgriTempTask { @@ -51,56 +45,93 @@ public class AgriTempTask { private final ObjectMapper objectMapper = new ObjectMapper(); public void checkTempStatus() { - - Boolean lockSuccess = stringRedisTemplate.opsForValue() - .setIfAbsent(LOCK_KEY, "agriTempTask", lockTtl, TimeUnit.SECONDS); - // 补充:处理Redis连接异常的情况 - if (lockSuccess == null) { - log.error("获取分布式锁失败:Redis连接异常"); - return; - } - if (!lockSuccess) { - log.debug("其他节点正在执行,跳过本次推送"); + if (!acquireLock()) { return; } try { - - // 查询大棚所有imei - List imeiList = agriInfoService.queryImeiByUserId(null); - if (imeiList.isEmpty()) { + List imeiList = queryAllGreenhouseImei(); + if (CollectionUtils.isEmpty(imeiList)) { log.info("大棚表无数据,结束推送"); return; } - // 查询所有设备最新的温湿度数据 - List> dtuDataList = dtuDataService.getLastDtuDataByImeiList(imeiList); - if (CollectionUtils.isEmpty(dtuDataList)) return; - // 判断谁不存在 - ArrayList offlineTempList = new ArrayList<>(); - for (String imei : imeiList) { - if (dtuDataList.stream().noneMatch(item -> item.get("imei").equals(imei))) { - offlineTempList.add(imei); - log.info("设备{} 不存在温湿度数据", imei); - } - } - // 不存在的告警 - for (String imei : offlineTempList) { - // todo 设备离线推送 发消息提醒 - Map alarmMsg = new HashMap<>(); - alarmMsg.put("online", "温度离线"); - alarmMsg.put("time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - alarmMsg.put("imei", imei); - String alarmMessage = objectMapper.writeValueAsString(alarmMsg); - mqttMessageSender.publish("frontend/" + imei + "/alarm", alarmMessage); - } + Map latestDataMap = queryLatestDtuData(imeiList); + List offlineDeviceList = findOfflineDevices(imeiList, latestDataMap); + pushOfflineAlarm(offlineDeviceList); } catch (Exception e) { log.error("设备在线状态推送任务异常", e); - // 可选:异常告警(如企业微信/钉钉) - // WxUtil.pushText("【设备在线状态推送异常】\n" + e.getMessage()); } finally { - // 释放锁(可选,也可依赖TTL自动过期) - stringRedisTemplate.delete(LOCK_KEY); + releaseLock(); } - - } -} + + private boolean acquireLock() { + Boolean lockSuccess = stringRedisTemplate.opsForValue() + .setIfAbsent(LOCK_KEY, "agriTempTask", lockTtl, TimeUnit.SECONDS); + if (lockSuccess == null) { + log.error("获取分布式锁失败:Redis连接异常"); + return false; + } + if (!lockSuccess) { + log.debug("其他节点正在执行,跳过本次推送"); + return false; + } + return true; + } + + private void releaseLock() { + stringRedisTemplate.delete(LOCK_KEY); + } + + private List queryAllGreenhouseImei() { + return agriInfoService.queryImeiByUserId(null); + } + + private Map queryLatestDtuData(List imeiList) { + List> dtuDataList = dtuDataService.getLastDtuDataByImeiList(imeiList); + Map dataMap = new HashMap<>(); + if (CollectionUtils.isEmpty(dtuDataList)) { + return dataMap; + } + for (Map item : dtuDataList) { + Object imei = item.get("imei"); + if (imei != null) { + dataMap.put(imei.toString(), item); + } + } + return dataMap; + } + + private List findOfflineDevices(List imeiList, Map latestDataMap) { + List offlineList = new ArrayList<>(); + for (String imei : imeiList) { + if (!latestDataMap.containsKey(imei)) { + offlineList.add(imei); + log.info("设备{} 不存在温湿度数据", imei); + } + } + return offlineList; + } + + private void pushOfflineAlarm(List offlineDeviceList) { + if (CollectionUtils.isEmpty(offlineDeviceList)) { + return; + } + String timeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + for (String imei : offlineDeviceList) { + sendAlarmMessage(imei, timeStr); + } + } + + private void sendAlarmMessage(String imei, String timeStr) { + try { + Map alarmMsg = new HashMap<>(); + alarmMsg.put("online", "温度离线"); + alarmMsg.put("time", timeStr); + alarmMsg.put("imei", imei); + String alarmMessage = objectMapper.writeValueAsString(alarmMsg); + mqttMessageSender.publish("frontend/" + imei + "/alarm", alarmMessage); + } catch (Exception e) { + log.error("发送设备离线告警失败, imei={}", imei, e); + } + } +} \ No newline at end of file