diff --git a/MP.Data/Controllers/MpIocController.cs b/MP.Data/Controllers/MpIocController.cs
index 2565d3cc..2f683d10 100644
--- a/MP.Data/Controllers/MpIocController.cs
+++ b/MP.Data/Controllers/MpIocController.cs
@@ -120,6 +120,96 @@ namespace MP.Data.Controllers
return result != 0;
}
+ ///
+ /// Processing intera catena eventi verifica cambio stato in singola transazione e con unico DbContext
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task CheckCambiaStatoBatchAsync(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet)
+ {
+ await using var dbCtx = new MoonProContext(_configuration);
+
+ try
+ {
+ var pIdxMacchina = new SqlParameter("@IdxMacchina", IdxMacchina);
+ var pIdxTipo = new SqlParameter("@IdxTipo", IdxTipo);
+ var pInizioStato = new SqlParameter("@InizioStato", InizioStato);
+ var pCodArticolo = new SqlParameter("@codArticolo", CodArt);
+ var pValue = new SqlParameter("@Value", Value);
+ var pMatrOpr = new SqlParameter("@MatrOpr", MatrOpr);
+ var pPallet = new SqlParameter("@pallet", pallet);
+
+ string opType = tipoInput switch
+ {
+ tipoInputEvento.barcode => "BARCODE",
+ tipoInputEvento.hw => "HW",
+ _ => "ND"
+ };
+
+ TransizioneStatiModel? rigaTrans = null;
+
+ if (opType != "ND")
+ {
+ string sql = tipoInput switch
+ {
+ tipoInputEvento.barcode => "EXEC dbo.stp_TS_getUserForcedTrans @IdxMacchina, @IdxTipo",
+ tipoInputEvento.hw => "EXEC dbo.stp_TS_getByIdxMacchIdxTipoEv @IdxMacchina, @IdxTipo",
+ _ => string.Empty
+ };
+
+ // ✅ CORRETTO: FirstOrDefaultAsync (no ToList)
+ rigaTrans = await dbCtx.DbSetSMES
+ .FromSqlRaw(sql, pIdxMacchina, pIdxTipo)
+ .AsNoTracking()
+ .FirstOrDefaultAsync();
+ }
+
+ if (rigaTrans != null && rigaTrans.IdxStato != rigaTrans.next_IdxStato)
+ {
+ var pIdxStato = new SqlParameter("@IdxStato", rigaTrans.next_IdxStato);
+
+ await dbCtx.Database.ExecuteSqlRawAsync(
+ "EXEC dbo.stp_DDB_InsStatoBatch @IdxMacchina, @InizioStato, @IdxStato, @codArticolo, @Value, @MatrOpr, @pallet",
+ pIdxMacchina, pInizioStato, pIdxStato, pCodArticolo, pValue, pMatrOpr, pPallet);
+
+ // ✅ CORRETTO: FirstOrDefaultAsync + parametro pulito
+ var pDataOra = new SqlParameter("@DataOra", DateTime.UtcNow);
+ var statoProd = await dbCtx.DbSetStatoProd
+ .FromSqlRaw("EXEC stp_StatoProd_getByMacchina @IdxMacchina, @DataOra", pIdxMacchina, pDataOra)
+ .AsNoTracking()
+ .FirstOrDefaultAsync();
+
+ // Opzionale: usa `statoProd` se serve per log o logica aggiuntiva
+ // if (statoProd != null) { ... }
+
+ var pMaxAgeSec = new SqlParameter("@maxAgeSec", 0);
+ await dbCtx.Database.ExecuteSqlRawAsync(
+ "EXEC stp_MSE_recalc @maxAgeSec, @idxMacchina",
+ pMaxAgeSec, pIdxMacchina);
+ }
+ else
+ {
+ Log.Debug($"Nessun cambio stato richiesto | {opType} | {IdxMacchina} | {IdxTipo}");
+ }
+
+ // Nessuna eccezione = successo
+ return true;
+ }
+ catch (Exception ex)
+ {
+ // Log dettagliato errore
+ Log.Error(ex, $"Errore in CheckCambiaStatoBatchAsync: {IdxMacchina} | {tipoInput}");
+ throw; // O return false; se il chiamante gestisce fallimenti
+ }
+ }
+
///
/// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma - dtEvent)
///
@@ -373,8 +463,6 @@ namespace MP.Data.Controllers
return await dbCtx.SaveChangesAsync() > 0;
}
-
-
///
/// Aggiunta record MicroStato + EventList
///
@@ -407,7 +495,7 @@ namespace MP.Data.Controllers
// Update() allega l'entità e segna tutti i campi come Modified
dbCtx.DbSetMicroStatoMacc.Update(actRec);
#if false
- dbCtx.Entry(actRec).State = EntityState.Modified;
+ dbCtx.Entry(actRec).State = EntityState.Modified;
#endif
}
@@ -1091,21 +1179,6 @@ namespace MP.Data.Controllers
return result.Count != 0;
}
- ///
- /// Aggiunta record RemoteRebootLog
- ///
- ///
- ///
- public async Task RemRebootLogAddAsync(RemoteRebootLogModel newRec)
- {
- using var dbCtx = new MoonProContext(_configuration);
-
- var dbResult = dbCtx
- .DbSetRemRebLog
- .Add(newRec);
-
- return await dbCtx.SaveChangesAsync() > 0;
- }
///
/// Aggiunta record RemoteRebootLog
///
@@ -1141,7 +1214,6 @@ namespace MP.Data.Controllers
await dbCtx.Database.ExecuteSqlRawAsync(
"EXEC dbo.stp_RRL_KeepLatest @num2keep, @multiplier", param,
new SqlParameter("@multiplier", 2.5f)); // Fisso e poiché è coinvolto MAC address è + alto
-
}
catch (Exception ex)
{
@@ -1153,6 +1225,22 @@ namespace MP.Data.Controllers
return fatto;
}
+ ///
+ /// Aggiunta record RemoteRebootLog
+ ///
+ ///
+ ///
+ public async Task RemRebootLogAddAsync(RemoteRebootLogModel newRec)
+ {
+ using var dbCtx = new MoonProContext(_configuration);
+
+ var dbResult = dbCtx
+ .DbSetRemRebLog
+ .Add(newRec);
+
+ return await dbCtx.SaveChangesAsync() > 0;
+ }
+
///
/// Recupera tutti i record di RemoteRebootLog
///
@@ -1257,112 +1345,6 @@ namespace MP.Data.Controllers
return dbResult;
}
- ///
- /// Processing intera catena eventi verifica cambio stato in singola transazione e con unico DbContext
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public async Task CheckCambiaStatoBatchAsync(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet)
- {
- // eseguo in transazione...
- await using var dbCtx = new MoonProContext(_configuration);
- await using var tx = await dbCtx.Database.BeginTransactionAsync();
-
- try
- {
-
- List listTransit = new List();
- TransizioneStatiModel? rigaTrans = null;
- var pIdxMacchina = new SqlParameter("@IdxMacchina", IdxMacchina);
- var pIdxTipo = new SqlParameter("@IdxTipo", IdxTipo);
- var pInizioStato = new SqlParameter("@InizioStato", InizioStato);
- var pIdxStato = new SqlParameter("@IdxStato", "");
- var pCodArticolo = new SqlParameter("@codArticolo", CodArt);
- var pValue = new SqlParameter("@Value", Value);
- var pMatrOpr = new SqlParameter("@MatrOpr", MatrOpr);
- var pPallet = new SqlParameter("@pallet", pallet);
- string opType = "ND";
- switch (tipoInput)
- {
- case tipoInputEvento.barcode:
- opType = "BARCODE";
- // effettuo cambio stato INDIPENDENTEMENTE da stato precedente
- rigaTrans = (await dbCtx
- .DbSetSMES
- .FromSqlRaw("exec dbo.stp_TS_getUserForcedTrans @IdxMacchina, @IdxTipo", pIdxMacchina, pIdxTipo)
- .AsNoTracking()
- .ToListAsync()
- ).FirstOrDefault();
- break;
-
- case tipoInputEvento.hw:
- opType = "HW";
- // verifico se ci sia necessità di cambio stato
- rigaTrans = (await dbCtx
- .DbSetSMES
- .FromSqlRaw("exec dbo.stp_TS_getByIdxMacchIdxTipoEv @IdxMacchina, @IdxTipo", pIdxMacchina, pIdxTipo)
- .AsNoTracking()
- .ToListAsync()
- ).FirstOrDefault();
- break;
-
- default:
- break;
- }
-
- if (rigaTrans != null)
- {
- // solo se cambia stato...
- if (rigaTrans.IdxStato != rigaTrans.next_IdxStato)
- {
- pIdxStato = new SqlParameter("@IdxStato", rigaTrans.next_IdxStato);
- var result = await dbCtx
- .Database
- .ExecuteSqlRawAsync("EXEC dbo.stp_DDB_InsStatoBatch @IdxMacchina, @InizioStato, @IdxStato, @codArticolo, @Value, @MatrOpr, @pallet", pIdxMacchina, pInizioStato, pIdxStato, pCodArticolo, pValue, pMatrOpr, pPallet);
-
- // aggiorno produzione macchina (serve?!?)
- var pDataOra = new SqlParameter("@DataOra ", DateTime.Now);
- var dbResProdMacc = (await dbCtx
- .DbSetStatoProd
- .FromSqlRaw("EXEC stp_StatoProd_getByMacchina @IdxMacchina, @DataOra ", pIdxMacchina, pDataOra)
- .AsNoTracking()
- .ToListAsync())
- .FirstOrDefault();
-
-
- // aggiorno MSE
- var pMaxAgeSec = new SqlParameter("@maxAgeSec ", 0);
- var mseResult = await dbCtx
- .Database
- .ExecuteSqlRawAsync("EXEC stp_MSE_recalc @maxAgeSec, @idxMacchina ", pMaxAgeSec, pIdxMacchina);
- }
- }
- else
- {
- Log.Debug($"Non trovata riga per: {opType} | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}");
- }
-
- // EF Core 8 raggruppa automaticamente INSERT/UPDATE in un batch
- var rowsAffected = await dbCtx.SaveChangesAsync();
- await tx.CommitAsync();
-
- return rowsAffected > 0;
- }
- catch
- {
- await tx.RollbackAsync();
- throw;
- }
- }
-
-
///
/// Intera tabella state machine ingressi 2 eventi
///
diff --git a/MP.IOC/MP.IOC.csproj b/MP.IOC/MP.IOC.csproj
index 8fa63d98..5a43d5f9 100644
--- a/MP.IOC/MP.IOC.csproj
+++ b/MP.IOC/MP.IOC.csproj
@@ -4,7 +4,7 @@
net8.0
enable
enable
- 8.16.2604.2918
+ 8.16.2604.2919
diff --git a/MP.IOC/Resources/ChangeLog.html b/MP.IOC/Resources/ChangeLog.html
index 393f5aee..628a4a09 100644
--- a/MP.IOC/Resources/ChangeLog.html
+++ b/MP.IOC/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MP-IOC
- Versione: 8.16.2604.2918
+ Versione: 8.16.2604.2919
Note di rilascio:
-
diff --git a/MP.IOC/Resources/VersNum.txt b/MP.IOC/Resources/VersNum.txt
index 5b83debe..0cc9271e 100644
--- a/MP.IOC/Resources/VersNum.txt
+++ b/MP.IOC/Resources/VersNum.txt
@@ -1 +1 @@
-8.16.2604.2918
+8.16.2604.2919
diff --git a/MP.IOC/Resources/manifest.xml b/MP.IOC/Resources/manifest.xml
index 67e00d00..7c85ab3f 100644
--- a/MP.IOC/Resources/manifest.xml
+++ b/MP.IOC/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 8.16.2604.2918
+ 8.16.2604.2919
https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/MP.IOC.zip
https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/ChangeLog.html
false