From f12aaa80a5fe52152a1e69111dd9cc14dc750c33 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Mon, 18 Nov 2019 10:31:23 +0100 Subject: [PATCH] Abbozzata anche gest statistiche, RIPORTO IN DEV!!!! --- MapoDb/FluxArchive.cs | 117 +++++++++++++++++++++++++++++++++++------- MapoSDK/Objects.cs | 12 +---- 2 files changed, 101 insertions(+), 28 deletions(-) diff --git a/MapoDb/FluxArchive.cs b/MapoDb/FluxArchive.cs index 7b0d5ef0..351a78a7 100644 --- a/MapoDb/FluxArchive.cs +++ b/MapoDb/FluxArchive.cs @@ -67,19 +67,30 @@ namespace MapoDb StringBuilder sb = new StringBuilder(); Stopwatch sw = new Stopwatch(); DateTime tStamp; + // oggetto gestione dati ts raggruppati var collRawData = database.GetCollection("FluxLogRawData"); - // valutare eventuale eliminazione records x TUTTO il periodo... - string startDateStr = data2transfer.ToString("yyyyMMdd"); - string endDateStr = data2transfer.AddDays(numDays).ToString("yyyyMMdd"); + var collHistData = database.GetCollection("FluxLogHistData"); + var builderRaw = Builders.Filter; + var builderHist = Builders.Filter; + string currDateStr = ""; int startYMD = 0; int endYMD = 0; + int currYMD = 0; + + // Effettuo eliminazione records x TUTTO il periodo dei dati RAW e stats... + string startDateStr = data2transfer.ToString("yyyyMMdd"); + string endDateStr = data2transfer.AddDays(numDays).ToString("yyyyMMdd"); int.TryParse(startDateStr, out startYMD); int.TryParse(endDateStr, out endYMD); - var builder = Builders.Filter; - var filtExisting = builder.Gte(u => u.dateYMD, startYMD) & builder.Lte(u => u.dateYMD, endYMD); - collRawData.DeleteMany(filtExisting); + // filtri e delete + var filtRawOld = builderRaw.Gte(u => u.dateYMD, startYMD) & builderRaw.Lte(u => u.dateYMD, endYMD); + collRawData.DeleteMany(filtRawOld); + var filtHistOld = builderHist.Gte(u => u.dateYMD, startYMD) & builderHist.Lte(u => u.dateYMD, endYMD); + collHistData.DeleteMany(filtHistOld); + // faccio ciclo su OGNI macchina + sw.Start(); var elencoMacchine = DataLayer.obj.taMacchine.GetData(); foreach (var macchina in elencoMacchine) { @@ -88,8 +99,9 @@ namespace MapoDb for (int i = 0; i < numDays; i++) { tStamp = data2transfer.AddDays(i); + currDateStr = tStamp.ToString("yyyyMMdd"); + int.TryParse(currDateStr, out currYMD); // leggo da DB i records... - sw.Start(); DS_applicazione.FluxLogDataTable tabDati = DataLayer.obj.taFL.getFiltOrd(macchina.IdxMacchina, tStamp, tStamp.AddDays(1), true); // solo se ho dati... if (tabDati.Count > 0) @@ -99,22 +111,16 @@ namespace MapoDb // salvo in blocco if (risultato.Count > 0) { - try { collRawData.InsertMany(risultato); + // calcolo la NUOVA statistica giornaliera... + var resStats = getStats(risultato); + // salvo! + collHistData.InsertOne(resStats); } - catch + catch (Exception exc) { } -#if false - var builder = Builders.Filter; - var existing = builder.Eq(u => u.varName, macchina.IdxMacchina); -#endif -#if false - var options = new UpdateOptions { IsUpsert = true }; - var empty = builder.Empty; - collRawData.UpdateMany(empty, risultato, options); -#endif } sb.AppendLine($"DB {tStamp}: {tabDati.Count}rec | MongoDb {risultato.Count} RAW DOC in {sw.ElapsedMilliseconds / 1000} sec"); } @@ -185,9 +191,84 @@ namespace MapoDb // aggiungo ultimo... salvo il VECCHIO record... if (currRecord != null) { + currRecord.samples = valori; listaRecords.Add(currRecord); } return listaRecords; } + /// + /// Calcola statistiche per i dati giornalieri processati + /// + /// + /// + protected histData getStats(List datiGiornalieri) + { + // init oggetti + histData currHist; + varStats currStat; + List statistiche = new List(); + int sampleNumRec = 1; + float sampleTotal = 0; + float sampleMinVal = 0; + float sampleMaxVal = 0; + float sampleAvg = 0; + float currVal = 0; + bool fatto = false; + string macName = ""; + int dateYMD = 0; + // ciclo x ogni variabile + foreach (var item in datiGiornalieri) + { + if (item.samples != null) + { + if (string.IsNullOrEmpty(macName)) + { + macName = item.macName; + dateYMD = item.dateYMD; + } + // reset vabiabili + sampleTotal = 0; + sampleMinVal = 0; + sampleMaxVal = 0; + sampleAvg = 0; + // calcolo statistiche + sampleNumRec = item.samples.Count; + foreach (var sample in item.samples) + { + fatto = float.TryParse(sample.value, out currVal); + if (fatto) + { + sampleTotal += currVal; + sampleMaxVal = sampleMaxVal < currVal ? currVal : sampleMaxVal; + sampleMinVal = sampleMinVal > currVal ? currVal : sampleMinVal; + } + } + if (sampleNumRec > 0) + { + sampleAvg = sampleTotal / sampleNumRec; + } + // salvo statistica + currStat = new varStats() + { + varName = item.varName, + numRec = sampleNumRec, + avg = sampleAvg, + min = sampleMinVal, + max = sampleMaxVal + }; + statistiche.Add(currStat); + } + } + currHist = new histData() + { + macName = macName, + varType = plcDataType.Real, + dateYMD = dateYMD, + period = timeWindow.day, + stats = statistiche + }; + // restituisco... + return currHist; + } } } diff --git a/MapoSDK/Objects.cs b/MapoSDK/Objects.cs index c502e6dd..3ea9750f 100644 --- a/MapoSDK/Objects.cs +++ b/MapoSDK/Objects.cs @@ -328,13 +328,9 @@ namespace MapoSDK public class varStats { /// - /// Data-Ora riferimento campione + /// Nome della Variabile tracciata /// - public DateTime timeStamp { get; set; } = DateTime.Now; - /// - /// Valore in formato stringa - /// - public string value { get; set; } = ""; + public string varName { get; set; } = ""; /// /// Num record /// @@ -377,10 +373,6 @@ namespace MapoSDK /// public string macName { get; set; } = ""; /// - /// Nome della Variabile tracciata - /// - public string varName { get; set; } = ""; - /// /// Tipo di valore registrato (internamente รจ string) /// //[JsonConverter(typeof(StringEnumConverter))]