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
2025-12-09 12:20:27 +10:00
public void ChangeTaskStatus ( TaskStatusEnum taskStatus , RobotConfiguration configuration )
2023-10-05 16:56:02 +10:00
{
configuration . TaskStatusCode = ( int ) taskStatus ;
switch ( taskStatus )
{
case TaskStatusEnum . Creating :
2025-12-09 12:20:27 +10:00
ChangeRobotStatus ( RobotStatusEnum . Wait , configuration ) ;
2023-10-05 16:56:02 +10:00
break ;
case TaskStatusEnum . Updating :
2025-12-09 12:20:27 +10:00
ChangeRobotStatus ( RobotStatusEnum . Wait , configuration ) ;
2023-10-05 16:56:02 +10:00
break ;
case TaskStatusEnum . Ok :
2025-12-09 12:20:27 +10:00
ChangeRobotStatus ( RobotStatusEnum . Complete , configuration ) ;
2023-10-05 16:56:02 +10:00
break ;
default :
break ;
}
2026-03-06 15:10:30 +10:00
}
2023-10-05 16:56:02 +10:00
2026-03-06 15:10:30 +10:00
public bool SetUpdateTaskStatusIfAllow ( RobotConfiguration configuration )
{
var updatingStatus = TaskStatusEnum . Updating ;
// ставить статус Updating можно только если текущий статус == Ok
if ( configuration . TaskStatusCode ! = ( int ) TaskStatusEnum . Ok )
{
logger . LogDebug ( "Нельзя установить статус {newStatus} для конфигурации {configurationId}, так как текущий статус {currentStatus}" , updatingStatus , configuration . Id , configuration . TaskStatusCode ) ;
return false ;
}
// Статус О К , можно ставить Updating
ChangeTaskStatus ( updatingStatus , configuration ) ;
logger . LogDebug ( "Установлен статус {newStatus} для конфигурации {configurationId}" , updatingStatus , configuration . Id ) ;
return true ;
2023-10-05 16:56:02 +10:00
}
2026-03-06 15:10:30 +10:00
2025-12-09 12:20:27 +10:00
public void ChangeRobotStatus ( RobotStatusEnum robotStatus , RobotConfiguration configuration )
2023-10-05 16:56:02 +10:00
{
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 ;
}
}
2025-11-26 14:34:03 +10:00
public RobotConfiguration GetFromTemplateByRobotCode ( RobotsEnum robotsEnum , Template template )
2023-10-05 16:56:02 +10:00
{
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 = >
{
2025-12-09 12:20:27 +10:00
ChangeRobotStatus ( RobotStatusEnum . Error , item ) ;
2023-10-05 16:56:02 +10:00
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
}
}