RobotTaskRepository.cs 3.12 KB
using Microsoft.EntityFrameworkCore;
using Rcs.Domain.Entities;
using Rcs.Domain.Repositories;
using Rcs.Infrastructure.DB.MsSql;
using TaskStatus = Rcs.Domain.Entities.TaskStatus;

namespace Rcs.Infrastructure.DB.Repositories
{
    /// <summary>
    /// 主任务仓储实现
    /// @author zzy
    /// </summary>
    public class RobotTaskRepository : Repository<RobotTask>, IRobotTaskRepository
    {
        private IRobotTaskRepository _robotTaskRepositoryImplementation;

        public RobotTaskRepository(AppDbContext context) : base(context)
        {
        }

        public async Task<RobotTask?> GetByTaskCodeAsync(string taskCode, CancellationToken cancellationToken = default)
        {
            return await _dbSet.FirstOrDefaultAsync(t => t.TaskCode == taskCode, cancellationToken);
        }

        public async Task<IEnumerable<RobotTask>> GetByRobotIdAsync(Guid robotId, CancellationToken cancellationToken = default)
        {
            return await _dbSet.Where(t => t.RobotId == robotId).ToListAsync(cancellationToken);
        }

        public async Task<IEnumerable<RobotTask>> GetByStatusAsync(TaskStatus status, CancellationToken cancellationToken = default)
        {
            return await _dbSet.Where(t => t.Status == status).ToListAsync(cancellationToken);
        }

        public async Task<IEnumerable<RobotTask>> GetnProgressByRobotIdAsync(Guid robotId, CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Where(t => t.RobotId == robotId
                    && t.Status != TaskStatus.Pending
                    && t.Status != TaskStatus.Assigned
                    && t.Status != TaskStatus.Completed
                    && t.Status != TaskStatus.Cancelled)
                .ToListAsync(cancellationToken);
        }

        public async Task<IEnumerable<RobotTask>> GetPendingTasksAsync(CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Where(t => t.Status == TaskStatus.Pending)
                .OrderBy(t => t.Priority)
                .ThenBy(t => t.CreatedAt)
                .ToListAsync(cancellationToken);
        }

        public async Task<RobotTask?> GetByIdWithDetailsAsync(Guid taskId, CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Include(t => t.Robot)
                .Include(t => t.BeginLocation).ThenInclude(l => l.MapNode)
                .Include(t => t.BeginLocation).ThenInclude(l => l.StorageArea)
                .Include(t => t.EndLocation).ThenInclude(l => l.MapNode)
                .Include(t => t.EndLocation).ThenInclude(l => l.StorageArea)
                .Include(t => t.TaskTemplate)
                .FirstOrDefaultAsync(t => t.TaskId == taskId, cancellationToken);
        }

        /// <summary>
        /// 根据关联单据获取任务
        /// @author zzy
        /// </summary>
        public async Task<RobotTask?> GetByRelationAsync(string relation, CancellationToken cancellationToken = default)
        {
            return await _dbSet.FirstOrDefaultAsync(t => t.Relation == relation, cancellationToken);
        }
    }
}