feat(core): Задание роботам с подменой на переименование шаблона, выдается только для шаблонов в статусе StatusTypeId==Used

This commit is contained in:
Mikhail Trubnikov
2026-07-28 16:15:01 +10:00
parent 8798529b4d
commit 56cdca0502

View File

@@ -335,38 +335,64 @@ namespace PARR.Core.Services.RobotTask.Implementations
&& t.LastRobotStatusUpdated < endDate) && t.LastRobotStatusUpdated < endDate)
).ToList(); ).ToList();
// Проверим StatusTypeId у старых шаблонов в процессе переименования
// 1. Находим задачи переименования, у которых StatusTypeId шаблона != Used
var invalidRenameTasks = allowedTasks
.Where(t => t.Template != null && t.Template.StatusTypeId != TemplateStatusTypeEnum.Used)
.ToList();
// 2. Создаем словарь для быстрого поиска и логирования: OldName -> StatusTypeId
var invalidOldNamesWithStatus = invalidRenameTasks
.Where(t => templateIdToOldName.ContainsKey(t.TemplateId))
.Select(t => new { OldName = templateIdToOldName[t.TemplateId], StatusTypeId = t.Template!.StatusTypeId })
.ToDictionary(x => x.OldName, x => x.StatusTypeId);
// 3. Оставляем для подмены только те задачи, у которых StatusTypeId == 0
var validAllowedTasks = allowedTasks
.Where(t => t.Template != null && t.Template.StatusTypeId == TemplateStatusTypeEnum.Used)
.ToList();
// Формируем список заданий // Формируем список заданий
var originalCount = tasks.Count; // Запоминаем сколько было изначально var originalCount = tasks.Count;
var errorTaskIdsSet = tasksToSetErrorStatus.ToHashSet(); var errorTaskIdsSet = tasksToSetErrorStatus.ToHashSet();
// Из исходных тасков удалить те которым установлен статус ошибки
var filteredOriginalTasks = tasks.Where(t => !errorTaskIdsSet.Contains(t.TaskId)).ToList();
var errorCount = errorTaskIdsSet.Count; var errorCount = errorTaskIdsSet.Count;
// Создаем словарь, где КЛЮЧОМ является OldName (который совпадает с task.TemplateName), // Создаем словарь подмены ТОЛЬКО из валидных задач (где StatusTypeId == Used)
// а не текущее имя шаблона (которое уже новое). var renameTasksToDictionary = validAllowedTasks
var renameTasksToDictionary = allowedTasks
.Where(t => templateIdToOldName.ContainsKey(t.TemplateId)) .Where(t => templateIdToOldName.ContainsKey(t.TemplateId))
.GroupBy(t => templateIdToOldName[t.TemplateId]) // Группируем по OldName! .GroupBy(t => templateIdToOldName[t.TemplateId])
.ToDictionary( .ToDictionary(
g => g.Key, // Ключ = OldName (например, "СтароеИмя") g => g.Key,
g => new RobotTaskDetails(g.First().Id, g.First().Template!.Name, g.First().Template!.NextRun) g => new RobotTaskDetails(g.First().Id, g.First().Template!.Name, g.First().Template!.NextRun)
); );
// Проходим по ИСХОДНОМУ списку, чтобы сохранить порядок сортировки и корректно подменить задачи // Проходим по ИСХОДНОМУ списку, чтобы сохранить порядок сортировки
var finalTasks = new List<RobotTaskDetails>(tasks.Count); var finalTasks = new List<RobotTaskDetails>(tasks.Count);
int replacedCount = 0; int replacedCount = 0;
int excludedByStatusCount = 0; // Счетчик для логов
foreach (var task in tasks) foreach (var task in tasks)
{ {
// Если задаче нужно поставить ошибку, просто пропускаем ее (она не попадет в итоговый список) // 1. Если задаче нужно поставить ошибку, пропускаем ее
if (errorTaskIdsSet.Contains(task.TaskId)) if (errorTaskIdsSet.Contains(task.TaskId))
{ {
continue; continue;
} }
// ключ в словаре - это OldName, который равен task.TemplateName // 2. Если этот шаблон связан с переименованием, но у старого шаблона StatusTypeId != Used
if (invalidOldNamesWithStatus.TryGetValue(task.TemplateName, out var badStatusId))
{
_logger.LogWarning(
"Задача для шаблона '{TemplateName}' (TaskId: {TaskId}) ИСКЛЮЧЕНА из выдачи. " +
"Связанный шаблон в процессе переименования имеет недопустимый StatusTypeId = {StatusTypeId} (ожидалось Used). " +
"Исходная задача также не выполняется.",
task.TemplateName, task.TaskId, badStatusId);
excludedByStatusCount++;
continue; // Не добавляем ни старую, ни новую задачу в итоговый список
}
// 3. Если для этого имени шаблона есть разрешенная задача на переименование (и она валидна) - вставляем ее
if (renameTasksToDictionary.TryGetValue(task.TemplateName, out var renameTask)) if (renameTasksToDictionary.TryGetValue(task.TemplateName, out var renameTask))
{ {
finalTasks.Add(renameTask); finalTasks.Add(renameTask);
@@ -382,10 +408,11 @@ namespace PARR.Core.Services.RobotTask.Implementations
// Логируем итоговую статистику трансформации пула задач // Логируем итоговую статистику трансформации пула задач
_logger.LogInformation( _logger.LogInformation(
"Трансформация пула задач завершена. Исходных: {OriginalCount} шт. " + "Трансформация пула задач завершена. Исходных: {OriginalCount} шт. " +
"Отклонено (ошибка): {ErrorCount} шт. Заменено на старые: {ReplacedCount} шт. " + "Отклонено (ошибка): {ErrorCount} шт. Исключено (невалидный StatusTypeId): {ExcludedCount} шт. " +
"Итого к выдаче: {FinalCount} шт.", "Заменено на старые: {ReplacedCount} шт. Итого к выдаче: {FinalCount} шт.",
originalCount, errorCount, replacedCount, finalTasks.Count); originalCount, errorCount, excludedByStatusCount, replacedCount, finalTasks.Count);
// Возвращаем без дополнительной сортировки по NextRun. Порядок сохранен начального списка
return finalTasks; return finalTasks;
} }