fix(templateMatcher): Исправлен баг в AutoControlResolver и добавивлен Include для AutoControl группы
- Добавлены строгие проверки на null для `GroupType`, `jobGroup.AutoControl` и `job.AutoControl` с генерацией исключений. - В запрос загрузки данных добавлен `.Include(j => j.Group).ThenInclude(g => g.AutoControl)`, исправивший падение в дефолтные состояния.
This commit is contained in:
@@ -16,26 +16,53 @@ namespace PARR.TemplateMatcher.Services.Implementations
|
|||||||
bool defaultTemplateState = false,
|
bool defaultTemplateState = false,
|
||||||
bool defaultScheduleState = false)
|
bool defaultScheduleState = false)
|
||||||
{
|
{
|
||||||
// Тип группы определяет источник настроек
|
// Защита от оптимизации: если группу забыли подгрузить, метод честно падает,
|
||||||
var isGroupLevel = jobGroup?.GroupType?.IsJobGroupAutoControl == true;
|
// потому что без GroupType бизнес-логика не может определить уровень управления
|
||||||
|
if (jobGroup == null)
|
||||||
if (isGroupLevel && jobGroup!.AutoControl != 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 (
|
return (
|
||||||
jobGroup.AutoControl.InitUsedTemplateState,
|
jobGroup.AutoControl.InitUsedTemplateState,
|
||||||
jobGroup.AutoControl.InitUsedScheduleState
|
jobGroup.AutoControl.InitUsedScheduleState
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isGroupLevel && job.AutoControl != null)
|
// 3. Сценарий: Управление на уровне конкретной Работы
|
||||||
{
|
if (job.AutoControl == null)
|
||||||
return (
|
throw new InvalidOperationException(
|
||||||
job.AutoControl.InitUsedTemplateState,
|
$"В типе группы '{jobGroup.GroupType.Id}' указано управление " +
|
||||||
job.AutoControl.InitUsedScheduleState
|
$"на уровне РАБОТЫ, но у работы '{job.Name}' (ID: {job.Id}) " +
|
||||||
);
|
$"отсутствуют настройки автоконтроля (Job.AutoControl равен null)!");
|
||||||
}
|
|
||||||
|
|
||||||
return (defaultTemplateState, defaultScheduleState);
|
return (
|
||||||
|
job.AutoControl.InitUsedTemplateState,
|
||||||
|
job.AutoControl.InitUsedScheduleState
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ internal class LoadJobStage : ISimpleSyncStage
|
|||||||
.Include(j => j.AutoControl)
|
.Include(j => j.AutoControl)
|
||||||
.Include(j => j.Tnk)
|
.Include(j => j.Tnk)
|
||||||
.Include(j => j.Group).ThenInclude(g => g!.GroupType)
|
.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)
|
.Include(j => j.UnitFilters).ThenInclude(uf => uf.RelationshipFilters)
|
||||||
.FirstOrDefaultAsync(j => j.Id == context.JobId, ct);
|
.FirstOrDefaultAsync(j => j.Id == context.JobId, ct);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user