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.
324 lines
12 KiB
C#
324 lines
12 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Haoliang.Core.Services;
|
|
using Haoliang.Models.System;
|
|
using Haoliang.Models.Device;
|
|
using Haoliang.Models.Common;
|
|
|
|
namespace Haoliang.Api.Controllers
|
|
{
|
|
[ApiController]
|
|
[Route("api/v1/[controller]")]
|
|
public class AlarmController : ControllerBase
|
|
{
|
|
private readonly IAlarmService _alarmService;
|
|
private readonly IAlarmRuleService _alarmRuleService;
|
|
private readonly IAlarmNotificationService _notificationService;
|
|
private readonly ILoggingService _loggingService;
|
|
|
|
public AlarmController(
|
|
IAlarmService alarmService,
|
|
IAlarmRuleService alarmRuleService,
|
|
IAlarmNotificationService notificationService,
|
|
ILoggingService loggingService)
|
|
{
|
|
_alarmService = alarmService;
|
|
_alarmRuleService = alarmRuleService;
|
|
_notificationService = notificationService;
|
|
_loggingService = loggingService;
|
|
}
|
|
|
|
[HttpGet]
|
|
public async Task<IActionResult> GetAllAlarms([FromQuery] AlarmType? type = null, [FromQuery] AlarmStatus? status = null)
|
|
{
|
|
try
|
|
{
|
|
IEnumerable<Alarm> alarms;
|
|
if (type.HasValue)
|
|
{
|
|
alarms = await _alarmService.GetAlarmsByTypeAsync(type.Value);
|
|
}
|
|
else if (status.HasValue)
|
|
{
|
|
alarms = await _alarmService.GetActiveAlarmsAsync();
|
|
}
|
|
else
|
|
{
|
|
alarms = await _alarmService.GetAllAlarmsAsync();
|
|
}
|
|
|
|
return Ok(ApiResponse.Ok(alarms));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to get alarms", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to get alarms"));
|
|
}
|
|
}
|
|
|
|
[HttpGet("{id}")]
|
|
public async Task<IActionResult> GetAlarm(int id)
|
|
{
|
|
try
|
|
{
|
|
var alarm = await _alarmService.GetAlarmByIdAsync(id);
|
|
if (alarm == null)
|
|
{
|
|
return NotFound(ApiResponse.NotFound("Alarm not found"));
|
|
}
|
|
return Ok(ApiResponse.Ok(alarm));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync($"Failed to get alarm {id}", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to get alarm"));
|
|
}
|
|
}
|
|
|
|
[HttpPost]
|
|
public async Task<IActionResult> CreateAlarm([FromBody] Alarm alarm)
|
|
{
|
|
try
|
|
{
|
|
var createdAlarm = await _alarmService.CreateAlarmAsync(alarm);
|
|
return Ok(ApiResponse.Ok(createdAlarm, "Alarm created successfully"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to create alarm", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to create alarm"));
|
|
}
|
|
}
|
|
|
|
[HttpPut("{id}")]
|
|
public async Task<IActionResult> UpdateAlarm(int id, [FromBody] Alarm alarm)
|
|
{
|
|
try
|
|
{
|
|
alarm.Id = id;
|
|
var updatedAlarm = await _alarmService.UpdateAlarmAsync(id, alarm);
|
|
if (updatedAlarm == null)
|
|
{
|
|
return NotFound(ApiResponse.NotFound("Alarm not found"));
|
|
}
|
|
return Ok(ApiResponse.Ok(updatedAlarm, "Alarm updated successfully"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync($"Failed to update alarm {id}", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to update alarm"));
|
|
}
|
|
}
|
|
|
|
[HttpDelete("{id}")]
|
|
public async Task<IActionResult> DeleteAlarm(int id)
|
|
{
|
|
try
|
|
{
|
|
var result = await _alarmService.DeleteAlarmAsync(id);
|
|
if (!result)
|
|
{
|
|
return NotFound(ApiResponse.NotFound("Alarm not found"));
|
|
}
|
|
return Ok(ApiResponse.Ok(null, "Alarm deleted successfully"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync($"Failed to delete alarm {id}", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to delete alarm"));
|
|
}
|
|
}
|
|
|
|
[HttpPost("{id}/resolve")]
|
|
public async Task<IActionResult> ResolveAlarm(int id, [FromBody] ResolveAlarmRequest request)
|
|
{
|
|
try
|
|
{
|
|
var result = await _alarmService.ResolveAlarmAsync(id, request.ResolutionNote);
|
|
if (!result)
|
|
{
|
|
return NotFound(ApiResponse.NotFound("Alarm not found"));
|
|
}
|
|
return Ok(ApiResponse.Ok(null, "Alarm resolved successfully"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync($"Failed to resolve alarm {id}", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to resolve alarm"));
|
|
}
|
|
}
|
|
|
|
[HttpPost("{id}/acknowledge")]
|
|
public async Task<IActionResult> AcknowledgeAlarm(int id, [FromBody] AcknowledgeAlarmRequest request)
|
|
{
|
|
try
|
|
{
|
|
var result = await _alarmService.AcknowledgeAlarmAsync(id, request.AcknowledgeNote);
|
|
if (!result)
|
|
{
|
|
return NotFound(ApiResponse.NotFound("Alarm not found"));
|
|
}
|
|
return Ok(ApiResponse.Ok(null, "Alarm acknowledged successfully"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync($"Failed to acknowledge alarm {id}", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to acknowledge alarm"));
|
|
}
|
|
}
|
|
|
|
[HttpGet("device/{deviceId}")]
|
|
public async Task<IActionResult> GetDeviceAlarms(int deviceId, [FromQuery] int days = 7)
|
|
{
|
|
try
|
|
{
|
|
var alarms = await _alarmService.GetDeviceAlarmsAsync(deviceId, days);
|
|
return Ok(ApiResponse.Ok(alarms));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync($"Failed to get alarms for device {deviceId}", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to get device alarms"));
|
|
}
|
|
}
|
|
|
|
[HttpGet("critical")]
|
|
public async Task<IActionResult> GetCriticalAlarms()
|
|
{
|
|
try
|
|
{
|
|
var alarms = await _alarmService.GetCriticalAlarmsAsync();
|
|
return Ok(ApiResponse.Ok(alarms));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to get critical alarms", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to get critical alarms"));
|
|
}
|
|
}
|
|
|
|
[HttpGet("statistics")]
|
|
public async Task<IActionResult> GetAlarmStatistics([FromQuery] DateTime date)
|
|
{
|
|
try
|
|
{
|
|
if (date == default)
|
|
date = DateTime.Today;
|
|
|
|
var statistics = await _alarmService.GetAlarmStatisticsAsync(date);
|
|
return Ok(ApiResponse.Ok(statistics));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to get alarm statistics", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to get alarm statistics"));
|
|
}
|
|
}
|
|
|
|
[HttpGet("date-range")]
|
|
public async Task<IActionResult> GetAlarmsByDateRange([FromQuery] DateTime startDate, [FromQuery] DateTime endDate)
|
|
{
|
|
try
|
|
{
|
|
var alarms = await _alarmService.GetAlarmsByDateRangeAsync(startDate, endDate);
|
|
return Ok(ApiResponse.Ok(alarms));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to get alarms by date range", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to get alarms by date range"));
|
|
}
|
|
}
|
|
|
|
[HttpPost("test-notification")]
|
|
public async Task<IActionResult> TestNotification([FromBody] TestNotificationRequest request)
|
|
{
|
|
try
|
|
{
|
|
var notification = new AlarmNotification
|
|
{
|
|
AlarmId = -1,
|
|
NotificationType = request.NotificationType.ToString(),
|
|
Subject = "Test notification",
|
|
Content = "Test notification",
|
|
IsSent = true,
|
|
SendTime = DateTime.Now,
|
|
Recipient = request.Recipient
|
|
};
|
|
|
|
await _notificationService.SendAlarmNotificationAsync(notification);
|
|
return Ok(ApiResponse.Ok(null, "Test notification sent successfully"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to send test notification", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to send test notification"));
|
|
}
|
|
}
|
|
|
|
[HttpGet("rules")]
|
|
public async Task<IActionResult> GetAlarmRules()
|
|
{
|
|
try
|
|
{
|
|
var rules = await _alarmRuleService.GetAllAlarmRulesAsync();
|
|
return Ok(ApiResponse.Ok(rules));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to get alarm rules", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to get alarm rules"));
|
|
}
|
|
}
|
|
|
|
[HttpPost("rules")]
|
|
public async Task<IActionResult> CreateAlarmRule([FromBody] AlarmRule rule)
|
|
{
|
|
try
|
|
{
|
|
var createdRule = await _alarmRuleService.CreateAlarmRuleAsync(rule);
|
|
return Ok(ApiResponse.Ok(createdRule, "Alarm rule created successfully"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync("Failed to create alarm rule", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to create alarm rule"));
|
|
}
|
|
}
|
|
|
|
[HttpPost("rules/{id}/test")]
|
|
public async Task<IActionResult> TestAlarmRule(int id)
|
|
{
|
|
try
|
|
{
|
|
await _alarmRuleService.TestAlarmRuleAsync(id);
|
|
return Ok(ApiResponse.Ok(null, "Alarm rule test completed"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await _loggingService.LogErrorAsync($"Failed to test alarm rule {id}", ex);
|
|
return StatusCode(500, ApiResponse.Error("Failed to test alarm rule"));
|
|
}
|
|
}
|
|
}
|
|
|
|
public class ResolveAlarmRequest
|
|
{
|
|
public string ResolutionNote { get; set; }
|
|
}
|
|
|
|
public class AcknowledgeAlarmRequest
|
|
{
|
|
public string AcknowledgeNote { get; set; }
|
|
}
|
|
|
|
public class TestNotificationRequest
|
|
{
|
|
public int DeviceId { get; set; }
|
|
public NotificationType NotificationType { get; set; }
|
|
public string Recipient { get; set; }
|
|
}
|
|
} |