fix(api,core): Исправлена логика выдачи переименованных шаблонов роботам
This commit is contained in:
@@ -273,6 +273,9 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
if (templatesToRename.Count == 0)
|
||||
return tasks;
|
||||
|
||||
// Создаем словарь маппинга TemplateId -> OldName.
|
||||
var templateIdToOldName = templatesToRename.ToDictionary(t => t.TemplateId, t => t.OldName);
|
||||
|
||||
// Ищем конфигурации роботов для СТАРЫХ шаблонов (которые переименовываются) по ИД, смотрим, можем ли взять их в работу
|
||||
var renameTemplateIds = templatesToRename.Select(t => t.TemplateId).ToList();
|
||||
var renameTasks = await _robotConfigurationRepository.Get()
|
||||
@@ -299,10 +302,16 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
{
|
||||
_logger.LogDebug("Найдено старых заданий на переименование с ошибками: {ErrorCount}. Ставим ошибку целевым (новым) заданиям.", errorTasks.Count);
|
||||
|
||||
var errorTemplateNames = errorTasks.Select(t => t.Template!.Name).ToHashSet();
|
||||
//var errorTemplateNames = errorTasks.Select(t => t.Template!.Name).ToHashSet();
|
||||
// Берем OldName из словаря
|
||||
var errorOldNames = errorTasks
|
||||
.Where(t => templateIdToOldName.ContainsKey(t.TemplateId))
|
||||
.Select(t => templateIdToOldName[t.TemplateId])
|
||||
.ToHashSet();
|
||||
|
||||
// Берем целевые таски, находим в них задания которым надо поставить ошибку
|
||||
tasksToSetErrorStatus = tasks
|
||||
.Where(t => errorTemplateNames.Contains(t.TemplateName))
|
||||
.Where(t => errorOldNames.Contains(t.TemplateName))
|
||||
.Select(t => t.TaskId)
|
||||
.ToList();
|
||||
|
||||
@@ -319,30 +328,36 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
var endDate = DateTimeOffset.UtcNow.Add(-_settingsFromDb.RobotWaitTime);
|
||||
|
||||
// Фильтруем старые задачи, которые МОЖНО взять в работу. Смотрим статусы роботов, можно взять в работу, только если (RobotStatus == Wait) или (InpRogress но которые еще не просрочены)
|
||||
var allowedRenameTasks = renameTasks.Where(t =>
|
||||
var allowedTasks = renameTasks.Where(t =>
|
||||
t.RobotStatusCode == (int)RobotStatusEnum.Wait
|
||||
|| (t.RobotStatusCode == (int)RobotStatusEnum.InProgress
|
||||
&& t.AttemptsNumber < _settingsFromDb.RobotAttemptsNumber
|
||||
&& t.LastRobotStatusUpdated < endDate)
|
||||
).ToList();
|
||||
|
||||
// Словарь для поиска подменной задачи по имени шаблона.
|
||||
// GroupBy + First на случай, если в бд есть дубликаты, но такого быть не может
|
||||
var renameTasksToDictionary = allowedRenameTasks
|
||||
.GroupBy(t => t.Template!.Name)
|
||||
.ToDictionary(
|
||||
t => t.Key,
|
||||
t => new RobotTaskDetails(t.First().Id, t.First().Template!.Name, t.First().Template!.NextRun)
|
||||
);
|
||||
// Формируем список заданий
|
||||
var originalCount = tasks.Count; // Запоминаем сколько было изначально
|
||||
|
||||
var errorTaskIdsSet = tasksToSetErrorStatus.ToHashSet();
|
||||
|
||||
// Создаем итоговый список
|
||||
// Из исходных тасков удалить те которым установлен статус ошибки
|
||||
var filteredOriginalTasks = tasks.Where(t => !errorTaskIdsSet.Contains(t.TaskId)).ToList();
|
||||
var errorCount = errorTaskIdsSet.Count;
|
||||
|
||||
// Создаем словарь, где КЛЮЧОМ является OldName (который совпадает с task.TemplateName),
|
||||
// а не текущее имя шаблона (которое уже новое).
|
||||
var renameTasksToDictionary = allowedTasks
|
||||
.Where(t => templateIdToOldName.ContainsKey(t.TemplateId))
|
||||
.GroupBy(t => templateIdToOldName[t.TemplateId]) // Группируем по OldName!
|
||||
.ToDictionary(
|
||||
g => g.Key, // Ключ = OldName (например, "СтароеИмя")
|
||||
g => new RobotTaskDetails(g.First().Id, g.First().Template!.Name, g.First().Template!.NextRun)
|
||||
);
|
||||
|
||||
// Проходим по ИСХОДНОМУ списку, чтобы сохранить порядок сортировки и корректно подменить задачи
|
||||
var finalTasks = new List<RobotTaskDetails>(tasks.Count);
|
||||
int replacedCount = 0;
|
||||
int errorCount = errorTaskIdsSet.Count;
|
||||
|
||||
// Проходим по ИСХОДНОМУ списку, чтобы сохранить его порядок сортировки
|
||||
foreach (var task in tasks)
|
||||
{
|
||||
// Если задаче нужно поставить ошибку, просто пропускаем ее (она не попадет в итоговый список)
|
||||
@@ -351,7 +366,7 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
continue;
|
||||
}
|
||||
|
||||
// Если для этого имени шаблона есть разрешенная задача на переименование - вставляем ее на место текущей
|
||||
// ключ в словаре - это OldName, который равен task.TemplateName
|
||||
if (renameTasksToDictionary.TryGetValue(task.TemplateName, out var renameTask))
|
||||
{
|
||||
finalTasks.Add(renameTask);
|
||||
@@ -364,13 +379,13 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
}
|
||||
}
|
||||
|
||||
// Логируем итоговую статистику трансформации пула задач
|
||||
_logger.LogInformation(
|
||||
"Трансформация пула задач (Rename). Исходных: {OriginalCount}. Отклонено (Error): {ErrorCount}. " +
|
||||
"Заменено на старые: {ReplacedCount}. Итого к выдаче: {FinalCount}",
|
||||
tasks.Count, errorCount, replacedCount, finalTasks.Count
|
||||
);
|
||||
"Трансформация пула задач завершена. Исходных: {OriginalCount} шт. " +
|
||||
"Отклонено (ошибка): {ErrorCount} шт. Заменено на старые: {ReplacedCount} шт. " +
|
||||
"Итого к выдаче: {FinalCount} шт.",
|
||||
originalCount, errorCount, replacedCount, finalTasks.Count);
|
||||
|
||||
// Возвращаем без дополнительной сортировки по NextRun. Порядок сохранен начального списка
|
||||
return finalTasks;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user