feat(api): Логика смены статусов для заданий робота. RobotTaskController
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.DAL.Context;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Services.Abstracts;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
@@ -10,14 +11,107 @@ namespace PARR.DAL.Services.Implementations
|
||||
internal class RobotConfigurationService : BaseService<RobotConfiguration>, IRobotConfigurationService
|
||||
{
|
||||
private readonly DataContext dataContext;
|
||||
private readonly ILogger<RobotConfigurationService> logger;
|
||||
|
||||
public RobotConfigurationService(DataContext dataContext, ILogger<RobotConfigurationService> logger) : base(logger)
|
||||
{
|
||||
this.dataContext = dataContext;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
protected override DbSet<RobotConfiguration> EntitySet => dataContext.RobotConfigurations;
|
||||
|
||||
protected override DataContext EntitiContext => dataContext;
|
||||
|
||||
|
||||
public void ChangeTaskStatus(TaskStatusEnum taskStatus, ref RobotConfiguration configuration)
|
||||
{
|
||||
configuration.TaskStatusCode = (int)taskStatus;
|
||||
|
||||
switch (taskStatus)
|
||||
{
|
||||
case TaskStatusEnum.Creating:
|
||||
ChangeRobotStatus(RobotStatusEnum.Wait, ref configuration);
|
||||
break;
|
||||
case TaskStatusEnum.Updating:
|
||||
ChangeRobotStatus(RobotStatusEnum.Wait, ref configuration);
|
||||
break;
|
||||
case TaskStatusEnum.Ok:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void ChangeRobotStatus(RobotStatusEnum robotStatus, ref RobotConfiguration configuration)
|
||||
{
|
||||
configuration.RobotStatusCode = (int)robotStatus;
|
||||
|
||||
switch (robotStatus)
|
||||
{
|
||||
case RobotStatusEnum.InProgress:
|
||||
configuration.AttemptsNumber++;
|
||||
configuration.LastStatusUpdated = DateTimeOffset.UtcNow;
|
||||
break;
|
||||
//case RobotStatusEnum.Error:
|
||||
// break;
|
||||
case RobotStatusEnum.Complete:
|
||||
configuration.LastStatusUpdated = DateTimeOffset.UtcNow;
|
||||
break;
|
||||
case RobotStatusEnum.Wait:
|
||||
configuration.LastStatusUpdated = null;
|
||||
configuration.AttemptsNumber = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public RobotConfiguration GetFromTemplateByRobotCode(RobotsEnum robotsEnum, ref Template template)
|
||||
{
|
||||
var config = template.RobotConfigurations.FirstOrDefault(t => t.RobotCode == (int)robotsEnum);
|
||||
|
||||
if (config == null)
|
||||
{
|
||||
logger.LogError($"У шаблона нет конфигурации роботов. TemplateId: {template.Id}");
|
||||
throw new Exception($"У шаблона нет конфигурации роботов. TemplateId: {template.Id}");
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
|
||||
// Поиск невыполненных заданий и установка им статуса ошибки робота
|
||||
public async Task FindUnfulfilledTaskAndSetRobotErrorStatusAsync(int robotAttemptsNumber, TimeSpan robotWaitTime)
|
||||
{
|
||||
//Ищем `RobotStatusCode` = 22 и `LastStatusUpdated` истекло и `AttemptsNumber` >= допустимого значения из настроек,
|
||||
//ставим всем этим записям `RobotStatusCode`= 33
|
||||
|
||||
var endDate = DateTimeOffset.UtcNow.Add(-robotWaitTime);
|
||||
|
||||
var configObjs = await EntitySet.Where(t =>
|
||||
t.RobotStatusCode == (int)RobotStatusEnum.InProgress
|
||||
&& t.AttemptsNumber >= robotAttemptsNumber
|
||||
&& t.LastStatusUpdated <= endDate
|
||||
).ToListAsync();
|
||||
|
||||
if (!configObjs.Any())
|
||||
return;
|
||||
|
||||
configObjs.ForEach(item =>
|
||||
{
|
||||
ChangeRobotStatus(RobotStatusEnum.Error, ref item);
|
||||
logger.LogInformation($"Устанавливаю RobotStatus: {RobotStatusEnum.Error} для RobotConfigurationId {item.Id}");
|
||||
});
|
||||
|
||||
var result = await CommitAsync();
|
||||
|
||||
if (!result)
|
||||
logger.LogError($"Ошибка при сохранении изменений RobotStatus для RobotConfigurationId: item.Id, RobotStatus: {RobotStatusEnum.Error}");
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,9 +13,9 @@ namespace PARR.DAL.Services.Implementations
|
||||
this.dataContext = dataContext;
|
||||
}
|
||||
|
||||
public IQueryable<StatusTask> Get()
|
||||
public IQueryable<Models.TaskStatus> Get()
|
||||
{
|
||||
return dataContext.StatusTasks;
|
||||
return dataContext.TaskStatuses;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,8 @@ namespace PARR.DAL.Services.Implementations
|
||||
.ThenInclude(p => p!.Process);
|
||||
}
|
||||
|
||||
//TODO: удалить этот метод
|
||||
#region delete
|
||||
public async Task CheckAndSetErrorRobotStatusAsync(int robotAttemptsNumber, TimeSpan robotWaitTime)
|
||||
{
|
||||
//Ищем `RobotStatusCode` = 22 и `RobotLastStatusUpdated` истекло и `RobotAttemptsNumber` >= допустимого значения из настроек,
|
||||
@@ -74,6 +76,7 @@ namespace PARR.DAL.Services.Implementations
|
||||
logger.LogError($"Ошибка при сохранении изменений RobotStatus у шаблонов на {RobotStatusEnum.Error}");
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void ChangeRobotStatus(RobotStatusEnum status, ref Template template)
|
||||
{
|
||||
@@ -98,5 +101,39 @@ namespace PARR.DAL.Services.Implementations
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<bool> CreateAsync(Template obj)
|
||||
{
|
||||
// добавление роботов для шаблона
|
||||
obj.RobotConfigurations = new List<RobotConfiguration>
|
||||
{
|
||||
// робот по управлению шаблоном
|
||||
new RobotConfiguration
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
DateCreated = DateTimeOffset.UtcNow,
|
||||
TemplateId = obj.Id,
|
||||
RobotCode = (int)RobotsEnum.TemplateOrder,
|
||||
TaskStatusCode = (int)TaskStatusEnum.Creating,
|
||||
RobotStatusCode = (int)RobotStatusEnum.Wait,
|
||||
AttemptsNumber = 0,
|
||||
LastStatusUpdated = null
|
||||
},
|
||||
// робот по управлениею расписанием
|
||||
new RobotConfiguration
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
DateCreated = DateTimeOffset.UtcNow,
|
||||
TemplateId = obj.Id,
|
||||
RobotCode = (int)RobotsEnum.ScheduleOrder,
|
||||
TaskStatusCode = (int)TaskStatusEnum.Creating,
|
||||
RobotStatusCode = (int)RobotStatusEnum.Wait,
|
||||
AttemptsNumber = 0,
|
||||
LastStatusUpdated = null
|
||||
}
|
||||
};
|
||||
|
||||
return base.CreateAsync(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,39 @@
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Services.Interfaces.Base;
|
||||
|
||||
namespace PARR.DAL.Services.Interfaces
|
||||
{
|
||||
public interface IRobotConfigurationService : IBaseService<RobotConfiguration>
|
||||
{
|
||||
/// <summary>
|
||||
/// Обновить статус работы робота
|
||||
/// </summary>
|
||||
/// <param name="robotStatus"></param>
|
||||
/// <param name="configuration"></param>
|
||||
void ChangeRobotStatus(RobotStatusEnum robotStatus, ref RobotConfiguration configuration);
|
||||
|
||||
/// <summary>
|
||||
/// Обновить статус задания (автоматически обновляется статус робота)
|
||||
/// </summary>
|
||||
/// <param name="taskStatus"></param>
|
||||
/// <param name="configuration"></param>
|
||||
void ChangeTaskStatus(TaskStatusEnum taskStatus, ref RobotConfiguration configuration);
|
||||
|
||||
/// <summary>
|
||||
/// Поиск невыполненных заданий и установка им статуса ошибки робота
|
||||
/// </summary>
|
||||
/// <param name="robotAttemptsNumber"></param>
|
||||
/// <param name="robotWaitTime"></param>
|
||||
/// <returns></returns>
|
||||
Task FindUnfulfilledTaskAndSetRobotErrorStatusAsync(int robotAttemptsNumber, TimeSpan robotWaitTime);
|
||||
|
||||
/// <summary>
|
||||
/// Получить конфигурацию из шаблона по RobotCode. У шаблона обязательно должен быть Include таблицы RobotConfiguration
|
||||
/// </summary>
|
||||
/// <param name="robotsEnum"></param>
|
||||
/// <param name="template"></param>
|
||||
/// <returns></returns>
|
||||
RobotConfiguration GetFromTemplateByRobotCode(RobotsEnum robotsEnum, ref Template template);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,6 @@ namespace PARR.DAL.Services.Interfaces
|
||||
{
|
||||
public interface IStatusTemplateService
|
||||
{
|
||||
IQueryable<StatusTask> Get();
|
||||
IQueryable<Models.TaskStatus> Get();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user