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
}
}