fix(dal): исправлен расчет следующего запуска Regularly в EsppScheduleTransformService.

This commit is contained in:
Mikhail Kuznetsov
2025-11-27 14:21:27 +10:00
parent 57b9ba8b9a
commit f42e5b5ea8
3 changed files with 21 additions and 13 deletions

View File

@@ -94,16 +94,22 @@ namespace PARR.DAL.DomainServices.Implementations
try
{
logger.LogDebug("Применяем фильтр #{Index} (Id={FilterId})", filterNumber, filter.Id);
// Стартуем с базового условия — имя Unit'а
var query = unitService.Get().AsNoTracking()
.Where(unit => EF.Functions.ILike(unit.Name, filter.UnitFilter));
// 1. Фильтры по полям (UnitValues)
logger.LogDebug("Базовый фильтр по Name: {NameFilter}", filter.UnitFilter);
// 1. Фильтры по полям (UnitValues)
foreach (var fieldFilter in filter.FieldFilters)
{
var fieldId = fieldFilter.FieldId;
var valueMask = fieldFilter.ValueMask;
logger.LogDebug("Фильтр по полю: FieldId={FieldId}, ValueMask={ValueMask}", fieldId, valueMask);
query = query.Where(unit =>
unit.UnitValues.Any(value =>
value.FieldId == fieldId
@@ -112,18 +118,19 @@ namespace PARR.DAL.DomainServices.Implementations
&& EF.Functions.ILike(value.Value.Value, valueMask)));
}
// 2. Фильтры по связям (родителям и детям)
// 2. Фильтры по связям (родителям и детям)
foreach (var relFilter in filter.RelationshipFilters)
{
var fieldId = relFilter.FieldId;
var valueMask = relFilter.ValueMask;
logger.LogDebug("Фильтр по связи: IsParent={IsParent}, IsInverse={IsInverse}, IsFullMatch={IsFullMatch}, FieldId={FieldId}, ValueMask={ValueMask}",
relFilter.IsParent, relFilter.IsInverse, relFilter.IsFullMatch, relFilter.FieldId, relFilter.ValueMask);
if (relFilter.IsParent)
{
// Работаем с ParentUnits → pu.ParentUnit
if (relFilter.IsInverse)
{
// "Обратный фильтр": ищем Unit'ы, у которых связанные Unit'ы НЕ имеют указанного значения
if (relFilter.IsFullMatch)
{
// Все родители НЕ должны иметь такое значение
@@ -138,7 +145,7 @@ namespace PARR.DAL.DomainServices.Implementations
}
else
{
// Хотя бы один родитель НЕ имеет такого значения
// Хотя бы один родитель НЕ должен иметь такое значение
query = query.Where(unit =>
!unit.ParentUnits.Any() ||
unit.ParentUnits.Any(parentLink =>
@@ -238,6 +245,8 @@ namespace PARR.DAL.DomainServices.Implementations
int min = job.MinValueRelationships.GetValueOrDefault(0);
int max = job.MaxValueRelationships.GetValueOrDefault(int.MaxValue);
logger.LogDebug("Фильтр по количеству связей: Min={Min}, Max={Max}, IsParent={IsParent}", min, max, job.IsParentRelationships);
if (job.IsParentRelationships == true)
{
query = query.Where(unit =>
@@ -250,12 +259,14 @@ namespace PARR.DAL.DomainServices.Implementations
}
}
// Запрашиваем в БД с учётом оставшегося лимита
// Выполняем — только Id, с учётом оставшегося лимита
var newIds = await query
.Select(unit => unit.Id)
.Take(remaining)
.ToListAsync();
logger.LogDebug("Фильтр #{Index}: найдено {Count} Unit'ов", filterNumber, newIds.Count);
collectedIds.UnionWith(newIds);
logger.LogDebug(
@@ -267,7 +278,6 @@ namespace PARR.DAL.DomainServices.Implementations
{
logger.LogError(ex, "Ошибка при обработке фильтра {FilterId} (#{Index}) для Job {JobId}",
filter.Id, filterNumber, job.Id);
// Продолжаем — другие фильтры могут сработать
}
}