using Microsoft.EntityFrameworkCore; using PARR.BLL.Contracts.Interfaces; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.Common.Domain; using PARR.Constants; using PARR.DAL.DomainServices.Interfaces; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.TemplateGeneratorWorker.Services; using PARR.TemplateGeneratorWorker.Settings; namespace PARR.TemplateGeneratorWorker { public class Worker : BackgroundService { private readonly ILogger logger; private readonly IMqSettings mqSettings; private readonly IMqService mqService; private readonly ITransformService transformService; private readonly IValidatorService validatorService; private readonly IServiceProvider serviceProvider; public Worker( ILogger logger, MqSettings mqSettings, IMqService mqService, ITransformService transformService, IValidatorService validatorService, IServiceProvider serviceProvider ) { this.logger = logger; this.mqSettings = mqSettings; this.mqService = mqService; this.transformService = transformService; this.validatorService = validatorService; this.serviceProvider = serviceProvider; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var isConnected = mqService.InitConsumer(mqSettings, GenerateTemplateAsync); if (!isConnected) throw new Exception("Ошибка при подключении к RabbitMq"); } } public override Task StopAsync(CancellationToken cancellationToken) { mqService.Dispose(); return base.StopAsync(cancellationToken); } private async Task GenerateTemplateAsync(string msg) { logger.LogInformation($"{this.GetType().Name}. Получили запрос: {msg}"); var query = transformService.GetModelFromJson(msg); if (query == null) return; if (!await validatorService.IsValidAsync(query.JobId, query.UnitId)) { logger.LogError($"Некорректные параметры регламентной работы {nameof(query.JobId)}: {query.JobId}"); return; } using (var scope = serviceProvider.CreateScope()) { var jobService = GetServiceInScope(scope); var job = await jobService .Get().AsNoTracking() .FirstOrDefaultAsync(t => t.Id == query.JobId); var shortcodesService = GetServiceInScope(scope); var templateName = await shortcodesService.ApplyShortcodesAsync(job!.TemplateNameMask!, query.UnitId, query.JobId); var template = new Template { Id = Guid.NewGuid(), Name = templateName, UnitId = query.UnitId, JobId = query.JobId, IsActiveTemplate = query.IsActiveTemplate ?? false, IsActiveSchedule = query.IsActiveSchedule ?? false, InitiatorComment = query.HistoryInitiator?.InitiatorComment, InitiatorParrComponentId = query.HistoryInitiator?.InitiatorParrComponentId }; var templateService = GetServiceInScope(scope); if (!await templateService.CreateAsync(template) || !await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Запрос на генерацию с тестового шаблона", InitiatorParrComponentId = ParrComponentsEnum.TemplateGenerator })) { logger.LogError($"Ошибка при создании шаблона: Name: {template.Name}, {nameof(template.Job)}: {template.JobId}, {nameof(template.Unit)}: {template.UnitId}"); } else { logger.LogInformation($"Создан шаблон: Name: {template.Name}, {nameof(template.Job)}: {template.JobId}, {nameof(template.Unit)}: {template.UnitId}"); } } } private Service GetServiceInScope(IServiceScope scope) { var service = scope.ServiceProvider.GetService(); if (service == null) throw new Exception($"Не найден сервис: {nameof(Service)}"); return service; } } }