Files
parr_api/PARR.TemplateActivator/TemplateActivator.cs

150 lines
7.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
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:
logger.LogInformation($"Получен запрос на активацию всех шаблонов");
query = query.Where(t => !t.IsActiveTemplate);
changes = await UpdateTemplateStateAsync(query, true);
break;
case TemplateActivatorActionsEnum.ActivateTemplatesWithActiveSchedules:
logger.LogInformation($"Получен запрос на активацию всех шаблонов, у которых активировано расписание");
query = query.Where(t => !t.IsActiveTemplate && t.IsActiveSchedule);
changes = await UpdateTemplateStateAsync(query, true);
break;
case TemplateActivatorActionsEnum.DeactivateAllTemplates:
logger.LogInformation($"Получен запрос на деактивацию всех шаблонов");
query = query.Where(t => t.IsActiveTemplate);
changes = await UpdateTemplateStateAsync(query, false);
break;
case TemplateActivatorActionsEnum.DeactivateTemplatesWithDeactivationSchedules:
logger.LogInformation($"Получен запрос на деактивацию всех шаблонов, у которых неактивированы расписания");
query = query.Where(t => t.IsActiveTemplate && !t.IsActiveSchedule);
changes = await UpdateTemplateStateAsync(query, false);
break;
case TemplateActivatorActionsEnum.ActivateAllSchedules:
logger.LogInformation($"Получен запрос на активацию всех расписаний");
query = query.Where(t => !t.IsActiveSchedule);
changes = await UpdateScheduleStateAsync(query, true);
break;
case TemplateActivatorActionsEnum.DeactivateAllSchedules:
logger.LogInformation($"Получен запрос на деактивацию всех расписаний");
query = query.Where(t => t.IsActiveSchedule);
changes = await UpdateScheduleStateAsync(query, false);
break;
case TemplateActivatorActionsEnum.ActivateSchedulesWithActiveTemplates:
logger.LogInformation($"Получен запрос на активацию всех расписаний, у которых активированы шаблоны");
query = query.Where(t => t.IsActiveTemplate && !t.IsActiveSchedule);
changes = await UpdateScheduleStateAsync(query, true);
break;
case TemplateActivatorActionsEnum.DeactivateSchedulesWithDeactivationTemplates:
logger.LogInformation($"Получен запрос на деактивацию всех расписаний, у которых неактивированы шаблоны");
query = query.Where(t => !t.IsActiveTemplate && t.IsActiveSchedule);
changes = await UpdateScheduleStateAsync(query, false);
break;
case TemplateActivatorActionsEnum.DeactivateSchedulesWithTemplateSyncErrors:
logger.LogInformation($"Получен запрос на деактивацию всех расписаний, у которых шаблоны синхронизированы с ошибкой");
query = query.Where(t => !t.IsActiveTemplate &&
t.RobotConfigurations.Any(t =>
t.RobotCode == (int) RobotsEnum.TemplateOrder &&
t.RobotStatusCode == (int)RobotStatusEnum.Error)
);
changes = await UpdateScheduleStateAsync(query, false);
break;
default:
break;
}
if (changes > 0 && !await templateService.CommitAsync())
logger.LogError($"{this.GetType} не удалось записать измения в БД о новых состояниях шаблонов и расписаний регламентной работы Id {applicationInWorkId}");
}
/// <summary>
/// Обновить состояние расписаний по запросу query на newState, без записи в БД. Возвращает количество шаблонов требующих фиксации в БД
/// </summary>
/// <param name="query"></param>
/// <param name="newState"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Обновить состояние шаблонов по запросу query на newState, без записи в БД. Возвращает количество расписаний требующих фиксацию в БД
/// </summary>
/// <param name="query"></param>
/// <param name="newState"></param>
/// <returns></returns>
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;
}
/// <summary>
/// принудительно обновить состояние задачи, связанной с шаблоном/расписанием, на обновление
/// </summary>
/// <param name="robotsEnum"></param>
/// <param name="t"></param>
private void UpdateRobotConfiguration(RobotsEnum robotsEnum, Template t)
{
var config = robotConfigurationService.GetFromTemplateByRobotCode(robotsEnum, ref t);
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, ref config);
}
}