feat(dal,core): Рефакторинг методов и логики выдачи заданий роботом при переименовании шаблонов
This commit is contained in:
@@ -54,7 +54,7 @@ namespace PARR.DAL.Repositories
|
||||
? ((TaskStatusEnum)taskStatusValue).ToString()
|
||||
: $"Unknown ({taskStatusValue})";
|
||||
|
||||
logger.LogInformation("Нельзя установить статус {newStatus} для конфигурации {configurationId}, templateId: {templateId}, так как текущий статус {currentStatus}",
|
||||
_logger.LogInformation("Нельзя установить статус {newStatus} для конфигурации {configurationId}, templateId: {templateId}, так как текущий статус {currentStatus}",
|
||||
updatingStatus, configuration.Id, configuration.TemplateId, taskStatusName);
|
||||
return false;
|
||||
}
|
||||
@@ -65,13 +65,13 @@ namespace PARR.DAL.Repositories
|
||||
// есть ли связь у config с templetes, может инклуда нет, мало ли
|
||||
if (configuration.Template == null)
|
||||
{
|
||||
logger.LogWarning("При изменении статуса задания на обновление шаблона, не смог проверить наличае ScheduleEsppId, так как нет Include с Templates. Пропустил эту проверку. configurationId: {configurationId}", configuration.Id);
|
||||
_logger.LogWarning("При изменении статуса задания на обновление шаблона, не смог проверить наличае ScheduleEsppId, так как нет Include с Templates. Пропустил эту проверку. configurationId: {configurationId}", configuration.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (configuration.Template.ScheduleEsppId == null)
|
||||
{
|
||||
logger.LogInformation("Нельзя установить статус {newStatus} для конфигурации {configurationId}, templateId: {templateId}, так как у шаблона отсутсвтует ScheduleEsppId=null",
|
||||
_logger.LogInformation("Нельзя установить статус {newStatus} для конфигурации {configurationId}, templateId: {templateId}, так как у шаблона отсутсвтует ScheduleEsppId=null",
|
||||
updatingStatus, configuration.Id, configuration.TemplateId);
|
||||
return false;
|
||||
}
|
||||
@@ -80,7 +80,7 @@ namespace PARR.DAL.Repositories
|
||||
|
||||
// Статус ОК, можно ставить Updating
|
||||
ChangeTaskStatus(updatingStatus, configuration);
|
||||
logger.LogInformation("Установлен статус {newStatus} для конфигурации {configurationId}, templateId: {templateId}", updatingStatus, configuration.Id, configuration.TemplateId);
|
||||
_logger.LogInformation("Установлен статус {newStatus} для конфигурации {configurationId}, templateId: {templateId}", updatingStatus, configuration.Id, configuration.TemplateId);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -154,7 +154,7 @@ namespace PARR.DAL.Repositories
|
||||
|
||||
if (config == null)
|
||||
{
|
||||
logger.LogError($"У шаблона нет конфигурации роботов. TemplateId: {template.Id}");
|
||||
_logger.LogError($"У шаблона нет конфигурации роботов. TemplateId: {template.Id}");
|
||||
throw new Exception($"У шаблона нет конфигурации роботов. TemplateId: {template.Id}");
|
||||
}
|
||||
|
||||
@@ -170,60 +170,72 @@ namespace PARR.DAL.Repositories
|
||||
|
||||
var endDate = DateTimeOffset.UtcNow.Add(-robotWaitTime);
|
||||
|
||||
var configObjs = await EntitySet.Where(t =>
|
||||
var expiredConfigs = await EntitySet.Where(t =>
|
||||
t.RobotStatusCode == (int)RobotStatusEnum.InProgress
|
||||
&& t.AttemptsNumber >= robotAttemptsNumber
|
||||
&& t.LastRobotStatusUpdated <= endDate
|
||||
).ToListAsync();
|
||||
|
||||
if (!configObjs.Any())
|
||||
if (!expiredConfigs.Any())
|
||||
return;
|
||||
|
||||
configObjs.ForEach(item =>
|
||||
foreach (var item in expiredConfigs)
|
||||
{
|
||||
ChangeRobotStatus(RobotStatusEnum.Error, item);
|
||||
logger.LogInformation($"Устанавливаю RobotStatus: {RobotStatusEnum.Error} для RobotConfigurationId {item.Id}");
|
||||
});
|
||||
_logger.LogInformation("Устанавливаю статус RobotStatus: {RobotStatus} для RobotConfigurationId: {RobotConfigurationId}", RobotStatusEnum.Error, item.Id);
|
||||
}
|
||||
|
||||
#region Ищем, есть ли связанные шаблоны, которые должны переименоваться, им тоже нужно установить статус ошибки, но только для Шаблонов
|
||||
|
||||
var linksCount = 0;
|
||||
// Проактивная обработка связанных шаблонов переименования Old->New
|
||||
// Если старый шаблон умен, мы должны сразу убить (!!!замочить!!!) и новый (целевой), чтобы он не висел вечно в ожидании.
|
||||
|
||||
var templateIds = configObjs.Where(t => t.RobotCode == (int)RobotsEnum.TemplateOrder).Select(t => t.TemplateId).ToList();
|
||||
if (templateIds.Any())
|
||||
var expiredTemplateIds = expiredConfigs
|
||||
.Where(t => t.RobotCode == (int)RobotsEnum.TemplateOrder)
|
||||
.Select(t => t.TemplateId)
|
||||
.Distinct()
|
||||
.ToList();
|
||||
|
||||
if (expiredTemplateIds.Any())
|
||||
{
|
||||
// По этим именам находим целевые шаблоны, берем их задания, и ставим им статус Ошибка + записать в лог робота
|
||||
var configs = await EntitySet
|
||||
.Where(t => t.RobotCode == (int)RobotsEnum.TemplateOrder
|
||||
&& t.RobotStatusCode != (int)RobotStatusEnum.Error
|
||||
&& EntityContext.Templates.Any(tmpl =>
|
||||
templateIds.Contains(tmpl.Id)
|
||||
&& tmpl.TemplateRenamePending != null
|
||||
&& tmpl.TemplateRenamePending.OldName == t.Template!.Name))
|
||||
.ToListAsync();
|
||||
// Находим OldName для этих шаблонов из таблицы переименований.
|
||||
var oldNamesToFail = await EntityContext.Templates
|
||||
.Where(t => expiredTemplateIds.Contains(t.Id) && t.TemplateRenamePending != null)
|
||||
.Select(t => t.TemplateRenamePending!.OldName)
|
||||
.Distinct()
|
||||
.ToListAsync();
|
||||
|
||||
linksCount = configs.Count;
|
||||
|
||||
foreach (var item in configs)
|
||||
// Находим целевые (новые задачи), имена которых совпадают с найденными OldName
|
||||
if (oldNamesToFail.Any())
|
||||
{
|
||||
SetErrorRobotStatusAndMaxAttempts(item);
|
||||
var targetConfigs = await EntitySet
|
||||
.Where(t =>
|
||||
t.RobotCode == (int)RobotsEnum.TemplateOrder
|
||||
&& t.RobotStatusCode != (int)RobotStatusEnum.Error // Не трогаем те, что уже в ошибке
|
||||
&& oldNamesToFail.Contains(t.Template!.Name)
|
||||
).ToListAsync();
|
||||
|
||||
// Пишем в лог роботу
|
||||
var history = new RobotHistory
|
||||
foreach (var item in targetConfigs)
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
HistoryLevel = (int)RobotStatusEnum.Error,
|
||||
TaskStatusCode = item.TaskStatusCode,
|
||||
RobotConfigurationId = item.Id,
|
||||
RobotIp = null,
|
||||
RobotId = ParrComponentsEnum.Api.ToString(),
|
||||
RobotMessage = "[RobotConfigurationRepository] Установлен статус ошибки, так как не переименован связанный шаблон"
|
||||
};
|
||||
SetErrorRobotStatusAndMaxAttempts(item);
|
||||
|
||||
// Синхронный Add работает быстрее и безопаснее внутри цикла
|
||||
EntityContext.RobotHistories.Add(history);
|
||||
// Пишем в лог роботу
|
||||
var history = new RobotHistory
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
HistoryLevel = (int)RobotStatusEnum.Error,
|
||||
TaskStatusCode = item.TaskStatusCode,
|
||||
RobotConfigurationId = item.Id,
|
||||
RobotIp = null,
|
||||
RobotId = ParrComponentsEnum.Api.ToString(),
|
||||
RobotMessage = "[RobotConfigurationRepository] Установлен статус ошибки, так как не переименован связанный шаблон"
|
||||
};
|
||||
|
||||
logger.LogInformation($"Устанавливаю RobotStatus: {RobotStatusEnum.Error} для RobotConfigurationId {item.Id}");
|
||||
// Синхронный Add работает быстрее и безопаснее внутри цикла
|
||||
EntityContext.RobotHistories.Add(history);
|
||||
|
||||
_logger.LogInformation("Проактивно установлен статус {Status} для целевого задания RobotConfigurationID: {Id} из-за ошибки старого шаблона.", RobotStatusEnum.Error, item.Id);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
@@ -231,7 +243,7 @@ namespace PARR.DAL.Repositories
|
||||
var result = await CommitAsync();
|
||||
|
||||
if (!result)
|
||||
logger.LogError("Ошибка при сохранении изменений RobotStatus для просроченных заданий в количестве {Count} шт.", configObjs.Count + linksCount);
|
||||
_logger.LogError("Ошибка при сохранении изменений RobotStatus для просроченных заданий. Откат транзакции.");
|
||||
//else
|
||||
// logger.LogInformation("Успешно обработано и переведено в статус Ошибки просроченных заданий: {Count} шт.", configObjs.Count + linksCount);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user