using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Haoliang.Models.System; using Haoliang.Data.Repositories; namespace Haoliang.Data.Repositories { public interface IAlarmRepository : IRepository { Task> GetActiveAlarmsAsync(); Task> GetAlarmsByDeviceIdAsync(int deviceId); Task> GetAlarmsByTypeAsync(string alarmType); Task> GetAlarmsByLevelAsync(string alarmLevel); Task> GetUnresolvedAlarmsAsync(); Task> GetAlarmsByDateRangeAsync(DateTime startDate, DateTime endDate); Task CountActiveAlarmsAsync(); Task CountAlarmsByTypeAsync(string alarmType); Task GetAlarmResolutionRateAsync(DateTime startDate, DateTime endDate); Task ResolveAlarmAsync(int alarmId, string resolutionNote, string resolvedBy); Task DeleteOldAlarmsAsync(int keepDays = 90); } public class AlarmRepository : Repository, IAlarmRepository { private readonly CNCDbContext _context; public AlarmRepository(CNCDbContext context) : base(context) { _context = context; } public async Task> GetActiveAlarmsAsync() { return await _context.Alarms .Where(a => !a.IsResolved) .OrderByDescending(a => a.OccurrenceTime) .ToListAsync(); } public async Task> GetAlarmsByDeviceIdAsync(int deviceId) { return await _context.Alarms .Where(a => a.DeviceId == deviceId) .OrderByDescending(a => a.OccurrenceTime) .ToListAsync(); } public async Task> GetAlarmsByTypeAsync(string alarmType) { return await _context.Alarms .Where(a => a.AlarmType == alarmType) .OrderByDescending(a => a.OccurrenceTime) .ToListAsync(); } public async Task> GetAlarmsByLevelAsync(string alarmLevel) { return await _context.Alarms .Where(a => a.AlarmLevel == alarmLevel) .OrderByDescending(a => a.OccurrenceTime) .ToListAsync(); } public async Task> GetUnresolvedAlarmsAsync() { return await GetActiveAlarmsAsync(); } public async Task> GetAlarmsByDateRangeAsync(DateTime startDate, DateTime endDate) { return await _context.Alarms .Where(a => a.OccurrenceTime >= startDate && a.OccurrenceTime <= endDate) .OrderByDescending(a => a.OccurrenceTime) .ToListAsync(); } public async Task CountActiveAlarmsAsync() { return await _context.Alarms .CountAsync(a => !a.IsResolved); } public async Task CountAlarmsByTypeAsync(string alarmType) { return await _context.Alarms .CountAsync(a => a.AlarmType == alarmType); } public async Task GetAlarmResolutionRateAsync(DateTime startDate, DateTime endDate) { var alarms = await GetAlarmsByDateRangeAsync(startDate, endDate); if (alarms.Any()) { var resolvedCount = alarms.Count(a => a.IsResolved); return (decimal)resolvedCount / alarms.Count * 100; } return 0; } public async Task ResolveAlarmAsync(int alarmId, string resolutionNote, string resolvedBy) { var alarm = await GetByIdAsync(alarmId); if (alarm != null) { alarm.IsResolved = true; alarm.ResolutionTime = DateTime.Now; alarm.ResolutionNote = resolutionNote; Update(alarm); await SaveAsync(); return true; } return false; } public async Task DeleteOldAlarmsAsync(int keepDays = 90) { var cutoffDate = DateTime.Now.AddDays(-keepDays); var oldAlarms = await _context.Alarms .Where(a => a.OccurrenceTime < cutoffDate) .ToListAsync(); if (oldAlarms.Any()) { RemoveRange(oldAlarms); await SaveAsync(); return true; } return false; } } public interface IAlarmRuleRepository : IRepository { Task GetByNameAsync(string ruleName); Task> GetEnabledRulesAsync(); Task> GetRulesByDeviceIdAsync(int deviceId); Task RuleNameExistsAsync(string ruleName); Task EnableRuleAsync(int ruleId); Task DisableRuleAsync(int ruleId); } public class AlarmRuleRepository : Repository, IAlarmRuleRepository { private readonly CNCDbContext _context; public AlarmRuleRepository(CNCDbContext context) : base(context) { _context = context; } public async Task GetByNameAsync(string ruleName) { return await _context.AlarmRules .FirstOrDefaultAsync(ar => ar.RuleName == ruleName); } public async Task> GetEnabledRulesAsync() { return await _context.AlarmRules .Where(ar => ar.IsEnabled) .OrderBy(ar => ar.RuleName) .ToListAsync(); } public async Task> GetRulesByDeviceIdAsync(int deviceId) { return await _context.AlarmRules .Where(ar => ar.DeviceId == null || ar.DeviceId == deviceId) .OrderBy(ar => ar.RuleName) .ToListAsync(); } public async Task RuleNameExistsAsync(string ruleName) { return await _context.AlarmRules .AnyAsync(ar => ar.RuleName == ruleName); } public async Task EnableRuleAsync(int ruleId) { var rule = await GetByIdAsync(ruleId); if (rule != null) { rule.IsEnabled = true; rule.UpdatedAt = DateTime.Now; Update(rule); await SaveAsync(); return true; } return false; } public async Task DisableRuleAsync(int ruleId) { var rule = await GetByIdAsync(ruleId); if (rule != null) { rule.IsEnabled = false; rule.UpdatedAt = DateTime.Now; Update(rule); await SaveAsync(); return true; } return false; } } public interface ISystemConfigRepository : IRepository { Task GetByKeyAsync(string configKey); Task GetConfigValueAsync(string configKey); Task UpdateConfigValueAsync(string configKey, string configValue); Task> GetByCategoryAsync(string category); Task ConfigKeyExistsAsync(string configKey); } public class SystemConfigRepository : Repository, ISystemConfigRepository { private readonly CNCDbContext _context; public SystemConfigRepository(CNCDbContext context) : base(context) { _context = context; } public async Task GetByKeyAsync(string configKey) { return await _context.SystemConfig .FirstOrDefaultAsync(sc => sc.ConfigKey == configKey); } public async Task GetConfigValueAsync(string configKey) { var config = await GetByKeyAsync(configKey); return config?.ConfigValue; } public async Task UpdateConfigValueAsync(string configKey, string configValue) { var config = await GetByKeyAsync(configKey); if (config != null) { config.ConfigValue = configValue; config.UpdatedAt = DateTime.Now; Update(config); await SaveAsync(); return true; } return false; } public async Task> GetByCategoryAsync(string category) { return await _context.SystemConfig .Where(sc => sc.Description?.Contains(category) == true) .OrderBy(sc => sc.ConfigKey) .ToListAsync(); } public async Task ConfigKeyExistsAsync(string configKey) { return await _context.SystemConfig .AnyAsync(sc => sc.ConfigKey == configKey); } } public interface IStatisticRuleRepository : IRepository { Task GetByNameAsync(string ruleName); Task> GetEnabledRulesAsync(); Task RuleNameExistsAsync(string ruleName); Task EnableRuleAsync(int ruleId); Task DisableRuleAsync(int ruleId); } public class StatisticRuleRepository : Repository, IStatisticRuleRepository { private readonly CNCDbContext _context; public StatisticRuleRepository(CNCDbContext context) : base(context) { _context = context; } public async Task GetByNameAsync(string ruleName) { return await _context.StatisticRules .FirstOrDefaultAsync(sr => sr.RuleName == ruleName); } public async Task> GetEnabledRulesAsync() { return await _context.StatisticRules .Where(sr => sr.IsEnabled) .OrderBy(sr => sr.RuleName) .ToListAsync(); } public async Task RuleNameExistsAsync(string ruleName) { return await _context.StatisticRules .AnyAsync(sr => sr.RuleName == ruleName); } public async Task EnableRuleAsync(int ruleId) { var rule = await GetByIdAsync(ruleId); if (rule != null) { rule.IsEnabled = true; rule.UpdatedAt = DateTime.Now; Update(rule); await SaveAsync(); return true; } return false; } public async Task DisableRuleAsync(int ruleId) { var rule = await GetByIdAsync(ruleId); if (rule != null) { rule.IsEnabled = false; rule.UpdatedAt = DateTime.Now; Update(rule); await SaveAsync(); return true; } return false; } } }