- Добавлены строгие проверки на null для `GroupType`, `jobGroup.AutoControl` и `job.AutoControl` с генерацией исключений. - В запрос загрузки данных добавлен `.Include(j => j.Group).ThenInclude(g => g.AutoControl)`, исправивший падение в дефолтные состояния.
69 lines
3.6 KiB
C#
69 lines
3.6 KiB
C#
using PARR.Domain.Entities.JobEntities;
|
||
using PARR.Domain.Entities.JobGroupEntities;
|
||
|
||
namespace PARR.TemplateMatcher.Services.Implementations
|
||
{
|
||
/// <summary>
|
||
/// Определяет начальные статусы шаблона и расписания на основе типа группы работ.
|
||
/// Если IsJobGroupAutoControl == true → берём из JobGroup.AutoControl.
|
||
/// Иначе → берём из Job.AutoControl.
|
||
/// </summary>
|
||
public static class AutoControlResolver
|
||
{
|
||
public static (bool IsActiveTemplate, bool IsActiveSchedule) ResolveInitStates(
|
||
Job job,
|
||
JobGroup? jobGroup,
|
||
bool defaultTemplateState = false,
|
||
bool defaultScheduleState = false)
|
||
{
|
||
// Защита от оптимизации: если группу забыли подгрузить, метод честно падает,
|
||
// потому что без 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
|
||
);
|
||
}
|
||
|
||
// 3. Сценарий: Управление на уровне конкретной Работы
|
||
if (job.AutoControl == null)
|
||
throw new InvalidOperationException(
|
||
$"В типе группы '{jobGroup.GroupType.Id}' указано управление " +
|
||
$"на уровне РАБОТЫ, но у работы '{job.Name}' (ID: {job.Id}) " +
|
||
$"отсутствуют настройки автоконтроля (Job.AutoControl равен null)!");
|
||
|
||
return (
|
||
job.AutoControl.InitUsedTemplateState,
|
||
job.AutoControl.InitUsedScheduleState
|
||
);
|
||
}
|
||
|
||
}
|
||
}
|