2025-12-04 09:24:05 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2026-07-03 11:17:48 +10:00
|
|
|
|
using PARR.Core.Repositories.Interfaces.JobGroupRepositories;
|
|
|
|
|
|
using PARR.Core.Repositories.Interfaces.JobRepositories;
|
2026-04-13 16:58:30 +10:00
|
|
|
|
using PARR.Domain.Entities.Base.History;
|
2026-07-03 11:17:48 +10:00
|
|
|
|
using PARR.Domain.Entities.JobEntities;
|
2026-04-13 16:58:30 +10:00
|
|
|
|
using PARR.Domain.Enums;
|
2025-12-23 18:27:31 +10:00
|
|
|
|
using PARR.TemplateMatcher.Services.Interfaces;
|
2025-11-01 15:29:12 +10:00
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
namespace PARR.TemplateMatcher.Services.Implementations
|
2025-11-01 15:29:12 +10:00
|
|
|
|
{
|
2025-11-12 11:24:07 +10:00
|
|
|
|
internal class TemplateMatcher : ITemplateMatcher
|
2025-11-01 15:29:12 +10:00
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
private readonly ILogger<TemplateMatcher> _logger;
|
|
|
|
|
|
private readonly IJobRepository _jobService;
|
|
|
|
|
|
private readonly IJobGroupRepository _jobGroupService;
|
|
|
|
|
|
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,
|
2026-04-30 10:35:31 +10:00
|
|
|
|
IJobRepository jobService,
|
|
|
|
|
|
IJobGroupRepository jobGroupService,
|
2025-12-23 18:27:31 +10:00
|
|
|
|
IEnumerable<ITemplateSynchronizer> synchronizers
|
|
|
|
|
|
)
|
2025-11-01 15:29:12 +10:00
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger = logger;
|
|
|
|
|
|
_jobService = jobService;
|
|
|
|
|
|
_jobGroupService = jobGroupService;
|
|
|
|
|
|
_synchronizers = synchronizers;
|
2025-12-23 18:27:31 +10:00
|
|
|
|
|
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
|
|
|
|
{
|
2026-06-11 15:09:46 +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-04 09:24:05 +10:00
|
|
|
|
if (job == null)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_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;
|
|
|
|
|
|
|
2025-12-26 21:47:53 +10:00
|
|
|
|
if (isGroupJob && job.Group!.GroupingUnitFieldId.HasValue)
|
2025-12-19 19:15:58 +10:00
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("Job {JobId} является групповым. Передаём в GroupedSynchronizer.", jobId);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
// Находим нужный синхронизатор
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var synchronizer = _synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
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
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogError("GroupedTemplateSynchronizer не найден.");
|
2025-12-04 14:24:42 +10:00
|
|
|
|
}
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
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
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("Job {JobId} является обычным. Передаём в SimpleSynchronizer.", jobId);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
// Находим нужный синхронизатор
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var synchronizer = _synchronizers.FirstOrDefault(s => s is SimpleTemplateSynchronizer);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
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
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogError("SimpleTemplateSynchronizer не найден.");
|
2025-12-04 14:24:42 +10:00
|
|
|
|
}
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
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)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogDebug("Начало синхронизации шаблонов для JobGroup {JobGroupId}", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var jobGroup = await _jobGroupService.Get()
|
2025-12-30 14:27:59 +10:00
|
|
|
|
.AsNoTracking()
|
|
|
|
|
|
.Include(jg => jg.GroupType)
|
|
|
|
|
|
.FirstOrDefaultAsync(jg => jg.Id == jobGroupId);
|
|
|
|
|
|
|
|
|
|
|
|
if (jobGroup == null || jobGroup.GroupType == null)
|
2025-12-04 09:24:05 +10:00
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogWarning("JobGroup {JobGroupId} не найден или не содержит GroupType.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
2025-12-04 14:24:42 +10:00
|
|
|
|
}
|
2025-12-30 14:27:59 +10:00
|
|
|
|
|
|
|
|
|
|
// Определяем стратегию по типу группы
|
|
|
|
|
|
switch (jobGroup.GroupType.Code)
|
2025-12-04 14:24:42 +10:00
|
|
|
|
{
|
2025-12-30 14:27:59 +10:00
|
|
|
|
case JobGroupTypesEnum.Group:
|
|
|
|
|
|
// Проверяем, есть ли GroupingUnitFieldId — это признак "настоящей" группировки
|
|
|
|
|
|
if (jobGroup.GroupingUnitFieldId.HasValue)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("JobGroup {JobGroupId} является Group с GroupingUnitFieldId. Передаём в GroupedTemplateSynchronizer.", jobGroupId);
|
|
|
|
|
|
var synchronizer = _synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
if (synchronizer != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
await synchronizer.SyncTemplatesForJobGroupAsync(jobGroupId, initiator);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogError("GroupedTemplateSynchronizer не найден для JobGroup {JobGroupId}.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("JobGroup {JobGroupId} является Group, но не имеет GroupingUnitFieldId. Обрабатываем как Collection.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
//await SyncJobGroupAsCollectionAsync(jobGroupId, initiator);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case JobGroupTypesEnum.Umbrella:
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("JobGroup {JobGroupId} является Umbrella. Обрабатываем как Collection (каждый Job — независимо).", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
await SyncJobGroupAsCollectionAsync(jobGroupId, initiator);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case JobGroupTypesEnum.Simple:
|
|
|
|
|
|
default:
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("JobGroup {JobGroupId} имеет тип Simple. Обрабатываем как Collection.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
await SyncJobGroupAsCollectionAsync(jobGroupId, initiator);
|
|
|
|
|
|
break;
|
2025-12-04 09:24:05 +10:00
|
|
|
|
}
|
2025-11-01 15:29:12 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-09-08 09:47:31 +10:00
|
|
|
|
|
2025-12-30 14:27:59 +10:00
|
|
|
|
public async Task UpdateTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogDebug("Начало обновления шаблонов для JobGroup {JobGroupId}", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var jobGroup = await _jobGroupService.Get()
|
2025-12-30 14:27:59 +10:00
|
|
|
|
.AsNoTracking()
|
|
|
|
|
|
.Include(jg => jg.GroupType)
|
|
|
|
|
|
.FirstOrDefaultAsync(jg => jg.Id == jobGroupId);
|
|
|
|
|
|
|
|
|
|
|
|
if (jobGroup == null || jobGroup.GroupType == null)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogWarning("JobGroup {JobGroupId} не найден или не содержит GroupType.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch (jobGroup.GroupType.Code)
|
|
|
|
|
|
{
|
|
|
|
|
|
case JobGroupTypesEnum.Group:
|
|
|
|
|
|
if (jobGroup.GroupingUnitFieldId.HasValue)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogWarning("UpdateTemplatesForJobGroup не поддерживается для Group с GroupingUnitFieldId. Id: {JobGroupId}", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("JobGroup {JobGroupId} — Group без GroupingUnitFieldId. Обновляем как Collection.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
await UpdateJobGroupAsCollectionAsync(jobGroupId, initiator);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case JobGroupTypesEnum.Umbrella:
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("JobGroup {JobGroupId} — Umbrella. Обновляем как Collection.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
await UpdateJobGroupAsCollectionAsync(jobGroupId, initiator);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case JobGroupTypesEnum.Simple:
|
|
|
|
|
|
default:
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("JobGroup {JobGroupId} — Simple. Обновляем как Collection.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
await UpdateJobGroupAsCollectionAsync(jobGroupId, initiator);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-12-04 09:24:05 +10:00
|
|
|
|
public async Task UpdateTemplatesForJob(Guid jobId, HistoryInitiator initiator)
|
2025-11-01 15:29:12 +10:00
|
|
|
|
{
|
2026-06-11 15:09:46 +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
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogError("Job с Id {JobId} не найден.", jobId);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
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-26 21:47:53 +10:00
|
|
|
|
if (isGroupJob && job.Group!.GroupingUnitFieldId.HasValue)
|
2025-12-23 18:27:31 +10:00
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("Job {JobId} является групповым. Передаём в GroupedSynchronizer для Update.", jobId);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
// Находим нужный синхронизатор
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var synchronizer = _synchronizers.FirstOrDefault(s => s is GroupedTemplateSynchronizer);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
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);
|
2025-12-05 09:53:09 +10:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogError("GroupedTemplateSynchronizer не найден.");
|
2025-12-05 09:53:09 +10:00
|
|
|
|
}
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
2025-12-04 09:24:05 +10:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("Job {JobId} является обычным. Передаём в SimpleSynchronizer для Update.", jobId);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
// Находим нужный синхронизатор
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var synchronizer = _synchronizers.FirstOrDefault(s => s is SimpleTemplateSynchronizer);
|
2025-12-23 18:27:31 +10:00
|
|
|
|
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
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogError("SimpleTemplateSynchronizer не найден.");
|
2025-12-04 14:24:42 +10:00
|
|
|
|
}
|
2025-12-30 14:27:59 +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-30 14:27:59 +10:00
|
|
|
|
private async Task SyncJobGroupAsCollectionAsync(Guid jobGroupId, HistoryInitiator initiator)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogDebug("Синхронизация JobGroup {JobGroupId} как Collection (по каждому Job'у отдельно)", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var jobIds = await _jobService.Get()
|
2025-12-30 14:27:59 +10:00
|
|
|
|
.AsNoTracking()
|
|
|
|
|
|
.Where(j => j.GroupId == jobGroupId)
|
|
|
|
|
|
.Select(j => j.Id)
|
|
|
|
|
|
.ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if (!jobIds.Any())
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogWarning("JobGroup {JobGroupId} не содержит Job'ов.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogDebug("Найдено {Count} Job'ов в JobGroup {JobGroupId}", jobIds.Count, jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var simpleSynchronizer = _synchronizers.FirstOrDefault(s => s is SimpleTemplateSynchronizer);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
|
|
|
|
|
|
if (simpleSynchronizer == null)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogError("SimpleTemplateSynchronizer не найден для синхронизации Job'ов в JobGroup {JobGroupId}.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var jobId in jobIds)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogDebug("Синхронизация Job {JobId} в рамках JobGroup {JobGroupId}", jobId, jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
await simpleSynchronizer.SyncTemplatesForJobAsync(jobId, initiator);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("Синхронизация JobGroup {JobGroupId} как Collection завершена.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task UpdateJobGroupAsCollectionAsync(Guid jobGroupId, HistoryInitiator initiator)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogDebug("Обновление JobGroup {JobGroupId} как Collection (по каждому Job'у)", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
var jobIds = await _jobService.Get()
|
2025-12-30 14:27:59 +10:00
|
|
|
|
.AsNoTracking()
|
|
|
|
|
|
.Where(j => j.GroupId == jobGroupId)
|
|
|
|
|
|
.Select(j => j.Id)
|
|
|
|
|
|
.ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if (!jobIds.Any())
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogWarning("JobGroup {JobGroupId} не содержит Job'ов.", jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var jobId in jobIds)
|
|
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogDebug("Обновление шаблонов для Job {JobId} в рамках JobGroup {JobGroupId}", jobId, jobGroupId);
|
2025-12-30 14:27:59 +10:00
|
|
|
|
await UpdateTemplatesForJob(jobId, initiator);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-11 15:09:46 +10:00
|
|
|
|
_logger.LogInformation("Обновление JobGroup {JobGroupId} как Collection завершено.", jobGroupId);
|
2025-12-30 14:27:59 +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
|
|
|
|
{
|
2026-06-11 15:09:46 +10:00
|
|
|
|
return await _jobService.Get()
|
2025-12-30 14:27:59 +10:00
|
|
|
|
.AsNoTracking()
|
2025-12-05 09:53:09 +10:00
|
|
|
|
.Include(j => j.Group)
|
2025-12-26 21:47:53 +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
|
|
|
|
}
|