diff --git a/MP.Data/Controllers/MpSpecController.cs b/MP.Data/Controllers/MpSpecController.cs index ddf75ff4..e3cbc159 100644 --- a/MP.Data/Controllers/MpSpecController.cs +++ b/MP.Data/Controllers/MpSpecController.cs @@ -551,16 +551,16 @@ namespace MP.Data.Controllers /// /// /// - /// - public async Task FluxLogDataRedux(string idxMaccSel, List fluxList, Periodo currPeriodo, Enum.ValSelection valMode, Enum.DataInterval intReq, int maxItem) + /// Restitusice list dei record statistiche raccolti (da integrare a quelli rpesenti in Redis...) + public async Task> FluxLogDataRedux(string idxMaccSel, List fluxList, Periodo currPeriodo, Enum.ValSelection valMode, Enum.DataInterval intReq, int maxItem) { + List procStats = new List(); Log.Info($"Inizio FluxLogDataRedux | idxMaccSel: {idxMaccSel} | periodo: {currPeriodo.Inizio} --> {currPeriodo.Fine}"); - bool fatto = false; TimeSpan step = TimeSpan.FromHours(1); switch (intReq) { case Enum.DataInterval.minute: - step = TimeSpan.FromMinutes(1.00/ maxItem); + step = TimeSpan.FromMinutes(1.00 / maxItem); break; case Enum.DataInterval.hour: step = TimeSpan.FromHours(1.00 / maxItem); @@ -571,7 +571,6 @@ namespace MP.Data.Controllers default: break; } - List procStats = new List(); // setup parametri costanti x stored var pIdxMacchina = new SqlParameter("@IdxMacchina", idxMaccSel); @@ -628,9 +627,21 @@ namespace MP.Data.Controllers listPeriodi.Add(new Periodo(dtCursStart, recEnd.dtEvento)); break; case Enum.ValSelection.Center: - var recCent = currFlux.Skip(numRec / 2).FirstOrDefault(); - // salvo 2 periodi! + int idx = 1; + // per iniziare mi metto a 1/(n+1) rec come step + var recCent = currFlux.Skip(idx / (maxItem + 1)).FirstOrDefault(); listPeriodi.Add(new Periodo(dtCursStart, recCent.dtEvento)); + // salvo restanti periodi (se > 1)! + if (maxItem > 1) + { + for (int i = 2; i < maxItem; i++) + { + DateTime dtInizio = recCent.dtEvento; + recCent = currFlux.Skip(i / (maxItem + 1)).FirstOrDefault(); + listPeriodi.Add(new Periodo(dtInizio, recCent.dtEvento)); + } + } + // aggiungo ultimo... listPeriodi.Add(new Periodo(recCent.dtEvento.AddSeconds(1), dtCursEnd)); break; default: @@ -656,21 +667,24 @@ namespace MP.Data.Controllers } // fermo cronometro e salvo su DB... sw.Stop(); - LogFLDedupModel currStat = new LogFLDedupModel() + DTO.StatDedupDTO currStat = new DTO.StatDedupDTO() { IdxMacchina = idxMaccSel, CodFlux = item, - DtRif = DateTime.Now, + Interval = intReq, + Num4Int = maxItem, NumRec = numRecProc, ProcTime = sw.Elapsed.TotalSeconds }; procStats.Add(currStat); } +#if false // salvo le statistiche di processing... - fatto = LogFLDedupInsert(procStats); + fatto = LogFLDedupInsert(procStats); +#endif Log.Info($"FINE FluxLogDataRedux | idxMaccSel: {idxMaccSel} | periodo: {currPeriodo.Inizio} --> {currPeriodo.Fine}"); - return fatto; + return procStats; } /// diff --git a/MP.Data/DTO/StatDedupDTO.cs b/MP.Data/DTO/StatDedupDTO.cs new file mode 100644 index 00000000..076aca72 --- /dev/null +++ b/MP.Data/DTO/StatDedupDTO.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +// +// This is here so CodeMaid doesn't reorganize this document +// +namespace MP.Data.DTO +{ + public class StatDedupDTO + { + /// + /// Macchina + /// + public string IdxMacchina { get; set; } = ""; + + /// + /// Cod Flusso interessato + /// + public string CodFlux { get; set; } = ""; + + /// + /// Tipo di intervallo richiesto + /// + public Enum.DataInterval Interval { get; set; } = Enum.DataInterval.hour; + + /// + /// num max di item per intervallo + /// + public int Num4Int { get; set; } = 1; + + /// + /// Num record processati (iniziali) + /// + public int NumRec { get; set; } = 1; + + /// + /// Tempo processing (secondi) + /// + public double ProcTime { get; set; } = 1; + + /// + /// Tempo processing atteso in ms per record + /// + [NotMapped] + public double ProcTimeMs + { + get => (ProcTime * 1000) / (NumRec > 1 ? NumRec : 1); + } + } +} diff --git a/MP.Data/Utils.cs b/MP.Data/Utils.cs index 4a4efbaf..5b89a344 100644 --- a/MP.Data/Utils.cs +++ b/MP.Data/Utils.cs @@ -232,6 +232,7 @@ namespace MP.Data public const string redisConfKey = redisBaseAddr + "Cache:Config"; public const string redisAKVKey = redisBaseAddr + "Cache:AKV"; public const string redisParetoFLKey = redisBaseAddr + "Cache:ParetoFL"; + public const string redisStatsProcFL = redisBaseAddr + "Stats:ProcessFL"; public const string redisDossByMac = redisBaseAddr + "Cache:DossByMac"; public const string redisFluxByMac = redisBaseAddr + "Cache:FluxByMac"; public const string redisFluxLogFilt = redisBaseAddr + "Cache:FluxLogFilt"; diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index 90cf6134..a087def9 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -1785,10 +1785,72 @@ namespace MP.SPEC.Data /// public async Task FluxLogDataRedux(string idxMaccSel, List fluxList, DtUtils.Periodo currPeriodo, ValSelection valMode, DataInterval intReq, int maxItem) { - await dbController.FluxLogDataRedux(idxMaccSel, fluxList, currPeriodo, valMode, intReq, maxItem); + List procStats = await dbController.FluxLogDataRedux(idxMaccSel, fluxList, currPeriodo, valMode, intReq, maxItem); + // effettuo merge statistiche... + ProcStatMerge(procStats); await FlushCacheFluxLog(); } + /// + /// Restituisce le statistiche di processo correnti x depluplica FluxLog + /// + /// + public List ProcFLStats() + { + List actStats = new List(); + string currKey = $"{Utils.redisStatsProcFL}"; + // recupero i record statistiche correnti + RedisValue rawData = redisDb.StringGet(currKey); + if (rawData.HasValue) + { + var rawStats = JsonConvert.DeserializeObject>($"{rawData}"); + if (rawStats != null) + { + actStats = rawStats; + } + } + return actStats; + } + + protected bool ProcStatMerge(List procStats) + { + bool answ = false; + List actStats = ProcFLStats(); + // se fosse vuoto --> add diretto + if (actStats.Count == 0) + { + actStats.AddRange(procStats); + } + else + { + // aggiorno su redis i record statistiche 1:1... + foreach (var recStat in procStats) + { + // cerco se ci fosse x aggiornare + var currRec = actStats.Where(x => x.IdxMacchina == recStat.IdxMacchina + && x.CodFlux == recStat.CodFlux + && x.Interval == recStat.Interval + && x.Num4Int == recStat.Num4Int).FirstOrDefault(); + // se trovato aggiorno + if (currRec != null) + { + currRec.ProcTime += recStat.ProcTime; + currRec.NumRec += recStat.NumRec; + } + // altrimenti aggiungo + else + { + actStats.Add(recStat); + } + } + } + // salvo record statistiche + var rawData = JsonConvert.SerializeObject(actStats); + string currKey = $"{Utils.redisStatsProcFL}"; + redisDb.StringSet(currKey, rawData); + return answ; + } + /// /// Stored manutenzione del DB /// diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 0e53782a..0180a490 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2310.2312 + 6.16.2310.2318 diff --git a/MP.SPEC/Pages/FluxLogStatus.razor.cs b/MP.SPEC/Pages/FluxLogStatus.razor.cs index 6bb67276..7de016a4 100644 --- a/MP.SPEC/Pages/FluxLogStatus.razor.cs +++ b/MP.SPEC/Pages/FluxLogStatus.razor.cs @@ -91,9 +91,17 @@ namespace MP.SPEC.Pages protected override async Task OnInitializedAsync() { + ReloadStats(); await ReloadData(); } + private void ReloadStats() + { + actStats = MDataServ.ProcFLStats(); + } + + protected List actStats { get; set; } = new List(); + protected async Task ReloadMacchine() { if (ListMacchineAll == null || ListMacchineAll.Count == 0) @@ -187,6 +195,8 @@ namespace MP.SPEC.Pages DateTime dtEnd = DateTime.Today.AddDays(1); DateTime dtStart = dtEnd.AddMonths(-1); CurrPeriodo = new Periodo(dtStart, dtEnd); + // calcolo tempo stimato e mostro... + } #endregion Private Methods diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index 09ad6fb2..c1566c2e 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

Versione: 6.16.2310.2312

+

Versione: 6.16.2310.2318


Note di rilascio:
  • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index d90133b4..3c671d09 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2310.2312 +6.16.2310.2318 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index b4c63949..72a5afcd 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2310.2312 + 6.16.2310.2318 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false