fix: 逻辑修复完善。
This commit is contained in:
@@ -115,12 +115,14 @@ public class DeviceDataHandler {
|
|||||||
private static final int WARN_TYPE_DISSOLVED_OXYGEN = 2; // 溶解氧
|
private static final int WARN_TYPE_DISSOLVED_OXYGEN = 2; // 溶解氧
|
||||||
private static final int WARN_TYPE_TEMPERATURE = 2; // 温度
|
private static final int WARN_TYPE_TEMPERATURE = 2; // 温度
|
||||||
private static final int WARN_TYPE_BATTERY = 2; // 电池电量
|
private static final int WARN_TYPE_BATTERY = 2; // 电池电量
|
||||||
|
private static final int WARN_TYPE_OFFLINE = 5; // 设备离线
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 告警类型名称
|
* 告警类型名称
|
||||||
*/
|
*/
|
||||||
private static final String ALARM_TYPE_DISSOLVED_OXYGEN = "溶解氧";
|
private static final String ALARM_TYPE_DISSOLVED_OXYGEN = "溶解氧";
|
||||||
private static final String ALARM_TYPE_TEMPERATURE = "温度";
|
private static final String ALARM_TYPE_TEMPERATURE_HIGH = "温度过高";
|
||||||
|
private static final String ALARM_TYPE_TEMPERATURE_LOW = "温度过低";
|
||||||
private static final String ALARM_TYPE_BATTERY = "电池电量";
|
private static final String ALARM_TYPE_BATTERY = "电池电量";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -380,7 +382,7 @@ public class DeviceDataHandler {
|
|||||||
alarmMessage.append(message).append("; ");
|
alarmMessage.append(message).append("; ");
|
||||||
|
|
||||||
warnList.add(createMessageWarn(deviceId, userId, pondName,
|
warnList.add(createMessageWarn(deviceId, userId, pondName,
|
||||||
ALARM_TYPE_TEMPERATURE, WARN_TYPE_TEMPERATURE, message));
|
ALARM_TYPE_TEMPERATURE_LOW, WARN_TYPE_TEMPERATURE, message));
|
||||||
hasAlarm = true;
|
hasAlarm = true;
|
||||||
} else if (tempWarnUpper != null && temperature > tempWarnUpper) {
|
} else if (tempWarnUpper != null && temperature > tempWarnUpper) {
|
||||||
String message = String.format("水温过高: %.2f °C (最高: %.2f)",
|
String message = String.format("水温过高: %.2f °C (最高: %.2f)",
|
||||||
@@ -388,7 +390,7 @@ public class DeviceDataHandler {
|
|||||||
alarmMessage.append(message).append("; ");
|
alarmMessage.append(message).append("; ");
|
||||||
|
|
||||||
warnList.add(createMessageWarn(deviceId, userId, pondName,
|
warnList.add(createMessageWarn(deviceId, userId, pondName,
|
||||||
ALARM_TYPE_TEMPERATURE, WARN_TYPE_TEMPERATURE, message));
|
ALARM_TYPE_TEMPERATURE_HIGH, WARN_TYPE_TEMPERATURE, message));
|
||||||
hasAlarm = true;
|
hasAlarm = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -588,6 +590,96 @@ public class DeviceDataHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理设备离线告警
|
||||||
|
* 当设备离线时,查询设备信息并发送语音通知
|
||||||
|
*
|
||||||
|
* @param deviceName 设备名称(serialNum)
|
||||||
|
*/
|
||||||
|
public void handleDeviceOffline(String deviceName) {
|
||||||
|
try {
|
||||||
|
Device device = deviceMapper.selectOne(
|
||||||
|
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<Device>()
|
||||||
|
.eq(Device::getSerialNum, deviceName)
|
||||||
|
.last("LIMIT 1")
|
||||||
|
);
|
||||||
|
|
||||||
|
if (device == null) {
|
||||||
|
log.debug("[离线告警] 设备不存在,跳过: {}", deviceName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long deviceId = device.getId();
|
||||||
|
Long userId = device.getUserId();
|
||||||
|
|
||||||
|
if (userId == null) {
|
||||||
|
log.debug("[离线告警] 设备未绑定用户,跳过: {}", deviceName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询手机号
|
||||||
|
AquUser aquUser = aquUserMapper.selectById(userId);
|
||||||
|
if (aquUser == null || StrUtil.isBlank(aquUser.getMobilePhone())) {
|
||||||
|
log.warn("[离线告警] 用户手机号不存在,跳过: {}", deviceName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String mobilePhone = aquUser.getMobilePhone();
|
||||||
|
|
||||||
|
// 检查告警间隔(防止频繁通知)
|
||||||
|
LocalDateTime intervalTime = LocalDateTime.now().minusMinutes(ALARM_NOTIFICATION_INTERVAL);
|
||||||
|
long recentCount = warnCallNoticeMapper.selectCount(
|
||||||
|
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<AquWarnCallNotice>()
|
||||||
|
.eq(AquWarnCallNotice::getDeviceId, deviceId)
|
||||||
|
.ge(AquWarnCallNotice::getCallTime, intervalTime)
|
||||||
|
);
|
||||||
|
if (recentCount > 0) {
|
||||||
|
log.debug("[离线告警] {}分钟内已通知,跳过: {}", ALARM_NOTIFICATION_INTERVAL, deviceName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询塘口名称
|
||||||
|
String pondName = deviceName;
|
||||||
|
if (device.getPondId() != null) {
|
||||||
|
Pond pond = pondMapper.selectById(device.getPondId());
|
||||||
|
if (pond != null) {
|
||||||
|
pondName = pond.getPondName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入告警消息
|
||||||
|
String warnMsg = "设备离线";
|
||||||
|
MessageWarn warn = createMessageWarn(deviceId, userId, pondName,
|
||||||
|
"设备离线", WARN_TYPE_OFFLINE, warnMsg);
|
||||||
|
messageWarnMapper.insert(warn);
|
||||||
|
|
||||||
|
// 创建通知记录
|
||||||
|
AquWarnCallNotice callNotice = new AquWarnCallNotice();
|
||||||
|
callNotice.setUserId(userId);
|
||||||
|
callNotice.setMobilePhone(mobilePhone);
|
||||||
|
callNotice.setDeviceId(deviceId);
|
||||||
|
callNotice.setPondName(pondName);
|
||||||
|
callNotice.setCallTime(LocalDateTime.now());
|
||||||
|
callNotice.setCallStatus(CALL_STATUS_NO_CALL);
|
||||||
|
warnCallNoticeMapper.insert(callNotice);
|
||||||
|
|
||||||
|
// 保存关联记录
|
||||||
|
if (warn.getId() != null) {
|
||||||
|
AquMapMessageWarnCallNotice mapRecord = new AquMapMessageWarnCallNotice();
|
||||||
|
mapRecord.setMessageWarnId(warn.getId());
|
||||||
|
mapRecord.setCallNoticeId(callNotice.getId());
|
||||||
|
mapMessageWarnCallNoticeMapper.insert(mapRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送语音通知
|
||||||
|
sendVoiceNotification(callNotice, device.getDeviceName() != null ? device.getDeviceName() : deviceName, warnMsg);
|
||||||
|
|
||||||
|
log.info("[离线告警] 已触发通知 - 设备: {}, 手机: {}", deviceName, mobilePhone);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("[离线告警] 处理失败: {}", e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 触发设备故障告警
|
* 触发设备故障告警
|
||||||
* 针对设备事件(error)的紧急告警
|
* 针对设备事件(error)的紧急告警
|
||||||
|
|||||||
@@ -244,7 +244,9 @@ public class AmqpMessageHandlerImpl implements AmqpMessageHandler {
|
|||||||
|
|
||||||
log.debug("设备状态: {} - {}", deviceName, status);
|
log.debug("设备状态: {} - {}", deviceName, status);
|
||||||
|
|
||||||
// TODO: 更新设备状态
|
if ("offline".equals(status) && deviceDataHandler != null && deviceName != null) {
|
||||||
|
deviceDataHandler.handleDeviceOffline(deviceName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -253,11 +255,16 @@ public class AmqpMessageHandlerImpl implements AmqpMessageHandler {
|
|||||||
private void handleLifeCycleMessage(JSONObject json) {
|
private void handleLifeCycleMessage(JSONObject json) {
|
||||||
String deviceName = json.getStr("deviceName");
|
String deviceName = json.getStr("deviceName");
|
||||||
String action = json.getStr("action");
|
String action = json.getStr("action");
|
||||||
|
// 先尝试 status 字段(部分消息格式用 status 而非 action)
|
||||||
|
if (action == null) {
|
||||||
|
action = json.getStr("status");
|
||||||
|
}
|
||||||
|
|
||||||
log.debug("设备{}: {}", "online".equals(action) ? "上线" : "下线", deviceName);
|
log.debug("设备{}: {}", "online".equals(action) ? "上线" : "下线", deviceName);
|
||||||
|
|
||||||
// action: "online" 或 "offline"
|
if ("offline".equals(action) && deviceDataHandler != null && deviceName != null) {
|
||||||
// TODO: 更新设备在线状态
|
deviceDataHandler.handleDeviceOffline(deviceName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user