Rimoazione transazione in checkCambiostato
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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,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 @@
|
||||
8.16.2604.2918
|
||||
8.16.2604.2919
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user