Rimoazione transazione in checkCambiostato

This commit is contained in:
Samuele Locatelli
2026-04-29 19:05:46 +02:00
parent 9e67df84a1
commit 035dd8351d
5 changed files with 111 additions and 129 deletions
+107 -125
View File
@@ -120,6 +120,96 @@ namespace MP.Data.Controllers
return result != 0;
}
/// <summary>
/// Processing intera catena eventi verifica cambio stato in singola transazione e con unico DbContext
/// </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>
/// <returns></returns>
public async Task<bool> 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
}
}
/// <summary>
/// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma - dtEvent)
/// </summary>
@@ -373,8 +463,6 @@ namespace MP.Data.Controllers
return await dbCtx.SaveChangesAsync() > 0;
}
/// <summary>
/// Aggiunta record MicroStato + EventList
/// </summary>
@@ -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;
}
/// <summary>
/// Aggiunta record RemoteRebootLog
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public async Task<bool> RemRebootLogAddAsync(RemoteRebootLogModel newRec)
{
using var dbCtx = new MoonProContext(_configuration);
var dbResult = dbCtx
.DbSetRemRebLog
.Add(newRec);
return await dbCtx.SaveChangesAsync() > 0;
}
/// <summary>
/// Aggiunta record RemoteRebootLog
/// </summary>
@@ -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;
}
/// <summary>
/// Aggiunta record RemoteRebootLog
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public async Task<bool> RemRebootLogAddAsync(RemoteRebootLogModel newRec)
{
using var dbCtx = new MoonProContext(_configuration);
var dbResult = dbCtx
.DbSetRemRebLog
.Add(newRec);
return await dbCtx.SaveChangesAsync() > 0;
}
/// <summary>
/// Recupera tutti i record di RemoteRebootLog
/// </summary>
@@ -1257,112 +1345,6 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Processing intera catena eventi verifica cambio stato in singola transazione e con unico DbContext
/// </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>
/// <returns></returns>
public async Task<bool> 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<TransizioneStatiModel> listTransit = new List<TransizioneStatiModel>();
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;
}
}
/// <summary>
/// Intera tabella state machine ingressi 2 eventi
/// </summary>
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>8.16.2604.2918</Version>
<Version>8.16.2604.2919</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MP-IOC </i>
<h4>Versione: 8.16.2604.2918</h4>
<h4>Versione: 8.16.2604.2919</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
8.16.2604.2918
8.16.2604.2919
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>8.16.2604.2918</version>
<version>8.16.2604.2919</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>