2026-03-11 12:10:11 +10:00
using Microsoft.Extensions.DependencyInjection ;
2024-02-05 16:05:02 +10:00
using Microsoft.Extensions.Logging ;
2026-04-14 16:27:27 +10:00
using PARR.Core.Common.Interfaces ;
2026-04-13 16:58:30 +10:00
using PARR.Domain.Entities.Base.History ;
using PARR.Domain.Enums ;
2026-03-11 12:10:11 +10:00
using PARR.NextRun.Services ;
2024-02-05 16:05:02 +10:00
using PARR.NextRun.Settings ;
namespace PARR.NextRun
{
2026-02-27 14:05:25 +10:00
/// <summary>
/// Расчет nextRun по интервалу
/// </summary>
internal class NextRunIntervalService : INextRunIntervalService
2024-02-05 16:05:02 +10:00
{
private readonly WorkerSettings workerSettings ;
2026-02-27 14:05:25 +10:00
private readonly ILogger < NextRunIntervalService > logger ;
2024-02-05 16:05:02 +10:00
private readonly IIntervalService intervalService ;
private readonly IServiceProvider serviceProvider ;
2026-02-27 14:05:25 +10:00
public NextRunIntervalService (
2024-02-05 16:05:02 +10:00
WorkerSettings workerSettings ,
2026-02-27 14:05:25 +10:00
ILogger < NextRunIntervalService > logger ,
2024-02-05 16:05:02 +10:00
IIntervalService intervalService ,
IServiceProvider serviceProvider
)
{
this . workerSettings = workerSettings ;
this . logger = logger ;
this . intervalService = intervalService ;
this . serviceProvider = serviceProvider ;
}
public async Task StartAsync ( )
{
logger . LogInformation ( "Запуск сервиса рассчета времени следующего создания наряда (nextRun)" ) ;
await intervalService . IntervalInitAsync ( async ( ) = >
{
using ( var scope = serviceProvider . CreateScope ( ) )
{
2026-03-11 12:10:11 +10:00
var nextRunUpdateService = scope . ServiceProvider . GetRequiredService < INextRunUpdateService > ( ) ;
await nextRunUpdateService . UpdateNextRunForTemplatesAsync (
// фильтр, только просроченные шаблоны
query = > query . Where ( t = > t . NextRun < DateTimeOffset . UtcNow ) ,
( ) = > new HistoryInitiator
{
InitiatorComment = "Обновлён NextRun (интервал)" ,
InitiatorParrComponentId = ParrComponentsEnum . NextRun
} ,
"Интервал"
) ;
//var templateService = scope.ServiceProvider.GetRequiredService<ITemplateService>();
//var nextRunService = scope.ServiceProvider.GetRequiredService<INextRunService>();
//var robotConfigurationService = scope.ServiceProvider.GetRequiredService<IRobotConfigurationService>();
//await HandlerAsync(templateService, nextRunService, robotConfigurationService);
2024-02-05 16:05:02 +10:00
}
} , workerSettings . RepeatEvery ) ;
}
2026-03-11 12:10:11 +10:00
///// <summary>
///// Рассчет следующей даты срабатываения
///// </summary>
///// <returns></returns>
//private async Task HandlerAsync(ITemplateService templateService, INextRunService nextRunService, IRobotConfigurationService robotConfigurationService)
//{
// logger.LogInformation("Начинаю обновлять NextRun по расписанию");
2024-02-05 16:05:02 +10:00
2026-03-11 12:10:11 +10:00
// await UpdateNextRunAsync(templateService, nextRunService, robotConfigurationService);
2026-01-23 09:28:14 +10:00
2026-03-11 12:10:11 +10:00
// logger.LogInformation($"Завершено обновление полей NextRun.");
//}
2026-01-23 09:28:14 +10:00
2026-03-11 12:10:11 +10:00
//private async Task UpdateNextRunAsync(ITemplateService templateService, INextRunService nextRunService, IRobotConfigurationService robotConfigurationService)
//{
// // выбираем все шаблоны с просроченным nextRun в статусе Used
2026-02-05 15:41:36 +10:00
2026-03-11 12:10:11 +10:00
// var templatesForUpdate = await templateService.Get()
// .Include(t => t.RobotConfigurations)
// .Where(t =>
// t.StatusTypeId == TemplateStatusTypeEnum.Used
// && t.NextRun < DateTimeOffset.UtcNow
// ).ToListAsync();
2026-02-05 15:41:36 +10:00
2026-03-11 12:10:11 +10:00
// logger.LogInformation("Найдено шаблонов в статусе Used с просроченным NextRun {count} шт.", templatesForUpdate.Count);
2026-02-05 15:41:36 +10:00
2026-03-11 12:10:11 +10:00
// if (!templatesForUpdate.Any())
// return;
2026-02-05 15:41:36 +10:00
2026-03-11 12:10:11 +10:00
// foreach (var template in templatesForUpdate)
// {
// var newNextRun = await nextRunService.GetNextRunForTemplateAsync(template.Id, false);
2026-02-05 15:41:36 +10:00
2026-03-11 12:10:11 +10:00
// if (newNextRun.HasValue)
// {
// template.LastRun = template.NextRun;
// template.NextRun = newNextRun.Value;
2026-02-05 15:41:36 +10:00
2026-03-11 12:10:11 +10:00
// //так как nextRun обновился, пробуем поставить задание на обновление
// var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, template);
// robotConfigurationService.SetUpdateTaskStatusIfAllow(config);
// }
// else
// {
// logger.LogError("При расчете nextRun для шаблона {templateId}, '{templateName}', nextRun=null. Это значит что при расчете возникла ошибка.", template.Id, template.Name);
// }
// }
2026-02-05 15:41:36 +10:00
2026-03-11 12:10:11 +10:00
// if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = ParrComponentsEnum.NextRun }))
// {
// logger.LogInformation("Обновлены значения полей NextRun для шаблонов в статусе Used, {count} шт.", templatesForUpdate.Count);
// }
// else
// {
// logger.LogError("Ошибка при обновлении значений полей NextRun, для шаблонов в статусе Used, {count} шт.", templatesForUpdate.Count);
// }
//}
2026-02-05 15:41:36 +10:00
2026-02-27 14:05:25 +10:00
2024-02-05 16:05:02 +10:00
}
}