diff --git a/src/main/java/com/campus/water/service/MqttSensorReceiver.java b/src/main/java/com/campus/water/service/MqttSensorReceiver.java index 62f03e5..55a1400 100644 --- a/src/main/java/com/campus/water/service/MqttSensorReceiver.java +++ b/src/main/java/com/campus/water/service/MqttSensorReceiver.java @@ -17,7 +17,7 @@ import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannel import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.handler.annotation.Header; import org.springframework.stereotype.Service; - +import com.campus.water.service.AlertTriggerService; import jakarta.annotation.PostConstruct; import java.math.BigDecimal; import java.time.LocalDateTime; diff --git a/src/main/java/com/campus/water/task/SensorSimulationTask.java b/src/main/java/com/campus/water/task/SensorSimulationTask.java index 4835f8e..6e624a2 100644 --- a/src/main/java/com/campus/water/task/SensorSimulationTask.java +++ b/src/main/java/com/campus/water/task/SensorSimulationTask.java @@ -1,50 +1,54 @@ package com.campus.water.task; +import com.campus.water.entity.Device; +import com.campus.water.mapper.DeviceRepository; import com.campus.water.service.MqttSensorSender; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Component @RequiredArgsConstructor @Slf4j public class SensorSimulationTask { private final MqttSensorSender mqttSensorSender; - - // 模拟已部署的设备列表(实际项目可从数据库查询) - private final List waterMakerDevices = new ArrayList<>() {{ - add("WM001"); // 制水机1 - add("WM002"); // 制水机2 - add("WM003"); // 制水机3 - add("WM004"); // 制水机4 - }}; - - private final List waterSupplyDevices = new ArrayList<>() {{ - add("WS001"); // 供水机1 - add("WS002"); // 供水机2 - add("WS003"); // 供水机3 - }}; + private final DeviceRepository deviceRepository; /** * 定时发送「正常状态数据」:每30秒执行一次 - * fixedRate:固定间隔(从上一次任务开始时间计算) */ @Scheduled(fixedRate = 30000) public void sendRegularStateData() { log.info("=== 开始发送设备正常状态数据 ==="); - // 1. 发送所有制水机状态 - for (String deviceId : waterMakerDevices) { - mqttSensorSender.sendWaterMakerState(deviceId); + // 1. 从数据库查询「制水机」(water_maker)类型设备(传入枚举类型) + List waterMakerDevices = deviceRepository.findByDeviceType(Device.DeviceType.water_maker) + .stream() + .map(Device::getDeviceId) + .collect(Collectors.toList()); + + // 2. 从数据库查询「供水机」(water_supply)类型设备(传入枚举类型) + List waterSupplyDevices = deviceRepository.findByDeviceType(Device.DeviceType.water_supply) + .stream() + .map(Device::getDeviceId) + .collect(Collectors.toList()); + + // 发送制水机状态 + if (!waterMakerDevices.isEmpty()) { + waterMakerDevices.forEach(deviceId -> mqttSensorSender.sendWaterMakerState(deviceId)); + } else { + log.warn("⚠️ device表中无「water_maker」类型设备"); } - // 2. 发送所有供水机状态 - for (String deviceId : waterSupplyDevices) { - mqttSensorSender.sendWaterSupplyData(deviceId); + // 发送供水机状态 + if (!waterSupplyDevices.isEmpty()) { + waterSupplyDevices.forEach(deviceId -> mqttSensorSender.sendWaterSupplyData(deviceId)); + } else { + log.warn("⚠️ device表中无「water_supply」类型设备"); } log.info("=== 设备正常状态数据发送完成 ==="); @@ -52,13 +56,23 @@ public class SensorSimulationTask { /** * 定时发送「随机告警数据」:每5分钟执行一次 - * fixedRate:固定间隔(从上一次任务开始时间计算) */ @Scheduled(fixedRate = 300000) public void sendRandomWarningData() { log.info("=== 开始发送随机告警数据 ==="); - // 随机选择1台制水机发送告警(模拟设备故障) + // 从数据库查询制水机列表(传入枚举类型) + List waterMakerDevices = deviceRepository.findByDeviceType(Device.DeviceType.water_maker) + .stream() + .map(Device::getDeviceId) + .collect(Collectors.toList()); + + if (waterMakerDevices.isEmpty()) { + log.warn("⚠️ device表中无「water_maker」类型设备,跳过告警发送"); + return; + } + + // 随机选择1台制水机发送告警 int randomIndex = (int) (Math.random() * waterMakerDevices.size()); String targetDevice = waterMakerDevices.get(randomIndex); mqttSensorSender.sendWaterMakerWarning(targetDevice);