diff --git a/MP-Site/MappaStatoSeq.aspx b/MP-Site/MappaStatoSeq.aspx index 78775b0a..9acd55ea 100644 --- a/MP-Site/MappaStatoSeq.aspx +++ b/MP-Site/MappaStatoSeq.aspx @@ -21,22 +21,23 @@ - <%----%> - - - <%----%> - <%-- - -
- - -
- -
-
-
- --%> - <%--
- -
--%> +
+ +
+
+ + +
+ + +
+ +
+
+
+ +
+ +
+
diff --git a/MP-Site/MappaStatoSeq.aspx.cs b/MP-Site/MappaStatoSeq.aspx.cs index b506c7e5..100335e4 100644 --- a/MP-Site/MappaStatoSeq.aspx.cs +++ b/MP-Site/MappaStatoSeq.aspx.cs @@ -9,6 +9,15 @@ namespace MoonPro { public partial class MappaStatoSeq : System.Web.UI.Page { + + public bool enableGraphJS + { + get + { + return memLayer.ML.CRB("enableGraphJS"); + } + } + public resoconti _resoconti; public int numGg { @@ -79,15 +88,23 @@ namespace MoonPro protected DS_applicazione.MacchineDataTable tabMacchine; protected void Page_Load(object sender, EventArgs e) { - //_resoconti = new resoconti(); - //tabMacchine = MapoDb.DataLayer.obj.taMacchine.GetData(); + divGraphJS.Visible = enableGraphJS; + divGraphLegacy.Visible = !enableGraphJS; + if (!enableGraphJS) + { + _resoconti = new resoconti(); + tabMacchine = MapoDb.DataLayer.obj.taMacchine.GetData(); + } if (!Page.IsPostBack) { ddlNumgg.DataBind(); ddlNumgg.SelectedValue = memLayer.ML.confReadString("seq_gg"); - // imposto date di intervallo - mod_sequencerStatiJS2.periodo = intervalloAnalisi; - mod_sequencerStatiJS2.numSplit = memLayer.ML.CRS("seq_numSpl"); + if (enableGraphJS) + { + // imposto date di intervallo + mod_sequencerStatiJS2.periodo = intervalloAnalisi; + mod_sequencerStatiJS2.numSplit = memLayer.ML.CRS("seq_numSpl"); + } } } @@ -104,8 +121,9 @@ namespace MoonPro sequencer.doUpdate(); sequencer.Visible = true; } - catch + catch (Exception exc) { + logger.lg.scriviLog(string.Format("Eccezione recupero dati{0}{1}", Environment.NewLine, exc), tipoLog.EXCEPTION); sequencer.Visible = false; } } @@ -119,7 +137,10 @@ namespace MoonPro protected void ddlNumgg_SelectedIndexChanged(object sender, EventArgs e) { - mod_sequencerStatiJS2.numGG = Convert.ToInt32(ddlNumgg.SelectedValue); + if (enableGraphJS) + { + mod_sequencerStatiJS2.numGG = Convert.ToInt32(ddlNumgg.SelectedValue); + } } /// /// recupera nome macchina da idx @@ -158,7 +179,10 @@ namespace MoonPro protected void btnReload_Click(object sender, EventArgs e) { - mod_sequencerStatiJS2.periodo = intervalloAnalisi; + if (enableGraphJS) + { + mod_sequencerStatiJS2.periodo = intervalloAnalisi; + } } } } \ No newline at end of file diff --git a/MP-Site/MappaStatoSeq.aspx.designer.cs b/MP-Site/MappaStatoSeq.aspx.designer.cs index 92ee994d..1f80a56a 100644 --- a/MP-Site/MappaStatoSeq.aspx.designer.cs +++ b/MP-Site/MappaStatoSeq.aspx.designer.cs @@ -48,6 +48,15 @@ namespace MoonPro { /// protected global::MoonPro.WebUserControls.mod_mainMap mod_mainMap; + /// + /// Controllo divGraphJS. + /// + /// + /// Campo generato automaticamente. + /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. + /// + protected global::System.Web.UI.HtmlControls.HtmlGenericControl divGraphJS; + /// /// Controllo mod_sequencerStatiJS2. /// @@ -56,5 +65,41 @@ namespace MoonPro { /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. /// protected global::MoonPro.WebUserControls.mod_sequencerStatiJS mod_sequencerStatiJS2; + + /// + /// Controllo divGraphLegacy. + /// + /// + /// Campo generato automaticamente. + /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. + /// + protected global::System.Web.UI.HtmlControls.HtmlGenericControl divGraphLegacy; + + /// + /// Controllo repSeq. + /// + /// + /// Campo generato automaticamente. + /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. + /// + protected global::System.Web.UI.WebControls.Repeater repSeq; + + /// + /// Controllo odsMappa. + /// + /// + /// Campo generato automaticamente. + /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. + /// + protected global::System.Web.UI.WebControls.ObjectDataSource odsMappa; + + /// + /// Controllo btnReload. + /// + /// + /// Campo generato automaticamente. + /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. + /// + protected global::System.Web.UI.WebControls.Button btnReload; } } diff --git a/MP-Site/Web.config b/MP-Site/Web.config index 3ed616d1..f8056538 100644 --- a/MP-Site/Web.config +++ b/MP-Site/Web.config @@ -69,6 +69,7 @@ + @@ -82,15 +83,22 @@ - + + + + + + - - + + + diff --git a/MP-Site/WebUserControls/mod_sequencerStati.ascx.cs b/MP-Site/WebUserControls/mod_sequencerStati.ascx.cs index ead60a04..97654715 100644 --- a/MP-Site/WebUserControls/mod_sequencerStati.ascx.cs +++ b/MP-Site/WebUserControls/mod_sequencerStati.ascx.cs @@ -1,3 +1,5 @@ +using MapoDb; +using Newtonsoft.Json; using SteamWare; using System; using System.Web.UI.DataVisualization.Charting; @@ -254,88 +256,119 @@ namespace MoonPro.WebUserControls private void plottaGruppi(DataLayer_generic.serieDatiDataTable dati) { DataLayer_generic.serieDatiDataTable datiGrouped = new DataLayer_generic.serieDatiDataTable(); - TableRow r = new TableRow(); - double valMin = totale / numSplit; - double valRigaCum = 0.0; - double valR = 0.0; - double valG = 0.0; - double valV = 0.0; - double valB = 0.0; - double valS = 0.0; - DateTime _t_0 = new DateTime(9999, 1, 1); - string _mostCodArticolo = ""; - int _maxVal = 0; - string colore; - foreach (DataLayer_generic.serieDatiRow riga in dati) + // verifico se ho i dati in cache REDIS... + double numGG = _grafico.intervallo.fine.Subtract(_grafico.intervallo.inizio).TotalDays; + logger.lg.scriviLog(string.Format("Richiesta dati legacySeq GROUPED per {0} gg", numGG)); + string rKey = DataLayer.mHash(string.Format("legacySeq:spl_{0}:mac_{1}_{2}_{3}", numSplit, _grafico.idxMacchina, _grafico.intervallo.inizio.ToString("yyyyMMdd_HHmmss"), _grafico.intervallo.fine.ToString("yyyyMMdd_HHmmss")).Replace(" ", "_")); + bool needRecalc = true; + string redJson = memLayer.ML.getRSV(rKey); + // controllo se ho già in sessione un oggetto seq... + if (redJson != null && redJson != "") { - // salvo prima data... - if (riga.timeData < _t_0) + try { - _t_0 = riga.timeData; + needRecalc = false; + // deserializzo + datiGrouped = JsonConvert.DeserializeObject(redJson); + logger.lg.scriviLog("Recuperato " + rKey); } - if (riga.valore > _maxVal) + catch { - _maxVal = Convert.ToInt32(riga.valore); - _mostCodArticolo = riga.label; } - valRigaCum = valRigaCum + riga.valore; - // accumulo valori... - switch (riga.colore) + } + if (needRecalc) + { + logger.lg.scriviLog(string.Format("INIZIO calcolo dati per {0}", rKey)); + TableRow r = new TableRow(); + double valMin = totale / numSplit; + double valRigaCum = 0.0; + double valR = 0.0; + double valG = 0.0; + double valV = 0.0; + double valB = 0.0; + double valS = 0.0; + DateTime _t_0 = new DateTime(9999, 1, 1); + string _mostCodArticolo = ""; + int _maxVal = 0; + string colore; + foreach (DataLayer_generic.serieDatiRow riga in dati) { - case "sVe": - valV = valV + riga.valore; - break; - case "sGi": - valG = valG + riga.valore; - break; - case "sRo": - valR = valR + riga.valore; - break; - case "sBl": - valB = valB + riga.valore; - break; - case "sGr": - valS = valS + riga.valore; - break; - } - // se è maggiore plotto... - if (valRigaCum >= valMin) - { - // determino il colore... - if (valV / valRigaCum >= minVerde) + // salvo prima data... + if (riga.timeData < _t_0) { - colore = "sVe"; - valV = 0.0; + _t_0 = riga.timeData; } - else if (valR / valRigaCum >= minRosso) + if (riga.valore > _maxVal) { - colore = "sRo"; - valR = 0.0; + _maxVal = Convert.ToInt32(riga.valore); + _mostCodArticolo = riga.label; } - else if (valS / valRigaCum >= minSpento) + valRigaCum = valRigaCum + riga.valore; + // accumulo valori... + switch (riga.colore) { - colore = "sGr"; - valS = 0.0; + case "sVe": + valV = valV + riga.valore; + break; + case "sGi": + valG = valG + riga.valore; + break; + case "sRo": + valR = valR + riga.valore; + break; + case "sBl": + valB = valB + riga.valore; + break; + case "sGr": + valS = valS + riga.valore; + break; } - else if (valB / valRigaCum >= minSpento) + // se è maggiore plotto... + if (valRigaCum >= valMin) { - colore = "sBl"; - valB = 0.0; - } - else - { - colore = "sGi"; - valG = 0.0; - } - // salvo riga dati - datiGrouped.AddserieDatiRow(valRigaCum, colore, _mostCodArticolo, _t_0); - // reset dei contatori... - valRigaCum = 0.0; + // determino il colore... + if (valV / valRigaCum >= minVerde) + { + colore = "sVe"; + valV = 0.0; + } + else if (valR / valRigaCum >= minRosso) + { + colore = "sRo"; + valR = 0.0; + } + else if (valS / valRigaCum >= minSpento) + { + colore = "sGr"; + valS = 0.0; + } + else if (valB / valRigaCum >= minSpento) + { + colore = "sBl"; + valB = 0.0; + } + else + { + colore = "sGi"; + valG = 0.0; + } + // salvo riga dati + datiGrouped.AddserieDatiRow(valRigaCum, colore, _mostCodArticolo, _t_0); + // reset dei contatori... + valRigaCum = 0.0; - _t_0 = new DateTime(9999, 1, 1); - _mostCodArticolo = ""; - _maxVal = 0; + _t_0 = new DateTime(9999, 1, 1); + _mostCodArticolo = ""; + _maxVal = 0; + } } + //registro fine + logger.lg.scriviLog(string.Format("FINE calcolo dati per {0}", rKey)); + // salvo sequenza in REDIS... + string rData = JsonConvert.SerializeObject(datiGrouped); + // salvo in sessione l'oggetto... secondo durata impostata in web.config.. moltiplicata x numero gg... + memLayer.ML.setRSV(rKey, rData, 60 * memLayer.ML.CRI("seqCacheDurMin") * (int)numGG); + logger.lg.scriviLog(string.Format("Salvataggio in sessione {0} effettuato", rKey)); } plottaDettaglio(datiGrouped); } diff --git a/MapoDb/MapoDb.csproj b/MapoDb/MapoDb.csproj index 568e165c..8da4aed3 100644 --- a/MapoDb/MapoDb.csproj +++ b/MapoDb/MapoDb.csproj @@ -64,14 +64,15 @@ False ExtLib\Microsoft.ReportViewer.WinForms.dll - - ..\packages\Newtonsoft.Json.5.0.4\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + diff --git a/MapoDb/app.config b/MapoDb/app.config index 5427e522..ce77c437 100644 --- a/MapoDb/app.config +++ b/MapoDb/app.config @@ -1,13 +1,19 @@ - + - + - + + + + + + + + + diff --git a/MapoDb/resoconti.cs b/MapoDb/resoconti.cs index 62fb4e69..d4dc1f3e 100644 --- a/MapoDb/resoconti.cs +++ b/MapoDb/resoconti.cs @@ -1,9 +1,11 @@ using MapoDb; +using Newtonsoft.Json; using SteamWare; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Web.Script.Serialization; /// /// Summary description for resoconti @@ -22,6 +24,13 @@ public enum statoMacchina /// public struct objSequencer { + /// + /// Macchina selezionata + /// + public string idxMacchina; + /// + /// Intervallo date + /// public intervalloDate intervallo; /// /// serie dei dati da plottare @@ -534,24 +543,56 @@ public class resoconti objSequencer _sequenza = new objSequencer(); if (idxMacchina != null && idxMacchina != "") { - _sequenza.serieDati = new DataLayer_generic.serieDatiDataTable(); - // seleziono i dati... - MapoDb.DS_applicazione.DiarioDiBordoDataTable tabSeq = taDiarioDiBordo.GetSequenza(idxMacchina, _intervallo.inizio, _intervallo.fine); - foreach (MapoDb.DS_applicazione.DiarioDiBordoRow riga in tabSeq.Rows) + // verifico se ho i dati in cache REDIS... + double numGG = _intervallo.fine.Subtract(_intervallo.inizio).TotalDays; + logger.lg.scriviLog(string.Format("Richiesta dati legacySeq per {0} gg", numGG)); + string rKey = DataLayer.mHash(string.Format("legacySeq:spl_{0}:mac_{1}_{2}_{3}", 0, idxMacchina, _intervallo.inizio.ToString("yyyyMMdd_HHmmss"), _intervallo.fine.ToString("yyyyMMdd_HHmmss")).Replace(" ", "_")); + bool needRecalc = true; + string redJson = memLayer.ML.getRSV(rKey); + // controllo se ho già in sessione un oggetto seq... + if (redJson != null && redJson != "") { - _sequenza.serieDati.AddserieDatiRow(riga.DurataMinuti, semaforoDaIdxStato(riga.IdxStato), riga.CodArticolo, riga.InizioStato); + try + { + needRecalc = false; + // deserializzo + _sequenza = JsonConvert.DeserializeObject(redJson); + logger.lg.scriviLog("Recuperato legacySeq " + rKey); + } + catch + { + } } - // faccio trim x primo evento... - if (_sequenza.serieDati[0].timeData < _intervallo.inizio) + if (needRecalc) { - _sequenza.serieDati[0].valore -= _intervallo.inizio.Subtract(_sequenza.serieDati[0].timeData).TotalMinutes; - _sequenza.serieDati[0].timeData = _intervallo.inizio; + logger.lg.scriviLog(string.Format("INIZIO calcolo dati per {0}", rKey)); + // altrimenti procedo come al solito... + _sequenza.idxMacchina = idxMacchina; + _sequenza.serieDati = new DataLayer_generic.serieDatiDataTable(); + // seleziono i dati... + MapoDb.DS_applicazione.DiarioDiBordoDataTable tabSeq = taDiarioDiBordo.GetSequenza(idxMacchina, _intervallo.inizio, _intervallo.fine); + foreach (MapoDb.DS_applicazione.DiarioDiBordoRow riga in tabSeq.Rows) + { + _sequenza.serieDati.AddserieDatiRow(riga.DurataMinuti, semaforoDaIdxStato(riga.IdxStato), riga.CodArticolo, riga.InizioStato); + } + // faccio trim x primo evento... + if (_sequenza.serieDati[0].timeData < _intervallo.inizio) + { + _sequenza.serieDati[0].valore -= _intervallo.inizio.Subtract(_sequenza.serieDati[0].timeData).TotalMinutes; + _sequenza.serieDati[0].timeData = _intervallo.inizio; + } + //...e ultimo evento... + int numValori = _sequenza.serieDati.Count - 1; + _sequenza.serieDati[numValori].valore = _intervallo.fine.Subtract(_sequenza.serieDati[numValori].timeData).TotalMinutes; + // salvo intervallo + _sequenza.intervallo = _intervallo; + logger.lg.scriviLog(string.Format("FINE calcolo dati per {0}", rKey)); + // salvo sequenza in REDIS... + string rData = JsonConvert.SerializeObject(_sequenza); + // salvo in sessione l'oggetto... secondo durata impostata in web.config.. moltiplicata x numero gg... + memLayer.ML.setRSV(rKey, rData, 60 * memLayer.ML.CRI("seqCacheDurMin") * (int)numGG); + logger.lg.scriviLog(string.Format("Salvataggio in sessione legacySeq {0} effettuato", rKey)); } - //...e ultimo evento... - int numValori = _sequenza.serieDati.Count - 1; - _sequenza.serieDati[numValori].valore = _intervallo.fine.Subtract(_sequenza.serieDati[numValori].timeData).TotalMinutes; - // salvo intervallo - _sequenza.intervallo = _intervallo; } return _sequenza; } @@ -606,7 +647,7 @@ public class resoconti } else { - int index = 0; + int index = 0; // ciclo su tutte le macchine var elMacchine = DataLayer.obj.taSelMacc.getAttive(); foreach (var item in elMacchine) @@ -937,7 +978,7 @@ public class visjsDsOptions /// /// Data End /// - public string end; + public string end; } /// /// Oggetto timeline vis.js con gruppi + items