fix: 控制器没有塘口时,也能打电话产生报警。

This commit is contained in:
tianyongbao
2026-06-06 09:21:51 +08:00
parent fcd5bcd032
commit f02bee1c8d
5 changed files with 436 additions and 238 deletions

View File

@@ -1535,18 +1535,7 @@ public class DeviceDataHandler {
return;
}
if (device.getPondId() == null) {
log.debug("[设备故障] 设备未绑定塘口,跳过: {}", deviceName);
return;
}
Pond pond = pondMapper.selectById(device.getPondId());
if (pond == null) {
log.debug("[设备故障] 塘口不存在,跳过: {}", deviceName);
return;
}
String pondName = pond.getPondName();
String pondName = getPondName(device.getPondId());
String displayName = device.getDeviceName() != null ? device.getDeviceName() : deviceName;
// 解析事件参数获取故障码
@@ -1557,8 +1546,8 @@ public class DeviceDataHandler {
errorDesc = "设备故障(code=" + errorCode + ")";
}
String warnMsg = String.format("%s塘口中%s(%s)发生故障:%s",
pondName, displayName, deviceName, errorDesc);
String warnMsg = formatPondWarnMessage(pondName,
String.format("%s(%s)发生故障:%s", displayName, deviceName, errorDesc));
log.error("[设备故障] 设备: {}, 故障信息: {}", deviceName, warnMsg);
// 获取告警手机号
@@ -1728,23 +1717,18 @@ public class DeviceDataHandler {
}
// 查询塘口(如果设备在塘口中)
String pondName = null;
if (device.getPondId() != null) {
Pond pond = pondMapper.selectById(device.getPondId());
if (pond != null) {
pondName = pond.getPondName();
}
}
String pondName = getPondName(device.getPondId());
String displayName = device.getDeviceName() != null ? device.getDeviceName() : device.getSerialNum();
// 设备在塘口中且非山机才触发告警
// 非离线状态才触发告警;未绑定塘口时仍告警,告警内容不带塘口前缀
boolean isOffline = device.getWarnCode() != null
&& (device.getWarnCode() & DefineDeviceWarnCode.DeviceOffline) != 0;
boolean warnTrigger = !isOffline && pondName != null;
boolean warnTrigger = !isOffline;
// 根据故障码范围分类生成告警内容
String title = null;
String message = null;
String messagePondName = pondName;
int switchIndex = 0;
// 告警类型:默认为控制器告警(3),开关相关故障使用开关告警(4)
int warnType = WARN_TYPE_CONTROLLER;
@@ -1758,8 +1742,8 @@ public class DeviceDataHandler {
}
if (warnTrigger) {
title = "控制器输入缺相";
message = String.format("%s塘口中%s(%s)输入缺%s相",
pondName, displayName, device.getSerialNum(), phaseName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)输入缺%s相", displayName, device.getSerialNum(), phaseName));
}
} else if (errorCode >= DefineDeviceErrorCode.Three_PhaseA_OverVoltage
&& errorCode <= DefineDeviceErrorCode.Three_PhaseC_UnderVoltage) {
@@ -1769,8 +1753,9 @@ public class DeviceDataHandler {
String phaseName = DefineDeviceErrorCode.getPhaseName(phaseIndex);
if (warnTrigger) {
title = isOver ? "控制器输入过压" : "控制器输入欠压";
message = String.format("%s塘口中%s(%s)%s相%s",
pondName, displayName, device.getSerialNum(), phaseName, isOver ? "过压" : "欠压");
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)%s相%s",
displayName, device.getSerialNum(), phaseName, isOver ? "过压" : "欠压"));
}
} else if (errorCode >= DefineDeviceErrorCode.Three_Switch1LosePhaseA
&& errorCode <= DefineDeviceErrorCode.Three_Switch4LosePhaseC) {
@@ -1785,10 +1770,12 @@ public class DeviceDataHandler {
if (warnTrigger) {
String swPondName = (sw != null && sw.getPondId() != null)
? getPondName(sw.getPondId()) : pondName;
messagePondName = swPondName;
String swName = sw != null && sw.getSwitchName() != null ? sw.getSwitchName() : ("开关" + switchIndex);
title = "控制器开关输出缺相";
message = String.format("%s塘口中%s(%s)的开关%d(%s)输出缺%s相",
swPondName, displayName, device.getSerialNum(), switchIndex, swName, phaseName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)的开关%d(%s)输出缺%s相",
displayName, device.getSerialNum(), switchIndex, swName, phaseName));
}
} else if (errorCode >= DefineDeviceErrorCode.Three_Switch1OverElectricA
&& errorCode <= DefineDeviceErrorCode.Three_Switch4OverElectricC) {
@@ -1802,10 +1789,12 @@ public class DeviceDataHandler {
warnTrigger = warnTrigger && electricWarnOpen;
if (warnTrigger) {
String swPondName = (sw.getPondId() != null) ? getPondName(sw.getPondId()) : pondName;
messagePondName = swPondName;
String swName = sw.getSwitchName() != null ? sw.getSwitchName() : ("开关" + switchIndex);
title = "控制器开关输出过流";
message = String.format("%s塘口中%s(%s)的开关%d(%s)输出%s相过流",
swPondName, displayName, device.getSerialNum(), switchIndex, swName, phaseName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)的开关%d(%s)输出%s相过流",
displayName, device.getSerialNum(), switchIndex, swName, phaseName));
}
} else if (errorCode >= DefineDeviceErrorCode.Three_Switch1UnderElectricA
&& errorCode <= DefineDeviceErrorCode.Three_Switch4UnderElectricC) {
@@ -1819,10 +1808,12 @@ public class DeviceDataHandler {
warnTrigger = warnTrigger && electricWarnOpen;
if (warnTrigger) {
String swPondName = (sw.getPondId() != null) ? getPondName(sw.getPondId()) : pondName;
messagePondName = swPondName;
String swName = sw.getSwitchName() != null ? sw.getSwitchName() : ("开关" + switchIndex);
title = "控制器开关输出欠流";
message = String.format("%s塘口中%s(%s)的开关%d(%s)输出%s相欠流",
swPondName, displayName, device.getSerialNum(), switchIndex, swName, phaseName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)的开关%d(%s)输出%s相欠流",
displayName, device.getSerialNum(), switchIndex, swName, phaseName));
}
} else if (errorCode >= DefineDeviceErrorCode.Three_Switch1ElectricEmpty
&& errorCode <= DefineDeviceErrorCode.Three_Switch4ElectricEmpty) {
@@ -1834,10 +1825,12 @@ public class DeviceDataHandler {
warnTrigger = warnTrigger && electricWarnOpen;
if (warnTrigger) {
String swPondName = (sw.getPondId() != null) ? getPondName(sw.getPondId()) : pondName;
messagePondName = swPondName;
String swName = sw.getSwitchName() != null ? sw.getSwitchName() : ("开关" + switchIndex);
title = "控制器开关输出空载";
message = String.format("%s塘口中%s(%s)的开关%d(%s)输出空载",
swPondName, displayName, device.getSerialNum(), switchIndex, swName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)的开关%d(%s)输出空载",
displayName, device.getSerialNum(), switchIndex, swName));
}
} else if (errorCode >= DefineDeviceErrorCode.One_Switch1OverElectric
&& errorCode <= DefineDeviceErrorCode.One_Switch4OverElectric) {
@@ -1849,10 +1842,12 @@ public class DeviceDataHandler {
warnTrigger = warnTrigger && electricWarnOpen;
if (warnTrigger) {
String swPondName = (sw.getPondId() != null) ? getPondName(sw.getPondId()) : pondName;
messagePondName = swPondName;
String swName = sw.getSwitchName() != null ? sw.getSwitchName() : ("开关" + switchIndex);
title = "控制器开关输出过流";
message = String.format("%s塘口中%s(%s)的开关%d(%s)输出过流",
swPondName, displayName, device.getSerialNum(), switchIndex, swName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)的开关%d(%s)输出过流",
displayName, device.getSerialNum(), switchIndex, swName));
}
} else if (errorCode >= DefineDeviceErrorCode.One_Switch1UnderElectric
&& errorCode <= DefineDeviceErrorCode.One_Switch4UnderElectric) {
@@ -1864,10 +1859,12 @@ public class DeviceDataHandler {
warnTrigger = warnTrigger && electricWarnOpen;
if (warnTrigger) {
String swPondName = (sw.getPondId() != null) ? getPondName(sw.getPondId()) : pondName;
messagePondName = swPondName;
String swName = sw.getSwitchName() != null ? sw.getSwitchName() : ("开关" + switchIndex);
title = "控制器开关输出欠流";
message = String.format("%s塘口中%s(%s)的开关%d(%s)输出欠流",
swPondName, displayName, device.getSerialNum(), switchIndex, swName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)的开关%d(%s)输出欠流",
displayName, device.getSerialNum(), switchIndex, swName));
}
} else if (errorCode >= DefineDeviceErrorCode.One_Switch1ElectricEmpty
&& errorCode <= DefineDeviceErrorCode.One_Switch4ElectricEmpty) {
@@ -1879,10 +1876,12 @@ public class DeviceDataHandler {
warnTrigger = warnTrigger && electricWarnOpen;
if (warnTrigger) {
String swPondName = (sw.getPondId() != null) ? getPondName(sw.getPondId()) : pondName;
messagePondName = swPondName;
String swName = sw.getSwitchName() != null ? sw.getSwitchName() : ("开关" + switchIndex);
title = "控制器开关输出空载";
message = String.format("%s塘口中%s(%s)的开关%d(%s)输出空载",
swPondName, displayName, device.getSerialNum(), switchIndex, swName);
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)的开关%d(%s)输出空载",
displayName, device.getSerialNum(), switchIndex, swName));
}
} else if (errorCode == DefineDeviceErrorCode.PowerOff) {
// 断电:已存在离线状态则不触发断电告警
@@ -1893,8 +1892,8 @@ public class DeviceDataHandler {
setDeviceWarnCodeBit(device.getSerialNum(), DefineDeviceWarnCode.ErrorPowerOff, true);
if (warnTrigger) {
title = "控制器断电";
message = String.format("%s塘口中%s(%s)断电",
pondName, displayName, device.getSerialNum());
message = formatPondWarnMessage(messagePondName,
String.format("%s(%s)断电", displayName, device.getSerialNum()));
}
} else {
warnTrigger = false;
@@ -1904,11 +1903,11 @@ public class DeviceDataHandler {
if (warnTrigger && title != null && message != null) {
Long userId = device.getUserId();
if (userId != null) {
MessageWarn warn = createMessageWarn(deviceId, userId, pondName, title, warnType, message);
MessageWarn warn = createMessageWarn(deviceId, userId, messagePondName, title, warnType, message);
messageWarnMapper.insert(warn);
// 创建电话通知记录(全局开关控制)
if (aliyunIotProperties.isCallNoticeEnabled()) {
createCallNotices(device, pondName, warn);
createCallNotices(device, messagePondName, warn);
}
}
}
@@ -1990,6 +1989,16 @@ public class DeviceDataHandler {
}
}
/**
* 格式化带塘口前缀的告警内容。未绑定塘口时只保留设备告警内容。
*/
private String formatPondWarnMessage(String pondName, String content) {
if (StrUtil.isBlank(pondName)) {
return content;
}
return String.format("%s塘口中%s", pondName, content);
}
/**
* 根据塘口ID获取塘口名称
*/