feat(core,dal,domain,templateUpdater): Задания роботам выдаюстя с учетом подмены и множества переименований
This commit is contained in:
@@ -260,15 +260,18 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
if (tasks.Count == 0 || robotCode != RobotsEnum.TemplateOrder)
|
||||
return tasks;
|
||||
|
||||
_logger.LogDebug("Исходный пул задач для проверки переименования: {Tasks}",
|
||||
string.Join(" | ", tasks.Select(t => $"[Id: {t.TaskId}, Name: '{t.TemplateName}']")));
|
||||
|
||||
// Ищем есть ли связанные шаблоны с таким имененм на переименование
|
||||
var taskTemplateNames = tasks.Select(t => t.TemplateName).Distinct().ToList();
|
||||
// Ищем записи в таблице переименований, где OldName совпадает с именами наших новых задач
|
||||
var templatesToRename = await _templateRenamePendingRepository.Get().AsNoTracking()
|
||||
var templatesToRename = await _templateRenamePendingRepository.Get()
|
||||
.AsNoTracking()
|
||||
.Where(t => taskTemplateNames.Contains(t.OldName))
|
||||
.ToListAsync();
|
||||
|
||||
_logger.LogDebug("Найдено шаблонов в процессе переименования для текущих задач: {Count} шт.", templatesToRename.Count);
|
||||
_logger.LogDebug("Найдено записей в TemplateRenamePending для текущих задач: {Count} шт.", templatesToRename.Count);
|
||||
|
||||
if (templatesToRename.Count == 0)
|
||||
return tasks;
|
||||
@@ -288,7 +291,9 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
&& t.TaskStatusCode == (int)TaskStatusEnum.Updating
|
||||
).ToListAsync();
|
||||
|
||||
// --- Блок обработки ошибок ---
|
||||
// =========================================================================
|
||||
// БЛОК 1: ОБРАБОТКА ОШИБОК (Правило: если ХОТЯ БЫ ОДНА упала в ошибку -> оригинал в ошибку)
|
||||
// =========================================================================
|
||||
|
||||
// Если старый шаблон в ошибке и лимит попыток исчерпан, ставим ошибку и новому шаблону
|
||||
var errorTasks = renameTasks
|
||||
@@ -300,16 +305,16 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
var tasksToSetErrorStatus = new List<Guid>();
|
||||
if (errorTasks.Count > 0)
|
||||
{
|
||||
_logger.LogDebug("Найдено старых заданий на переименование с ошибками: {ErrorCount}. Ставим ошибку целевым (новым) заданиям.", errorTasks.Count);
|
||||
_logger.LogDebug("Найдено связанных заданий на переименование с ошибками: {ErrorCount}. Ставим ошибку целевым (новым) заданиям.", errorTasks.Count);
|
||||
|
||||
//var errorTemplateNames = errorTasks.Select(t => t.Template!.Name).ToHashSet();
|
||||
// Берем OldName из словаря
|
||||
// Собираем ВСЕ OldName, для которых есть хотя бы одна упавшая в ошибку задача.
|
||||
// Использование ToHashSet() гарантирует, что если 1 или 10 задач в ошибке, OldName попадет в набор один раз.
|
||||
var errorOldNames = errorTasks
|
||||
.Where(t => templateIdToOldName.ContainsKey(t.TemplateId))
|
||||
.Select(t => templateIdToOldName[t.TemplateId])
|
||||
.ToHashSet();
|
||||
|
||||
// Берем целевые таски, находим в них задания которым надо поставить ошибку
|
||||
// Находим оригинальные задачи, чье имя совпадает с любым из "ошибочных" OldName
|
||||
tasksToSetErrorStatus = tasks
|
||||
.Where(t => errorOldNames.Contains(t.TemplateName))
|
||||
.Select(t => t.TaskId)
|
||||
@@ -318,16 +323,17 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
if (tasksToSetErrorStatus.Count > 0)
|
||||
{
|
||||
// Устанавливаем ошибку целевым + пишем комментарий от робота + нажимаем комит
|
||||
var logMessage = "[RobotTaskService] Установлен статус ошибки, так как не переименован связанный шаблон";
|
||||
var logMessage = "[RobotTaskService] Установлен статус ошибки, так как хотя бы одна из связанных задач переименования не была успешно выполнена.";
|
||||
await SetErrorStatusAsync(tasksToSetErrorStatus, logMessage);
|
||||
}
|
||||
}
|
||||
|
||||
// --- Блок подмены задач ---
|
||||
|
||||
// =========================================================================
|
||||
// БЛОК 2: ПОДМЕНА ЗАДАЧ (Правило: берем ПЕРВУЮ валидную задачу для подмены)
|
||||
// =========================================================================
|
||||
var endDate = DateTimeOffset.UtcNow.Add(-_settingsFromDb.RobotWaitTime);
|
||||
|
||||
// Фильтруем старые задачи, которые МОЖНО взять в работу. Смотрим статусы роботов, можно взять в работу, только если (RobotStatus == Wait) или (InpRogress но которые еще не просрочены)
|
||||
// Фильтруем старые задачи, которые МОЖНО взять в работу. Смотрим статусы роботов, можно взять в работу, только если (RobotStatus == Wait) или (InProgress но которые еще не просрочены)
|
||||
var allowedTasks = renameTasks.Where(t =>
|
||||
t.RobotStatusCode == (int)RobotStatusEnum.Wait
|
||||
|| (t.RobotStatusCode == (int)RobotStatusEnum.InProgress
|
||||
@@ -347,7 +353,7 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
.Select(t => new { OldName = templateIdToOldName[t.TemplateId], StatusTypeId = t.Template!.StatusTypeId })
|
||||
.ToDictionary(x => x.OldName, x => x.StatusTypeId);
|
||||
|
||||
// 3. Оставляем для подмены только те задачи, у которых StatusTypeId == 0
|
||||
// 3. Оставляем для подмены только те задачи, у которых StatusTypeId == Used
|
||||
var validAllowedTasks = allowedTasks
|
||||
.Where(t => t.Template != null && t.Template.StatusTypeId == TemplateStatusTypeEnum.Used)
|
||||
.ToList();
|
||||
@@ -358,13 +364,15 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
var errorCount = errorTaskIdsSet.Count;
|
||||
|
||||
// Создаем словарь подмены ТОЛЬКО из валидных задач (где StatusTypeId == Used)
|
||||
// ГРУППИРУЕМ по OldName и берем .First()!
|
||||
// Это реализует правило: "если записей несколько, берем из них первую и подменяем ей оригинальное задание".
|
||||
var renameTasksToDictionary = validAllowedTasks
|
||||
.Where(t => templateIdToOldName.ContainsKey(t.TemplateId))
|
||||
.GroupBy(t => templateIdToOldName[t.TemplateId])
|
||||
.ToDictionary(
|
||||
g => g.Key,
|
||||
g => new RobotTaskDetails(g.First().Id, g.First().Template!.Name, g.First().Template!.NextRun)
|
||||
);
|
||||
.Where(t => templateIdToOldName.ContainsKey(t.TemplateId))
|
||||
.GroupBy(t => templateIdToOldName[t.TemplateId])
|
||||
.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);
|
||||
@@ -393,8 +401,13 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
}
|
||||
|
||||
// 3. Если для этого имени шаблона есть разрешенная задача на переименование (и она валидна) - вставляем ее
|
||||
// Подменяем оригинальную задачу на ПЕРВУЮ валидную задачу переименования
|
||||
if (renameTasksToDictionary.TryGetValue(task.TemplateName, out var renameTask))
|
||||
{
|
||||
_logger.LogDebug( "ПОДМЕНА ЗАДАЧИ: Исходная [Id: {OriginalId}, Name: '{OriginalName}'] " +
|
||||
"-> Заменена на [Id: {NewId}, Name: '{NewName}']",
|
||||
task.TaskId, task.TemplateName, renameTask.TaskId, renameTask.TemplateName);
|
||||
|
||||
finalTasks.Add(renameTask);
|
||||
replacedCount++;
|
||||
}
|
||||
@@ -405,11 +418,13 @@ namespace PARR.Core.Services.RobotTask.Implementations
|
||||
}
|
||||
}
|
||||
|
||||
// Логируем итоговую статистику трансформации пула задач
|
||||
_logger.LogDebug("Итоговый пул задач после трансформации: {Tasks}",
|
||||
string.Join(" | ", finalTasks.Select(t => $"[Id: {t.TaskId}, Name: '{t.TemplateName}']")));
|
||||
|
||||
_logger.LogInformation(
|
||||
"Трансформация пула задач завершена. Исходных: {OriginalCount} шт. " +
|
||||
"Отклонено (ошибка): {ErrorCount} шт. Исключено (невалидный StatusTypeId): {ExcludedCount} шт. " +
|
||||
"Заменено на старые: {ReplacedCount} шт. Итого к выдаче: {FinalCount} шт.",
|
||||
"Заменено на старые (взята первая из группы): {ReplacedCount} шт. Итого к выдаче: {FinalCount} шт.",
|
||||
originalCount, errorCount, excludedByStatusCount, replacedCount, finalTasks.Count);
|
||||
|
||||
// Возвращаем без дополнительной сортировки по NextRun. Порядок сохранен начального списка
|
||||
|
||||
Reference in New Issue
Block a user