using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.Common.Domain; using PARR.DAL.Contracts; using PARR.DAL.Models.Job; using PARR.DAL.Services.Interfaces.Job; using PARR.TemplateMatcher.Services.Implemetaions; using PARR.TemplateMatcher.Services.Interfaces; namespace PARR.TemplateMatcher { internal class TemplateMatcher : ITemplateMatcher { private readonly ILogger logger; private readonly IJobService jobService; private readonly IEnumerable synchronizers; // Получаем все стратегии public TemplateMatcher( ILogger logger, IJobService jobService, IEnumerable synchronizers ) { this.logger = logger; this.jobService = jobService; this.synchronizers = synchronizers; } public async Task SyncTemplatesForJob(Guid jobId, HistoryInitiator initiator) { logger.LogDebug("Начало синхронизации шаблонов для JobId {JobId}", jobId); var job = await GetJobWithGroupAndAutoControlAsync(jobId); if (job == null) { logger.LogError("Job с Id {JobId} не найден.", jobId); return; } // Проверяем, является ли Job "групповым" bool isGroupJob = job.Group != null && job.Group.GroupType?.Code == JobGroupTypesEnum.Group; if (isGroupJob && job.Group.GroupingUnitFieldId.HasValue) { logger.LogInformation("Job {JobId} является групповым. Передаём в GroupedSynchronizer.", jobId); // Находим нужный синхронизатор var synchronizer = synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer); if (synchronizer != null) { // Так как Job групповой, вызываем синхронизацию для его JobGroup await synchronizer.SyncTemplatesForJobGroupAsync(job.GroupId, initiator); } else { logger.LogError("GroupedTemplateSynchronizer не найден."); } return; // Завершаем выполнение для группового Job } else { logger.LogInformation("Job {JobId} является обычным. Передаём в SimpleSynchronizer.", jobId); // Находим нужный синхронизатор var synchronizer = synchronizers.FirstOrDefault(s => s is SimpleTemplateSynchronizer); if (synchronizer != null) { await synchronizer.SyncTemplatesForJobAsync(jobId, initiator); } else { logger.LogError("SimpleTemplateSynchronizer не найден."); } return; // Завершаем выполнение для обычного Job } } public async Task SyncTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator) { logger.LogDebug("Начало синхронизации шаблонов для JobGroup {JobGroupId}", jobGroupId); var synchronizer = synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer); if (synchronizer != null) { await synchronizer.SyncTemplatesForJobGroupAsync(jobGroupId, initiator); } else { logger.LogError("GroupedTemplateSynchronizer не найден."); } } public async Task UpdateTemplatesForJob(Guid jobId, HistoryInitiator initiator) { logger.LogDebug("Начало обновления шаблонов для JobId {JobId}", jobId); var job = await GetJobWithGroupAndAutoControlAsync(jobId); if (job == null) { logger.LogError("Job с Id {JobId} не найден.", jobId); return; } // Проверяем, является ли Job "групповым" bool isGroupJob = job.Group != null && job.Group.GroupType?.Code == JobGroupTypesEnum.Group; if (isGroupJob && job.Group.GroupingUnitFieldId.HasValue) { logger.LogInformation("Job {JobId} является групповым. Передаём в GroupedSynchronizer для Update.", jobId); // Находим нужный синхронизатор var synchronizer = synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer); if (synchronizer != null) { // Вызов UpdateTemplatesForJobAsync для GroupedTemplateSynchronizer (который делает предупреждение) await synchronizer.UpdateTemplatesForJobAsync(jobId, initiator); // Или, возможно, имеет смысл вызвать полную синхронизацию для группы: // await synchronizer.SyncTemplatesForJobGroupAsync(job.GroupId, initiator); } else { logger.LogError("GroupedTemplateSynchronizer не найден."); } return; // Завершаем выполнение } else { logger.LogInformation("Job {JobId} является обычным. Передаём в SimpleSynchronizer для Update.", jobId); // Находим нужный синхронизатор var synchronizer = synchronizers.FirstOrDefault(s => s is SimpleTemplateSynchronizer); if (synchronizer != null) { await synchronizer.UpdateTemplatesForJobAsync(jobId, initiator); } else { logger.LogError("SimpleTemplateSynchronizer не найден."); } return; // Завершаем выполнение } } // --- Вспомогательные методы --- private async Task GetJobWithGroupAndAutoControlAsync(Guid jobId) { return await jobService.Get() .AsNoTracking() // Добавлено .Include(j => j.Group) .ThenInclude(j => j.GroupType) .Include(j => j.AutoControl) .FirstOrDefaultAsync(j => j.Id == jobId); } } }