Files
Mikhail Kuznetsov 6c93e1971f fix(templateMatcher): Исправлен баг в AutoControlResolver и добавивлен Include для AutoControl группы
- Добавлены строгие проверки на null для `GroupType`, `jobGroup.AutoControl` и `job.AutoControl` с генерацией исключений.
- В запрос загрузки данных добавлен `.Include(j => j.Group).ThenInclude(g => g.AutoControl)`, исправивший падение в дефолтные состояния.
2026-07-16 15:00:17 +10:00

69 lines
3.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
);
}
}
}