2024-07-25 17:23:08 +10:00
using Microsoft.EntityFrameworkCore ;
using Microsoft.Extensions.Logging ;
using PARR.Constants ;
using PARR.DAL.Contracts ;
using PARR.DAL.Models ;
using PARR.DAL.Services.Interfaces ;
namespace PARR.TemplateActivator ;
internal class TemplateActivator : ITemplateActivator
{
private readonly ILogger < TemplateActivator > logger ;
private readonly ITemplateService templateService ;
private readonly IRobotConfigurationService robotConfigurationService ;
public TemplateActivator (
ILogger < TemplateActivator > logger ,
ITemplateService templateService ,
IRobotConfigurationService robotConfigurationService
)
{
this . logger = logger ;
this . templateService = templateService ;
this . robotConfigurationService = robotConfigurationService ;
}
2024-07-26 11:41:40 +10:00
2024-07-25 17:23:08 +10:00
public async Task ChangeStateAsync ( Guid applicationInWorkId , TemplateActivatorActionsEnum action )
{
var query = templateService . Get ( )
. Include ( t = > t . RobotConfigurations ) . ThenInclude ( t = > t . Robot )
. Where ( t = > t . ApplicationInWorkId = = applicationInWorkId ) ;
var changes = 0 ;
switch ( action )
{
case TemplateActivatorActionsEnum . ActivateAllTemplates :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на активацию всех шаблонов" ) ;
2024-07-25 17:23:08 +10:00
query = query . Where ( t = > ! t . IsActiveTemplate ) ;
changes = await UpdateTemplateStateAsync ( query , true ) ;
break ;
case TemplateActivatorActionsEnum . ActivateTemplatesWithActiveSchedules :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на активацию всех шаблонов, у которых активировано расписание" ) ;
2024-07-25 17:23:08 +10:00
query = query . Where ( t = > ! t . IsActiveTemplate & & t . IsActiveSchedule ) ;
changes = await UpdateTemplateStateAsync ( query , true ) ;
break ;
case TemplateActivatorActionsEnum . DeactivateAllTemplates :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на деактивацию всех шаблонов" ) ;
2024-07-25 17:23:08 +10:00
query = query . Where ( t = > t . IsActiveTemplate ) ;
changes = await UpdateTemplateStateAsync ( query , false ) ;
break ;
case TemplateActivatorActionsEnum . DeactivateTemplatesWithDeactivationSchedules :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на деактивацию всех шаблонов, у которых неактивированы расписания" ) ;
query = query . Where ( t = > t . IsActiveTemplate & & ! t . IsActiveSchedule ) ;
2024-07-25 17:23:08 +10:00
changes = await UpdateTemplateStateAsync ( query , false ) ;
break ;
case TemplateActivatorActionsEnum . ActivateAllSchedules :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на активацию всех расписаний" ) ;
2024-07-25 17:23:08 +10:00
query = query . Where ( t = > ! t . IsActiveSchedule ) ;
changes = await UpdateScheduleStateAsync ( query , true ) ;
break ;
case TemplateActivatorActionsEnum . DeactivateAllSchedules :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на деактивацию всех расписаний" ) ;
2024-07-25 17:23:08 +10:00
query = query . Where ( t = > t . IsActiveSchedule ) ;
changes = await UpdateScheduleStateAsync ( query , false ) ;
break ;
case TemplateActivatorActionsEnum . ActivateSchedulesWithActiveTemplates :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на активацию всех расписаний, у которых активированы шаблоны" ) ;
2024-07-25 17:23:08 +10:00
query = query . Where ( t = > t . IsActiveTemplate & & ! t . IsActiveSchedule ) ;
changes = await UpdateScheduleStateAsync ( query , true ) ;
break ;
case TemplateActivatorActionsEnum . DeactivateSchedulesWithDeactivationTemplates :
2024-07-26 11:41:40 +10:00
logger . LogInformation ( $"Получен запрос на деактивацию всех расписаний, у которых неактивированы шаблоны" ) ;
query = query . Where ( t = > ! t . IsActiveTemplate & & t . IsActiveSchedule ) ;
2024-07-25 17:23:08 +10:00
changes = await UpdateScheduleStateAsync ( query , false ) ;
break ;
default :
break ;
}
if ( changes > 0 & & ! await templateService . CommitAsync ( ) )
2024-07-26 11:41:40 +10:00
logger . LogError ( $"{this.GetType} не удалось записать измения в БД о новых состояниях шаблонов и расписаний регламентной работы Id {applicationInWorkId}" ) ;
2024-07-25 17:23:08 +10:00
}
2024-07-26 11:41:40 +10:00
/// <summary>
/// Обновить состояние расписаний по запросу query на newState, без записи в БД. Возвращает количество шаблонов требующих фиксации в БД
/// </summary>
/// <param name="query"></param>
/// <param name="newState"></param>
/// <returns></returns>
2024-07-25 17:23:08 +10:00
private async Task < int > UpdateScheduleStateAsync ( IQueryable < Template > query , bool newState )
{
var templates = await query . Select ( t = > t ) . ToListAsync ( ) ;
if ( templates . Any ( ) )
templates . ForEach ( t = >
{
t . IsActiveSchedule = newState ;
UpdateRobotConfiguration ( RobotsEnum . ScheduleOrder , t ) ;
} ) ;
templates . ForEach ( t = > t . IsActiveSchedule = newState ) ;
return templates . Count ;
}
2024-07-26 11:41:40 +10:00
/// <summary>
2024-07-29 16:51:18 +10:00
/// Обновить состояние шаблонов по запросу query на newState, без записи в БД. Возвращает количество расписаний требующих фиксацию в БД
2024-07-26 11:41:40 +10:00
/// </summary>
/// <param name="query"></param>
/// <param name="newState"></param>
/// <returns></returns>
2024-07-25 17:23:08 +10:00
private async Task < int > UpdateTemplateStateAsync ( IQueryable < Template > query , bool newState )
{
var templates = await query . Select ( t = > t ) . ToListAsync ( ) ;
if ( templates . Any ( ) )
templates . ForEach ( t = >
{
t . IsActiveTemplate = newState ;
UpdateRobotConfiguration ( RobotsEnum . TemplateOrder , t ) ;
} ) ;
return templates . Count ;
}
2024-07-26 11:41:40 +10:00
/// <summary>
/// принудительно обновить состояние задачи, связанной с шаблоном/расписанием, на обновление
/// </summary>
/// <param name="robotsEnum"></param>
/// <param name="t"></param>
2024-07-25 17:23:08 +10:00
private void UpdateRobotConfiguration ( RobotsEnum robotsEnum , Template t )
{
var config = robotConfigurationService . GetFromTemplateByRobotCode ( robotsEnum , ref t ) ;
robotConfigurationService . ChangeTaskStatus ( TaskStatusEnum . Updating , ref config ) ;
}
}