You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
7.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Haoliang.Models.System;
namespace Haoliang.Core.Services
{
public interface IAlarmService
{
Task<Alarm> CreateAlarmAsync(Alarm alarm);
Task<Alarm> UpdateAlarmAsync(int alarmId, Alarm alarm);
Task<bool> DeleteAlarmAsync(int alarmId);
Task<Alarm> GetAlarmByIdAsync(int alarmId);
Task<IEnumerable<Alarm>> GetAllAlarmsAsync();
Task<IEnumerable<Alarm>> GetAlarmsByDeviceAsync(int deviceId);
Task<IEnumerable<Alarm>> GetAlarmsByTypeAsync(AlarmType type);
Task<IEnumerable<Alarm>> GetActiveAlarmsAsync();
Task<IEnumerable<Alarm>> GetAlarmsByDateRangeAsync(DateTime startDate, DateTime endDate);
Task<bool> ResolveAlarmAsync(int alarmId, string resolutionNote);
Task<bool> AcknowledgeAlarmAsync(int alarmId, string acknowledgeNote);
Task<AlarmStatistics> GetAlarmStatisticsAsync(DateTime date);
Task<IEnumerable<Alarm>> GetCriticalAlarmsAsync();
Task<IEnumerable<Alarm>> GetDeviceAlarmsAsync(int deviceId, int days = 7);
}
public interface IAlarmRuleService
{
Task<AlarmRule> CreateAlarmRuleAsync(AlarmRule rule);
Task<AlarmRule> UpdateAlarmRuleAsync(int ruleId, AlarmRule rule);
Task<bool> DeleteAlarmRuleAsync(int ruleId);
Task<AlarmRule> GetAlarmRuleByIdAsync(int ruleId);
Task<IEnumerable<AlarmRule>> GetAllAlarmRulesAsync();
Task<IEnumerable<AlarmRule>> GetActiveAlarmRulesAsync();
Task<IEnumerable<AlarmRule>> GetRulesByDeviceAsync(int deviceId);
Task<bool> EvaluateAlarmRuleAsync(AlarmRule rule, DeviceCurrentStatus status);
Task<Alarm> GenerateAlarmFromRuleAsync(AlarmRule rule, DeviceCurrentStatus status);
Task TestAlarmRuleAsync(int ruleId);
}
public interface IAlarmNotificationService
{
Task SendAlarmNotificationAsync(Alarm alarm);
Task SendBulkAlarmNotificationsAsync(IEnumerable<Alarm> alarms);
Task<bool> SendSmsNotificationAsync(string phoneNumber, string message);
Task<bool> SendEmailNotificationAsync(string email, string subject, string message);
Task<bool> SendWechatNotificationAsync(string openId, string message);
Task<IEnumerable<AlarmNotification>> GetNotificationHistoryAsync(DateTime startDate, DateTime endDate);
Task<bool> ConfigureNotificationChannelAsync(NotificationChannel channel);
Task<IEnumerable<NotificationChannel>> 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<Alarm> 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<Alarm> 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<bool> DeleteAlarmAsync(int alarmId)
{
return await _alarmRepository.DeleteAsync(alarmId);
}
public async Task<Alarm> GetAlarmByIdAsync(int alarmId)
{
return await _alarmRepository.GetByIdAsync(alarmId);
}
public async Task<IEnumerable<Alarm>> GetAllAlarmsAsync()
{
return await _alarmRepository.GetAllAsync();
}
public async Task<IEnumerable<Alarm>> GetAlarmsByDeviceAsync(int deviceId)
{
return await _alarmRepository.GetByDeviceIdAsync(deviceId);
}
public async Task<IEnumerable<Alarm>> GetAlarmsByTypeAsync(AlarmType type)
{
return await _alarmRepository.GetByAlarmTypeAsync(type);
}
public async Task<IEnumerable<Alarm>> GetActiveAlarmsAsync()
{
return await _alarmRepository.GetByStatusAsync(AlarmStatus.Active);
}
public async Task<IEnumerable<Alarm>> GetAlarmsByDateRangeAsync(DateTime startDate, DateTime endDate)
{
return await _alarmRepository.GetByDateRangeAsync(startDate, endDate);
}
public async Task<bool> 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<bool> 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<AlarmStatistics> GetAlarmStatisticsAsync(DateTime date)
{
return await _alarmRepository.GetAlarmStatisticsAsync(date);
}
public async Task<IEnumerable<Alarm>> GetCriticalAlarmsAsync()
{
return await _alarmRepository.GetBySeverityAsync(AlarmSeverity.Critical);
}
public async Task<IEnumerable<Alarm>> GetDeviceAlarmsAsync(int deviceId, int days = 7)
{
var startDate = DateTime.Now.AddDays(-days);
var endDate = DateTime.Now;
return await _alarmRepository.GetByDeviceAndDateRangeAsync(deviceId, startDate, endDate);
}
}
}