diff --git a/MP-SITE/WebUserControls/baseUserControl.cs b/MP-SITE/WebUserControls/baseUserControl.cs index b22f25a3..d8fdf859 100644 --- a/MP-SITE/WebUserControls/baseUserControl.cs +++ b/MP-SITE/WebUserControls/baseUserControl.cs @@ -107,5 +107,17 @@ namespace MP_SITE.WebUserControls } #endregion Public Methods + + + /// + /// Arrotondamento oggetto datetime all'intervallo timespan indicato + /// + /// Dataora + /// Timespan arrotondamento (x eccesso) + /// + protected DateTime RoundUp(DateTime dt, TimeSpan d) + { + return new DateTime((dt.Ticks + d.Ticks - 1) / d.Ticks * d.Ticks, dt.Kind); + } } } \ No newline at end of file diff --git a/MP-Site/WebUserControls/mod_statoMacchina.ascx.cs b/MP-Site/WebUserControls/mod_statoMacchina.ascx.cs index 31a3fa1f..44ea1f0a 100644 --- a/MP-Site/WebUserControls/mod_statoMacchina.ascx.cs +++ b/MP-Site/WebUserControls/mod_statoMacchina.ascx.cs @@ -3,10 +3,11 @@ using Newtonsoft.Json; using SteamWare; using System; using System.IO; +using System.Linq; namespace MP_SITE.WebUserControls { - public partial class mod_statoMacchina : System.Web.UI.UserControl + public partial class mod_statoMacchina : baseUserControl { #region Public Properties @@ -275,7 +276,7 @@ namespace MP_SITE.WebUserControls DateTime lastKA = DateTime.Now.AddMinutes(-minuti); if (_IdxMacchina != "nd") { - string nomeVar = string.Format("KeepAlive:{0}", _IdxMacchina); + string nomeVar = $"KeepAlive:{_IdxMacchina}"; string redKey = memLayer.ML.redHash(nomeVar); var _lastKA = memLayer.ML.getRSV(redKey); if (_lastKA == null) @@ -318,6 +319,63 @@ namespace MP_SITE.WebUserControls } } + /// + /// Recupera riga stato corrente + /// + /// + protected DS_ProdTempi.stp_repDonati_getLastStatoDurataMacchinaRow rigaStato() + { + DS_ProdTempi.stp_repDonati_getLastStatoDurataMacchinaRow answ = null; + // cerco in redis + string nomeVar = $"RigaStatoMacc:{IdxMacchina}"; + string redKey = memLayer.ML.redHash(nomeVar); + string rawData = memLayer.ML.getRSV(redKey); + if (!string.IsNullOrEmpty(rawData)) + { + answ = JsonConvert.DeserializeObject(rawData); + } + // altrimenti DB + else + { + answ = DataLayerObj.taDatiStatoMacch.GetData(IdxMacchina, 0.1)[0]; + rawData = JsonConvert.SerializeObject(answ); + memLayer.ML.setRSV(redKey, rawData, 30); + } + return answ; + } + + /// + /// Recupera pezzi prodotti + /// + /// Periodo finestra minuti da considerare dato dataora aggiornata ai 15 sec... + /// + protected int pezziProd(int numMinuti) + { + DateTime dtEnd = RoundUp(DateTime.Now, TimeSpan.FromSeconds(60)); + DateTime dtStart = dtEnd.AddMinutes(-numMinuti); + int answ = 0; + // cerco in redis + string nomeVar = $"PezziProd:{IdxMacchina}:{dtStart:yyyyMMdd-HHmmss}:{dtEnd:yyyyMMdd-HHmmss}"; + string redKey = memLayer.ML.redHash(nomeVar); + string rawData = memLayer.ML.getRSV(redKey); + if (!string.IsNullOrEmpty(rawData)) + { + answ = JsonConvert.DeserializeObject(rawData); + } + // altrimenti DB + else + { + var tcRilTab = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, dtStart, dtEnd); + if (tcRilTab != null && tcRilTab.Rows.Count > 0) + { + answ = tcRilTab.Sum(x => x.PzProd); + } + rawData = JsonConvert.SerializeObject(answ); + memLayer.ML.setRSV(redKey, rawData, 120); + } + return answ; + } + /// /// sistema il testo /// @@ -330,8 +388,6 @@ namespace MP_SITE.WebUserControls lblStato.Text = "Stato"; lblProd.Text = "T.Ciclo"; // era OEE lblDurata.Text = "Durata"; - // 2018.02.05 cambio x fix nuovi impianti valMacchina.Text = - // tabMacchine.FindByIdxMacchina(IdxMacchina).Nome; valCodArticolo.Text = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).CodArticolo; // leggo valori da MSE... valMacchina.Text = tabMSE[0].Nome; @@ -344,26 +400,19 @@ namespace MP_SITE.WebUserControls float minuti = 0; try { - DS_ProdTempi.stp_repDonati_getLastStatoDurataMacchinaRow rigaStato = DataLayerObj.taDatiStatoMacch.GetData(IdxMacchina, 0.1)[0]; - idxStato = rigaStato.idxStato; - oreTot = Convert.ToInt32(Math.Floor(rigaStato.Minuti / 60)); - minuti = (float)rigaStato.Minuti - 60 * oreTot; + var rigaStatoCurr = rigaStato(); + idxStato = rigaStatoCurr.idxStato; + oreTot = Convert.ToInt32(Math.Floor(rigaStatoCurr.Minuti / 60)); + minuti = (float)rigaStatoCurr.Minuti - 60 * oreTot; } catch { // 2018.02.05 cambio x fix nuovi impianti - //idxStato = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).IdxStato; - //DateTime inizioStato = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).InizioStato; - //DateTime ora = DateTime.Now; - //TimeSpan durata = ora.Subtract(inizioStato); - //oreTot = durata.Days * 24 + durata.Hours; - //minuti = durata.Minutes; idxStato = tabMSE[0].idxStato; oreTot = (int)tabMSE[0].durata / 60; minuti = (int)tabMSE[0].durata - 60 * oreTot; } // 2018.02.05 cambio x fix nuovi impianti - //valStato.Text = tabAnagStati.FindByIdxStato(idxStato).Descrizione; valStato.Text = tabMSE[0].DescrizioneStato; valDurata.Text = $"{oreTot}h {minuti:N2}min"; // solo se in stato NON di run... @@ -373,14 +422,12 @@ namespace MP_SITE.WebUserControls string cauFermo = "nd"; try { - cauFermo = tabAnagStati.FindByIdxStato(tabMSE[0].idxStato).Descrizione; - //cauFermo = tabAnagStati.FindByIdxStato(Convert.ToInt32(tabStatoMacchine.FindByIdxMacchina(IdxMacchina).IdxStato)).Descrizione; + cauFermo = tabAnagStati.FindByIdxStato(idxStato).Descrizione; } catch { // 2018.02.05 cambio x fix nuovi impianti - //cauFermo = string.Format("IN: {0}", tabStatoMacchine.FindByIdxMacchina(IdxMacchina).Value); - cauFermo = $"IN: {tabMSE[0].idxStato}"; + cauFermo = $"IN: {idxStato}"; } valCausale.Text = cauFermo; } @@ -390,75 +437,53 @@ namespace MP_SITE.WebUserControls valCausale.Text = ""; } - // ATTENZIONE! dati generati casualmente, da cambiare in produzione!!! - bool demoRandom = false; - if (demoRandom) + + DateTime Ora = DateTime.Now; + valProd.Text = "1H: "; + string emptyVal = "n/a
"; + int numPezzi = 0; + // prova l'ultima ora + try { - // indico a caso % pz prodotti... - Random RandomClass = new Random(DateTime.Now.Millisecond); - if (idxStato == 13) + // conto num pezzi e divido 1h/pezzi + //2023.05.03 gestione con cache e conteggio corretto + //numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-1), Ora).Rows.Count; + numPezzi = pezziProd(60); + if (numPezzi > 0) { - valProd.Text = string.Format("{0:P}", RandomClass.NextDouble() / 4 + 0.75); - } - else if (oreTot > 8) - { - valProd.Text = string.Format("{0:P}", 0); + valProd.Text += $"{Math.Round((double)60 / numPezzi, 3):#.00}m
"; } else { - valProd.Text = string.Format("{0:P}", RandomClass.NextDouble() / 2 + 0.25); + valProd.Text += emptyVal; } } - else // mostra lo stesso valore per tutti e due + catch { - // prova...se non ha dati relativa mostra n/a - not available + valProd.Text += emptyVal; + } - DateTime Ora = DateTime.Now; - - valProd.Text = "1H: "; - string emptyVal = "n/a
"; - int numPezzi = 0; - // prova l'ultima ora - try + // prova le ultime 8 ore + valProd.Text += "8H: "; + numPezzi = 0; + try + { + // conto num pezzi e divido 1h/pezzi + //numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-8), Ora).Rows.Count; + numPezzi = pezziProd(480); + if (numPezzi > 0) { - // conto num pezzi e divido 1h/pezzi - numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-1), Ora).Rows.Count; - if (numPezzi > 0) - { - valProd.Text += String.Format("{0:#.00}m
", Math.Round((double)60 / numPezzi, 3)); - } - else - { - valProd.Text += emptyVal; - } + valProd.Text += $"{Math.Round((double)480 / numPezzi, 3):#.00}m "; } - catch - { - valProd.Text += emptyVal; - } - - // prova le ultime 8 ore - - valProd.Text += "8H: "; - numPezzi = 0; - try - { - // conto num pezzi e divido 1h/pezzi - numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-8), Ora).Rows.Count; - if (numPezzi > 0) - { - valProd.Text += String.Format("{0:#.00}m ", Math.Round((double)480 / numPezzi, 3)); - } - else - { - valProd.Text += emptyVal; - } - } - catch + else { valProd.Text += emptyVal; } } + catch + { + valProd.Text += emptyVal; + } } } diff --git a/MP-TAB/WebUserControls/BaseUserControl.cs b/MP-TAB/WebUserControls/BaseUserControl.cs index ca0643e5..5483bce4 100644 --- a/MP-TAB/WebUserControls/BaseUserControl.cs +++ b/MP-TAB/WebUserControls/BaseUserControl.cs @@ -548,6 +548,17 @@ namespace MoonProTablet.WebUserControls return answ; } + /// + /// Arrotondamento oggetto datetime all'intervallo timespan indicato + /// + /// Dataora + /// Timespan arrotondamento (x eccesso) + /// + protected DateTime RoundUp(DateTime dt, TimeSpan d) + { + return new DateTime((dt.Ticks + d.Ticks - 1) / d.Ticks * d.Ticks, dt.Kind); + } + #endregion Protected Methods } } \ No newline at end of file