portato avanti gestione metodi insert batch

This commit is contained in:
Samuele Locatelli
2023-10-06 17:50:18 +02:00
parent 6653249613
commit 9c8c606636
12 changed files with 949 additions and 734 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<Version>6.16.2310.615</Version>
<Version>6.16.2310.617</Version>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP_TAB_SERV</RootNamespace>
</PropertyGroup>
+1 -1
View File
@@ -58,7 +58,7 @@ namespace MP_TAB_SERV.Pages
if (insRealtime)
{
// se realtime
TabServ.scriviRigaEventoBarcode(IdxMacc, IdxEv, rigaStato.CodArticolo, "DRT", MatrOpr, rigaStato.pallet);
await TabServ.scriviRigaEventoBarcode(IdxMacc, IdxEv, rigaStato.CodArticolo, "DRT", MatrOpr, rigaStato.pallet);
// resetta il microstato in modo da ricevere successive info HW
TabServ.resetMicrostatoMacchina(IdxMacc);
}
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2310.615</h4>
<h4>Versione: 6.16.2310.617</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2310.615
6.16.2310.617
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2310.615</version>
<version>6.16.2310.617</version>
<url>https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/MP-TAB-SERV.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+1 -1
View File
@@ -300,7 +300,7 @@ namespace MP.Data.Controllers
}
/// <summary>
/// Intera tabella relazione master/slave in machine (gestione setup master --&gt; slave)
/// Intera tabella state machine ingressi 2 eventi
/// </summary>
/// <returns></returns>
public List<TransizioneIngressiModel> StateMachineIngressi(int idxFam)
+452 -213
View File
@@ -7,6 +7,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static MP.Data.Objects.Enums;
namespace MP.Data.Controllers
{
@@ -24,6 +25,23 @@ namespace MP.Data.Controllers
#region Public Methods
/// <summary>
/// Restituisce l'anagrafica EVENTI per intero
/// </summary>
/// <returns></returns>
public List<AnagEventiModel> AnagEventiGetAll()
{
List<AnagEventiModel> dbResult = new List<AnagEventiModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetAnagEventi
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Restituisce l'anagrafica EVENTI per intero
/// </summary>
@@ -44,22 +62,7 @@ namespace MP.Data.Controllers
}
return dbResult;
}
/// <summary>
/// Restituisce l'anagrafica EVENTI per intero
/// </summary>
/// <returns></returns>
public List<AnagEventiModel> AnagEventiGetAll()
{
List<AnagEventiModel> dbResult = new List<AnagEventiModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetAnagEventi
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Restituisce l'anagrafica STATI per intero
/// </summary>
@@ -77,6 +80,98 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma
/// --&gt; dtEvent)
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="modoConfProd">0=periodo, 1 = giorno, 2 = turno</param>
/// <param name="numPzConfermati">qta pezzi BUONI da confermare</param>
/// <param name="numPzScarto">qta pezzi SCARTO da confermare</param>
/// <param name="DataOraApp">DataOra in cui registrare approvazione</param>
/// <param name="MatrOpr">Matricola operatore</param>
/// <returns></returns>
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;
}
/// <summary>
/// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma
/// --&gt; dtEvent)
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="modoConfProd">0=periodo, 1 = giorno, 2 = turno</param>
/// <param name="numPzConfermati">qta pezzi BUONI da confermare</param>
/// <param name="numPzLasciati">
/// qta pezzi LASCIATI alla macchina da confermare (2 eventi 121 rettifica neg/pos)
/// </param>
/// <param name="numPzScarto">qta pezzi SCARTO da confermare</param>
/// <param name="DataOraApp">DataOra in cui registrare approvazione</param>
/// <param name="MatrOpr">Matricola operatore</param>
/// <returns></returns>
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;
}
/// <summary>
/// Elenco da tabella Config
/// </summary>
@@ -100,6 +195,215 @@ namespace MP.Data.Controllers
_configuration = null;
}
/// <summary>
/// Aggiunta record EventList
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public async Task<bool> 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;
}
/// <summary>
/// MicroStato macchina (da key)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Stato macchina - tutte
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
public List<MicroStatoMacchinaModel> MicroStatoMacchinaGetAll()
{
List<MicroStatoMacchinaModel> dbResult = new List<MicroStatoMacchinaModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetMicroStatoMacc
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Aggiornamento record Microstato macchina
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Effettua ricalcolo MSE x macchina indicata
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="maxAgeSec">Num massimo secondi di "vecchiaia" del dato</param>
/// <returns></returns>
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;
}
/// <summary>
/// Intera tabella state machine eventi 2 stati
/// </summary>
/// <returns></returns>
public List<TransizioneStatiModel> SMES_GetAll()
{
List<TransizioneStatiModel> dbResult = new List<TransizioneStatiModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetSMES
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Tabella state machine eventi 2 stati data famiglia
/// </summary>
/// <returns></returns>
public List<TransizioneStatiModel> SMES_GetByFam(int idxFam)
{
List<TransizioneStatiModel> dbResult = new List<TransizioneStatiModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetSMES
.Where(x => x.IdxFamiglia == idxFam)
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Tabella state machine eventi 2 stati data macchina e tipo evento
/// </summary>
/// <param name="idxTipo"></param>
/// <returns></returns>
public List<TransizioneStatiModel> SMES_getUserForced(string idxMacchina, int idxTipo)
{
List<TransizioneStatiModel> dbResult = new List<TransizioneStatiModel>();
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;
}
/// <summary>
/// Tabella state machine eventi 2 stati data macchina e tipo evento
/// </summary>
/// <param name="idxTipo"></param>
/// <returns></returns>
public List<TransizioneStatiModel> SMES_getHwTransitions(string idxMacchina, int idxTipo)
{
List<TransizioneStatiModel> dbResult = new List<TransizioneStatiModel>();
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;
}
/// <summary>
/// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL
/// </summary>
@@ -150,6 +454,46 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Intera tabella state machine ingressi 2 eventi data famiglia
/// </summary>
/// <param name="idxFam"></param>
/// <returns></returns>
public List<TransizioneIngressiModel> StateMachineIngressi(int idxFam)
{
List<TransizioneIngressiModel> dbResult = new List<TransizioneIngressiModel>();
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;
}
/// <summary>
/// Stato macchina (da key)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Stato prod macchina (completo)
/// </summary>
@@ -175,220 +519,115 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Stato macchina (da key)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
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;
}
/// <summary>
/// MicroStato macchina (da key)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Stato macchina - tutte
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
public List<MicroStatoMacchinaModel> MicroStatoMacchinaGetAll()
{
List<MicroStatoMacchinaModel> dbResult = new List<MicroStatoMacchinaModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetMicroStatoMacc
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Aggiornamento record Microstato macchina
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public bool MicroStatoMacchinaUpsert(MicroStatoMacchinaModel newRec)
#endregion Public Methods
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 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;
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);
dbCtx.Entry(actRec).State = EntityState.Modified;
}
dbCtx.SaveChanges();
fatto = true;
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;
}
/// <summary>
/// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma
/// --&gt; dtEvent)
/// Verifica se sia necessario inserire un cambio di stato impianto in modalità batch
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="modoConfProd">0=periodo, 1 = giorno, 2 = turno</param>
/// <param name="numPzConfermati">qta pezzi BUONI da confermare</param>
/// <param name="numPzLasciati">
/// qta pezzi LASCIATI alla macchina da confermare (2 eventi 121 rettifica neg/pos)
/// </param>
/// <param name="numPzScarto">qta pezzi SCARTO da confermare</param>
/// <param name="DataOraApp">DataOra in cui registrare approvazione</param>
/// <param name="MatrOpr">Matricola operatore</param>
/// <returns></returns>
public bool ConfermaProdMacchinaFull(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzLasciati, int numPzScarto, DateTime DataOraApp, int MatrOpr)
/// <param name="tipoInput"></param>
/// <param name="IdxMacchina"></param>
/// <param name="InizioStato"></param>
/// <param name="IdxTipo"></param>
/// <param name="CodArt"></param>
/// <param name="Value"></param>
/// <param name="MatrOpr"></param>
/// <param name="pallet"></param>
public void CheckCambiaStatoBatch(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet)
{
bool answ = false;
try
List<TransizioneStatiModel> tabTransStati = new List<TransizioneStatiModel>();
TransizioneStatiModel rigaTransStati = new TransizioneStatiModel();
switch (tipoInput)
{
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);
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;
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;
}
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;
}
catch (Exception exc)
{
Log.Error($"Eccezione in ConfermaProdMacchinaFull con rett ev121:{Environment.NewLine}{exc}");
}
return answ;
}
/// <summary>
/// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma
/// --&gt; dtEvent)
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="modoConfProd">0=periodo, 1 = giorno, 2 = turno</param>
/// <param name="numPzConfermati">qta pezzi BUONI da confermare</param>
/// <param name="numPzScarto">qta pezzi SCARTO da confermare</param>
/// <param name="DataOraApp">DataOra in cui registrare approvazione</param>
/// <param name="MatrOpr">Matricola operatore</param>
/// <returns></returns>
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;
}
/// <summary>
/// Effettua ricalcolo MSE x macchina indicata
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="maxAgeSec">Num massimo secondi di "vecchiaia" del dato</param>
/// <returns></returns>
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;
}
#endregion Public Methods
#region Private Fields
private static IConfiguration _configuration;
@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels
{
[Table("DiarioDiBordo")]
public partial class DiarioDiBordoModel
{
#region Public Properties
[MaxLength(50)]
public string IdxMacchina { get; set; } = "NA";
public DateTime InizioStato { get; set; } = DateTime.Now;
public DateTime? FineStato { get; set; } = DateTime.Now;
public int IdxStato { get; set; } = 0;
public float DurataMinuti { get; set; } = 0;
[MaxLength(50)]
public string Value { get; set; } = "";
[MaxLength(50)]
public string CodArticolo { get; set; } = "";
public float TempoCicloBase { get; set; } = 0;
public int PzPalletProd { get; set; } = 0;
public int MatrOpr { get; set; } = 0;
[MaxLength(20)]
public string pallet { get; set; } = "";
/// <summary>
/// Navigazione oggetto Machine
/// </summary>
[ForeignKey("IdxMacchina")]
public virtual Macchine MachineNav { get; set; } = null!;
/// <summary>
/// Navigazione oggetto Articolo
/// </summary>
[ForeignKey("CodArticolo")]
public virtual AnagArticoli ArticoloNav { get; set; } = null!;
#endregion Public Properties
}
}
@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace MP.Data.DatabaseModels
{
[Table("TransizioneIngressi")]
public partial class TransizioneIngressiModel
{
public int IdxFamigliaIngresso { get; set; }
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace MP.Data.DatabaseModels
{
[Table("TransizioneStati")]
public partial class TransizioneStatiModel
{
public int IdxFamiglia { get; set; } = 0;
public int IdxStato { get; set; } = 0;
public int IdxTipo { get; set; } = 0;
public int next_IdxStato { get; set; } = 0;
}
}
+13
View File
@@ -55,6 +55,7 @@ namespace MP.Data
public virtual DbSet<StatODLModel> DbSetStatOdl { get; set; }
public virtual DbSet<PzProdModel> DbSetPzProd { get; set; }
public virtual DbSet<EventListModel> DbSetEvList { get; set; }
public virtual DbSet<DiarioDiBordoModel> DbSetDDB { get; set; }
public virtual DbSet<VocabolarioModel> DbSetVocabolario { get; set; }
public virtual DbSet<AnagOperatoriModel> DbOperatori { get; set; }
public virtual DbSet<Gruppi2OperModel> DbSetGrp2Oper { get; set; }
@@ -63,6 +64,7 @@ namespace MP.Data
public virtual DbSet<VMSFDModel> DbSetMSFD { get; set; }
public virtual DbSet<Macchine2SlaveModel> DbSetM2S { get; set; }
public virtual DbSet<TransizioneIngressiModel> DbSetSMI { get; set; }
public virtual DbSet<TransizioneStatiModel> DbSetSMES { get; set; }
public virtual DbSet<KeepAliveModel> DbSetKeepAlive { get; set; }
public virtual DbSet<MicroStatoMacchinaModel> DbSetMicroStatoMacc { get; set; }
public virtual DbSet<StatoMacchineModel> DbSetStatoMacc { get; set; }
@@ -331,6 +333,11 @@ namespace MP.Data
{
entity.HasKey(e => new { e.IdxMacchina, e.InizioStato, e.IdxTipo });
});
modelBuilder.Entity<DiarioDiBordoModel>(entity =>
{
entity.HasKey(e => new { e.IdxMacchina, e.InizioStato });
});
modelBuilder.Entity<VocabolarioModel>(entity =>
{
@@ -505,6 +512,12 @@ namespace MP.Data
});
modelBuilder.Entity<TransizioneStatiModel>(entity =>
{
entity.HasKey(e => new { e.IdxFamiglia, e.IdxStato, e.IdxTipo });
});
OnModelCreatingPartial(modelBuilder);
}
+414 -515
View File
@@ -1,6 +1,6 @@
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using MP.Data.DatabaseModels;
using MP.Data.DTO;
using MP.Data.Objects;
using Newtonsoft.Json;
using NLog;
@@ -18,6 +18,10 @@ namespace MP.Data.Services
{
#region Public Constructors
/// <summary>
/// Init servizio TAB
/// </summary>
/// <param name="configuration"></param>
public TabDataService(IConfiguration configuration)
{
_configuration = configuration;
@@ -54,42 +58,14 @@ namespace MP.Data.Services
}
}
}
// sistemo
// sistemo
DataSource = connStrParams["Server"];
DataBase = connStrParams["Database"];
}
}
private Dictionary<string, string> connStrParams = new Dictionary<string, string>();
private string ConnStr = "";
private string CodModulo = "";
private string DataSource = "";
private string DataBase = "";
private string redHash(string keyName)
{
string result = keyName;
try
{
result = $"{CodModulo}:{DataSource}:{DataBase}:{keyName}".Replace("\\", "_");
}
catch (Exception exc)
{
Log.Error($"Errore in redHash{Environment.NewLine}{exc}");
}
return result;
}
#endregion Public Constructors
#region Public Properties
private static Controllers.MpIocController dbIocController { get; set; } = null!;
private static Controllers.MpTabController dbTabController { get; set; } = null!;
#endregion Public Properties
#region Public Methods
/// <summary>
@@ -128,6 +104,7 @@ namespace MP.Data.Services
Log.Debug($"AnagEventiGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Elenco EVENTI validi x macchina
/// </summary>
@@ -275,8 +252,17 @@ namespace MP.Data.Services
return result;
}
public void Dispose()
{
// Clear database controller
dbTabController.Dispose();
dbIocController.Dispose();
}
/// <summary>
/// Recupero info IOB x TAB (da info registrate IOB-WIN--> MP-IO)
/// </summary>
/// <param name="IdxMacchina"></param>
/// <returns></returns>
public async Task<IOB_data> IobInfo(string IdxMacchina)
{
string source = "DB";
@@ -300,487 +286,6 @@ namespace MP.Data.Services
return result;
}
public void Dispose()
{
// Clear database controller
dbTabController.Dispose();
}
/// <summary>
/// Effettua ricalcolo MSE x macchina indicata
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="maxAgeSec">Num massimo secondi di "vecchiaia" del dato</param>
/// <returns></returns>
public bool RicalcMse(string idxMacchina, int maxAgeSec)
{
bool answ = false;
answ = dbTabController.RicalcMse(idxMacchina, maxAgeSec);
return answ;
}
/// <summary>
/// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL
/// </summary>
/// <param name="codGruppo"></param>
/// <param name="idxODL"></param>
/// <returns></returns>
public async Task<List<ST_ActRow>> STAR_byGrpOdl(string codGruppo, int idxODL)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<ST_ActRow>? result = new List<ST_ActRow>();
// cerco in redis...
string currKey = $"{redisBaseKey}:START:{codGruppo}:{idxODL}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<ST_ActRow>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.STAR_byGrpOdl(codGruppo, idxODL);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, LongCache);
}
if (result == null)
{
result = new List<ST_ActRow>();
}
sw.Stop();
Log.Debug($"STAR_byGrpOdl | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL
/// </summary>
/// <param name="codGruppo"></param>
/// <param name="label"></param>
/// <param name="idxODL"></param>
/// <returns></returns>
public async Task<List<ST_ActRow>> STAR_byGrpOdlLbl(string codGruppo, string label, int idxODL)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<ST_ActRow>? result = new List<ST_ActRow>();
// cerco in redis...
string currKey = $"{redisBaseKey}:START:{codGruppo}:{label}:{idxODL}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<ST_ActRow>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.STAR_byGrpOdlLbl(codGruppo, label, idxODL);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, LongCache);
}
if (result == null)
{
result = new List<ST_ActRow>();
}
sw.Stop();
Log.Debug($"STAR_byGrpOdlLbl | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Stato prod macchina (completo)
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dtReq"></param>
/// <returns></returns>
public async Task<StatoProdModel> StatoProdMacchina(string idxMacchina, DateTime dtReq)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
StatoProdModel? result = new StatoProdModel();
// cerco in redis...
string currKey = $"{redisBaseKey}:StatoProd:{idxMacchina}:{dtReq:HHmmss}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<StatoProdModel>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.StatoProdMacchina(idxMacchina, dtReq);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraFastCache);
}
if (result == null)
{
result = new StatoProdModel();
}
sw.Stop();
Log.Debug($"StatoProdMacchina | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Stato macchina
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
public async Task<StatoMacchineModel> StatoMacchina(string idxMacchina)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
StatoMacchineModel? result = new StatoMacchineModel();
// cerco in redis...
string currKey = $"{redisBaseKey}:StatoMacc:{idxMacchina}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<StatoMacchineModel>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.StatoMacchina(idxMacchina);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(2));
}
if (result == null)
{
result = new StatoMacchineModel();
}
sw.Stop();
Log.Debug($"StatoMacchina | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Intera vista v_MSFD
/// </summary>
/// <returns></returns>
public async Task<List<VMSFDModel>> VMSFDGetAll()
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<VMSFDModel> result = new List<VMSFDModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:MSFD:ALL";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<VMSFDModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbIocController.VMSFDGetAll();
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
if (result == null)
{
result = new List<VMSFDModel>();
}
sw.Stop();
Log.Debug($"VMSFDGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Vista v_MSFD x singola macchina (da stored) - singolo record
/// </summary>
/// <param name="idxMacc"></param>
/// <returns></returns>
public async Task<List<VMSFDModel>> VMSFDGetByMacc(string idxMacc)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<VMSFDModel>? result = new List<VMSFDModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:MSFD:MACCH:{idxMacc}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<VMSFDModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbIocController.VMSFDGetByMacc(idxMacc);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraFastCache);
}
if (result == null)
{
result = new List<VMSFDModel>();
}
sw.Stop();
Log.Debug($"VMSFDGetByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Vista v_MSFD delle machine MULTI filtrato x macchina (da stored)
/// </summary>
/// <param name="idxMacc"></param>
/// <returns></returns>
public async Task<List<VMSFDModel>> VMSFDGetMultiByMacc(string idxMacc)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<VMSFDModel>? result = new List<VMSFDModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:MSFD:MULTI:{idxMacc}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<VMSFDModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbIocController.VMSFDGetByMacc(idxMacc);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
if (result == null)
{
result = new List<VMSFDModel>();
}
sw.Stop();
Log.Debug($"VMSFDGetMultiByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
#endregion Public Methods
#region Protected Fields
/// <summary>
/// Oggetto per connessione a REDIS
/// </summary>
protected ConnectionMultiplexer redisConn = null!;
/// <summary>
/// Oggetto DB redis da impiegare x chiamate R/W
/// </summary>
protected IDatabase redisDb = null!;
#endregion Protected Fields
#region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger();
private string redisBaseKey = "MP:TAB:Cache";
private string moonProRedisBaseKey = "MoonPro:SQL2016DEV:MoonPro:hM2IOB";
#endregion Private Fields
/// <summary>
/// Aggiunta record EventList
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public async Task<bool> 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;
}
/// <summary>
/// scrive una riga di evento inviato da Barcode nel db
/// </summary>
/// <param name="idxMacchina">codice macchina</param>
/// <param name="idxTipo">idx evento</param>
/// <param name="codArticolo">Codice Articolo</param>
/// <param name="value">valore</param>
/// <param name="matrOpr">matricola operatore</param>
/// <param name="pallet">pallet (vuoto se nd)</param>
/// <returns></returns>
public async Task<inputComandoMapo> scriviRigaEventoBarcode(string idxMacchina, int idxTipo, string codArticolo, string value, int matrOpr, string pallet)
{
bool inserito = false;
DateTime adesso = DateTime.Now;
EventListModel newRec = new EventListModel()
{
IdxMacchina = idxMacchina,
InizioStato = adesso,
IdxTipo = idxTipo,
CodArticolo = codArticolo,
Value = value,
MatrOpr = matrOpr,
pallet = pallet
};
try
{
// inserisco evento
inserito = await EvListInsert(newRec);
}
catch (Exception exc)
{
string logMsg = $"Eccezione in fase di scrittura evento con i seguenti dati | macchina: {idxMacchina} | IdxTipo: {idxTipo} | CodArticolo: {codArticolo} | Value {value} | MatrOpr {matrOpr} | Pallet {pallet}{Environment.NewLine}{exc}";
Log.Error(logMsg);
}
try
{
// faccio controllo per eventuale cambio stato da tab transizioni...
checkCambiaStatoBatch(tipoInputEvento.barcode, idxMacchina, adesso, idxTipo, codArticolo, value, matrOpr, pallet);
}
catch (Exception exc)
{
string logMsg = $"Eccezione in checkCambiaStatoBatch(6) | tipoInputEvento: {tipoInputEvento.barcode} | macchina: {idxMacchina} | dataOra: {adesso} | IdxTipo: {idxTipo} | CodArticolo: {codArticolo} | Value {value} | MatrOpr {matrOpr} | Pallet {pallet}{Environment.NewLine}{exc}";
Log.Error(logMsg);
}
// formatto output
inputComandoMapo answ = new inputComandoMapo();
answ.outValue = inserito.ToString();
answ.needStatusRefresh = true;
return answ;
}
/// <summary>
/// Verifica se sia necessario inserire un cambio di stato impianto in modalità batch
/// </summary>
/// <param name="tipoInput"></param>
/// <param name="IdxMacchina"></param>
/// <param name="InizioStato"></param>
/// <param name="IdxTipo"></param>
/// <param name="CodArt"></param>
/// <param name="Value"></param>
/// <param name="MatrOpr"></param>
/// <param name="pallet"></param>
private void checkCambiaStatoBatch(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet)
{
#if false
DS_applicazione.TransizioneStatiDataTable tabTransStati;
DS_applicazione.TransizioneStatiRow rigaTransStati;
switch (tipoInput)
{
case tipoInputEvento.barcode:
// effettuo cambio stato INDIPENDENTEMENTE da stato precedente
try
{
tabTransStati = MapoDbObj.taTranSt.GetUserForcedTransitions(IdxMacchina, IdxTipo);
if (tabTransStati != null)
{
if (tabTransStati.Count > 0)
{
rigaTransStati = tabTransStati[0];
// solo se cambia stato...
if (rigaTransStati.IdxStato != rigaTransStati.next_IdxStato)
{
MapoDbObj.taDiario.InsStatoBatch(IdxMacchina, InizioStato, rigaTransStati.next_IdxStato, CodArt, Value, MatrOpr, pallet);
// aggiorno MSE
taMSE.forceRecalc(0, IdxMacchina);
}
}
else
{
if (_logLevel > 6)
{
Log.Info($"Non trovata riga per: BARCODE | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}", tipoLog.INFO);
}
}
}
}
catch (Exception exc)
{
// non dovrebbe succedere... input utente da barcode dovrebbero TUTTI essere
// inseriti in tab transizione con famiglia 1...
Log.Info($"Errore controllo transizione stato x evento barcode: BARCODE | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
}
break;
case tipoInputEvento.hw:
// verifico se ci sia necessità di cambio stato
try
{
tabTransStati = MapoDbObj.taTranSt.GetHwTransitions(IdxMacchina, IdxTipo);
if (tabTransStati != null)
{
if (tabTransStati.Count > 0)
{
rigaTransStati = tabTransStati[0];
if (rigaTransStati != null)
{
// solo se cambia stato...
if (rigaTransStati.IdxStato != rigaTransStati.next_IdxStato)
{
MapoDbObj.taDiario.InsStatoBatch(IdxMacchina, InizioStato, rigaTransStati.next_IdxStato, CodArt, Value, MatrOpr, pallet);
}
}
}
else
{
if (_logLevel > 6)
{
Log.Info($"Non trovata riga per: HW | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}", tipoLog.INFO);
}
}
}
}
catch (Exception exc)
{
// non trovo riga [0]... NON scrivo!
Log.Info($"Errore controllo transizione stato x evento barcode: HW | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
}
break;
}
#endif
}
/// <summary>
/// Effettua reset microstato macchina
/// </summary>
/// <param name="idxMacchina"></param>
public void resetMicrostatoMacchina(string idxMacchina)
{
// salvo microstato 0...
MicroStatoMacchinaModel newRecMS = new MicroStatoMacchinaModel()
{
IdxMacchina = idxMacchina,
InizioStato = DateTime.Now,
IdxMicroStato = 0,
Value = "FER"
};
var result = dbTabController.MicroStatoMacchinaUpsert(newRecMS);
// reset in redis
resetDatiMacchina(idxMacchina);
}
/// <summary>
/// Resetta (rileggendo) i dati della macchina
/// </summary>
@@ -878,9 +383,403 @@ namespace MP.Data.Services
else
{
Log.Info("Errore in chiamata stp_MSFD_getMacc (connDb.taMSFD.getByIdxMacc(idxMacchina))");
}
}
#endif
return answ;
}
/// <summary>
/// Effettua reset microstato macchina
/// </summary>
/// <param name="idxMacchina"></param>
public void resetMicrostatoMacchina(string idxMacchina)
{
// salvo microstato 0...
MicroStatoMacchinaModel newRecMS = new MicroStatoMacchinaModel()
{
IdxMacchina = idxMacchina,
InizioStato = DateTime.Now,
IdxMicroStato = 0,
Value = "FER"
};
var result = dbTabController.MicroStatoMacchinaUpsert(newRecMS);
// reset in redis
resetDatiMacchina(idxMacchina);
}
/// <summary>
/// Effettua ricalcolo MSE x macchina indicata
/// </summary>
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="maxAgeSec">Num massimo secondi di "vecchiaia" del dato</param>
/// <returns></returns>
public bool RicalcMse(string idxMacchina, int maxAgeSec)
{
bool answ = false;
answ = dbTabController.RicalcMse(idxMacchina, maxAgeSec);
return answ;
}
/// <summary>
/// scrive una riga di evento inviato da Barcode nel db
/// </summary>
/// <param name="idxMacchina">codice macchina</param>
/// <param name="idxTipo">idx evento</param>
/// <param name="codArticolo">Codice Articolo</param>
/// <param name="value">valore</param>
/// <param name="matrOpr">matricola operatore</param>
/// <param name="pallet">pallet (vuoto se nd)</param>
/// <returns></returns>
public async Task<inputComandoMapo> scriviRigaEventoBarcode(string idxMacchina, int idxTipo, string codArticolo, string value, int matrOpr, string pallet)
{
bool inserito = false;
DateTime adesso = DateTime.Now;
EventListModel newRec = new EventListModel()
{
IdxMacchina = idxMacchina,
InizioStato = adesso,
IdxTipo = idxTipo,
CodArticolo = codArticolo,
Value = value,
MatrOpr = matrOpr,
pallet = pallet
};
try
{
// inserisco evento
inserito = await dbTabController.EvListInsert(newRec);
}
catch (Exception exc)
{
string logMsg = $"Eccezione in fase di scrittura evento con i seguenti dati | macchina: {idxMacchina} | IdxTipo: {idxTipo} | CodArticolo: {codArticolo} | Value {value} | MatrOpr {matrOpr} | Pallet {pallet}{Environment.NewLine}{exc}";
Log.Error(logMsg);
}
try
{
// faccio controllo per eventuale cambio stato da tab transizioni...
dbTabController.CheckCambiaStatoBatch(tipoInputEvento.barcode, idxMacchina, adesso, idxTipo, codArticolo, value, matrOpr, pallet);
}
catch (Exception exc)
{
string logMsg = $"Eccezione in checkCambiaStatoBatch(6) | tipoInputEvento: {tipoInputEvento.barcode} | macchina: {idxMacchina} | dataOra: {adesso} | IdxTipo: {idxTipo} | CodArticolo: {codArticolo} | Value {value} | MatrOpr {matrOpr} | Pallet {pallet}{Environment.NewLine}{exc}";
Log.Error(logMsg);
}
// formatto output
inputComandoMapo answ = new inputComandoMapo();
answ.outValue = inserito.ToString();
answ.needStatusRefresh = true;
return answ;
}
/// <summary>
/// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL
/// </summary>
/// <param name="codGruppo"></param>
/// <param name="idxODL"></param>
/// <returns></returns>
public async Task<List<ST_ActRow>> STAR_byGrpOdl(string codGruppo, int idxODL)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<ST_ActRow>? result = new List<ST_ActRow>();
// cerco in redis...
string currKey = $"{redisBaseKey}:START:{codGruppo}:{idxODL}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<ST_ActRow>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.STAR_byGrpOdl(codGruppo, idxODL);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, LongCache);
}
if (result == null)
{
result = new List<ST_ActRow>();
}
sw.Stop();
Log.Debug($"STAR_byGrpOdl | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL
/// </summary>
/// <param name="codGruppo"></param>
/// <param name="label"></param>
/// <param name="idxODL"></param>
/// <returns></returns>
public async Task<List<ST_ActRow>> STAR_byGrpOdlLbl(string codGruppo, string label, int idxODL)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<ST_ActRow>? result = new List<ST_ActRow>();
// cerco in redis...
string currKey = $"{redisBaseKey}:START:{codGruppo}:{label}:{idxODL}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<ST_ActRow>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.STAR_byGrpOdlLbl(codGruppo, label, idxODL);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, LongCache);
}
if (result == null)
{
result = new List<ST_ActRow>();
}
sw.Stop();
Log.Debug($"STAR_byGrpOdlLbl | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Stato macchina
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
public async Task<StatoMacchineModel> StatoMacchina(string idxMacchina)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
StatoMacchineModel? result = new StatoMacchineModel();
// cerco in redis...
string currKey = $"{redisBaseKey}:StatoMacc:{idxMacchina}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<StatoMacchineModel>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.StatoMacchina(idxMacchina);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(2));
}
if (result == null)
{
result = new StatoMacchineModel();
}
sw.Stop();
Log.Debug($"StatoMacchina | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Stato prod macchina (completo)
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dtReq"></param>
/// <returns></returns>
public async Task<StatoProdModel> StatoProdMacchina(string idxMacchina, DateTime dtReq)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
StatoProdModel? result = new StatoProdModel();
// cerco in redis...
string currKey = $"{redisBaseKey}:StatoProd:{idxMacchina}:{dtReq:HHmmss}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<StatoProdModel>($"{rawData}");
source = "REDIS";
}
else
{
result = dbTabController.StatoProdMacchina(idxMacchina, dtReq);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraFastCache);
}
if (result == null)
{
result = new StatoProdModel();
}
sw.Stop();
Log.Debug($"StatoProdMacchina | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Intera vista v_MSFD
/// </summary>
/// <returns></returns>
public async Task<List<VMSFDModel>> VMSFDGetAll()
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<VMSFDModel> result = new List<VMSFDModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:MSFD:ALL";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<VMSFDModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbIocController.VMSFDGetAll();
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
if (result == null)
{
result = new List<VMSFDModel>();
}
sw.Stop();
Log.Debug($"VMSFDGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Vista v_MSFD x singola macchina (da stored) - singolo record
/// </summary>
/// <param name="idxMacc"></param>
/// <returns></returns>
public async Task<List<VMSFDModel>> VMSFDGetByMacc(string idxMacc)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<VMSFDModel>? result = new List<VMSFDModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:MSFD:MACCH:{idxMacc}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<VMSFDModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbIocController.VMSFDGetByMacc(idxMacc);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraFastCache);
}
if (result == null)
{
result = new List<VMSFDModel>();
}
sw.Stop();
Log.Debug($"VMSFDGetByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Vista v_MSFD delle machine MULTI filtrato x macchina (da stored)
/// </summary>
/// <param name="idxMacc"></param>
/// <returns></returns>
public async Task<List<VMSFDModel>> VMSFDGetMultiByMacc(string idxMacc)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<VMSFDModel>? result = new List<VMSFDModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:MSFD:MULTI:{idxMacc}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<VMSFDModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbIocController.VMSFDGetByMacc(idxMacc);
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
if (result == null)
{
result = new List<VMSFDModel>();
}
sw.Stop();
Log.Debug($"VMSFDGetMultiByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
#endregion Public Methods
#region Protected Fields
/// <summary>
/// Oggetto per connessione a REDIS
/// </summary>
protected ConnectionMultiplexer redisConn = null!;
/// <summary>
/// Oggetto DB redis da impiegare x chiamate R/W
/// </summary>
protected IDatabase redisDb = null!;
#endregion Protected Fields
#region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger();
private string CodModulo = "";
private string ConnStr = "";
private Dictionary<string, string> connStrParams = new Dictionary<string, string>();
private string DataBase = "";
private string DataSource = "";
private string redisBaseKey = "MP:TAB:Cache";
#endregion Private Fields
#region Private Properties
private static Controllers.MpIocController dbIocController { get; set; } = null!;
private static Controllers.MpTabController dbTabController { get; set; } = null!;
#endregion Private Properties
#region Private Methods
private string redHash(string keyName)
{
string result = keyName;
try
{
result = $"{CodModulo}:{DataSource}:{DataBase}:{keyName}".Replace("\\", "_");
}
catch (Exception exc)
{
Log.Error($"Errore in redHash{Environment.NewLine}{exc}");
}
return result;
}
#endregion Private Methods
}
}