using System; using System.Collections.Generic; using System.Threading.Tasks; using Haoliang.Models.System; namespace Haoliang.Core.Services { public interface IAlarmService { Task CreateAlarmAsync(Alarm alarm); Task UpdateAlarmAsync(int alarmId, Alarm alarm); Task DeleteAlarmAsync(int alarmId); Task GetAlarmByIdAsync(int alarmId); Task> GetAllAlarmsAsync(); Task> GetAlarmsByDeviceAsync(int deviceId); Task> GetAlarmsByTypeAsync(AlarmType type); Task> GetActiveAlarmsAsync(); Task> GetAlarmsByDateRangeAsync(DateTime startDate, DateTime endDate); Task ResolveAlarmAsync(int alarmId, string resolutionNote); Task AcknowledgeAlarmAsync(int alarmId, string acknowledgeNote); Task GetAlarmStatisticsAsync(DateTime date); Task> GetCriticalAlarmsAsync(); Task> GetDeviceAlarmsAsync(int deviceId, int days = 7); } public interface IAlarmRuleService { Task CreateAlarmRuleAsync(AlarmRule rule); Task UpdateAlarmRuleAsync(int ruleId, AlarmRule rule); Task DeleteAlarmRuleAsync(int ruleId); Task GetAlarmRuleByIdAsync(int ruleId); Task> GetAllAlarmRulesAsync(); Task> GetActiveAlarmRulesAsync(); Task> GetRulesByDeviceAsync(int deviceId); Task EvaluateAlarmRuleAsync(AlarmRule rule, DeviceCurrentStatus status); Task GenerateAlarmFromRuleAsync(AlarmRule rule, DeviceCurrentStatus status); Task TestAlarmRuleAsync(int ruleId); } public interface IAlarmNotificationService { Task SendAlarmNotificationAsync(Alarm alarm); Task SendBulkAlarmNotificationsAsync(IEnumerable alarms); Task SendSmsNotificationAsync(string phoneNumber, string message); Task SendEmailNotificationAsync(string email, string subject, string message); Task SendWechatNotificationAsync(string openId, string message); Task> GetNotificationHistoryAsync(DateTime startDate, DateTime endDate); Task ConfigureNotificationChannelAsync(NotificationChannel channel); Task> GetAvailableChannelsAsync(); } public class AlarmManager : IAlarmService { private readonly IAlarmRepository _alarmRepository; private readonly IAlarmRuleService _alarmRuleService; private readonly IAlarmNotificationService _notificationService; public AlarmManager( IAlarmRepository alarmRepository, IAlarmRuleService alarmRuleService, IAlarmNotificationService notificationService) { _alarmRepository = alarmRepository; _alarmRuleService = alarmRuleService; _notificationService = notificationService; } public async Task CreateAlarmAsync(Alarm alarm) { // 设置初始状态 alarm.AlarmStatus = AlarmStatus.Active; alarm.CreateTime = DateTime.Now; alarm.UpdateTime = DateTime.Now; var createdAlarm = await _alarmRepository.AddAsync(alarm); // 发送告警通知 await _notificationService.SendAlarmNotificationAsync(createdAlarm); return createdAlarm; } public async Task UpdateAlarmAsync(int alarmId, Alarm alarm) { var existingAlarm = await _alarmRepository.GetByIdAsync(alarmId); if (existingAlarm == null) { throw new KeyNotFoundException($"Alarm with ID {alarmId} not found"); } // 更新字段 alarm.AlarmId = alarmId; alarm.UpdateTime = DateTime.Now; var updatedAlarm = await _alarmRepository.UpdateAsync(alarm); return updatedAlarm; } public async Task DeleteAlarmAsync(int alarmId) { return await _alarmRepository.DeleteAsync(alarmId); } public async Task GetAlarmByIdAsync(int alarmId) { return await _alarmRepository.GetByIdAsync(alarmId); } public async Task> GetAllAlarmsAsync() { return await _alarmRepository.GetAllAsync(); } public async Task> GetAlarmsByDeviceAsync(int deviceId) { return await _alarmRepository.GetByDeviceIdAsync(deviceId); } public async Task> GetAlarmsByTypeAsync(AlarmType type) { return await _alarmRepository.GetByAlarmTypeAsync(type); } public async Task> GetActiveAlarmsAsync() { return await _alarmRepository.GetByStatusAsync(AlarmStatus.Active); } public async Task> GetAlarmsByDateRangeAsync(DateTime startDate, DateTime endDate) { return await _alarmRepository.GetByDateRangeAsync(startDate, endDate); } public async Task ResolveAlarmAsync(int alarmId, string resolutionNote) { var alarm = await _alarmRepository.GetByIdAsync(alarmId); if (alarm == null) { return false; } alarm.AlarmStatus = AlarmStatus.Resolved; alarm.ResolutionNote = resolutionNote; alarm.ResolvedTime = DateTime.Now; alarm.UpdateTime = DateTime.Now; return await _alarmRepository.UpdateAsync(alarm) != null; } public async Task AcknowledgeAlarmAsync(int alarmId, string acknowledgeNote) { var alarm = await _alarmRepository.GetByIdAsync(alarmId); if (alarm == null) { return false; } alarm.AlarmStatus = AlarmStatus.Acknowledged; alarm.AcknowledgeNote = acknowledgeNote; alarm.AcknowledgedTime = DateTime.Now; alarm.UpdateTime = DateTime.Now; return await _alarmRepository.UpdateAsync(alarm) != null; } public async Task GetAlarmStatisticsAsync(DateTime date) { return await _alarmRepository.GetAlarmStatisticsAsync(date); } public async Task> GetCriticalAlarmsAsync() { return await _alarmRepository.GetBySeverityAsync(AlarmSeverity.Critical); } public async Task> GetDeviceAlarmsAsync(int deviceId, int days = 7) { var startDate = DateTime.Now.AddDays(-days); var endDate = DateTime.Now; return await _alarmRepository.GetByDeviceAndDateRangeAsync(deviceId, startDate, endDate); } } }