2026-07-03 11:17:48 +10:00
|
|
|
|
using PARR.Domain.Entities.JobEntities;
|
|
|
|
|
|
using PARR.Domain.Entities.JobGroupEntities;
|
|
|
|
|
|
|
2026-07-03 11:59:46 +10:00
|
|
|
|
namespace PARR.TemplateMatcher.Services.Implementations
|
2026-07-03 11:17:48 +10:00
|
|
|
|
{
|
|
|
|
|
|
/// <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)
|
|
|
|
|
|
{
|
2026-07-16 15:00:17 +10:00
|
|
|
|
// Защита от оптимизации: если группу забыли подгрузить, метод честно падает,
|
|
|
|
|
|
// потому что без GroupType бизнес-логика не может определить уровень управления
|
|
|
|
|
|
if (jobGroup == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new InvalidOperationException(
|
|
|
|
|
|
$"Критическая ошибка бизнес-логики: Для работы '{job.Name}' (ID: {job.Id}) " +
|
|
|
|
|
|
$"не передана группа (null). Нужно добавить '.Include(j => j.Group)'.");
|
|
|
|
|
|
}
|
2026-07-03 11:17:48 +10:00
|
|
|
|
|
2026-07-16 15:00:17 +10:00
|
|
|
|
// 1. Проверяем, что разработчики подгрузили GroupType из базы данных
|
|
|
|
|
|
if (jobGroup.GroupType == null)
|
2026-07-03 11:17:48 +10:00
|
|
|
|
{
|
2026-07-16 15:00:17 +10:00
|
|
|
|
throw new InvalidOperationException(
|
|
|
|
|
|
$"Для работы '{job.Name}' (ID: {job.Id}) передана группа, " +
|
|
|
|
|
|
$"но её GroupType = null. Нужно добавить '.ThenInclude(g => g.GroupType)' в запрос.");
|
2026-07-03 11:17:48 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-16 15:00:17 +10:00
|
|
|
|
// Теперь компилятор знает, что jobGroup и GroupType гарантированно не null
|
|
|
|
|
|
var isGroupLevel = jobGroup.GroupType.IsJobGroupAutoControl;
|
|
|
|
|
|
|
|
|
|
|
|
// 2. Сценарий: Управление на уровне Группы Работ
|
|
|
|
|
|
if (isGroupLevel)
|
2026-07-03 11:17:48 +10:00
|
|
|
|
{
|
2026-07-16 15:00:17 +10:00
|
|
|
|
if (jobGroup.AutoControl == null)
|
|
|
|
|
|
throw new InvalidOperationException(
|
|
|
|
|
|
$"В типе группы '{jobGroup.GroupType.Id}' указано управление " +
|
|
|
|
|
|
$"на уровне ГРУППЫ, но у группы '{jobGroup.GroupName}' (ID: {jobGroup.Id}) " +
|
|
|
|
|
|
$"отсутствуют настройки автоконтроля (JobGroup.AutoControl равен null)!");
|
|
|
|
|
|
|
2026-07-03 11:17:48 +10:00
|
|
|
|
return (
|
2026-07-16 15:00:17 +10:00
|
|
|
|
jobGroup.AutoControl.InitUsedTemplateState,
|
|
|
|
|
|
jobGroup.AutoControl.InitUsedScheduleState
|
2026-07-03 11:17:48 +10:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-16 15:00:17 +10:00
|
|
|
|
// 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
|
|
|
|
|
|
);
|
2026-07-03 11:17:48 +10:00
|
|
|
|
}
|
2026-07-16 15:00:17 +10:00
|
|
|
|
|
2026-07-03 11:17:48 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|