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.
132 lines
4.7 KiB
C#
132 lines
4.7 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.Repositories;
|
|
|
|
namespace Haoliang.Data.Repositories
|
|
{
|
|
public interface ICollectionTaskRepository : IRepository<CollectionTask>
|
|
{
|
|
Task<IEnumerable<CollectionTask>> GetPendingTasksAsync();
|
|
Task<IEnumerable<CollectionTask>> GetFailedTasksAsync();
|
|
Task<CollectionTask> GetByDeviceAsync(int deviceId);
|
|
Task<bool> MarkTaskCompletedAsync(int taskId, bool isSuccess, string result);
|
|
Task<IEnumerable<CollectionTask>> GetTasksByDateAsync(DateTime date);
|
|
Task<IEnumerable<CollectionTask>> GetRunningTasksAsync();
|
|
Task<CollectionTaskStatistics> GetTaskStatisticsAsync(DateTime date);
|
|
Task<bool> HasPendingTasksAsync(int deviceId);
|
|
Task<IEnumerable<CollectionTask>> GetTasksByStatusAsync(string status);
|
|
}
|
|
|
|
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(t => t.Status == "Pending")
|
|
.OrderBy(t => t.ScheduledTime)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<IEnumerable<CollectionTask>> GetFailedTasksAsync()
|
|
{
|
|
return await _context.CollectionTasks
|
|
.Where(t => t.Status == "Failed")
|
|
.OrderByDescending(t => t.CreatedAt)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<CollectionTask> GetByDeviceAsync(int deviceId)
|
|
{
|
|
return await _context.CollectionTasks
|
|
.Where(t => t.DeviceId == deviceId)
|
|
.OrderByDescending(t => t.CreatedAt)
|
|
.FirstOrDefaultAsync();
|
|
}
|
|
|
|
public async Task<bool> MarkTaskCompletedAsync(int taskId, bool isSuccess, string result)
|
|
{
|
|
var task = await GetByIdAsync(taskId);
|
|
if (task == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
task.Status = isSuccess ? "Completed" : "Failed";
|
|
task.Result = result;
|
|
task.CompletedAt = DateTime.Now;
|
|
|
|
await SaveAsync();
|
|
return true;
|
|
}
|
|
|
|
public async Task<IEnumerable<CollectionTask>> GetTasksByDateAsync(DateTime date)
|
|
{
|
|
var startOfDay = date.Date;
|
|
var endOfDay = startOfDay.AddDays(1);
|
|
|
|
return await _context.CollectionTasks
|
|
.Where(t => t.CreatedAt >= startOfDay &&
|
|
t.CreatedAt < endOfDay)
|
|
.OrderBy(t => t.ScheduledTime)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<IEnumerable<CollectionTask>> GetRunningTasksAsync()
|
|
{
|
|
return await _context.CollectionTasks
|
|
.Where(t => t.Status == "Running")
|
|
.OrderBy(t => t.ScheduledTime)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<CollectionTaskStatistics> GetTaskStatisticsAsync(DateTime date)
|
|
{
|
|
var startOfDay = date.Date;
|
|
var endOfDay = startOfDay.AddDays(1);
|
|
|
|
var tasks = await _context.CollectionTasks
|
|
.Where(t => t.CreatedAt >= startOfDay &&
|
|
t.CreatedAt < endOfDay)
|
|
.ToListAsync();
|
|
|
|
var stats = new CollectionTaskStatistics
|
|
{
|
|
Date = date,
|
|
TotalTasks = tasks.Count,
|
|
PendingTasks = tasks.Count(t => t.Status == "Pending"),
|
|
RunningTasks = tasks.Count(t => t.Status == "Running"),
|
|
CompletedTasks = tasks.Count(t => t.Status == "Completed"),
|
|
FailedTasks = tasks.Count(t => t.Status == "Failed"),
|
|
DeviceTasks = tasks.GroupBy(t => t.DeviceId)
|
|
.ToDictionary(g => g.Key, g => g.Count())
|
|
};
|
|
|
|
return stats;
|
|
}
|
|
|
|
public async Task<bool> HasPendingTasksAsync(int deviceId)
|
|
{
|
|
return await _context.CollectionTasks
|
|
.AnyAsync(t => t.DeviceId == deviceId && t.Status == "Pending");
|
|
}
|
|
|
|
public async Task<IEnumerable<CollectionTask>> GetTasksByStatusAsync(string status)
|
|
{
|
|
return await _context.CollectionTasks
|
|
.Where(t => t.Status == status)
|
|
.OrderBy(t => t.ScheduledTime)
|
|
.ToListAsync();
|
|
}
|
|
}
|
|
} |