RobotTaskRepository.cs 3.74 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).Include(t =>t.SubTasks).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);
        }

        /// <summary>
        /// 获取包含完整详情的任务(包含机器人、起点/终点库位、地图节点、任务模板)
        /// @author zzy
        /// </summary>
        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)
                        .ThenInclude(n => n.StorageLocationType)
                .Include(t => t.BeginLocation)
                        .ThenInclude(l => l.StorageArea)
                .Include(t => t.EndLocation)
                    .ThenInclude(l => l.MapNode)
                        .ThenInclude(n => n.StorageLocationType)
                .Include(t => t.EndLocation)
                    .ThenInclude(l => l.StorageArea)
                .Include(t => t.SubTasks)        
                    .ThenInclude(st => st.EndNode)
                .Include(t => t.SubTasks)        
                    .ThenInclude(st => st.BeginNode)
                .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);
        }
    }
}