modifica call checkCambbiaStato in ASYNC

This commit is contained in:
Samuele Locatelli
2026-04-18 12:31:04 +02:00
parent 950c2ed87b
commit d91f224179
6 changed files with 134 additions and 112 deletions
+107
View File
@@ -364,6 +364,40 @@ namespace MP.Data.Controllers
return fatto;
}
/// <summary>
/// Inserimento record in DDB
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="inizioStato"></param>
/// <param name="idxStato"></param>
/// <param name="codArt"></param>
/// <param name="value"></param>
/// <param name="matrOpr"></param>
/// <param name="pallet"></param>
/// <returns></returns>
public async Task<bool> DDB_InsStatoBatchAsync(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 = await dbCtx
.Database
.ExecuteSqlRawAsync("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>
/// Elenco tabella decodifica articoli / codice decimale
/// </summary>
@@ -1227,6 +1261,37 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Elenco ODL data macchina e periodo
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dtStart"></param>
/// <param name="dtEnd"></param>
/// <returns></returns>
public async Task<List<ODLExpModel>> OdlListByMaccPeriodoAsync(string idxMacchina, DateTime dtStart, DateTime dtEnd)
{
List<ODLExpModel> dbResult = new List<ODLExpModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
try
{
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
var DataFrom = new SqlParameter("@dataFrom", dtStart);
var DataTo = new SqlParameter("@dataTo", dtEnd);
dbResult = await dbCtx
.DbSetODLExp
.FromSqlRaw("EXEC stp_ODL_getByMacchinaPeriodo @IdxMacchina, @dataFrom, @dataTo", IdxMacchina, DataFrom, DataTo)
.AsNoTracking()
.ToListAsync();
}
catch (Exception exc)
{
Log.Error($"Eccezione durante OdlListByMaccPeriodoAsync{Environment.NewLine}{exc}");
}
}
return dbResult;
}
/// <summary>
/// Conteggio PzProd Macchina
/// </summary>
@@ -1634,6 +1699,26 @@ namespace MP.Data.Controllers
}
return dbResult;
}
/// <summary>
/// Tabella state machine eventi 2 stati data macchina e tipo evento
/// </summary>
/// <param name="idxTipo"></param>
/// <returns></returns>
public async Task<List<TransizioneStatiModel>> SMES_getHwTransitionsAsync(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 = await dbCtx
.DbSetSMES
.FromSqlRaw("exec dbo.stp_TS_getByIdxMacchIdxTipoEv @IdxMacchina, @IdxTipo", IdxMacchina, IdxTipo)
.AsNoTracking()
.ToListAsync();
}
return dbResult;
}
/// <summary>
/// Tabella state machine eventi 2 stati data macchina e tipo evento
@@ -1657,6 +1742,28 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Tabella state machine eventi 2 stati data macchina e tipo evento
/// </summary>
/// <param name="idxTipo"></param>
/// <returns></returns>
public async Task<List<TransizioneStatiModel>> SMES_getUserForcedAsync(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 = await dbCtx
.DbSetSMES
.FromSqlRaw("exec dbo.stp_TS_getUserForcedTrans @IdxMacchina, @IdxTipo", IdxMacchina, IdxTipo)
.AsNoTracking()
//.AsEnumerable()
.ToListAsync();
}
return dbResult;
}
/// <summary>
/// Intera tabella state machine ingressi 2 eventi
/// </summary>
+23 -108
View File
@@ -1882,7 +1882,7 @@ namespace MP.IOC.Data
result = await IocDbController.Macchine2SlaveAsync();
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, getRandTOut(redisLongTimeCache));
await redisDb.StringSetAsync(currKey, rawData, getRandTOut(redisLongTimeCache * 10));
}
if (result == null)
{
@@ -2291,7 +2291,7 @@ namespace MP.IOC.Data
// se è vuoto... leggo da DB e popolo!
if (answ.Count == 0)
{
answ = ResetDatiMacchina(idxMacchina);
answ = await ResetDatiMacchinaAsync(idxMacchina);
}
}
catch (Exception exc)
@@ -3828,7 +3828,7 @@ namespace MP.IOC.Data
/// <param name="dtEve">DataOra evento</param>
/// <param name="dtCurr">DataOra corrente</param>
/// <returns></returns>
public string saveCaricoPezzi(string idxMacchina, string qty, string dtEve = "", string dtCurr = "")
public async Task<string> SaveCaricoPezziAsync(string idxMacchina, string qty, string dtEve = "", string dtCurr = "")
{
// default: 0, non registrato x cautela...
string answ = "0";
@@ -3848,7 +3848,7 @@ namespace MP.IOC.Data
// se il conteggio è >= 0 SALVO evento...
if (numPzIncr >= 0)
{
var listOdl = IocDbController.OdlListByMaccPeriodo(idxMacchina, dtEvent, dtEvent.AddSeconds(1));
var listOdl = await IocDbController.OdlListByMaccPeriodoAsync(idxMacchina, dtEvent, dtEvent.AddSeconds(1));
if (listOdl != null && listOdl.Count > 0)
{
string codArticolo = listOdl.FirstOrDefault()?.CodArticolo ?? "ND";
@@ -3866,7 +3866,7 @@ namespace MP.IOC.Data
Value = qty
};
// salva e processa
var resp = scriviRigaEvento(newRecEv);
var resp = await scriviRigaEventoAsync(newRecEv);
// registro in risposta che è andato tutto bene... ovvero la qty richiesta...
answ = qty;
}
@@ -4526,7 +4526,7 @@ namespace MP.IOC.Data
#region Private Methods
/// <summary>
/// verifica se sia necessario inserire un cambio di stato impianto (DiarioDi Bordo) in modalità batch
/// Verifica se sia necessario inserire un cambio di stato impianto (DiarioDi Bordo) in modalità batch
/// </summary>
/// <param name="tipoInput"></param>
/// <param name="IdxMacchina"></param>
@@ -4536,7 +4536,7 @@ namespace MP.IOC.Data
/// <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)
private async Task CheckCambiaStatoBatchAsync(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet)
{
//DS_applicazione.TransizioneStatiDataTable tabTransStati;
//DS_applicazione.TransizioneStatiRow rigaTransStati;
@@ -4546,7 +4546,7 @@ namespace MP.IOC.Data
{
case tipoInputEvento.barcode:
// effettuo cambio stato INDIPENDENTEMENTE da stato precedente
listTransit = IocDbController.SMES_getUserForced(IdxMacchina, IdxTipo);
listTransit = await IocDbController.SMES_getUserForcedAsync(IdxMacchina, IdxTipo);
if (listTransit.Count > 0)
{
@@ -4554,9 +4554,9 @@ namespace MP.IOC.Data
// solo se cambia stato...
if (rigaTrans != null && rigaTrans.IdxStato != rigaTrans.next_IdxStato)
{
IocDbController.DDB_InsStatoBatch(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
await IocDbController.DDB_InsStatoBatchAsync(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
// aggiorno MSE
IocDbController.RecalcMse(IdxMacchina, 0);
await IocDbController.RecalcMseAsync(IdxMacchina, 0);
}
}
else
@@ -4567,22 +4567,24 @@ namespace MP.IOC.Data
case tipoInputEvento.hw:
// verifico se ci sia necessità di cambio stato
listTransit = IocDbController.SMES_getHwTransitions(IdxMacchina, IdxTipo);
listTransit = await IocDbController.SMES_getHwTransitionsAsync(IdxMacchina, IdxTipo);
if (listTransit.Count > 0)
{
rigaTrans = listTransit.FirstOrDefault();
if (rigaTrans != null && rigaTrans.IdxStato != rigaTrans.next_IdxStato)
{
IocDbController.DDB_InsStatoBatch(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
await IocDbController.DDB_InsStatoBatchAsync(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
// aggiorno MSE
IocDbController.RecalcMse(IdxMacchina, 0);
await IocDbController.RecalcMseAsync(IdxMacchina, 0);
}
}
else
{
Log.Debug($"Non trovata riga per: HW | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}");
}
break;
default:
break;
}
}
@@ -4712,25 +4714,6 @@ namespace MP.IOC.Data
return answ;
}
/// <summary>
/// Restituisce il valore booleano se la macchina sia di tipo MULTI (con più state machine x INGRESSI)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
private bool isMulti(string idxMacchina)
{
bool answ = false;
try
{
answ = Convert.ToBoolean(mDatiMacchinaVal(idxMacchina, "Multi") == "1");
}
catch (Exception exc)
{
Log.Error($"Eccezione in isMulti{Environment.NewLine}{exc}");
}
return answ;
}
/// <summary>
/// Restituisce il valore booleano se la macchina sia di tipo MULTI (con più state machine x INGRESSI)
/// usando dati macchina in cache per evitare lookup ridondanti
@@ -4767,54 +4750,6 @@ namespace MP.IOC.Data
return answ;
}
/// <summary>
/// Calcola l'effettivo valore da passare alla macchina a stati INGRESSI data conf Macchine2FamigliaIngressi
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="valore"></param>
/// <returns></returns>
private string preProcInput(string idxMacchina, string valore)
{
string newVal = "";
try
{
// variabili
int valINT = 0;
int BitFilt = 0;
int BSR = 0;
bool ExplodeBit = false;
int NumBit = 0;
int newValInt = 0;
// recupero parametri...
int.TryParse(mDatiMacchinaVal(idxMacchina, "BitFilt"), out BitFilt);
int.TryParse(mDatiMacchinaVal(idxMacchina, "BSR"), out BSR);
Boolean.TryParse(mDatiMacchinaVal(idxMacchina, "ExplodeBit"), out ExplodeBit);
int.TryParse(mDatiMacchinaVal(idxMacchina, "NumBit"), out NumBit); // non usato (x ora)
// recupero valore
valINT = int.Parse(valore, NumberStyles.HexNumber);
// filtro
newValInt = MP.Core.Utils.bMaskInt(valINT, BitFilt);
// effettuo eventuale BitShiftRight
if (BSR > 0)
{
newValInt = newValInt >> BSR;
}
// effettuo eventuale esplosione in BIT esclusivi
if (ExplodeBit)
{
newValInt = Convert.ToInt32(1 << newValInt);
}
// riconverto a STRING HEX!!!
newVal = newValInt.ToString("X");
}
catch
{
newVal = valore;
}
return newVal;
}
/// <summary>
/// Calcola l'effettivo valore da passare alla macchina a stati INGRESSI usando dati macchina in cache
/// </summary>
@@ -4927,7 +4862,7 @@ namespace MP.IOC.Data
result.Add("Slave", isSlave);
// durata cache in secondi dal valore insEnabled...
double numSecCache = 60 * ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache / 4 : redisShortTimeCache);
double numSecCache = ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache : redisLongTimeCache);
// ...e salvo...
RedisSetHashDict(currHash, result, numSecCache);
@@ -4993,7 +4928,7 @@ namespace MP.IOC.Data
result.Add("Slave", isSlave);
// durata cache in secondi dal valore insEnabled...
double numSecCache = 60 * ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache : redisLongTimeCache);
double numSecCache = ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache : redisLongTimeCache);
// ...e salvo...
await RedisSetHashDictAsync(currHash, result, numSecCache);
@@ -5077,6 +5012,7 @@ namespace MP.IOC.Data
return answ;
}
#if false
/// <summary>
/// Scrive una riga di evento nel db + check cambio stato DiarioDiBordo
/// </summary>
@@ -5090,7 +5026,7 @@ namespace MP.IOC.Data
// inserisco evento
inserito = IocDbController.EvListInsert(newRec);
// faccio controllo per eventuale cambio stato da tab transizioni...
checkCambiaStatoBatch(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
CheckCambiaStatoBatchAsync(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
}
catch (Exception exc)
{
@@ -5101,7 +5037,8 @@ namespace MP.IOC.Data
answ.outValue = inserito.ToString();
answ.needStatusRefresh = true;
return answ;
}
}
#endif
/// <summary>
/// Scrive una riga di evento nel db + check cambio stato DiarioDiBordo
@@ -5116,7 +5053,7 @@ namespace MP.IOC.Data
// inserisco evento
inserito = await IocDbController.EvListInsertAsync(newRec);
// faccio controllo per eventuale cambio stato da tab transizioni...
checkCambiaStatoBatch(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
await CheckCambiaStatoBatchAsync(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
}
catch (Exception exc)
{
@@ -5142,7 +5079,7 @@ namespace MP.IOC.Data
// inserisco evento
inserito = await IocDbController.EvListInsertAsync(newRec);
// faccio controllo per eventuale cambio stato da tab transizioni...
checkCambiaStatoBatch(tipoInputEvento.barcode, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
CheckCambiaStatoBatchAsync(tipoInputEvento.barcode, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
}
catch (Exception exc)
{
@@ -5155,26 +5092,6 @@ namespace MP.IOC.Data
return answ;
}
/// <summary>
/// Restituisce il valore booleano se la macchina sia abilitata all'inserimento COMPLETO nel
/// Signal Log
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
private bool sLogEnab(string idxMacchina)
{
bool answ = false;
try
{
answ = Convert.ToBoolean(mDatiMacchinaVal(idxMacchina, "sLogEnabled"));
}
catch (Exception exc)
{
Log.Error($"Eccezione in sLogEnab{Environment.NewLine}{exc}");
}
return answ;
}
/// <summary>
/// Stato prod macchina (completo)
/// </summary>
@@ -5184,7 +5101,6 @@ namespace MP.IOC.Data
private StatoProdModel StatoProdMacchina(string idxMacchina, DateTime dtReq, bool forceDb = false)
{
// setup parametri costanti
string source = "DB";
StatoProdModel? result = new StatoProdModel();
// cerco in _redisConn...
string currKey = $"{Utils.redisStatoProd}:{idxMacchina}:{dtReq:HHmm}";
@@ -5192,7 +5108,6 @@ namespace MP.IOC.Data
if (rawData.HasValue && !forceDb)
{
result = JsonConvert.DeserializeObject<StatoProdModel>($"{rawData}");
source = "REDIS";
}
else
{
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>6.16.2604.1811</Version>
<Version>6.16.2604.1812</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MP-IOC </i>
<h4>Versione: 6.16.2604.1811</h4>
<h4>Versione: 6.16.2604.1812</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2604.1811
6.16.2604.1812
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2604.1811</version>
<version>6.16.2604.1812</version>
<url>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/MP.IOC.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>