Files
parr_api/PARR.TemplateMatcher/TemplateMatcher.cs

152 lines
6.8 KiB
C#
Raw Normal View History

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<TemplateMatcher> logger;
private readonly IJobService jobService;
private readonly IEnumerable<ITemplateSynchronizer> synchronizers; // Получаем все стратегии
public TemplateMatcher(
ILogger<TemplateMatcher> logger,
IJobService jobService,
IEnumerable<ITemplateSynchronizer> 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<Job?> 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);
}
}
}