feat(api, core): Workload - статус формирования отчетности. RedisCacheService - получить первую запись из кэш типа Hash.

This commit is contained in:
Mikhail Trubnikov
2026-05-18 16:46:42 +10:00
parent 911e6febcd
commit e5535857d4
11 changed files with 181 additions and 5 deletions

View File

@@ -328,6 +328,18 @@ namespace PARR.Core.Services.Workload.Implementations
}
/// <summary>
/// Вернуть первую запись из TamplateCache если есть
/// </summary>
/// <returns></returns>
public async Task<TemplateCache?> GetFirstTemplateCacheAsync()
{
var cache = await redisCacheService.GetFirstHashFieldAsync<TemplateCache>(redisCacheService.GetKey(cacheTemplateKey));
return cache?.Value;
}
/// <summary>
/// Формирует ключ для отчета Workload
/// </summary>

View File

@@ -1,7 +1,9 @@
using Microsoft.Extensions.Logging;
using PARR.Core.Services.NextRunServices;
using PARR.Core.Services.TaskServices.Interfaces;
using PARR.Core.Services.Workload.Interfaces;
using PARR.Core.Services.Workload.Models;
using PARR.Domain.DTOs.TaskDTO;
using PARR.Domain.DTOs.Workload;
using PARR.Domain.Enums;
@@ -12,16 +14,19 @@ namespace PARR.Core.Services.Workload.Implementations
private readonly ILogger<WorkloadService> logger;
private readonly WorkloadCacheService workloadCacheService;
private readonly INextRunService nextRunService;
private readonly ITaskManagementService taskManagementService;
public WorkloadService(
ILogger<WorkloadService> logger,
WorkloadCacheService workloadCacheService,
INextRunService nextRunService
INextRunService nextRunService,
ITaskManagementService taskManagementService
)
{
this.logger = logger;
this.workloadCacheService = workloadCacheService;
this.nextRunService = nextRunService;
this.taskManagementService = taskManagementService;
}
@@ -107,6 +112,39 @@ namespace PARR.Core.Services.Workload.Implementations
return report;
}
public async Task<WorkloadCacheInfo> GetReportInfoAsync()
{
// может быть три статуса
// 1 - отчет сейчас формируется (дата начала формирования отчета)
// 2 - отчет сформирован (вернуть дату формирования кэш)
// 3 - отчет сейчас не формируется, кэша нет (date = null)
// 1. проверить что выполнились все задания на обновление кэш
var activeTasks = await taskManagementService.GetActiveTasksAsync(TaskTypeEnum.Workload);
if (activeTasks.Count > 0)
{
// идет формирование отчета
// задача может быт только одна, так как у нее такой тип
var task = activeTasks.First();
return new WorkloadCacheInfo { Status = WorkloadCacheInfo.StatusEnum.Processing, Date = task.DateCreated };
}
// 2. получить дату кэш
// Если нет активных задач, значит может быть кэш существует, пробуем получить дату из кэш
var templateCache = await workloadCacheService.GetFirstTemplateCacheAsync();
if (templateCache != null)
{
return new WorkloadCacheInfo { Status = WorkloadCacheInfo.StatusEnum.Generated, Date = templateCache.Timestamp };
}
// Если кэш нет, то возвращаем null
return new WorkloadCacheInfo { Status = WorkloadCacheInfo.StatusEnum.NotFound };
}
/// <summary>
/// Получить список дней для отчета, с отметкой выходной/рабочий
/// </summary>

View File

@@ -8,6 +8,12 @@ namespace PARR.Core.Services.Workload.Interfaces
/// </summary>
public interface IWorkloadService
{
/// <summary>
/// Получить статус кэш/отчета
/// </summary>
/// <returns></returns>
Task<WorkloadCacheInfo> GetReportInfoAsync();
/// <summary>
/// Получить отчет о загруженности
/// </summary>