using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace Nashel.Modules.Reputation.Infrastructure.BackgroundJobs { public class AutoReviewJob : BackgroundService { private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; public AutoReviewJob(ILogger logger, IServiceProvider serviceProvider) { _logger = logger; _serviceProvider = serviceProvider; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Запуск AutoReviewJob..."); while (!stoppingToken.IsCancellationRequested) { try { _logger.LogInformation("AutoReviewJob: Проверка заказов без отзывов..."); // TODO: Реализовать логику авто-отзыва // 1. Получить все завершенные заказы (из модуля Order или через Integration Events/View) // 2. Отфильтровать те, которые завершены > 7 дней назад // 3. Проверить, есть ли уже отзыв для этого заказа (в таблице Reviews) // 4. Если отзыва нет -> создать Review с Rating=5 и IsAutoGenerated=true // 5. Сохранить в БД (ReviewRepository.AddAsync) using (var scope = _serviceProvider.CreateScope()) { var logger = scope.ServiceProvider.GetRequiredService>(); var reviewRepo = scope.ServiceProvider.GetRequiredService(); // Логика авто-отзыва: // 1. Ищем заказы, которые были завершены ровно 7 дней назад. // Это можно сделать через интеграционное событие или запрос к Order Module. // 2. Для каждого такого заказа проверяем, оставил ли уже клиент отзыв. // 3. Если отзыва нет: // Review autoReview = Review.Create(order.Id, Guid.Empty (System), order.EmployeeId, 5, "Авто-отзыв: Заказ успешно завершен.", isAutoGenerated: true); // await reviewRepo.AddAsync(autoReview); logger.LogInformation("AutoReviewJob: Проверка завершена."); } // Ждем 24 часа перед следующей проверкой await Task.Delay(TimeSpan.FromHours(24), stoppingToken); } catch (Exception ex) { _logger.LogError(ex, "Ошибка в AutoReviewJob"); // Ждем немного перед повторной попыткой при ошибке await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken); } } } } }