153 lines
6.9 KiB
C#
153 lines
6.9 KiB
C#
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.Implementations;
|
||
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);
|
||
}
|
||
}
|
||
} |