Модуль репутации

This commit is contained in:
Халимов Рустам
2026-02-12 16:11:14 +03:00
parent d6c1f63842
commit 46f008aefa
38 changed files with 1959 additions and 4 deletions
@@ -0,0 +1,66 @@
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<AutoReviewJob> _logger;
private readonly IServiceProvider _serviceProvider;
public AutoReviewJob(ILogger<AutoReviewJob> 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<ILogger<AutoReviewJob>>();
var reviewRepo = scope.ServiceProvider.GetRequiredService<Nashel.Modules.Reputation.Domain.Repositories.IReviewRepository>();
// Логика авто-отзыва:
// 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);
}
}
}
}
}