TaskTemplateRepository.cs 3.21 KB
using Microsoft.EntityFrameworkCore;
using Rcs.Domain.Entities;
using Rcs.Domain.Repositories;
using Rcs.Infrastructure.DB.MsSql;

namespace Rcs.Infrastructure.DB.Repositories
{
    public class TaskTemplateRepository : Repository<TaskTemplate>, ITaskTemplateRepository
    {
        public TaskTemplateRepository(AppDbContext context) : base(context)
        {
        }

        public async Task<TaskTemplate?> GetByTemplateCodeAsync(
            string templateCode,
            CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .FirstOrDefaultAsync(t => t.TemplateCode == templateCode, cancellationToken);
        }

        public async Task<IEnumerable<TaskTemplate>> GetEnabledAsync(
            CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Where(t => t.IsEnabled)
                .OrderBy(t => t.TemplateCode)
                .ToListAsync(cancellationToken);
        }

        public async Task<IEnumerable<TaskTemplate>> GetByRobotTypeAsync(
            RobotType robotType,
            CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Where(t => t.RobotType == robotType)
                .OrderBy(t => t.TemplateCode)
                .ToListAsync(cancellationToken);
        }

        public async Task<TaskTemplate?> GetWithStepsAsync(
            Guid templateId,
            CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Include(t => t.TaskSteps)
                .FirstOrDefaultAsync(t => t.TemplateId == templateId, cancellationToken);
        }

        public async Task<TaskTemplate?> GetWithStepsByCodeAsync(
            string templateCode,
            CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Include(t => t.TaskSteps)
                .FirstOrDefaultAsync(t => t.TemplateCode == templateCode, cancellationToken);
        }

        public async Task<TaskTemplate?> GetWithFullDetailsAsync(
            Guid templateId,
            CancellationToken cancellationToken = default)
        {
            return await _dbSet
                .Include(t => t.TaskSteps)
                    .ThenInclude(s => s.Properties)
                        .ThenInclude(p => p.Actions)
                .FirstOrDefaultAsync(t => t.TemplateId == templateId, cancellationToken);
        }

        /// <summary>
        /// 获取指定机器人类型和制造商的默认模板
        /// @author zzy
        /// </summary>
        public async Task<TaskTemplate?> GetDefaultTemplateAsync(
            RobotType robotType,
            string? manufacturer,
            Guid? excludeTemplateId = null,
            CancellationToken cancellationToken = default)
        {
            var query = _dbSet.Where(t =>
                t.RobotType == robotType &&
                t.Manufacturer == manufacturer &&
                t.IsDefault);

            if (excludeTemplateId.HasValue)
            {
                query = query.Where(t => t.TemplateId != excludeTemplateId.Value);
            }

            return await query.FirstOrDefaultAsync(cancellationToken);
        }
    }
}