feat(dal,templateMatcher): уточнена логика UnitFilterService, в TemplateMatcher добавлены методы синхронизации и обновлению существующих шаблонов по группе
This commit is contained in:
@@ -7,5 +7,6 @@ namespace PARR.TemplateMatcher
|
||||
Task SyncTemplatesForJob(Guid jobId, HistoryInitiator initiator);
|
||||
Task UpdateTemplatesForJob(Guid jobId, HistoryInitiator initiator);
|
||||
Task SyncTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator);
|
||||
Task UpdateTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,14 +93,14 @@ namespace PARR.TemplateMatcher
|
||||
switch (query.Action)
|
||||
{
|
||||
case TemplateMatcherActionEnum.Sync:
|
||||
// Создать недостающие шаблоны, привязать к нужному Job, включить/выключить по фильтрам
|
||||
await templateMatcherService.SyncTemplatesForJobGroup(query.Id, query.Initiator);
|
||||
break;
|
||||
|
||||
case TemplateMatcherActionEnum.Update:
|
||||
// Обновить существующие шаблоны: имя, привязка к Job, вкл/выкл по фильтрам
|
||||
//await templateMatcherService.UpdateTemplatesForJob(query.Id, query.Initiator);
|
||||
logger.LogWarning("Обработка EntityType JobGroup и TemplateMatcherActionEnum.Update не реализована. Id: {Id}, Action: {Action}", query.Id, query.Action);
|
||||
await templateMatcherService.UpdateTemplatesForJobGroup(query.Id, query.Initiator);
|
||||
break;
|
||||
|
||||
default:
|
||||
logger.LogWarning("Неизвестное действие для {EntityType}: {Action}", query.EntityType, query.Action);
|
||||
break;
|
||||
|
||||
@@ -4,6 +4,7 @@ using PARR.BLL.Domain.Mq;
|
||||
using PARR.BLL.Services.Interfaces;
|
||||
using PARR.Common.Domain;
|
||||
using PARR.Constants;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.DomainServices.Interfaces;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Models.Job;
|
||||
@@ -14,6 +15,7 @@ using PARR.DAL.Services.Interfaces.Unit;
|
||||
using PARR.DAL.TransformServices;
|
||||
using PARR.TemplateMatcher.Services.Interfaces;
|
||||
using PARR.TemplateMatcher.Settings;
|
||||
using System.Configuration;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace PARR.TemplateMatcher.Services.Implementations;
|
||||
@@ -60,7 +62,8 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
IUnitFieldService unitFieldService,
|
||||
ITemplateDeactivator templateDeactivator,
|
||||
ITemplateNameNormalizer templateNameNormalizer,
|
||||
ITemplateUpdaterMqSender templateUpdaterMqSender
|
||||
ITemplateUpdaterMqSender templateUpdaterMqSender,
|
||||
SettingsFromDb settingsFromDb
|
||||
)
|
||||
{
|
||||
this.logger = logger;
|
||||
@@ -155,7 +158,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, есть ли юнит в expectedUnitIds
|
||||
// Отладка: проверить, есть ли юнит в expectedUnitIds
|
||||
if (expectedUnitIds.Contains(targetUnitId))
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} найден в expectedUnitIds.", targetUnitId);
|
||||
@@ -191,7 +194,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
.ToHashSet();
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, есть ли юнит в unitIdsWithValidGroupingFieldSet
|
||||
// Отладка: проверить, есть ли юнит в unitIdsWithValidGroupingFieldSet
|
||||
if (unitIdsWithValidGroupingFieldSet.Contains(targetUnitId))
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} найден в unitIdsWithValidGroupingFieldSet.", targetUnitId);
|
||||
@@ -223,7 +226,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
.ToHashSet(); // И снова в HashSet
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, есть ли юнит в unitIdsWithValidWorkGroupFieldSet
|
||||
// Отладка: проверить, есть ли юнит в unitIdsWithValidWorkGroupFieldSet
|
||||
if (unitIdsWithValidWorkGroupFieldSet.Contains(targetUnitId))
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} найден в unitIdsWithValidWorkGroupFieldSet.", targetUnitId);
|
||||
@@ -257,7 +260,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
.ToListAsync();
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, юнит участвует в potentialUnitInUnitLinks
|
||||
// Отладка: проверить, юнит участвует в potentialUnitInUnitLinks
|
||||
var potentialLinksContainingTarget = potentialUnitInUnitLinks.Where(l => l.ParentUnitId == targetUnitId || l.ChildUnitId == targetUnitId).ToList();
|
||||
if (potentialLinksContainingTarget.Any())
|
||||
{
|
||||
@@ -334,7 +337,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, юнит участвует в filteredUnitInUnitLinks
|
||||
// Отладка: проверить, юнит участвует в filteredUnitInUnitLinks
|
||||
var filteredLinksContainingTarget = filteredUnitInUnitLinks.Where(l => l.ParentUnitId == targetUnitId || l.ChildUnitId == targetUnitId).ToList();
|
||||
if (filteredLinksContainingTarget.Any())
|
||||
{
|
||||
@@ -377,7 +380,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
logger.LogDebug("Сформировано {Count} групп по связанным юнитам до разрешения конфликтов.", groupedRelationships.Count);
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, юнит есть в groupedRelationships.Values
|
||||
// Отладка: проверить, юнит есть в groupedRelationships.Values
|
||||
var allUnitsInGroups = groupedRelationships.Values.SelectMany(x => x).ToList();
|
||||
if (allUnitsInGroups.Contains(targetUnitId))
|
||||
{
|
||||
@@ -410,7 +413,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, юнит есть в unitToKeys до поиска конфликтов
|
||||
// Отладка: проверить, юнит есть в unitToKeys до поиска конфликтов
|
||||
if (unitToKeys.ContainsKey(targetUnitId))
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} найден в unitToKeys до поиска конфликтов, находится в {Count} группах: [{Groups}]", targetUnitId, unitToKeys[targetUnitId].Count, string.Join(", ", unitToKeys[targetUnitId]));
|
||||
@@ -425,7 +428,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
var conflictedUnits = unitToKeys.Where(kvp => kvp.Value.Count > 1).ToList();
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, юнит в conflictedUnits
|
||||
// Отладка: проверить, юнит в conflictedUnits
|
||||
var targetConflictedEntry = conflictedUnits.FirstOrDefault(c => c.Key == targetUnitId);
|
||||
if (targetConflictedEntry.Key != default)
|
||||
{
|
||||
@@ -468,7 +471,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, юнит есть в groupedRelationships.Values после разрешения конфликтов
|
||||
// Отладка: проверить, юнит есть в groupedRelationships.Values после разрешения конфликтов
|
||||
var allUnitsInGroupsAfterConflictResolution = groupedRelationships.Values.SelectMany(x => x).ToList();
|
||||
if (allUnitsInGroupsAfterConflictResolution.Contains(targetUnitId))
|
||||
{
|
||||
@@ -503,7 +506,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
if (childUnitIds.Count == 0)
|
||||
continue;
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, есть ли ВРТ-AOS-05-ДВС в childUnitIds
|
||||
// Отладка: проверить, есть ли ВРТ-AOS-05-ДВС в childUnitIds
|
||||
var childUnitNames = childUnitIds.Select(id => unitService.Get().AsNoTracking().Where(u => u.Id == id).Select(u => u.Name).FirstOrDefaultAsync().GetAwaiter().GetResult() ?? id.ToString()).ToList();
|
||||
if (childUnitNames.Contains("ВРТ-AOS-05-ДВС"))
|
||||
{
|
||||
|
||||
@@ -95,11 +95,26 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer
|
||||
if (unitIds == null || !unitIds.Any())
|
||||
{
|
||||
logger.LogInformation("Для Job {JobId} фильтры не дали Unit'ов.", jobId);
|
||||
|
||||
// Деактивировать все существующие шаблоны для этого Job
|
||||
var existingTemplatesForDeactivation = await templateService.Get()
|
||||
.AsNoTracking()
|
||||
.Include(t => t.UnitsInTemplate)
|
||||
.Where(t => t.JobId == jobId && t.StatusTypeId == TemplateStatusTypeEnum.Used)
|
||||
.ToListAsync();
|
||||
|
||||
foreach (var unusedTemplate in existingTemplatesForDeactivation)
|
||||
{
|
||||
logger.LogInformation("Деактивация лишнего шаблона {TemplateId} (Job {JobId}, UnitId {UnitId}).", unusedTemplate.Id, jobId, unusedTemplate.UnitId);
|
||||
await templateDeactivator.DeactivateTemplateAsync(unusedTemplate, initiator);
|
||||
}
|
||||
|
||||
logger.LogInformation("Синхронизация шаблонов завершена для Job {JobId}.", jobId);
|
||||
return;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, есть ли юнит в unitIds
|
||||
// Отладка: проверить, есть ли юнит в unitIds
|
||||
if (unitIds.Contains(targetUnitId))
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} найден в unitIds.", targetUnitId);
|
||||
@@ -107,12 +122,10 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer
|
||||
else
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} НЕ найден в unitIds.", targetUnitId);
|
||||
return; // ❌ юнит отсеялся на этом этапе
|
||||
}
|
||||
#endif
|
||||
|
||||
var existingTemplates = await templateService.Get()
|
||||
.AsNoTracking()
|
||||
.Include(t => t.UnitsInTemplate)
|
||||
.Where(t => t.JobId == jobId)
|
||||
.ToListAsync();
|
||||
@@ -203,7 +216,7 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
// ✅ Отладка: проверить, есть ли юнит в unitIds
|
||||
// Отладка: проверить, есть ли юнит в unitIds
|
||||
if (unitIds.Contains(targetUnitId))
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} найден в unitIds.", targetUnitId);
|
||||
@@ -211,7 +224,6 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer
|
||||
else
|
||||
{
|
||||
logger.LogDebug("Юнит {TargetUnitId} НЕ найден в unitIds.", targetUnitId);
|
||||
return; // ❌ юнит отсеялся на этом этапе
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.BLL.Domain.Mq;
|
||||
using PARR.BLL.Services.Interfaces;
|
||||
using PARR.Common.Domain;
|
||||
using PARR.Constants;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Models.Job;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.DAL.Services.Interfaces.Job;
|
||||
using PARR.TemplateMatcher.Services.Interfaces;
|
||||
using PARR.TemplateMatcher.Settings;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace PARR.TemplateMatcher.Services.Implementations;
|
||||
|
||||
@@ -24,20 +21,23 @@ internal class TemplateDeactivator : ITemplateDeactivator
|
||||
private readonly IJobService jobService;
|
||||
private readonly ITemplateNameNormalizer namenormalizer;
|
||||
private readonly ITemplateUpdaterMqSender sender;
|
||||
private readonly Guid unusedJobId = Guid.Parse("8f85a91c-a223-4686-bb69-1f0ee73624f2");
|
||||
private readonly SettingsFromDb settingsFromDb;
|
||||
|
||||
public TemplateDeactivator(
|
||||
ILogger<TemplateDeactivator> logger,
|
||||
ITemplateService templateService,
|
||||
IJobService jobService,
|
||||
ITemplateNameNormalizer namenormalizer,
|
||||
ITemplateUpdaterMqSender sender)
|
||||
ITemplateUpdaterMqSender sender,
|
||||
SettingsFromDb settingsFromDb
|
||||
)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.templateService = templateService;
|
||||
this.jobService = jobService;
|
||||
this.namenormalizer = namenormalizer;
|
||||
this.sender = sender;
|
||||
this.settingsFromDb = settingsFromDb;
|
||||
}
|
||||
|
||||
public async Task<bool> DeactivateTemplateAsync(Template template, HistoryInitiator initiator)
|
||||
@@ -68,7 +68,7 @@ internal class TemplateDeactivator : ITemplateDeactivator
|
||||
.Include(j => j.Tnk)
|
||||
.Include(j => j.Group)
|
||||
.ThenInclude(g => g!.GroupType)
|
||||
.FirstOrDefaultAsync(j => j.Id == unusedJobId);
|
||||
.FirstOrDefaultAsync(j => j.Id == settingsFromDb.JobIdForUnusedTemplates);
|
||||
|
||||
if (unusedJob == null)
|
||||
{
|
||||
@@ -84,7 +84,7 @@ internal class TemplateDeactivator : ITemplateDeactivator
|
||||
TemplateId = template.Id,
|
||||
JobId = unusedJob.Id,
|
||||
UnitId = template.UnitId,
|
||||
Name = expectedName,
|
||||
Name = expectedName + "_" + DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
|
||||
IsActiveTemplate = DefaultUnusedTemplateState,
|
||||
IsActiveSchedule = DefaultUnusedScheduleState,
|
||||
LastRun = template.LastRun,
|
||||
|
||||
@@ -5,7 +5,6 @@ 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
|
||||
@@ -14,17 +13,19 @@ namespace PARR.TemplateMatcher
|
||||
{
|
||||
private readonly ILogger<TemplateMatcher> logger;
|
||||
private readonly IJobService jobService;
|
||||
private readonly IEnumerable<ITemplateSynchronizer> synchronizers; // Получаем все стратегии
|
||||
|
||||
private readonly IJobGroupService jobGroupService;
|
||||
private readonly IEnumerable<ITemplateSynchronizer> synchronizers;
|
||||
|
||||
public TemplateMatcher(
|
||||
ILogger<TemplateMatcher> logger,
|
||||
IJobService jobService,
|
||||
IJobGroupService jobGroupService,
|
||||
IEnumerable<ITemplateSynchronizer> synchronizers
|
||||
)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.jobService = jobService;
|
||||
this.jobGroupService = jobGroupService;
|
||||
this.synchronizers = synchronizers;
|
||||
|
||||
}
|
||||
@@ -57,7 +58,7 @@ namespace PARR.TemplateMatcher
|
||||
{
|
||||
logger.LogError("GroupedTemplateSynchronizer не найден.");
|
||||
}
|
||||
return; // Завершаем выполнение для группового Job
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -72,24 +73,106 @@ namespace PARR.TemplateMatcher
|
||||
{
|
||||
logger.LogError("SimpleTemplateSynchronizer не найден.");
|
||||
}
|
||||
return; // Завершаем выполнение для обычного Job
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SyncTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator)
|
||||
{
|
||||
logger.LogDebug("Начало синхронизации шаблонов для JobGroup {JobGroupId}", jobGroupId);
|
||||
var synchronizer = synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer);
|
||||
if (synchronizer != null)
|
||||
|
||||
var jobGroup = await jobGroupService.Get()
|
||||
.AsNoTracking()
|
||||
.Include(jg => jg.GroupType)
|
||||
.FirstOrDefaultAsync(jg => jg.Id == jobGroupId);
|
||||
|
||||
if (jobGroup == null || jobGroup.GroupType == null)
|
||||
{
|
||||
await synchronizer.SyncTemplatesForJobGroupAsync(jobGroupId, initiator);
|
||||
logger.LogWarning("JobGroup {JobGroupId} не найден или не содержит GroupType.", jobGroupId);
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
// Определяем стратегию по типу группы
|
||||
switch (jobGroup.GroupType.Code)
|
||||
{
|
||||
logger.LogError("GroupedTemplateSynchronizer не найден.");
|
||||
case JobGroupTypesEnum.Group:
|
||||
// Проверяем, есть ли GroupingUnitFieldId — это признак "настоящей" группировки
|
||||
if (jobGroup.GroupingUnitFieldId.HasValue)
|
||||
{
|
||||
logger.LogInformation("JobGroup {JobGroupId} является Group с GroupingUnitFieldId. Передаём в GroupedTemplateSynchronizer.", jobGroupId);
|
||||
var synchronizer = synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer);
|
||||
if (synchronizer != null)
|
||||
{
|
||||
await synchronizer.SyncTemplatesForJobGroupAsync(jobGroupId, initiator);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError("GroupedTemplateSynchronizer не найден для JobGroup {JobGroupId}.", jobGroupId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogInformation("JobGroup {JobGroupId} является Group, но не имеет GroupingUnitFieldId. Обрабатываем как Collection.", jobGroupId);
|
||||
//await SyncJobGroupAsCollectionAsync(jobGroupId, initiator);
|
||||
}
|
||||
break;
|
||||
|
||||
case JobGroupTypesEnum.Umbrella:
|
||||
logger.LogInformation("JobGroup {JobGroupId} является Umbrella. Обрабатываем как Collection (каждый Job — независимо).", jobGroupId);
|
||||
await SyncJobGroupAsCollectionAsync(jobGroupId, initiator);
|
||||
break;
|
||||
|
||||
case JobGroupTypesEnum.Simple:
|
||||
default:
|
||||
logger.LogInformation("JobGroup {JobGroupId} имеет тип Simple. Обрабатываем как Collection.", jobGroupId);
|
||||
await SyncJobGroupAsCollectionAsync(jobGroupId, initiator);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task UpdateTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator)
|
||||
{
|
||||
logger.LogDebug("Начало обновления шаблонов для JobGroup {JobGroupId}", jobGroupId);
|
||||
|
||||
var jobGroup = await jobGroupService.Get()
|
||||
.AsNoTracking()
|
||||
.Include(jg => jg.GroupType)
|
||||
.FirstOrDefaultAsync(jg => jg.Id == jobGroupId);
|
||||
|
||||
if (jobGroup == null || jobGroup.GroupType == null)
|
||||
{
|
||||
logger.LogWarning("JobGroup {JobGroupId} не найден или не содержит GroupType.", jobGroupId);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (jobGroup.GroupType.Code)
|
||||
{
|
||||
case JobGroupTypesEnum.Group:
|
||||
if (jobGroup.GroupingUnitFieldId.HasValue)
|
||||
{
|
||||
logger.LogWarning("UpdateTemplatesForJobGroup не поддерживается для Group с GroupingUnitFieldId. Id: {JobGroupId}", jobGroupId);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogInformation("JobGroup {JobGroupId} — Group без GroupingUnitFieldId. Обновляем как Collection.", jobGroupId);
|
||||
await UpdateJobGroupAsCollectionAsync(jobGroupId, initiator);
|
||||
}
|
||||
break;
|
||||
|
||||
case JobGroupTypesEnum.Umbrella:
|
||||
logger.LogInformation("JobGroup {JobGroupId} — Umbrella. Обновляем как Collection.", jobGroupId);
|
||||
await UpdateJobGroupAsCollectionAsync(jobGroupId, initiator);
|
||||
break;
|
||||
|
||||
case JobGroupTypesEnum.Simple:
|
||||
default:
|
||||
logger.LogInformation("JobGroup {JobGroupId} — Simple. Обновляем как Collection.", jobGroupId);
|
||||
await UpdateJobGroupAsCollectionAsync(jobGroupId, initiator);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task UpdateTemplatesForJob(Guid jobId, HistoryInitiator initiator)
|
||||
{
|
||||
logger.LogDebug("Начало обновления шаблонов для JobId {JobId}", jobId);
|
||||
@@ -113,14 +196,12 @@ namespace PARR.TemplateMatcher
|
||||
{
|
||||
// Вызов UpdateTemplatesForJobAsync для GroupedTemplateSynchronizer (который делает предупреждение)
|
||||
await synchronizer.UpdateTemplatesForJobAsync(jobId, initiator);
|
||||
// Или, возможно, имеет смысл вызвать полную синхронизацию для группы:
|
||||
// await synchronizer.SyncTemplatesForJobGroupAsync(job.GroupId, initiator);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError("GroupedTemplateSynchronizer не найден.");
|
||||
}
|
||||
return; // Завершаем выполнение
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -135,15 +216,77 @@ namespace PARR.TemplateMatcher
|
||||
{
|
||||
logger.LogError("SimpleTemplateSynchronizer не найден.");
|
||||
}
|
||||
return; // Завершаем выполнение
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// --- Вспомогательные методы ---
|
||||
private async Task SyncJobGroupAsCollectionAsync(Guid jobGroupId, HistoryInitiator initiator)
|
||||
{
|
||||
logger.LogDebug("Синхронизация JobGroup {JobGroupId} как Collection (по каждому Job'у отдельно)", jobGroupId);
|
||||
|
||||
var jobIds = await jobService.Get()
|
||||
.AsNoTracking()
|
||||
.Where(j => j.GroupId == jobGroupId)
|
||||
.Select(j => j.Id)
|
||||
.ToListAsync();
|
||||
|
||||
if (!jobIds.Any())
|
||||
{
|
||||
logger.LogWarning("JobGroup {JobGroupId} не содержит Job'ов.", jobGroupId);
|
||||
return;
|
||||
}
|
||||
|
||||
logger.LogDebug("Найдено {Count} Job'ов в JobGroup {JobGroupId}", jobIds.Count, jobGroupId);
|
||||
|
||||
var simpleSynchronizer = synchronizers.FirstOrDefault(s => s is SimpleTemplateSynchronizer);
|
||||
|
||||
if (simpleSynchronizer == null)
|
||||
{
|
||||
logger.LogError("SimpleTemplateSynchronizer не найден для синхронизации Job'ов в JobGroup {JobGroupId}.", jobGroupId);
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var jobId in jobIds)
|
||||
{
|
||||
logger.LogDebug("Синхронизация Job {JobId} в рамках JobGroup {JobGroupId}", jobId, jobGroupId);
|
||||
await simpleSynchronizer.SyncTemplatesForJobAsync(jobId, initiator);
|
||||
}
|
||||
|
||||
logger.LogInformation("Синхронизация JobGroup {JobGroupId} как Collection завершена.", jobGroupId);
|
||||
}
|
||||
|
||||
|
||||
private async Task UpdateJobGroupAsCollectionAsync(Guid jobGroupId, HistoryInitiator initiator)
|
||||
{
|
||||
logger.LogDebug("Обновление JobGroup {JobGroupId} как Collection (по каждому Job'у)", jobGroupId);
|
||||
|
||||
var jobIds = await jobService.Get()
|
||||
.AsNoTracking()
|
||||
.Where(j => j.GroupId == jobGroupId)
|
||||
.Select(j => j.Id)
|
||||
.ToListAsync();
|
||||
|
||||
if (!jobIds.Any())
|
||||
{
|
||||
logger.LogWarning("JobGroup {JobGroupId} не содержит Job'ов.", jobGroupId);
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var jobId in jobIds)
|
||||
{
|
||||
logger.LogDebug("Обновление шаблонов для Job {JobId} в рамках JobGroup {JobGroupId}", jobId, jobGroupId);
|
||||
await UpdateTemplatesForJob(jobId, initiator);
|
||||
}
|
||||
|
||||
logger.LogInformation("Обновление JobGroup {JobGroupId} как Collection завершено.", jobGroupId);
|
||||
}
|
||||
|
||||
|
||||
private async Task<Job?> GetJobWithGroupAndAutoControlAsync(Guid jobId)
|
||||
{
|
||||
return await jobService.Get()
|
||||
.AsNoTracking() // Добавлено
|
||||
.AsNoTracking()
|
||||
.Include(j => j.Group)
|
||||
.ThenInclude(j => j!.GroupType)
|
||||
.Include(j => j.AutoControl)
|
||||
|
||||
Reference in New Issue
Block a user