using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MP.Data.DatabaseModels; using NLog; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using static MP.Data.Objects.Enums; namespace MP.Data.Controllers { public class MpTabController : IDisposable { #region Public Constructors public MpTabController(IConfiguration configuration) { _configuration = configuration; Log.Info("Avviato MpTabController"); } #endregion Public Constructors #region Public Methods /// /// Restituisce l'anagrafica EVENTI per intero /// /// public List AnagEventiGetAll() { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetAnagEventi .AsNoTracking() .ToList(); } return dbResult; } /// /// Restituisce l'anagrafica EVENTI per intero /// /// public List AnagEventiGetByMacc(string IdxMac) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacch = new SqlParameter("@idxMacchina", IdxMac); dbResult = dbCtx .DbSetVSEB .FromSqlRaw("exec dbo.stp_vseb_getByIdxMacchinaFull @idxMacchina", IdxMacch) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// Restituisce l'anagrafica STATI per intero /// /// public List AnagStatiGetAll() { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetAnagStati .AsNoTracking() .ToList(); } return dbResult; } /// /// Verifica se sia necessario inserire un cambio di stato impianto in modalità batch /// /// /// /// /// /// /// /// /// public void CheckCambiaStatoBatch(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet) { List tabTransStati = new List(); TransizioneStatiModel rigaTransStati = new TransizioneStatiModel(); switch (tipoInput) { case tipoInputEvento.barcode: // effettuo cambio stato INDIPENDENTEMENTE da stato precedente try { tabTransStati = SMES_getUserForced(IdxMacchina, IdxTipo); if (tabTransStati != null) { if (tabTransStati.Count > 0) { rigaTransStati = tabTransStati.FirstOrDefault(); // solo se cambia stato... if (rigaTransStati.IdxStato != rigaTransStati.next_IdxStato) { DDB_InsStatoBatch(IdxMacchina, InizioStato, rigaTransStati.next_IdxStato, CodArt, Value, MatrOpr, pallet); // aggiorno MSE RicalcMse(IdxMacchina, 0); } } else { Log.Debug($"Non trovata riga per: BARCODE | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}"); } } } catch (Exception exc) { // non dovrebbe succedere... input utente da barcode dovrebbero TUTTI essere // inseriti in tab transizione con famiglia 1... Log.Error($"Eccezione controllo transizione stato x evento barcode: BARCODE | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}{Environment.NewLine}{exc}"); } break; case tipoInputEvento.hw: // verifico se ci sia necessità di cambio stato try { tabTransStati = SMES_getHwTransitions(IdxMacchina, IdxTipo); if (tabTransStati != null) { if (tabTransStati.Count > 0) { //rigaTransStati = tabTransStati[0]; rigaTransStati = tabTransStati.FirstOrDefault(); if (rigaTransStati != null) { // solo se cambia stato... if (rigaTransStati.IdxStato != rigaTransStati.next_IdxStato) { DDB_InsStatoBatch(IdxMacchina, InizioStato, rigaTransStati.next_IdxStato, CodArt, Value, MatrOpr, pallet); } } } else { Log.Debug($"Non trovata riga per: HW | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}"); } } } catch (Exception exc) { // non trovo riga [0]... NON scrivo! Log.Error($"Errore controllo transizione stato x evento barcode: HW | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}{Environment.NewLine}{exc}"); } break; } } /// /// Recupera elenco ultimi commenti x macchina /// /// Idx macchina, "*" = tutte /// Num massimo di record da recuperare /// public List CommentiGetLastByMacc(string idxMacchina, int maxRec) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina); var MaxRec = new SqlParameter("@MaxRec", maxRec); dbResult = dbCtx .DbSetCommenti .FromSqlRaw("exec dbo.stp_Comm_getLastByMacchina @IdxMacchina, @MaxRec", IdxMacchina, MaxRec) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma /// --> dtEvent) /// /// idx macchina da confermare /// 0=periodo, 1 = giorno, 2 = turno /// qta pezzi BUONI da confermare /// qta pezzi SCARTO da confermare /// DataOra in cui registrare approvazione /// Matricola operatore /// public bool ConfermaProdMacchina(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzScarto, DateTime DataOraApp, int MatrOpr) { bool answ = false; try { var rigaProd = StatoProdMacchina(idxMacchina, DateTime.Now); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@idxMacchina", idxMacchina); var MatrApp = new SqlParameter("@MatrApp ", MatrOpr); var DataFrom = new SqlParameter("@dataFrom ", rigaProd.DataFrom); var DataTo = new SqlParameter("@dataTo", DataOraApp); var PezziConf = new SqlParameter("@pezziConf", numPzConfermati); var PezziScar = new SqlParameter("@pezziScar", numPzScarto); var TipoConf = new SqlParameter("@TipoConf", modoConfProd); var DtOraApp = new SqlParameter("@DataOraApp", DataOraApp); var TestConferma = new SqlParameter("@TestConferma", true); var result = dbCtx .Database .ExecuteSqlRaw("EXEC stp_ConfermaProduzCompleta @idxMacchina, @MatrApp, @dataFrom, @dataTo, @pezziConf, @pezziScar, @TipoConf, @DataOraApp, @TestConferma ", IdxMacchina, MatrApp, DataFrom, DataTo, PezziConf, PezziScar, TipoConf, DtOraApp, TestConferma); // indico eseguito! answ = result > 0; } } catch (Exception exc) { Log.Error($"Eccezione in ConfermaProdMacchina:{Environment.NewLine}{exc}"); } return answ; } /// /// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma /// --> dtEvent) /// /// idx macchina da confermare /// 0=periodo, 1 = giorno, 2 = turno /// qta pezzi BUONI da confermare /// /// qta pezzi LASCIATI alla macchina da confermare (2 eventi 121 rettifica neg/pos) /// /// qta pezzi SCARTO da confermare /// DataOra in cui registrare approvazione /// Matricola operatore /// public bool ConfermaProdMacchinaFull(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzLasciati, int numPzScarto, DateTime DataOraApp, int MatrOpr) { bool answ = false; try { var rigaProd = StatoProdMacchina(idxMacchina, DateTime.Now); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@idxMacchina", idxMacchina); var MatrApp = new SqlParameter("@MatrApp ", MatrOpr); var DataFrom = new SqlParameter("@dataFrom ", rigaProd.DataFrom); var DataTo = new SqlParameter("@dataTo", DataOraApp); var PezziConf = new SqlParameter("@pezziConf", numPzConfermati); var PezziLasc = new SqlParameter("@pezziLasciati", numPzLasciati); var PezziScar = new SqlParameter("@pezziScar", numPzScarto); var TipoConf = new SqlParameter("@TipoConf", modoConfProd); var DtOraApp = new SqlParameter("@DataOraApp", DataOraApp); var TestConferma = new SqlParameter("@TestConferma", true); var result = dbCtx .Database .ExecuteSqlRaw("EXEC stp_ConfermaProduzCompletaFull @idxMacchina, @MatrApp, @dataFrom, @dataTo, @pezziConf, @pezziLasciati, @pezziScar, @TipoConf, @DataOraApp, @TestConferma ", IdxMacchina, MatrApp, DataFrom, DataTo, PezziConf, PezziLasc, PezziScar, TipoConf, DtOraApp, TestConferma); // indico eseguito! answ = result > 0; } } catch (Exception exc) { Log.Error($"Eccezione in ConfermaProdMacchinaFull con rett ev121:{Environment.NewLine}{exc}"); } return answ; } /// /// Elenco da tabella Config /// /// public List ConfigGetAll() { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetConfig .AsNoTracking() .OrderBy(x => x.Chiave) .ToList(); } return dbResult; } public bool DDB_InsStatoBatch(string idxMacchina, DateTime inizioStato, int idxStato, string codArt, string value, int matrOpr, string pallet) { bool fatto = false; using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina); var InizioStato = new SqlParameter("@InizioStato", inizioStato); var IdxStato = new SqlParameter("@IdxStato", idxStato); var CodArticolo = new SqlParameter("@CodArticolo", codArt); var Value = new SqlParameter("@Value", value); var MatrOpr = new SqlParameter("@MatrOpr", matrOpr); var Pallet = new SqlParameter("@pallet", pallet); var result = dbCtx .Database .ExecuteSqlRaw("exec dbo.stp_DDB_InsStatoBatch @IdxMacchina, @InizioStato, @IdxStato, @CodArticolo, @Value, @MatrOpr, @pallet", IdxMacchina, InizioStato, IdxStato, CodArticolo, Value, MatrOpr, Pallet); // indico eseguito! fatto = result > 0; } return fatto; } public void Dispose() { _configuration = null; } /// /// Eliminazione record EventList (SE trovato) /// /// /// public async Task EvListDelete(string idxMacchina, DateTime dtEvento) { bool fatto = false; using (var dbCtx = new MoonProContext(_configuration)) { try { var item2del = dbCtx .DbSetEvList .Where(x => x.IdxMacchina == idxMacchina && x.InizioStato == dtEvento) .FirstOrDefault(); if (item2del != null) { dbCtx.DbSetEvList.Remove(item2del); await dbCtx.SaveChangesAsync(); } } catch (Exception exc) { Log.Error($"Eccezione durante EvListDelete{Environment.NewLine}{exc}"); } } await Task.Delay(1); return fatto; } /// /// Recupera record EventList date condizioni filtro /// /// Idx macchina, "*" = tutte /// Data limite per recupero antecedenti /// Tipo evento cercato, 0 = tutti /// Num massimo di record da recuperare /// public async Task> EvListGetLastBySearch(string idxMacchina, DateTime dtLimit, int idxTipo, int maxRec) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = await dbCtx .DbSetEvList .Where(x => (idxMacchina == "*" || x.IdxMacchina == idxMacchina) && (x.InizioStato <= dtLimit) && (idxTipo == 0 || x.IdxTipo == idxTipo)) .OrderByDescending(x => x.InizioStato) .Take(maxRec) .ToListAsync(); } return dbResult; } /// /// Aggiunta record EventList /// /// /// public async Task EvListInsert(EventListModel newRec) { bool fatto = false; using (var dbCtx = new MoonProContext(_configuration)) { try { var currRec = dbCtx .DbSetEvList .Add(newRec); await dbCtx.SaveChangesAsync(); } catch (Exception exc) { Log.Error($"Eccezione durante EvListInsert{Environment.NewLine}{exc}"); } } await Task.Delay(1); return fatto; } /// /// Recupera elenco fermi non qualificati da filtro /// /// Idx macchina, "*" = tutte /// Num massimo di giorni antecedenti /// Durata minima (in minuti) /// public List FermiNonQualificatiFilt(string idxMacchina, int gg, double durataMin) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina); var GG = new SqlParameter("@MaxRec", gg); var DurataMin = new SqlParameter("@MaxRec", durataMin); dbResult = dbCtx .DbSetFNQ .FromSqlRaw("exec dbo.stp_FNQ_getFilt @IdxMacchina, @gg, @durataMin", IdxMacchina, GG, DurataMin) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// MicroStato macchina (da key) /// /// /// public MicroStatoMacchinaModel MicroStatoMacchina(string idxMacchina) { MicroStatoMacchinaModel dbResult = new MicroStatoMacchinaModel(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetMicroStatoMacc .Where(x => x.IdxMacchina == idxMacchina) .AsNoTracking() .FirstOrDefault(); } return dbResult; } /// /// Stato macchina - tutte /// /// /// public List MicroStatoMacchinaGetAll() { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetMicroStatoMacc .AsNoTracking() .ToList(); } return dbResult; } /// /// Aggiornamento record Microstato macchina /// /// /// public bool MicroStatoMacchinaUpsert(MicroStatoMacchinaModel newRec) { bool fatto = false; using (var dbCtx = new MoonProContext(_configuration)) { var actRec = dbCtx .DbSetMicroStatoMacc .Where(x => x.IdxMacchina == newRec.IdxMacchina) .AsNoTracking() .FirstOrDefault(); if (actRec == null) { dbCtx .DbSetMicroStatoMacc .Add(newRec); } else { actRec.IdxMicroStato = newRec.IdxMicroStato; actRec.InizioStato = newRec.InizioStato; actRec.Value = newRec.Value; dbCtx.Entry(actRec).State = EntityState.Modified; } dbCtx.SaveChanges(); fatto = true; } return fatto; } /// /// Effettua ricalcolo MSE x macchina indicata /// /// idx macchina da confermare /// Num massimo secondi di "vecchiaia" del dato /// public bool RicalcMse(string idxMacchina, int maxAgeSec) { bool answ = false; try { var rigaProd = StatoProdMacchina(idxMacchina, DateTime.Now); using (var dbCtx = new MoonProContext(_configuration)) { var MaxAgeSec = new SqlParameter("@maxAgeSec ", maxAgeSec); var IdxMacchina = new SqlParameter("@idxMacchina", idxMacchina); var result = dbCtx .Database .ExecuteSqlRaw("EXEC stp_MSE_recalc @maxAgeSec, @idxMacchina ", MaxAgeSec, IdxMacchina); // indico eseguito! answ = result > 0; } } catch (Exception exc) { Log.Error($"Eccezione in RicalcMse:{Environment.NewLine}{exc}"); } return answ; } /// /// Intera tabella state machine eventi 2 stati /// /// public List SMES_GetAll() { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetSMES .AsNoTracking() .ToList(); } return dbResult; } /// /// Tabella state machine eventi 2 stati data famiglia /// /// public List SMES_GetByFam(int idxFam) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetSMES .Where(x => x.IdxFamiglia == idxFam) .AsNoTracking() .ToList(); } return dbResult; } /// /// Tabella state machine eventi 2 stati data macchina e tipo evento /// /// /// public List SMES_getHwTransitions(string idxMacchina, int idxTipo) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina); var IdxTipo = new SqlParameter("@IdxTipo", idxTipo); dbResult = dbCtx .DbSetSMES .FromSqlRaw("exec dbo.stp_TS_getByIdxMacchIdxTipoEv @IdxMacchina, @IdxTipo", IdxMacchina, IdxTipo) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// Tabella state machine eventi 2 stati data macchina e tipo evento /// /// /// public List SMES_getUserForced(string idxMacchina, int idxTipo) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina); var IdxTipo = new SqlParameter("@IdxTipo", idxTipo); dbResult = dbCtx .DbSetSMES .FromSqlRaw("exec dbo.stp_TS_getUserForcedTrans @IdxMacchina, @IdxTipo", IdxMacchina, IdxTipo) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL /// /// /// /// public List STAR_byGrpOdl(string codGruppo, int idxODL) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var CodGruppo = new SqlParameter("@CodGruppo", codGruppo); var IdxODL = new SqlParameter("@IdxODL", idxODL); dbResult = dbCtx .DbSetStActRow .FromSqlRaw("exec dbo.stp_ST_AR_getByGrpOdl @CodGruppo, @IdxODL", CodGruppo, IdxODL) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL + label /// /// /// /// /// public List STAR_byGrpOdlLbl(string codGruppo, string label, int idxODL) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var CodGruppo = new SqlParameter("@CodGruppo", codGruppo); var Label = new SqlParameter("@Label", label); var IdxODL = new SqlParameter("@IdxODL", idxODL); dbResult = dbCtx .DbSetStActRow .FromSqlRaw("exec dbo.stp_ST_AR_getGrpOdlLabel @CodGruppo, @Label, @IdxODL", CodGruppo, Label, IdxODL) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// Intera tabella state machine ingressi 2 eventi data famiglia /// /// /// public List StateMachineIngressi(int idxFam) { List dbResult = new List(); using (var dbCtx = new MoonProContext(_configuration)) { var IdxFamIn = new SqlParameter("@IdxFamigliaIngresso", idxFam); dbResult = dbCtx .DbSetSMI .FromSqlRaw("exec dbo.stp_TRI_getByIdxFamIng @IdxFamigliaIngresso", IdxFamIn) .AsNoTracking() .AsEnumerable() .ToList(); } return dbResult; } /// /// Stato macchina (da key) /// /// /// public StatoMacchineModel StatoMacchina(string idxMacchina) { StatoMacchineModel dbResult = new StatoMacchineModel(); using (var dbCtx = new MoonProContext(_configuration)) { dbResult = dbCtx .DbSetStatoMacc .Where(x => x.IdxMacchina == idxMacchina) .AsNoTracking() .FirstOrDefault(); } return dbResult; } /// /// Stato prod macchina (completo) /// /// /// /// public StatoProdModel StatoProdMacchina(string idxMacchina, DateTime dtReq) { StatoProdModel dbResult = new StatoProdModel(); using (var dbCtx = new MoonProContext(_configuration)) { var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina); var DataOra = new SqlParameter("@DataOra ", dtReq); var rawData = dbCtx .DbSetStatoProd .FromSqlRaw("EXEC stp_StatoProd_getByMacchina @IdxMacchina, @DataOra ", IdxMacchina, DataOra) .AsNoTracking() .AsEnumerable() .ToList(); dbResult = rawData .FirstOrDefault(); } return dbResult; } #endregion Public Methods #region Private Fields private static IConfiguration _configuration; private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields } }