This commit is contained in:
Mikhail Kuznetsov
2026-05-28 16:56:54 +10:00
12 changed files with 251 additions and 149 deletions

View File

@@ -4,6 +4,7 @@ using PARR.Core.Common.Interfaces;
using PARR.Core.Repositories.Interfaces;
using PARR.Core.Services.Shortcodes;
using PARR.Core.Services.Workload.Models;
using PARR.Domain.Cache;
using PARR.Domain.Cache.Models;
using PARR.Domain.DTOs.Workload;
using PARR.Domain.Entities;
@@ -36,10 +37,10 @@ namespace PARR.Core.Services.Workload.Implementations
//todo:----------- Настройки, вынести -----------
/// <summary>
/// Ключ КЭШ шаблонов
/// </summary>
private readonly string[] cacheTemplateKey = { "template", "report", "params" };
///// <summary>
///// Ключ КЭШ шаблонов
///// </summary>
//private readonly string[] cacheTemplateKey = { "template", "report", "params" };
/// <summary>
/// TTL кэша шаблонов
@@ -51,25 +52,25 @@ namespace PARR.Core.Services.Workload.Implementations
/// </summary>
private readonly int maxCacheDiff = 1000;
/// <summary>
/// Ключ КЭШ, отчет о загруженности, все ЗО
/// </summary>
private readonly string[] cacheWorkloadResponseAreaAllKey = { "workload", "response area", "all" };
///// <summary>
///// Ключ КЭШ, отчет о загруженности, все ЗО
///// </summary>
//private readonly string[] cacheWorkloadResponseAreaAllKey = { "workload", "response area", "all" };
/// <summary>
/// Ключ КЭШ, отчет о загруженности, одна ЗО
/// </summary>
private readonly string[] cacheWorkloadResponseAreaItemKey = { "workload", "response area", "item" };
///// <summary>
///// Ключ КЭШ, отчет о загруженности, одна ЗО
///// </summary>
//private readonly string[] cacheWorkloadResponseAreaItemKey = { "workload", "response area", "item" };
/// <summary>
/// Ключ КЭШ, отчет о загруженности, все РГ
/// </summary>
private readonly string[] cacheWorkloadWorkGroupAllKey = { "workload", "work group", "all" };
///// <summary>
///// Ключ КЭШ, отчет о загруженности, все РГ
///// </summary>
//private readonly string[] cacheWorkloadWorkGroupAllKey = { "workload", "work group", "all" };
/// <summary>
/// Ключ КЭШ, отчет о загруженности, одна РГ
/// </summary>
private readonly string[] cacheWorkloadWorkGroupItemKey = { "workload", "work group", "item" };
///// <summary>
///// Ключ КЭШ, отчет о загруженности, одна РГ
///// </summary>
//private readonly string[] cacheWorkloadWorkGroupItemKey = { "workload", "work group", "item" };
/// <summary>
/// TTL кэша отчетов workload
@@ -132,7 +133,7 @@ namespace PARR.Core.Services.Workload.Implementations
templateCount++;
#region Расчет и отрпавка прогресса
#region Расчет и отправка прогресса
// Считаем текущий процент(0 - 100). Этап идёт от 5% до 95%
var currentPercent = 5 + (int)((templateCount * 90.0) / totalTemplates);
@@ -153,11 +154,14 @@ namespace PARR.Core.Services.Workload.Implementations
//3. Сохранить в Redis
logger.LogDebug("Для сохранения в Redis подготовлен массив из {Count} строк", cacheData.Count);
var hashKey = redisCacheService.GetKey(cacheTemplateKey);
//var hashKey = redisCacheService.GetKey(cacheTemplateKey);
var hashKey = redisCacheService.GetKey(CacheKeys.Workload.TemplateHash());
foreach (var item in cacheData)
{
await redisCacheService.SetHashFieldAsync(hashKey, item.Data.TemplateId.ToString(), item, cacheTemplateTtl);
var templateKey = redisCacheService.GetKey(CacheKeys.Workload.Template(item.Data.TemplateId));
//await redisCacheService.SetHashFieldAsync(hashKey, item.Data.TemplateId.ToString(), item, cacheTemplateTtl);
await redisCacheService.SetHashFieldAsync(hashKey, templateKey, item, cacheTemplateTtl);
}
await progress.ReportAsync(100);
@@ -172,8 +176,9 @@ namespace PARR.Core.Services.Workload.Implementations
/// <returns></returns>
public async Task DeleteTemplateCacheAsync()
{
var hashKey = redisCacheService.GetKey(cacheTemplateKey);
logger.LogDebug("Удаляю кэш шаблонов, {HashKey}", redisCacheService.GetKey(cacheTemplateKey));
//var hashKey = redisCacheService.GetKey(cacheTemplateKey);
var hashKey = redisCacheService.GetKey(CacheKeys.Workload.TemplateHash());
logger.LogDebug("Удаляю кэш шаблонов, {HashKey}", hashKey);
await redisCacheService.DeleteHashAsync(hashKey);
}
@@ -186,11 +191,12 @@ namespace PARR.Core.Services.Workload.Implementations
{
logger.LogDebug("Удаляю кэш отчетов");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(cacheWorkloadResponseAreaAllKey) + "*");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(cacheWorkloadResponseAreaItemKey) + "*");
//await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(cacheWorkloadResponseAreaAllKey) + "*");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(CacheKeys.Workload.WorkloadResponseAreaAll()) + "*");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(CacheKeys.Workload.WorkloadResponseAreaItem()) + "*");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(cacheWorkloadWorkGroupAllKey) + "*");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(cacheWorkloadWorkGroupItemKey) + "*");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(CacheKeys.Workload.WorkloadWorkGroupAll()) + "*");
await redisCacheService.DeleteKeysByPatternAsync(redisCacheService.GetKey(CacheKeys.Workload.WorkloadWorkGroupItem()) + "*");
}
/// <summary>
@@ -207,7 +213,8 @@ namespace PARR.Core.Services.Workload.Implementations
logger.LogDebug("Получаю данные для формирования отчета. DateStart {DateStart}, DurationDays {DurationDays}, Offset {Offset}", dateStart, durationDays, offset);
// Получим кэш целиком
var cacheData = await redisCacheService.GetAllHashFieldsAsync<TemplateCache>(redisCacheService.GetKey(cacheTemplateKey));
//var cacheData = await redisCacheService.GetAllHashFieldsAsync<TemplateCache>(redisCacheService.GetKey(cacheTemplateKey));
var cacheData = await redisCacheService.GetAllHashFieldsAsync<TemplateCache>(redisCacheService.GetKey(CacheKeys.Workload.TemplateHash()));
if (cacheData.Count == 0)
{
logger.LogDebug("Записей в кэш 0. Конец.");
@@ -245,7 +252,9 @@ namespace PARR.Core.Services.Workload.Implementations
foreach (var template in templates)
{
cacheData.TryGetValue(template.Id.ToString(), out var cache);
//cacheData.TryGetValue(template.Id.ToString(), out var cache);
var templateKey = redisCacheService.GetKey(CacheKeys.Workload.Template(template.Id));
cacheData.TryGetValue(templateKey, out var cache);
var (workGroup, responseArea) = ("", "");
var cacheDate = DateTimeOffset.UtcNow;
@@ -309,7 +318,12 @@ namespace PARR.Core.Services.Workload.Implementations
Timestamp = DateTimeOffset.UtcNow
};
await redisCacheService.SetHashFieldAsync(redisCacheService.GetKey(cacheTemplateKey), templateId.ToString(), cacheItem);
//await redisCacheService.SetHashFieldAsync(redisCacheService.GetKey(cacheTemplateKey), templateId.ToString(), cacheItem);
await redisCacheService.SetHashFieldAsync(
redisCacheService.GetKey(CacheKeys.Workload.TemplateHash()),
redisCacheService.GetKey(CacheKeys.Workload.Template(templateId)),
cacheItem
);
logger.LogDebug("Добавлена недостающая запись в кэш. {TemplateId}, '{WorkGroup}', '{ResponseArea}'", templateId, workGroup, responseArea);
return (workGroup, responseArea);
@@ -369,7 +383,8 @@ namespace PARR.Core.Services.Workload.Implementations
/// <returns></returns>
public async Task<TemplateCache?> GetFirstTemplateCacheAsync()
{
var cache = await redisCacheService.GetFirstHashFieldAsync<TemplateCache>(redisCacheService.GetKey(cacheTemplateKey));
//var cache = await redisCacheService.GetFirstHashFieldAsync<TemplateCache>(redisCacheService.GetKey(cacheTemplateKey));
var cache = await redisCacheService.GetFirstHashFieldAsync<TemplateCache>(redisCacheService.GetKey(CacheKeys.Workload.TemplateHash()));
return cache?.Value;
}
@@ -394,23 +409,24 @@ namespace PARR.Core.Services.Workload.Implementations
switch (reportType)
{
case WorkloadReportType.ResponseAreaAll:
keyList.AddRange(cacheWorkloadResponseAreaAllKey);
//keyList.AddRange(cacheWorkloadResponseAreaAllKey);
keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaAll());
break;
case WorkloadReportType.ResponseAreaItem:
keyList.AddRange(cacheWorkloadResponseAreaItemKey);
keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaItem());
break;
case WorkloadReportType.WorkGroupAll:
keyList.AddRange(cacheWorkloadWorkGroupAllKey);
keyList.AddRange(CacheKeys.Workload.WorkloadWorkGroupAll());
break;
case WorkloadReportType.WorkGroupItem:
keyList.AddRange(cacheWorkloadWorkGroupItemKey);
keyList.AddRange(CacheKeys.Workload.WorkloadWorkGroupItem());
break;
default:
logger.LogError("Недопустимое значение тип отчета '{ReportType}'", reportType);
throw new ArgumentException("Недопустимое значение тип отчета", nameof(reportType));
}
keyList.AddRange(new string[] { dateStart.ToString(), durationDays.ToString(), offset.ToString() });
keyList.AddRange(new string[] { dateStart.ToString("yyyy-MM-dd"), durationDays.ToString(), offset.ToString() });
var keyStr = string.Empty;