2023-10-05 12:28:31 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2023-11-22 12:04:33 +10:00
|
|
|
|
using PARR.Constants;
|
2023-10-05 12:28:31 +10:00
|
|
|
|
using PARR.DAL.Context;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
using PARR.DAL.Contracts;
|
2023-10-05 12:28:31 +10:00
|
|
|
|
using PARR.DAL.Models;
|
|
|
|
|
|
using PARR.DAL.Services.Abstracts;
|
|
|
|
|
|
using PARR.DAL.Services.Interfaces;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PARR.DAL.Services.Implementations
|
|
|
|
|
|
{
|
|
|
|
|
|
internal class RobotConfigurationService : BaseService<RobotConfiguration>, IRobotConfigurationService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly DataContext dataContext;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
private readonly ILogger<RobotConfigurationService> logger;
|
2023-10-05 12:28:31 +10:00
|
|
|
|
|
|
|
|
|
|
public RobotConfigurationService(DataContext dataContext, ILogger<RobotConfigurationService> logger) : base(logger)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.dataContext = dataContext;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
this.logger = logger;
|
2023-10-05 12:28:31 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override DbSet<RobotConfiguration> EntitySet => dataContext.RobotConfigurations;
|
|
|
|
|
|
|
|
|
|
|
|
protected override DataContext EntitiContext => dataContext;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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++;
|
2023-10-06 11:38:33 +10:00
|
|
|
|
configuration.LastRobotStatusUpdated = DateTimeOffset.UtcNow;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
break;
|
|
|
|
|
|
//case RobotStatusEnum.Error:
|
|
|
|
|
|
// break;
|
|
|
|
|
|
case RobotStatusEnum.Complete:
|
2023-10-06 11:38:33 +10:00
|
|
|
|
configuration.LastRobotStatusUpdated = DateTimeOffset.UtcNow;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
break;
|
|
|
|
|
|
case RobotStatusEnum.Wait:
|
2023-10-06 11:38:33 +10:00
|
|
|
|
configuration.LastRobotStatusUpdated = null;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
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
|
2023-10-06 11:38:33 +10:00
|
|
|
|
&& t.LastRobotStatusUpdated <= endDate
|
2023-10-05 16:56:02 +10:00
|
|
|
|
).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}");
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-10-05 12:28:31 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|