Forráskód Böngészése

fix(alarm): 优化告警处理逻辑并统一设备负责人字段命名

- 将多个服务中的"设备维护人员"字段统一更名为"设备负责人"
- 重构告警数据保存方法,返回告警等级用于条件判断
- 实现分级告警机制,仅一级告警触发短信通知
- 新增专门的一级告警数据保存方法saveAlarmDataLevelOne
- 集成短信发送功能,支持批量发送告警通知
- 添加设备手机号获取工具类集成
- 增强告警日志记录,包含告警级别信息
- 修复告警数据入库异常处理机制
林仔 4 napja
szülő
commit
90749f39c2

+ 36 - 13
firefighting-pressure-service/src/main/java/com/zksy/pressure/utils/MessageHandler.java

@@ -251,39 +251,41 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			}
 			//1.3超出了阈值则发送短信,先保存告警数据再发送短信
 			if(isOverThreshold){
-				saveAlarmData(deviceId, warningType, warningCode,
+				int alarmLevel = saveAlarmData(deviceId, warningType, warningCode,
 						minValue != null ? BigDecimal.valueOf(minValue) : null,
 						maxValue != null ? BigDecimal.valueOf(maxValue) : null,
 						pressureValue != null ? BigDecimal.valueOf(pressureValue) : null,
 						remark != null ? remark : "压力报警");
-				sendMessage(deviceId,warningType,resultData.getLongitude(),resultData.getLatitude());
+				if (alarmLevel == 1) {
+					sendMessage(deviceId,warningType,resultData.getLongitude(),resultData.getLatitude());
+				}
 			}
 			if(resultData.getD14()==1){
-				saveAlarmData(deviceId, "压力变幅报警", "WARN-PRESSURE-VARY", null, null, null, "压力变幅报警");
+				saveAlarmDataLevelOne(deviceId, "压力变幅报警", "WARN-PRESSURE-VARY", null, "压力变幅报警");
 				sendMessage(deviceId,"压力变幅报警",resultData.getLongitude(),resultData.getLatitude());
 			}
 			if(resultData.getD13()==1){
-				saveAlarmData(deviceId, "压力下下限报警", "WARN-PRESSURE-LOW-LOW", null, null, null, "压力下下限报警");
+				saveAlarmDataLevelOne(deviceId, "压力下下限报警", "WARN-PRESSURE-LOW-LOW", null, "压力下下限报警");
 				sendMessage(deviceId,"压力下下限报警",resultData.getLongitude(),resultData.getLatitude());
 			}
 			if(resultData.getD12()==1){
-				saveAlarmData(deviceId, "压力上上限报警", "WARN-PRESSURE-HIGH-HIGH", null, null, null, "压力上上限报警");
+				saveAlarmDataLevelOne(deviceId, "压力上上限报警", "WARN-PRESSURE-HIGH-HIGH", null, "压力上上限报警");
 				sendMessage(deviceId,"压力上上限报警",resultData.getLongitude(),resultData.getLatitude());
 			}
 			if(resultData.getD11()==1){
-				saveAlarmData(deviceId, "压力下线报警", "WARN-PRESSURE-LOW", null, null, null, "压力下线报警");
+				saveAlarmDataLevelOne(deviceId, "压力下线报警", "WARN-PRESSURE-LOW", null, "压力下线报警");
 				sendMessage(deviceId,"压力下线报警",resultData.getLongitude(),resultData.getLatitude());
 			}
 			if(resultData.getD10()==1){
-				saveAlarmData(deviceId, "压力上限报警", "WARN-PRESSURE-HIGH", null, null, null, "压力上限报警");
+				saveAlarmDataLevelOne(deviceId, "压力上限报警", "WARN-PRESSURE-HIGH", null, "压力上限报警");
 				sendMessage(deviceId,"压力上限报警",resultData.getLongitude(),resultData.getLatitude());
 			}
 			if(resultData.getD9()==1){
-				saveAlarmData(deviceId, "传感器状态", "WARN-SENSOR-STATUS", null, null, null, "传感器状态");
+				saveAlarmDataLevelOne(deviceId, "传感器状态", "WARN-SENSOR-STATUS", null, "传感器状态");
 				sendMessage(deviceId,"传感器状态",resultData.getLongitude(),resultData.getLatitude());
 			}
 			if(resultData.getD1()==1){
-				saveAlarmData(deviceId, "倾斜报警1", "WARN-TILT-1", null, null, null, "倾斜报警1");
+				saveAlarmDataLevelOne(deviceId, "倾斜报警1", "WARN-TILT-1", null, "倾斜报警1");
 				sendMessage(deviceId,"倾斜报警1",resultData.getLongitude(),resultData.getLatitude());
 			}
 		} catch (Exception e) {
@@ -292,9 +294,10 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 
 	}
 
