diff --git a/PARR.TemplateMatcher/Services/Implementations/AutoControlResolver.cs b/PARR.TemplateMatcher/Services/Implementations/AutoControlResolver.cs index 4ca82b79..1c117157 100644 --- a/PARR.TemplateMatcher/Services/Implementations/AutoControlResolver.cs +++ b/PARR.TemplateMatcher/Services/Implementations/AutoControlResolver.cs @@ -16,26 +16,53 @@ namespace PARR.TemplateMatcher.Services.Implementations bool defaultTemplateState = false, bool defaultScheduleState = false) { - // Тип группы определяет источник настроек - var isGroupLevel = jobGroup?.GroupType?.IsJobGroupAutoControl == true; - - if (isGroupLevel && jobGroup!.AutoControl != null) + // Защита от оптимизации: если группу забыли подгрузить, метод честно падает, + // потому что без GroupType бизнес-логика не может определить уровень управления + if (jobGroup == null) { + throw new InvalidOperationException( + $"Критическая ошибка бизнес-логики: Для работы '{job.Name}' (ID: {job.Id}) " + + $"не передана группа (null). Нужно добавить '.Include(j => j.Group)'."); + } + + // 1. Проверяем, что разработчики подгрузили GroupType из базы данных + if (jobGroup.GroupType == null) + { + throw new InvalidOperationException( + $"Для работы '{job.Name}' (ID: {job.Id}) передана группа, " + + $"но её GroupType = null. Нужно добавить '.ThenInclude(g => g.GroupType)' в запрос."); + } + + // Теперь компилятор знает, что jobGroup и GroupType гарантированно не null + var isGroupLevel = jobGroup.GroupType.IsJobGroupAutoControl; + + // 2. Сценарий: Управление на уровне Группы Работ + if (isGroupLevel) + { + if (jobGroup.AutoControl == null) + throw new InvalidOperationException( + $"В типе группы '{jobGroup.GroupType.Id}' указано управление " + + $"на уровне ГРУППЫ, но у группы '{jobGroup.GroupName}' (ID: {jobGroup.Id}) " + + $"отсутствуют настройки автоконтроля (JobGroup.AutoControl равен null)!"); + return ( jobGroup.AutoControl.InitUsedTemplateState, jobGroup.AutoControl.InitUsedScheduleState ); } - if (!isGroupLevel && job.AutoControl != null) - { - return ( - job.AutoControl.InitUsedTemplateState, - job.AutoControl.InitUsedScheduleState - ); - } + // 3. Сценарий: Управление на уровне конкретной Работы + if (job.AutoControl == null) + throw new InvalidOperationException( + $"В типе группы '{jobGroup.GroupType.Id}' указано управление " + + $"на уровне РАБОТЫ, но у работы '{job.Name}' (ID: {job.Id}) " + + $"отсутствуют настройки автоконтроля (Job.AutoControl равен null)!"); - return (defaultTemplateState, defaultScheduleState); + return ( + job.AutoControl.InitUsedTemplateState, + job.AutoControl.InitUsedScheduleState + ); } + } } diff --git a/PARR.TemplateMatcher/Services/SimpleSync/LoadJobStage.cs b/PARR.TemplateMatcher/Services/SimpleSync/LoadJobStage.cs index d4849ddf..6692c7fe 100644 --- a/PARR.TemplateMatcher/Services/SimpleSync/LoadJobStage.cs +++ b/PARR.TemplateMatcher/Services/SimpleSync/LoadJobStage.cs @@ -26,7 +26,7 @@ internal class LoadJobStage : ISimpleSyncStage .Include(j => j.AutoControl) .Include(j => j.Tnk) .Include(j => j.Group).ThenInclude(g => g!.GroupType) - .Include(j => j.AutoControl) + .Include(j => j.Group).ThenInclude(g => g!.AutoControl) .Include(j => j.UnitFilters).ThenInclude(uf => uf.RelationshipFilters) .FirstOrDefaultAsync(j => j.Id == context.JobId, ct);