feat(api,dal): исключения расписаний ЕСПП привязаны к JobGroup, удалены константы из настроек. Кол-во шаблонов в Job считается только used. В JobFieldFilter добавлено поле IsInverse.

This commit is contained in:
Mikhail Trubnikov
2025-12-26 11:21:45 +10:00
parent eb57f4b3cd
commit 61c46770e0
29 changed files with 8901 additions and 46 deletions

View File

@@ -1,9 +1,9 @@
using FluentValidation;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json.Linq;
using PARR.API.Contracts.V1.Requests;
using PARR.DAL.Contracts;
using PARR.DAL.Services.Interfaces.Job;
using PARR.DAL.Services.Interfaces.Schedule;
using PARR.DAL.Services.Interfaces.Unit;
namespace PARR.API.Validators
@@ -12,7 +12,9 @@ namespace PARR.API.Validators
{
public JobGroupValidator(
IJobGroupTypeService jobGroupTypeService,
IUnitFieldService unitFieldService
IUnitFieldService unitFieldService,
IScheduleExcludeTypeService scheduleExcludeTypeService,
IScheduleExcludeTypeCalendarService scheduleExcludeTypeCalendarService
)
{
RuleFor(t => t.Name)
@@ -60,6 +62,36 @@ namespace PARR.API.Validators
return true;
})
.WithMessage("Не указано поле для группировки");
RuleFor(t => t.ScheduleExcludeTypeId)
.NotNull()
.NotEmpty()
.MustAsync(async (entity, value, c) => await scheduleExcludeTypeService.GetAsync(value) != null)
.WithMessage("Некорректное значение");
RuleFor(t => t.ScheduleExcludeTypeCalendarId)
.MustAsync(async (entity, value, c) =>
{
// Если выбрано "Нет исключений", то это поле должно быть пустое, иначе, должно быть валидное значение
var type = await scheduleExcludeTypeService.GetAsync(entity.ScheduleExcludeTypeId);
if (type == null)
return false;
if (type.Code == ScheduleExcludeTypeEnum.None.ToString())
{
// ScheduleExcludeTypeCalendarId должно быть null
return value == null;
}
// Тип любой кроме "Нет исключений", значение обязательно
if (!value.HasValue)
return false;
return await scheduleExcludeTypeCalendarService.GetAsync(value.Value) != null;
})
.WithMessage("Некорректное значение");
}
}
}