-	private void saveAlarmData(String deviceCode, String warningType, String warningCode,
+	private int saveAlarmData(String deviceCode, String warningType, String warningCode,
 							  BigDecimal minValue, BigDecimal maxValue,
 							  BigDecimal actualValue, String remark) {
+		int alarmLevel = 4;
 		try {
 			AlarmData alarmData = new AlarmData();
 			alarmData.setDeviceCode(deviceCode);
@@ -304,8 +307,7 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setMaxValue(maxValue);
 			alarmData.setActualValue(actualValue);
 
-			// 计算告警等级和偏差率
-			int alarmLevel = AlarmLevelUtil.calculateLevel(actualValue, minValue, maxValue);
+			alarmLevel = AlarmLevelUtil.calculateLevel(actualValue, minValue, maxValue);
 			BigDecimal deviationRatio = AlarmLevelUtil.calculateDeviationRatio(actualValue, minValue, maxValue);
 			alarmData.setAlarmLevel(alarmLevel);
 			alarmData.setDeviationRatio(deviationRatio);
@@ -316,11 +318,32 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setCreateTime(LocalDateTime.now());
 			alarmDataService.saveAlarmData(alarmData);
 
-			// 1级告警特殊处理(TODO:调用短信接口或发送特殊通知)
 			if (alarmLevel == 1) {
 				log.warn("【1级紧急告警】deviceCode={}, warningCode={}, deviationRatio={}%",
 						deviceCode, warningCode, deviationRatio);
 			}
+			log.info("告警数据入库成功: deviceCode={}, warningCode={}, level={}级", deviceCode, warningCode, alarmLevel);
+		} catch (Exception e) {
+			log.error("保存告警数据失败", e);
+		}
+		return alarmLevel;
+	}
+
+	private void saveAlarmDataLevelOne(String deviceCode, String warningType, String warningCode,
+									   BigDecimal actualValue, String remark) {
+		try {
+			AlarmData alarmData = new AlarmData();
+			alarmData.setDeviceCode(deviceCode);
+			alarmData.setWarningType(warningType);
+			alarmData.setWarningCode(warningCode);
+			alarmData.setActualValue(actualValue);
+			alarmData.setAlarmLevel(1);
+			alarmData.setAlarmStatus(0);
+			alarmData.setAlarmTime(LocalDateTime.now());
+			alarmData.setRemark(remark);
+			alarmData.setCreateTime(LocalDateTime.now());
+			alarmDataService.saveAlarmData(alarmData);
+			log.info("设备主动告警入库(1级): deviceCode={}, warningCode={}", deviceCode, warningCode);
 		} catch (Exception e) {
 			log.error("保存告警数据失败", e);
 		}

+ 53 - 32
flammable-gas-service/src/main/java/com/zksy/gas/utils/MessageHandler.java

@@ -214,13 +214,13 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			temperatureIsOverThreshold = true;
 		}
 		if(temperatureIsOverThreshold){
-			//先保存告警数据
-			saveAlarmData(deviceId, temWarningType, temWarningCode,
+			int alarmLevel = saveAlarmData(deviceId, temWarningType, temWarningCode,
 					temMinValue != null ? BigDecimal.valueOf(temMinValue) : null,
 					temMaxValue != null ? BigDecimal.valueOf(temMaxValue) : null,
 					BigDecimal.valueOf(temperature), temRemark != null ? temRemark : "可燃气体温度报警");
-			//再发送短信
-			sendMessage(deviceId, temWarningType, resultData.getLongitude(), resultData.getLatitude());
+			if (alarmLevel == 1) {
+				sendMessage(deviceId, temWarningType, resultData.getLongitude(), resultData.getLatitude());
+			}
 		}
 
 		//判断湿度
@@ -233,13 +233,13 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			humidityIsOverThreshold = true;
 		}
 		if(humidityIsOverThreshold){
-			//先保存告警数据
-			saveAlarmData(deviceId, humWarningType, humWarningCode,
+			int alarmLevel = saveAlarmData(deviceId, humWarningType, humWarningCode,
 					humMinValue != null ? BigDecimal.valueOf(humMinValue) : null,
 					humMaxValue != null ? BigDecimal.valueOf(humMaxValue) : null,
 					BigDecimal.valueOf(humidity), humRemark != null ? humRemark : "可燃气体湿度报警");
-			//再发送短信
-			sendMessage(deviceId, humWarningType, resultData.getLongitude(), resultData.getLatitude());
+			if (alarmLevel == 1) {
+				sendMessage(deviceId, humWarningType, resultData.getLongitude(), resultData.getLatitude());
+			}
 		}
 
 		//判断气体浓度
@@ -253,79 +253,79 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			concentrationIsOverThreshold = true;
 		}
 		if(concentrationIsOverThreshold){
-			//先保存告警数据
-			saveAlarmData(deviceId, gasWarningType, gasWarningCode,
+			int alarmLevel = saveAlarmData(deviceId, gasWarningType, gasWarningCode,
 					gasMinValue != null ? BigDecimal.valueOf(gasMinValue) : null,
 					gasMaxValue != null ? BigDecimal.valueOf(gasMaxValue) : null,
 					gasConcentration, gasRemark != null ? gasRemark : "可燃气体浓度报警");
-			//再发送短信
-			sendMessage(deviceId, gasWarningType, resultData.getLongitude(), resultData.getLatitude());
+			if (alarmLevel == 1) {
+				sendMessage(deviceId, gasWarningType, resultData.getLongitude(), resultData.getLatitude());
+			}
 		}
 
 		//获取到的数据逐一进行判断
 		Map<String, Boolean> alarmBits = resultData.parseAlarmBits();
 		if(alarmBits.get("unknownAlarm")){
-			saveAlarmData(deviceId, "未知报警", "WARN-UNKNOWN", null, null, null, "可燃气体未知报警");
+			saveAlarmDataLevelOne(deviceId, "未知报警", "WARN-UNKNOWN", null, "可燃气体未知报警");
 			sendMessage(deviceId,"未知报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("highAlarm")){
-			saveAlarmData(deviceId, "高报警", "WARN-HIGH", null, null, null, "可燃气体高报警");
+			saveAlarmDataLevelOne(deviceId, "高报警", "WARN-HIGH", null, "可燃气体高报警");
 			sendMessage(deviceId,"高报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("overRange")){
-			saveAlarmData(deviceId, "超量程", "WARN-OVER-RANGE", null, null, null, "可燃气体超量程报警");
+			saveAlarmDataLevelOne(deviceId, "超量程", "WARN-OVER-RANGE", null, "可燃气体超量程报警");
 			sendMessage(deviceId,"超量程",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("calibrationCycle")){
-			saveAlarmData(deviceId, "标定周期", "WARN-CALIBRATION-CYCLE", null, null, null, "可燃气体标定周期报警");
+			saveAlarmDataLevelOne(deviceId, "标定周期", "WARN-CALIBRATION-CYCLE", null, "可燃气体标定周期报警");
 			sendMessage(deviceId,"标定周期",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("overLife")){
-			saveAlarmData(deviceId, "超寿命", "WARN-OVER-LIFE", null, null, null, "可燃气体超寿命报警");
+			saveAlarmDataLevelOne(deviceId, "超寿命", "WARN-OVER-LIFE", null, "可燃气体超寿命报警");
 			sendMessage(deviceId,"超寿命",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("fallAlarm")){
-			saveAlarmData(deviceId, "跌倒报警", "WARN-FALL", null, null, null, "可燃气体跌倒报警");
+			saveAlarmDataLevelOne(deviceId, "跌倒报警", "WARN-FALL", null, "可燃气体跌倒报警");
 			sendMessage(deviceId,"跌倒报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("undervoltage")){
-			saveAlarmData(deviceId, "欠压报警", "WARN-UNDERVOLTAGE", null, null, null, "可燃气体欠压报警");
+			saveAlarmDataLevelOne(deviceId, "欠压报警", "WARN-UNDERVOLTAGE", null, "可燃气体欠压报警");
 			sendMessage(deviceId,"欠压报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("rangeAlarm")){
-			saveAlarmData(deviceId, "区间报警", "WARN-RANGE", null, null, null, "可燃气体区间报警");
+			saveAlarmDataLevelOne(deviceId, "区间报警", "WARN-RANGE", null, "可燃气体区间报警");
 			sendMessage(deviceId,"区间报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("keyAlarm")){
-			saveAlarmData(deviceId, "按键报警", "WARN-KEY", null, null, null, "可燃气体按键报警");
+			saveAlarmDataLevelOne(deviceId, "按键报警", "WARN-KEY", null, "可燃气体按键报警");
 			sendMessage(deviceId,"按键报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("vibrationAlarm")){
-			saveAlarmData(deviceId, "震动报警", "WARN-VIBRATION", null, null, null, "可燃气体震动报警");
+			saveAlarmDataLevelOne(deviceId, "震动报警", "WARN-VIBRATION", null, "可燃气体震动报警");
 			sendMessage(deviceId,"震动报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("waterLevelAlarm")){
-			saveAlarmData(deviceId, "水位报警", "WARN-WATER-LEVEL", null, null, null, "可燃气体水位报警");
+			saveAlarmDataLevelOne(deviceId, "水位报警", "WARN-WATER-LEVEL", null, "可燃气体水位报警");
 			sendMessage(deviceId,"水位报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("powerOffAlarm")){
-			saveAlarmData(deviceId, "断电报警", "WARN-POWER-OFF", null, null, null, "可燃气体断电报警");
+			saveAlarmDataLevelOne(deviceId, "断电报警", "WARN-POWER-OFF", null, "可燃气体断电报警");
 			sendMessage(deviceId,"断电报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("sensorFault")){
-			saveAlarmData(deviceId, "传感器故障", "WARN-SENSOR-FAULT", null, null, null, "可燃气体传感器故障");
+			saveAlarmDataLevelOne(deviceId, "传感器故障", "WARN-SENSOR-FAULT", null, "可燃气体传感器故障");
 			sendMessage(deviceId,"传感器故障",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("overHumidity")){
-			saveAlarmData(deviceId, "超湿报警", "WARN-OVER-HUMIDITY", null, null, null, "可燃气体超湿报警");
+			saveAlarmDataLevelOne(deviceId, "超湿报警", "WARN-OVER-HUMIDITY", null, "可燃气体超湿报警");
 			sendMessage(deviceId,"超湿报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("overTemperature")){
-			saveAlarmData(deviceId, "超温报警", "WARN-OVER-TEMPERATURE", null, null, null, "可燃气体超温报警");
+			saveAlarmDataLevelOne(deviceId, "超温报警", "WARN-OVER-TEMPERATURE", null, "可燃气体超温报警");
 			sendMessage(deviceId,"超温报警",resultData.getLongitude(),resultData.getLatitude());
 		}
 		if(alarmBits.get("systemFault")){
-			saveAlarmData(deviceId, "系统故障", "WARN-SYSTEM-FAULT", null, null, null, "可燃气体系统故障");
+			saveAlarmDataLevelOne(deviceId, "系统故障", "WARN-SYSTEM-FAULT", null, "可燃气体系统故障");
 			sendMessage(deviceId,"系统故障",resultData.getLongitude(),resultData.getLatitude());
 		}
 	}
@@ -339,9 +339,10 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 		}
 	}
 
-	private void saveAlarmData(String deviceCode, String warningType, String warningCode,
+	private int saveAlarmData(String deviceCode, String warningType, String warningCode,
 							  BigDecimal minValue, BigDecimal maxValue,
 							  BigDecimal actualValue, String remark) {
+		int alarmLevel = 4;
 		try {
 			AlarmData alarmData = new AlarmData();
 			alarmData.setDeviceCode(deviceCode);
@@ -351,8 +352,7 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setMaxValue(maxValue);
 			alarmData.setActualValue(actualValue);
 
-			// 计算告警等级和偏差率
-			int alarmLevel = AlarmLevelUtil.calculateLevel(actualValue, minValue, maxValue);
+			alarmLevel = AlarmLevelUtil.calculateLevel(actualValue, minValue, maxValue);
 			BigDecimal deviationRatio = AlarmLevelUtil.calculateDeviationRatio(actualValue, minValue, maxValue);
 			alarmData.setAlarmLevel(alarmLevel);
 			alarmData.setDeviationRatio(deviationRatio);
@@ -363,11 +363,32 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setCreateTime(LocalDateTime.now());
 			alarmDataService.saveAlarmData(alarmData);
 
-			// 1级告警特殊处理(TODO:调用短信接口或发送特殊通知)
 			if (alarmLevel == 1) {
 				log.warn("【1级紧急告警】deviceCode={}, warningCode={}, deviationRatio={}%",
 						deviceCode, warningCode, deviationRatio);
 			}
+			log.info("告警数据入库成功: deviceCode={}, warningCode={}, level={}级", deviceCode, warningCode, alarmLevel);
+		} catch (Exception e) {
+			log.error("保存告警数据失败", e);
+		}
+		return alarmLevel;
+	}
+
+	private void saveAlarmDataLevelOne(String deviceCode, String warningType, String warningCode,
+									   BigDecimal actualValue, String remark) {
+		try {
+			AlarmData alarmData = new AlarmData();
+			alarmData.setDeviceCode(deviceCode);
+			alarmData.setWarningType(warningType);
+			alarmData.setWarningCode(warningCode);
+			alarmData.setActualValue(actualValue);
+			alarmData.setAlarmLevel(1);
+			alarmData.setAlarmStatus(0);
+			alarmData.setAlarmTime(LocalDateTime.now());
+			alarmData.setRemark(remark);
+			alarmData.setCreateTime(LocalDateTime.now());
+			alarmDataService.saveAlarmData(alarmData);
+			log.info("设备主动告警入库(1级): deviceCode={}, warningCode={}", deviceCode, warningCode);
 		} catch (Exception e) {
 			log.error("保存告警数据失败", e);
 		}

+ 1 - 1
manhole-service/src/main/java/com/zksy/manhole/domain/BaseDevicesManhole.java

@@ -116,7 +116,7 @@ public class BaseDevicesManhole implements Serializable {
     /**
      * 设备维护人员
      */
-    @ApiModelProperty(value = "设备维护人员")
+    @ApiModelProperty(value = "设备负责人")
     private String maintainer;
 
     /**

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/EquipmentBase.java

@@ -67,7 +67,7 @@ public class EquipmentBase {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime installTime;
 
-    @ApiModelProperty("设备维护人员")
+    @ApiModelProperty("设备负责人")
     private String maintainer;
 
     @ApiModelProperty("联系方式")

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/EquipmentFullVO.java

@@ -62,7 +62,7 @@ public class EquipmentFullVO {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime installTime;
 
-    @ApiModelProperty("维护人员")
+    @ApiModelProperty("设备负责人")
     private String maintainer;
 
     @ApiModelProperty("联系方式")

+ 34 - 4
radar-service/src/main/java/com/zksy/radar/utils/MessageHandler.java

@@ -5,9 +5,11 @@ import com.zksy.api.domain.WarningThreshold;
 import com.zksy.api.service.AlarmDataService;
 import com.zksy.api.service.WarningThresholdService;
 import com.zksy.api.utils.AlarmLevelUtil;
+import com.zksy.api.utils.SmsUtil;
 import com.zksy.common.exception.InvalidMessageException;
 import com.zksy.radar.domain.RadarData;
 import com.zksy.radar.service.RadarDataService;
+import com.zksy.utils.DevicePhoneFetchUtil;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandler;
@@ -22,6 +24,8 @@ import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
 
 @ChannelHandler.Sharable
 @Slf4j
@@ -31,11 +35,17 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 	private final RadarDataService service;
 	private final WarningThresholdService warningThresholdService;
 	private final AlarmDataService alarmDataService;
+	private final SmsUtil smsUtil;
+	private final DevicePhoneFetchUtil devicePhoneFetchUtil;
+
 	@Autowired
-	public MessageHandler(RadarDataService RadarDataService, WarningThresholdService warningThresholdService, AlarmDataService alarmDataService) {
+	public MessageHandler(RadarDataService RadarDataService, WarningThresholdService warningThresholdService,
+	                       AlarmDataService alarmDataService, SmsUtil smsUtil, DevicePhoneFetchUtil devicePhoneFetchUtil) {
 		this.service = RadarDataService;
 		this.warningThresholdService = warningThresholdService;
 		this.alarmDataService = alarmDataService;
+		this.smsUtil = smsUtil;
+		this.devicePhoneFetchUtil = devicePhoneFetchUtil;
 	}
 
 	@Override
@@ -278,7 +288,6 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setMaxValue(maxValue);
 			alarmData.setActualValue(actualValue);
 
-			// 计算告警等级和偏差率
 			int alarmLevel = AlarmLevelUtil.calculateLevel(actualValue, minValue, maxValue);
 			BigDecimal deviationRatio = AlarmLevelUtil.calculateDeviationRatio(actualValue, minValue, maxValue);
 			alarmData.setAlarmLevel(alarmLevel);
@@ -289,15 +298,36 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setRemark(remark);
 			alarmData.setCreateTime(LocalDateTime.now());
 			alarmDataService.saveAlarmData(alarmData);
+			logger.info("告警数据入库成功: deviceCode={}, warningCode={}, level={}级", deviceCode, warningCode, alarmLevel);
 
-			// 1级告警特殊处理(TODO:调用短信接口或发送特殊通知)
 			if (alarmLevel == 1) {
 				logger.warn("【1级紧急告警】deviceCode={}, warningCode={}, deviationRatio={}%",
 						deviceCode, warningCode, deviationRatio);
+				sendAlarmSms(deviceCode, warningType, actualValue, minValue, maxValue);
 			}
-			logger.info("告警数据入库成功: deviceCode={}, warningCode={}", deviceCode, warningCode);
 		} catch (Exception e) {
 			logger.error("保存告警数据失败", e);
 		}
 	}
+
+	private void sendAlarmSms(String deviceCode, String warningType, BigDecimal actualValue,
+	                          BigDecimal minValue, BigDecimal maxValue) {
+		try {
+			List<String> phoneList = devicePhoneFetchUtil.getPhoneListByDeviceId(deviceCode);
+			if (phoneList == null || phoneList.isEmpty()) {
+				logger.warn("报警短信发送失败:未找到设备{}的维护人员手机号", deviceCode);
+				return;
+			}
+			com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject();
+			params.put("deviceNo", deviceCode);
+			params.put("alarmType", warningType);
+			params.put("location", "当前值:" + actualValue + ",正常范围:" + minValue + "~" + maxValue);
+
+			Map<String, Boolean> result = smsUtil.sendBatchSms(phoneList, params.toJSONString());
+			long successCount = result.values().stream().filter(Boolean::booleanValue).count();
+			logger.info("1级告警短信发送完成,成功{}条,失败{}条", successCount, phoneList.size() - successCount);
+		} catch (Exception e) {
+			logger.error("发送报警短信异常: {}", e.getMessage());
+		}
+	}
 }

+ 34 - 4
water-level-service/src/main/java/com/zksy/water/utils/MessageHandler.java

@@ -5,7 +5,9 @@ import com.zksy.api.domain.WarningThreshold;
 import com.zksy.api.service.AlarmDataService;
 import com.zksy.api.service.WarningThresholdService;
 import com.zksy.api.utils.AlarmLevelUtil;
+import com.zksy.api.utils.SmsUtil;
 import com.zksy.common.exception.InvalidMessageException;
+import com.zksy.utils.DevicePhoneFetchUtil;
 import com.zksy.water.domain.WaterMonitorData;
 import com.zksy.water.service.WaterMonitorDataService;
 import io.netty.buffer.ByteBuf;
@@ -22,6 +24,8 @@ import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
 
 @ChannelHandler.Sharable
 @Slf4j
@@ -31,11 +35,17 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 	private final WaterMonitorDataService service;
 	private final WarningThresholdService warningThresholdService;
 	private final AlarmDataService alarmDataService;
+	private final SmsUtil smsUtil;
+	private final DevicePhoneFetchUtil devicePhoneFetchUtil;
+
 	@Autowired
-	public MessageHandler(WaterMonitorDataService waterMonitorDataService, WarningThresholdService warningThresholdService, AlarmDataService alarmDataService) {
+	public MessageHandler(WaterMonitorDataService waterMonitorDataService, WarningThresholdService warningThresholdService,
+	                       AlarmDataService alarmDataService, SmsUtil smsUtil, DevicePhoneFetchUtil devicePhoneFetchUtil) {
 		this.service = waterMonitorDataService;
 		this.warningThresholdService = warningThresholdService;
 		this.alarmDataService = alarmDataService;
+		this.smsUtil = smsUtil;
+		this.devicePhoneFetchUtil = devicePhoneFetchUtil;
 	}
 
 	@Override
@@ -272,7 +282,6 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setMaxValue(maxValue);
 			alarmData.setActualValue(actualValue);
 
-			// 计算告警等级和偏差率
 			int alarmLevel = AlarmLevelUtil.calculateLevel(actualValue, minValue, maxValue);
 			BigDecimal deviationRatio = AlarmLevelUtil.calculateDeviationRatio(actualValue, minValue, maxValue);
 			alarmData.setAlarmLevel(alarmLevel);
@@ -283,15 +292,36 @@ public class MessageHandler extends ChannelInboundHandlerAdapter {
 			alarmData.setRemark(remark);
 			alarmData.setCreateTime(LocalDateTime.now());
 			alarmDataService.saveAlarmData(alarmData);
+			logger.info("告警数据入库成功: deviceCode={}, warningCode={}, level={}级", deviceCode, warningCode, alarmLevel);
 
-			// 1级告警特殊处理(TODO:调用短信接口或发送特殊通知)
 			if (alarmLevel == 1) {
 				logger.warn("【1级紧急告警】deviceCode={}, warningCode={}, deviationRatio={}%",
 						deviceCode, warningCode, deviationRatio);
+				sendAlarmSms(deviceCode, warningType, actualValue, minValue, maxValue);
 			}
-			logger.info("告警数据入库成功: deviceCode={}, warningCode={}", deviceCode, warningCode);
 		} catch (Exception e) {
 			logger.error("保存告警数据失败", e);
 		}
 	}
+
+	private void sendAlarmSms(String deviceCode, String warningType, BigDecimal actualValue,
+	                          BigDecimal minValue, BigDecimal maxValue) {
+		try {
+			List<String> phoneList = devicePhoneFetchUtil.getPhoneListByDeviceId(deviceCode);
+			if (phoneList == null || phoneList.isEmpty()) {
+				logger.warn("报警短信发送失败:未找到设备{}的维护人员手机号", deviceCode);
+				return;
+			}
+			com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject();
+			params.put("deviceNo", deviceCode);
+			params.put("alarmType", warningType);
+			params.put("location", "当前值:" + actualValue + ",正常范围:" + minValue + "~" + maxValue);
+
+			Map<String, Boolean> result = smsUtil.sendBatchSms(phoneList, params.toJSONString());
+			long successCount = result.values().stream().filter(Boolean::booleanValue).count();
+			logger.info("1级告警短信发送完成,成功{}条,失败{}条", successCount, phoneList.size() - successCount);
+		} catch (Exception e) {
+			logger.error("发送报警短信异常: {}", e.getMessage());
+		}
+	}
 }