using MapoDb; using SteamWare; using System; using System.Collections.Generic; /// /// Summary description for resoconti /// public enum statoMacchina { Run = 1, Setup, Guasto, Campionatura, Disposizione, Varie } /// /// oggetto dati per grafico sequencer /// public struct objSequencer { public intervalloDate intervallo; /// /// serie dei dati da plottare /// public DataLayer_generic.serieDatiDataTable serieDati; } /// /// oggetto dati per grafico TempiCiclo /// public struct objTempiCiclo { public intervalloDate intervallo; public decimal minVal; public decimal maxVal; public decimal targetVal; public bool palletChange; /// /// serie dei dati da plottare /// public DataLayer_generic.serieTimeValDataTable serieDati; } //public struct intervallo //{ // public DateTime inizio; // public DateTime fine; //} public class resoconti { #region area protected protected MapoDb.DS_applicazioneTableAdapters.MacchineTableAdapter taMacchine; protected MapoDb.DS_ProdTempiTableAdapters.TempiCicloRilevatiTableAdapter taTempiCiclo; protected MapoDb.DS_applicazione.MacchineDataTable _Macchine; protected MapoDb.DS_applicazione.MacchineDataTable Macchine { get { if (!memLayer.ML.isInCacheObject("Macchine")) //if (HttpContext.Current.Cache["Macchine"] == null) { _Macchine = taMacchine.GetData(); memLayer.ML.setCacheVal("Macchine", _Macchine, true); } else { _Macchine = (MapoDb.DS_applicazione.MacchineDataTable)memLayer.ML.objCacheObj("Macchine"); } return _Macchine; } } protected MapoDb.DS_applicazioneTableAdapters.StatoMacchineTableAdapter taStatoMacchine; protected MapoDb.DS_applicazione.StatoMacchineDataTable _StatoMacchine; protected MapoDb.DS_applicazione.StatoMacchineDataTable StatoMacchine { get { //if (_StatoMacchine == null) //{ // _StatoMacchine = taStatoMacchine.GetData(); //} if (!memLayer.ML.isInCacheObject("StatoMacchine")) { _StatoMacchine = taStatoMacchine.GetData(); SteamWare.memLayer.ML.setCacheVal("StatoMacchine", _StatoMacchine, true); } else { _StatoMacchine = (MapoDb.DS_applicazione.StatoMacchineDataTable)SteamWare.memLayer.ML.objCacheObj("StatoMacchine"); } return _StatoMacchine; } } protected MapoDb.DS_applicazioneTableAdapters.AnagraficaStatiTableAdapter taStati; protected MapoDb.DS_applicazione.AnagraficaStatiDataTable _Stati; protected MapoDb.DS_applicazione.AnagraficaStatiDataTable Stati { get { if (!memLayer.ML.isInCacheObject("Stati")) { _Stati = taStati.GetData(); memLayer.ML.setCacheVal("Stati", _Stati, true); } else { _Stati = (MapoDb.DS_applicazione.AnagraficaStatiDataTable)memLayer.ML.objCacheObj("Stati"); } return _Stati; } } protected MapoDb.DS_applicazioneTableAdapters.DiarioDiBordoTableAdapter taDiarioDiBordo; protected MapoDb.DS_applicazione.DiarioDiBordoDataTable _DiarioDiBordo; protected MapoDb.DS_applicazione.DiarioDiBordoDataTable DiarioDiBordo { get { if (_DiarioDiBordo == null) { _DiarioDiBordo = taDiarioDiBordo.GetData(); } return _DiarioDiBordo; } } protected MapoDb.DS_applicazioneTableAdapters.ParetoDurateTableAdapter taParetoDurate; protected MapoDb.DS_applicazioneTableAdapters.AnagraficaEventiTableAdapter taAnagraficaEventi; protected MapoDb.DS_applicazione.AnagraficaEventiDataTable _AnagraficaEventi; protected MapoDb.DS_applicazione.AnagraficaEventiDataTable AnagraficaEventi { get { if (!memLayer.ML.isInCacheObject("AnagraficaEventi")) //if (HttpContext.Current.Cache["AnagraficaEventi"] == null) { _AnagraficaEventi = taAnagraficaEventi.GetData(); SteamWare.memLayer.ML.setCacheVal("AnagraficaEventi", _AnagraficaEventi, true); //HttpContext.Current.Cache["AnagraficaEventi"] = _AnagraficaEventi; } else { _AnagraficaEventi = (MapoDb.DS_applicazione.AnagraficaEventiDataTable)SteamWare.memLayer.ML.objCacheObj("AnagraficaEventi"); //_AnagraficaEventi = (MapoDb.DS_applicazione.AnagraficaEventiDataTable)HttpContext.Current.Cache["AnagraficaEventi"]; } return _AnagraficaEventi; } } protected MapoDb.DS_applicazioneTableAdapters.AnagArticoliTableAdapter taAnagArt; protected MapoDb.DS_applicazione.AnagArticoliDataTable _AnagArt; protected MapoDb.DS_applicazione.AnagArticoliDataTable AnagArt { get { if (!memLayer.ML.isInCacheObject("AnagArt")) { _AnagArt = taAnagArt.GetData(); SteamWare.memLayer.ML.setCacheVal("AnagArt", _AnagArt, true); } else { _AnagArt = (MapoDb.DS_applicazione.AnagArticoliDataTable)SteamWare.memLayer.ML.objCacheObj("AnagArt"); } return _AnagArt; } } protected MapoDb.DS_applicazioneTableAdapters.AnagraficaOperatoriTableAdapter taAnagOpr; protected MapoDb.DS_applicazione.AnagraficaOperatoriDataTable _AnagOpr; protected MapoDb.DS_applicazione.AnagraficaOperatoriDataTable AnagOpr { get { if (!memLayer.ML.isInCacheObject("AnagOpr")) //if (HttpContext.Current.Cache["AnagOpr"] == null) { _AnagOpr = taAnagOpr.GetData(); SteamWare.memLayer.ML.setCacheVal("AnagOpr", _AnagOpr, true); //HttpContext.Current.Cache["AnagOpr"] = _AnagOpr; } else { _AnagOpr = (MapoDb.DS_applicazione.AnagraficaOperatoriDataTable)SteamWare.memLayer.ML.objCacheObj("AnagOpr"); //_AnagOpr = (MapoDb.DS_applicazione.AnagraficaOperatoriDataTable)HttpContext.Current.Cache["AnagOpr"]; } return _AnagOpr; } } #endregion #region area public public resoconti() { AvviaTabAdapt(); setConnString(); } /// /// singleton accesso resoconti /// public static resoconti mngr = new resoconti(); /// /// avvio i table adapter della classe /// private void AvviaTabAdapt() { taMacchine = new MapoDb.DS_applicazioneTableAdapters.MacchineTableAdapter(); taStatoMacchine = new MapoDb.DS_applicazioneTableAdapters.StatoMacchineTableAdapter(); taStati = new MapoDb.DS_applicazioneTableAdapters.AnagraficaStatiTableAdapter(); taDiarioDiBordo = new MapoDb.DS_applicazioneTableAdapters.DiarioDiBordoTableAdapter(); taParetoDurate = new MapoDb.DS_applicazioneTableAdapters.ParetoDurateTableAdapter(); taAnagraficaEventi = new MapoDb.DS_applicazioneTableAdapters.AnagraficaEventiTableAdapter(); taAnagArt = new MapoDb.DS_applicazioneTableAdapters.AnagArticoliTableAdapter(); taAnagOpr = new MapoDb.DS_applicazioneTableAdapters.AnagraficaOperatoriTableAdapter(); taTempiCiclo = new MapoDb.DS_ProdTempiTableAdapters.TempiCicloRilevatiTableAdapter(); } /// /// forza la connString x i vari table adapters /// private void setConnString() { string _connectionString = SteamWare.memLayer.ML.confReadString("MoonProConnectionString"); taMacchine.Connection.ConnectionString = _connectionString; taStatoMacchine.Connection.ConnectionString = _connectionString; taStati.Connection.ConnectionString = _connectionString; taDiarioDiBordo.Connection.ConnectionString = _connectionString; taParetoDurate.Connection.ConnectionString = _connectionString; taAnagraficaEventi.Connection.ConnectionString = _connectionString; taAnagArt.Connection.ConnectionString = _connectionString; taAnagOpr.Connection.ConnectionString = _connectionString; taTempiCiclo.Connection.ConnectionString = _connectionString; } public string locazioneDaIdx(string idx) { MapoDb.DS_applicazione.MacchineRow riga = Macchine.FindByIdxMacchina(idx); return string.Format("{0}", riga.locazione); } public string idxDaLocazione(string locazione) { string answ = ""; MapoDb.DS_applicazione.MacchineRow riga = null; try { riga = (MapoDb.DS_applicazione.MacchineRow)Macchine.Select(string.Format("locazione = '{0}'", locazione))[0]; answ = string.Format("{0}", riga.IdxMacchina); } catch { } return answ; } public string nomeMacchina(string idx) { string answ = ""; MapoDb.DS_applicazione.MacchineRow riga = Macchine.FindByIdxMacchina(idx); try { answ = string.Format("{0} ({1} - {2})", riga.Nome, riga.CodMacchina, riga.Descrizione); } catch { } return answ; } public string macchinaDaIdx(string idx) { MapoDb.DS_applicazione.MacchineRow riga = Macchine.FindByIdxMacchina(idx); return string.Format("{0}", riga.CodMacchina); } public string urlMacchina(string idx) { string answ = ""; MapoDb.DS_applicazione.MacchineRow riga = null; try { riga = Macchine.FindByIdxMacchina(idx); answ = string.Format("{0}", riga.url); } catch { } return answ; } /// /// fornisce idxStato della macchina indicata /// /// /// public int statoMacchina(string idx) { int answ = 0; try { if (memLayer.ML.CRB("RedEnab")) { // recupero SE IMPIEGATO REDIS i valori del Dictionary della macchina... Dictionary datiMacc = DataLayer.mDatiMacchine(idx); answ = Convert.ToInt32(datiMacc["IdxStato"]); } if (answ == 0) { MapoDb.DS_ProdTempi.stp_repDonati_getLastStatoDurataMacchinaRow riga = (MapoDb.DS_ProdTempi.stp_repDonati_getLastStatoDurataMacchinaRow)(MapoDb.DataLayer.obj.taDatiStatoMacch.GetData(idx, 0)[0]); answ = riga.idxStato; } } catch { } return answ; } /// /// fornisce descrizione stato da IdxStato /// /// /// public string statoDaIdx(int idx) { return Stati.FindByIdxStato(idx).Descrizione; } /// /// fornisce cod operatore data matricola /// /// /// public string oprDaMatr(int matr) { string answ = "nd"; try { MapoDb.DS_applicazione.AnagraficaOperatoriRow riga = AnagOpr.FindByMatrOpr(matr); answ = string.Format("{0} {1}", riga.Cognome, riga.Nome); } catch { } return answ; } /// /// Dizionario codici colore (chiave = idxStato), valore = codice colore /// protected Dictionary codColore { get { Dictionary answ = new Dictionary(); if (memLayer.ML.isInCacheObject("codColore")) { answ = (Dictionary)memLayer.ML.objCacheObj("codColore"); } else { string _colore = ""; foreach (MapoDb.DS_applicazione.AnagraficaStatiRow item in Stati) { switch (item.Semaforo) { case "sGi": // giallo _colore = "#ffec00"; break; case "sRo": // rosso _colore = "#e2001a"; break; case "sGr": // grigio - spenta _colore = "#bcbcbc"; break; case "sVe": // verde _colore = "#009036"; break; case "sBl": // blu _colore = "#3690FF"; break; default: break; } answ.Add(item.IdxStato, _colore); } memLayer.ML.setCacheVal("codColore", answ, true); } return answ; } } /// /// Dizionario codici semaforo (chiave = idxStato), valore = codice semaforo /// protected Dictionary codSemaforo { get { Dictionary answ = new Dictionary(); if (memLayer.ML.isInCacheObject("codSemaforo")) { answ = (Dictionary)memLayer.ML.objCacheObj("codSemaforo"); } else { foreach (MapoDb.DS_applicazione.AnagraficaStatiRow item in Stati) { answ.Add(item.IdxStato, item.Semaforo); } memLayer.ML.setCacheVal("codSemaforo", answ, true); } return answ; } } /// /// Restituisce colore da IdxStato /// /// /// public string coloreDaIdx(int idx) { string _answ = ""; if (memLayer.ML.CRB("fastColorDecode")) { _answ = codColore[idx]; } else { switch (Stati.FindByIdxStato(idx).Semaforo) { case "sGi": // giallo _answ = "#ffec00"; break; case "sRo": // rosso _answ = "#e2001a"; break; case "sGr": // grigio - spenta _answ = "#bcbcbc"; break; case "sVe": // verde _answ = "#009036"; break; case "sBl": // blu _answ = "#3690FF"; break; default: break; } } return _answ; } /// /// restituisce cod semaforo dato IdxStato /// /// /// public string semaforoDaIdxStato(int idx) { string _answ = ""; if (memLayer.ML.CRB("fastColorDecode")) { _answ = codSemaforo[idx]; } else { _answ = Stati.FindByIdxStato(idx).Semaforo; } return _answ; } /// /// fornisce una torta stati /// /// /// /// /// /// public DataLayer_generic.serieDatiDataTable tortaStati(string idx, intervalloDate _intervallo, int minDurata, bool hideSpenta) { // leggo i dati e costituisco una collezione... DataLayer_generic.serieDatiDataTable punti = new DataLayer_generic.serieDatiDataTable(); // seleziono i dati... MapoDb.DS_applicazione.ParetoDurateDataTable tabPareto; if (hideSpenta) { tabPareto = taParetoDurate.GetParetoDurateHideSpenta(idx, minDurata, _intervallo.fine, _intervallo.inizio); } else { tabPareto = taParetoDurate.GetParetoDurateFilt(idx, minDurata, _intervallo.fine, _intervallo.inizio); } double totale = 1; try { totale = (double)tabPareto.Compute("SUM(DurataMinuti)", ""); } catch { } foreach (MapoDb.DS_applicazione.ParetoDurateRow riga in tabPareto.Rows) { punti.AddserieDatiRow((float)((Math.Round(((float)riga.DurataMinuti) / totale * 1000)) / 1000), coloreDaIdx(riga.IdxStato), statoDaIdx(riga.IdxStato), riga.InizioStato); } return punti; } /// /// tipo evento da Idx /// /// /// public string tipoDaIdx(int idx) { return AnagraficaEventi.FindByIdxTipo(idx).Nome; } /// /// oggetto sequenza dati x sequencer /// /// IdxMacchina /// /// public objSequencer sequenzaDati(string idxMacchina, intervalloDate _intervallo) { DateTime start = DateTime.Now; // leggo i dati e costituisco una collezione... 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) { _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; } return _sequenza; } /// /// oggetto sequenza tempi ciclo x visualizzatore /// /// /// /// tempo target di riferimento (se zero calcola la media...) /// public objTempiCiclo tempiCiclo(string idxMacchina, intervalloDate _intervallo, decimal targetVal) { // inizializzo objTempiCiclo _serie = new objTempiCiclo(); if (idxMacchina != null && idxMacchina != "") { _serie.serieDati = new DataLayer_generic.serieTimeValDataTable(); // seleziono i dati if (targetVal > 0) { _serie.targetVal = targetVal; } else { try { _serie.targetVal = taTempiCiclo.getMedByMacchinaPeriodo(idxMacchina, _intervallo.inizio, _intervallo.fine)[0].TCMedio; } catch { } } int TcMaxFactor = memLayer.ML.confReadInt("TcMaxFactor"); DS_ProdTempi.TempiCicloRilevatiDataTable tabTempi = taTempiCiclo.getByMacchinaPeriodoFiltMax(idxMacchina, _intervallo.inizio, _intervallo.fine, _serie.targetVal * TcMaxFactor); // converto! DateTime inizio; foreach (MapoDb.DS_ProdTempi.TempiCicloRilevatiRow riga in tabTempi.Rows) { inizio = riga.DataOraRif.AddMinutes(Convert.ToDouble(-riga.TCMedio * riga.PzProd)); // tolgo il tempo necessario a produrre i pezzi indicati come inizio _serie.serieDati.AddserieTimeValRow(inizio, riga.DataOraRif, riga.TCMedio, string.Format("Art: {0} - T.C. {1}'", riga.CodArticolo, riga.TCMedio), riga.CodArticolo); } // sistemo estremi x date e valori try { _serie.maxVal = taTempiCiclo.getMaxByMacchinaPeriodo(idxMacchina, _intervallo.inizio, _intervallo.fine)[0].TCMedio; if (_serie.maxVal > _serie.targetVal * TcMaxFactor) { _serie.maxVal = _serie.targetVal * TcMaxFactor; } } catch { } try { _serie.minVal = taTempiCiclo.getMinByMacchinaPeriodo(idxMacchina, _intervallo.inizio, _intervallo.fine)[0].TCMedio; } catch { } _serie.intervallo = _intervallo; // imposto se abbia cambio pallet _serie.palletChange = false; try { _serie.palletChange = MapoDb.DataLayer.obj.taDatiMacchine.getByIdx(idxMacchina)[0].palletChange; } catch { } } return _serie; } #endregion }