package com.waterquality.service; import com.waterquality.entity.Alarm; import com.waterquality.entity.WaterQualityStation; import com.waterquality.repository.AlarmRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class AlarmServiceImpl implements AlarmService { private final AlarmRepository alarmRepository; @Override @Transactional public Alarm createAlarm(Alarm alarm) { log.info("Creating alarm for station: {}, type: {}, level: {}", alarm.getStation().getStationName(), alarm.getAlarmType(), alarm.getAlarmLevel()); if (alarm.getAlarmType() == null) { throw new IllegalArgumentException("Alarm type is required"); } if (alarm.getAlarmLevel() == null) { throw new IllegalArgumentException("Alarm level is required"); } if (alarm.getStation() == null) { throw new IllegalArgumentException("Station is required"); } if (alarm.getAlarmMessage() == null) { throw new IllegalArgumentException("Alarm message is required"); } // 设置默认报警时间为当前时间 if (alarm.getAlarmTime() == null) { alarm.setAlarmTime(LocalDateTime.now()); } alarm.setStatus("ACTIVE"); return alarmRepository.save(alarm); } @Override @Transactional public Alarm acknowledgeAlarm(Long id, String operator, String notes) { log.info("Acknowledging alarm: {}", id); Alarm alarm = alarmRepository.findById(id) .orElseThrow(() -> new RuntimeException("Alarm not found: " + id)); if (!"ACTIVE".equals(alarm.getStatus())) { throw new IllegalStateException("Can only acknowledge active alarms"); } alarm.setStatus("ACKNOWLEDGED"); alarm.setAcknowledgeTime(LocalDateTime.now()); alarm.setOperator(operator); alarm.setAcknowledgeNotes(notes); alarm.setUpdatedAt(LocalDateTime.now()); return alarmRepository.save(alarm); } @Override @Transactional public Alarm resolveAlarm(Long id, String operator, String notes) { log.info("Resolving alarm: {}", id); Alarm alarm = alarmRepository.findById(id) .orElseThrow(() -> new RuntimeException("Alarm not found: " + id)); if (!"ACKNOWLEDGED".equals(alarm.getStatus())) { throw new IllegalStateException("Can only resolve acknowledged alarms"); } alarm.setStatus("RESOLVED"); alarm.setResolveTime(LocalDateTime.now()); alarm.setOperator(operator); alarm.setResolveNotes(notes); alarm.setUpdatedAt(LocalDateTime.now()); return alarmRepository.save(alarm); } @Override @Transactional public void deleteAlarm(Long id) { log.info("Deleting alarm: {}", id); Alarm alarm = alarmRepository.findById(id) .orElseThrow(() -> new RuntimeException("Alarm not found: " + id)); alarm.setIsActive(false); alarm.setUpdatedAt(LocalDateTime.now()); alarmRepository.save(alarm); } @Override public List getAllActiveAlarms() { log.info("Getting all active alarms"); return alarmRepository.findByIsActiveTrue(); } @Override public List getAlarmsByStationId(Long stationId) { log.info("Getting alarms for station ID: {}", stationId); return alarmRepository.findByStationId(stationId); } @Override public List getAlarmsByLevel(String alarmLevel) { log.info("Getting alarms by level: {}", alarmLevel); return alarmRepository.findByAlarmLevelAndIsActiveTrue(alarmLevel); } @Override public List getAlarmsByType(String alarmType) { log.info("Getting alarms by type: {}", alarmType); return alarmRepository.findByAlarmTypeAndIsActiveTrue(alarmType); } @Override public List getAlarmsByStatus(String status) { log.info("Getting alarms by status: {}", status); return alarmRepository.findByStatus(status); } @Override public List getAlarmsByTimeRange(LocalDateTime startTime, LocalDateTime endTime) { log.info("Getting alarms from {} to {}", startTime, endTime); return alarmRepository.findByAlarmTimeBetween(startTime, endTime); } @Override public List getUnacknowledgedAlarms() { log.info("Getting unacknowledged alarms"); return alarmRepository.findUnacknowledgedAlarms(); } @Override public List getUnresolvedAlarms() { log.info("Getting unresolved alarms"); return alarmRepository.findUnresolvedAlarms(); } @Override public Alarm getAlarmById(Long id) { log.info("Getting alarm by id: {}", id); return alarmRepository.findById(id) .orElseThrow(() -> new RuntimeException("Alarm not found: " + id)); } }