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.

349 lines
12 KiB
C#

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Haoliang.Models.DataCollection;
using Haoliang.Data;
using Haoliang.Data.Repositories;
using Haoliang.Data.Entities;
namespace Haoliang.Data.Repositories
{
public interface ICollectionTaskRepository : IRepository<CollectionTask>
{
Task<IEnumerable<CollectionTask>> GetPendingTasksAsync();
Task<IEnumerable<CollectionTask>> GetRunningTasksAsync();
Task<IEnumerable<CollectionTask>> GetTasksByDeviceIdAsync(int deviceId);
Task<IEnumerable<CollectionTask>> GetFailedTasksAsync(int retryCount = 3);
Task<CollectionTask> GetNextPendingTaskAsync();
Task<bool> MarkTaskCompletedAsync(int taskId, bool isSuccess, string errorMessage = null);
Task<bool> MarkTaskRunningAsync(int taskId);
Task<int> CountPendingTasksAsync();
Task<int> CountFailedTasksAsync();
Task<decimal> GetTaskSuccessRateAsync(int hours = 24);
}
public class CollectionTaskRepository : Repository<CollectionTask>, ICollectionTaskRepository
{
private readonly CNCDbContext _context;
public CollectionTaskRepository(CNCDbContext context) : base(context)
{
_context = context;
}
public async Task<IEnumerable<CollectionTask>> GetPendingTasksAsync()
{
return await _context.CollectionTasks
.Where(ct => ct.Status == "Pending")
.OrderBy(ct => ct.ScheduledTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionTask>> GetRunningTasksAsync()
{
return await _context.CollectionTasks
.Where(ct => ct.Status == "Running")
.OrderBy(ct => ct.StartTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionTask>> GetTasksByDeviceIdAsync(int deviceId)
{
return await _context.CollectionTasks
.Where(ct => ct.DeviceId == deviceId)
.OrderByDescending(ct => ct.ScheduledTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionTask>> GetFailedTasksAsync(int retryCount = 3)
{
return await _context.CollectionTasks
.Where(ct => ct.Status == "Failed" && ct.RetryCount >= retryCount)
.OrderByDescending(ct => ct.ScheduledTime)
.ToListAsync();
}
public async Task<CollectionTask> GetNextPendingTaskAsync()
{
return await _context.CollectionTasks
.Where(ct => ct.Status == "Pending" && ct.ScheduledTime <= DateTime.Now)
.OrderBy(ct => ct.ScheduledTime)
.FirstOrDefaultAsync();
}
public async Task<bool> MarkTaskCompletedAsync(int taskId, bool isSuccess, string errorMessage = null)
{
var task = await GetByIdAsync(taskId);
if (task != null)
{
task.Status = isSuccess ? "Completed" : "Failed";
task.EndTime = DateTime.Now;
task.IsSuccess = isSuccess;
if (!isSuccess)
{
task.ErrorMessage = errorMessage;
task.RetryCount++;
}
Update(task);
await SaveAsync();
return true;
}
return false;
}
public async Task<bool> MarkTaskRunningAsync(int taskId)
{
var task = await GetByIdAsync(taskId);
if (task != null)
{
task.Status = "Running";
task.StartTime = DateTime.Now;
Update(task);
await SaveAsync();
return true;
}
return false;
}
public async Task<int> CountPendingTasksAsync()
{
return await _context.CollectionTasks
.CountAsync(ct => ct.Status == "Pending");
}
public async Task<int> CountFailedTasksAsync()
{
return await _context.CollectionTasks
.CountAsync(ct => ct.Status == "Failed");
}
public async Task<decimal> GetTaskSuccessRateAsync(int hours = 24)
{
var startTime = DateTime.Now.AddHours(-hours);
var tasks = await _context.CollectionTasks
.Where(ct => ct.ScheduledTime >= startTime)
.ToListAsync();
if (tasks.Any())
{
var successCount = tasks.Count(ct => ct.IsSuccess);
return (decimal)successCount / tasks.Count * 100;
}
return 0;
}
}
public interface ICollectionResultRepository : IRepository<CollectionResult>
{
Task<IEnumerable<CollectionResult>> GetResultsByDeviceIdAsync(int deviceId);
Task<IEnumerable<CollectionResult>> GetResultsByDateRangeAsync(DateTime startDate, DateTime endDate);
Task<IEnumerable<CollectionResult>> GetFailedResultsAsync(int deviceId = 0);
Task<CollectionResult> GetLatestResultAsync(int deviceId);
Task<int> CountResultsAsync(int deviceId = 0);
Task<int> CountFailedResultsAsync(int deviceId = 0);
Task<decimal> GetAverageResponseTimeAsync(int deviceId = 0);
Task<long> GetTotalDataSizeAsync(int deviceId = 0);
Task<bool> DeleteOldResultsAsync(int keepDays = 30);
}
public class CollectionResultRepository : Repository<CollectionResult>, ICollectionResultRepository
{
private readonly CNCDbContext _context;
public CollectionResultRepository(CNCDbContext context) : base(context)
{
_context = context;
}
public async Task<IEnumerable<CollectionResult>> GetResultsByDeviceIdAsync(int deviceId)
{
return await _context.CollectionResults
.Where(cr => cr.DeviceId == deviceId)
.OrderByDescending(cr => cr.CollectionTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionResult>> GetResultsByDateRangeAsync(DateTime startDate, DateTime endDate)
{
return await _context.CollectionResults
.Where(cr => cr.CollectionTime >= startDate && cr.CollectionTime <= endDate)
.OrderByDescending(cr => cr.CollectionTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionResult>> GetFailedResultsAsync(int deviceId = 0)
{
var query = _context.CollectionResults.Where(cr => !cr.IsSuccess);
if (deviceId > 0)
{
query = query.Where(cr => cr.DeviceId == deviceId);
}
return await query
.OrderByDescending(cr => cr.CollectionTime)
.ToListAsync();
}
public async Task<CollectionResult> GetLatestResultAsync(int deviceId)
{
return await _context.CollectionResults
.Where(cr => cr.DeviceId == deviceId)
.OrderByDescending(cr => cr.CollectionTime)
.FirstOrDefaultAsync();
}
public async Task<int> CountResultsAsync(int deviceId = 0)
{
var query = _context.CollectionResults.AsQueryable();
if (deviceId > 0)
{
query = query.Where(cr => cr.DeviceId == deviceId);
}
return await query.CountAsync();
}
public async Task<int> CountFailedResultsAsync(int deviceId = 0)
{
var query = _context.CollectionResults.Where(cr => !cr.IsSuccess);
if (deviceId > 0)
{
query = query.Where(cr => cr.DeviceId == deviceId);
}
return await query.CountAsync();
}
public async Task<decimal> GetAverageResponseTimeAsync(int deviceId = 0)
{
var query = _context.CollectionResults.Where(cr => cr.IsSuccess);
if (deviceId > 0)
{
query = query.Where(cr => cr.DeviceId == deviceId);
}
var results = await query.ToListAsync();
if (results.Any())
{
return (decimal)results.Average(cr => cr.ResponseTime);
}
return 0;
}
public async Task<long> GetTotalDataSizeAsync(int deviceId = 0)
{
var query = _context.CollectionResults.Where(cr => cr.IsSuccess);
if (deviceId > 0)
{
query = query.Where(cr => cr.DeviceId == deviceId);
}
var results = await query.ToListAsync();
return results.Sum(cr => cr.DataSize ?? 0);
}
public async Task<bool> DeleteOldResultsAsync(int keepDays = 30)
{
var cutoffDate = DateTime.Now.AddDays(-keepDays);
var oldResults = await _context.CollectionResults
.Where(cr => cr.CollectionTime < cutoffDate)
.ToListAsync();
if (oldResults.Any())
{
RemoveRange(oldResults);
await SaveAsync();
return true;
}
return false;
}
}
public interface ICollectionLogRepository : IRepository<CollectionLog>
{
Task<IEnumerable<CollectionLog>> GetLogsByLevelAsync(LogLevel logLevel);
Task<IEnumerable<CollectionLog>> GetLogsByDeviceIdAsync(int deviceId);
Task<IEnumerable<CollectionLog>> GetLogsByDateRangeAsync(DateTime startDate, DateTime endDate);
Task<IEnumerable<CollectionLog>> GetErrorLogsAsync();
Task<int> CountLogsByLevelAsync(LogLevel logLevel);
Task<bool> DeleteOldLogsAsync(int keepDays = 90);
}
public class CollectionLogRepository : Repository<CollectionLog>, ICollectionLogRepository
{
private readonly CNCDbContext _context;
public CollectionLogRepository(CNCDbContext context) : base(context)
{
_context = context;
}
public async Task<IEnumerable<CollectionLog>> GetLogsByLevelAsync(LogLevel logLevel)
{
return await _context.CollectionLogs
.Where(cl => cl.LogLevel == logLevel)
.OrderByDescending(cl => cl.LogTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionLog>> GetLogsByDeviceIdAsync(int deviceId)
{
return await _context.CollectionLogs
.Where(cl => cl.DeviceId == deviceId)
.OrderByDescending(cl => cl.LogTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionLog>> GetLogsByDateRangeAsync(DateTime startDate, DateTime endDate)
{
return await _context.CollectionLogs
.Where(cl => cl.LogTime >= startDate && cl.LogTime <= endDate)
.OrderByDescending(cl => cl.LogTime)
.ToListAsync();
}
public async Task<IEnumerable<CollectionLog>> GetErrorLogsAsync()
{
return await _context.CollectionLogs
.Where(cl => cl.LogLevel == LogLevel.Error || cl.LogLevel == LogLevel.Critical)
.OrderByDescending(cl => cl.LogTime)
.ToListAsync();
}
public async Task<int> CountLogsByLevelAsync(LogLevel logLevel)
{
return await _context.CollectionLogs
.CountAsync(cl => cl.LogLevel == logLevel);
}
public async Task<bool> DeleteOldLogsAsync(int keepDays = 90)
{
var cutoffDate = DateTime.Now.AddDays(-keepDays);
var oldLogs = await _context.CollectionLogs
.Where(cl => cl.LogTime < cutoffDate)
.ToListAsync();
if (oldLogs.Any())
{
RemoveRange(oldLogs);
await SaveAsync();
return true;
}
return false;
}
}
}