获取所有设备最新的温湿度数据

master
lld 2026-03-31 17:05:32 +08:00
parent c35551698c
commit ad656d8cc3
1 changed files with 79 additions and 48 deletions

View File

@ -21,12 +21,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/**
* // 1、查询大棚所有imei
* // 2、查询所有设备最新的温湿度数据
* // 3、判断谁不存在
* // 4、发送不存在的告警
*/
@Component @Component
public class AgriTempTask { public class AgriTempTask {
@ -51,56 +45,93 @@ public class AgriTempTask {
private final ObjectMapper objectMapper = new ObjectMapper(); private final ObjectMapper objectMapper = new ObjectMapper();
public void checkTempStatus() { public void checkTempStatus() {
if (!acquireLock()) {
Boolean lockSuccess = stringRedisTemplate.opsForValue()
.setIfAbsent(LOCK_KEY, "agriTempTask", lockTtl, TimeUnit.SECONDS);
// 补充处理Redis连接异常的情况
if (lockSuccess == null) {
log.error("获取分布式锁失败Redis连接异常");
return;
}
if (!lockSuccess) {
log.debug("其他节点正在执行,跳过本次推送");
return; return;
} }
try { try {
List<String> imeiList = queryAllGreenhouseImei();
// 查询大棚所有imei if (CollectionUtils.isEmpty(imeiList)) {
List<String> imeiList = agriInfoService.queryImeiByUserId(null);
if (imeiList.isEmpty()) {
log.info("大棚表无数据,结束推送"); log.info("大棚表无数据,结束推送");
return; return;
} }
// 查询所有设备最新的温湿度数据 Map<String, Object> latestDataMap = queryLatestDtuData(imeiList);
List<Map<String, Object>> dtuDataList = dtuDataService.getLastDtuDataByImeiList(imeiList); List<String> offlineDeviceList = findOfflineDevices(imeiList, latestDataMap);
if (CollectionUtils.isEmpty(dtuDataList)) return; pushOfflineAlarm(offlineDeviceList);
// 判断谁不存在
ArrayList<String> 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<String, Object> 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);
}
} catch (Exception e) { } catch (Exception e) {
log.error("设备在线状态推送任务异常", e); log.error("设备在线状态推送任务异常", e);
// 可选:异常告警(如企业微信/钉钉)
// WxUtil.pushText("【设备在线状态推送异常】\n" + e.getMessage());
} finally { } finally {
// 释放锁可选也可依赖TTL自动过期 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); stringRedisTemplate.delete(LOCK_KEY);
} }
private List<String> queryAllGreenhouseImei() {
return agriInfoService.queryImeiByUserId(null);
}
private Map<String, Object> queryLatestDtuData(List<String> imeiList) {
List<Map<String, Object>> dtuDataList = dtuDataService.getLastDtuDataByImeiList(imeiList);
Map<String, Object> dataMap = new HashMap<>();
if (CollectionUtils.isEmpty(dtuDataList)) {
return dataMap;
}
for (Map<String, Object> item : dtuDataList) {
Object imei = item.get("imei");
if (imei != null) {
dataMap.put(imei.toString(), item);
}
}
return dataMap;
}
private List<String> findOfflineDevices(List<String> imeiList, Map<String, Object> latestDataMap) {
List<String> offlineList = new ArrayList<>();
for (String imei : imeiList) {
if (!latestDataMap.containsKey(imei)) {
offlineList.add(imei);
log.info("设备{} 不存在温湿度数据", imei);
}
}
return offlineList;
}
private void pushOfflineAlarm(List<String> 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<String, Object> 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);
}
} }
} }