获取所有设备最新的温湿度数据
parent
c35551698c
commit
ad656d8cc3
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue