From 035dd8351d8515fdd6bfbefb696c46c08bb69e79 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 29 Apr 2026 19:05:46 +0200 Subject: [PATCH] Rimoazione transazione in checkCambiostato --- MP.Data/Controllers/MpIocController.cs | 232 ++++++++++++------------- MP.IOC/MP.IOC.csproj | 2 +- MP.IOC/Resources/ChangeLog.html | 2 +- MP.IOC/Resources/VersNum.txt | 2 +- MP.IOC/Resources/manifest.xml | 2 +- 5 files changed, 111 insertions(+), 129 deletions(-) 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