using EgwCoreLib.Utils; using Microsoft.Extensions.Configuration; using MP.Core.DTO; using MP.Data.DbModels.Utils; using MP.Data.DTO; using MP.Data.Repository.Utils; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace MP.Data.Services.Utils { internal class StatsCodeService : BaseServ, IStatsCodeService { #region Public Constructors public StatsCodeService( IConfiguration config, IConnectionMultiplexer redis, IStatsCodeRepository repo) : base(config, redis) { _className = "StatsStatusCode"; _repo = repo; } #endregion Public Constructors #region Public Methods /// public async Task> GetFiltAsync(DateTime dtStart, DateTime dtEnd) { return await TraceAsync($"{_className}.GetFilt", async (activity) => { return await GetOrSetCacheAsync( $"{_redisBaseKey}:{_className}:DT:{dtStart:yyyyMMdd}:{dtEnd:yyyyMMdd}", async () => await _repo.GetFiltAsync(dtStart, dtEnd), UltraLongCache ); }); } /// public async Task>> GetParetoStatsDayAsync(int numDay) { return await TraceAsync($"{_className}.GetParetoStatsDayAsync", async (activity) => { return await GetOrSetCacheAsync( $"{_redisBaseKey}:{_className}:ParetoDay", async () => await GetParetoDestAsync(numDay), LongCache ); }); } /// public async Task>> GetParetoStatsWeekAsync() { return await TraceAsync($"{_className}.GetParetoStatsWeekAsync", async (activity) => { return await GetOrSetCacheAsync( $"{_redisBaseKey}:{_className}:ParetoWeek", async () => await GetParetoDataAsync(), LongCache ); }); } /// public async Task GetRangeAsync() { return await TraceAsync($"{_className}.GetRange", async (activity) => { return await GetOrSetCacheAsync( $"{_redisBaseKey}:{_className}:Range", async () => await _repo.GetRangeAsync(), UltraFastCache ); }); } /// public List GetTimeSeriesData(List rawData) { DateTime adesso = DateTime.Now; List series = new(); series = rawData .GroupBy(s => new { s.Destination }) .Select(group => new ChartSeriesDto { SeriesName = group.Key.Destination, DataPoints = group .OrderBy(p => p.Hour) .Select(p => new chartJsData.chartJsTSerie { x = p.Hour, y = p.Count / (p.Hour.Date.Equals(adesso.Date) ? adesso.TimeOfDay.TotalHours : 24) }) .ToList() }) .ToList(); return series; } /// public async Task UpsertManyAsync(List listRecords, bool removeOld) { return await TraceAsync($"{_className}.UpsertMany", async (activity) => { string operation = "UpsertMany"; var success = await _repo.UpsertManyAsync(listRecords, removeOld); activity?.SetTag("db.operation", operation); if (success > 0) { await ClearCacheAsync($"{_redisBaseKey}:{_className}:*"); } return success; }); } #endregion Public Methods #region Protected Methods /// /// metodo locale per recupero e trasformazione dati da includere con processo generare di tracking & cache /// /// protected async Task>> GetParetoDataAsync() { Dictionary> result = new(); DateTime oggi = DateTime.Today; int numDays = 7; var rawData = await GetFiltAsync(oggi.AddDays(-numDays), oggi); // calcolo le varie statistiche... var pDestRequest = rawData.GroupBy(x => x.Destination) .Select(g => new StatDataDTO { Label = g.Key, Value = g.Sum(x => x.Count) / numDays }) .OrderByDescending(x => x.Value) .ToList(); result.Add("Errors (#)", pDestRequest); return result; } protected async Task>> GetParetoDestAsync(int numDay) { Dictionary> result = new(); DateTime adesso = DateTime.Now; DateTime start = DateTime.Today.AddDays(-numDay); var rawData = await GetFiltAsync(start, adesso); var numHour = adesso.Subtract(start).TotalHours; // calcolo le varie statistiche... var pDestRequest = rawData.GroupBy(x => x.Destination) .Select(g => new StatDataDTO { Label = g.Key, Value = g.Sum(x => x.Count) / numHour }) .OrderByDescending(x => x.Value) .ToList(); result.Add("Dest.Request (#/h)", pDestRequest); return result; } #endregion Protected Methods #region Private Fields private readonly string _className; private readonly IStatsCodeRepository _repo; #endregion Private Fields } }