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

View File

@@ -18,8 +18,5 @@ namespace PARR.DAL.Models
[ForeignKey(nameof(UnitId))] [ForeignKey(nameof(UnitId))]
public Unit.Unit? Unit { get; set; } public Unit.Unit? Unit { get; set; }
} }
} }

View File

@@ -5,7 +5,6 @@ using PARR.DAL.Contracts;
using PARR.DAL.DomainModels; using PARR.DAL.DomainModels;
using PARR.DAL.Extensions; using PARR.DAL.Extensions;
using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces;
using PARR.DAL.Services.Interfaces.Job;
namespace PARR.DAL.TransformServices namespace PARR.DAL.TransformServices
{ {
@@ -206,7 +205,9 @@ namespace PARR.DAL.TransformServices
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}"); throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
} }
var calcDay = referenceDate.AddHours(regNum); var calcDay = referenceDate;
if (calcDay < DateTimeOffset.UtcNow)
calcDay = calcDay.AddHours(regNum);
//TODO: вот это повторяется от метода к методу //TODO: вот это повторяется от метода к методу
//Если итоговая дата указывает на прошлое, то повторяем расчёт и уходим в рекурсию //Если итоговая дата указывает на прошлое, то повторяем расчёт и уходим в рекурсию
@@ -305,7 +306,7 @@ namespace PARR.DAL.TransformServices
return calcDay; return calcDay;
} }
private DateTimeOffset GetNextDateAnnually(List<EsppScheduleValDto> values, DateTimeOffset referenceDate) private DateTimeOffset GetNextDateAnnually(List<EsppScheduleValDto> values, DateTimeOffset referenceDate)
{ {