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