Riscrittura metodo EFCore x avere unica transazione x checkCambiaStato

This commit is contained in:
Samuele Locatelli
2026-04-29 18:37:18 +02:00
parent bfd843cfde
commit 9e67df84a1
6 changed files with 116 additions and 8 deletions
+108 -1
View File
@@ -9,6 +9,7 @@ using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using static MP.Core.Objects.Enums;
namespace MP.Data.Controllers
{
@@ -1243,7 +1244,7 @@ namespace MP.Data.Controllers
/// <returns></returns>
public async Task<List<TransizioneStatiModel>> SMES_getUserForcedAsync(string idxMacchina, int idxTipo)
{
using var dbCtx = new MoonProContext(_configuration);
await using var dbCtx = new MoonProContext(_configuration);
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
var IdxTipo = new SqlParameter("@IdxTipo", idxTipo);
@@ -1256,6 +1257,112 @@ 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 -3
View File
@@ -4307,8 +4307,8 @@ namespace MP.IOC.Data
/// <param name="pallet"></param>
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;
await IocDbController.CheckCambiaStatoBatchAsync(tipoInput, IdxMacchina, InizioStato, IdxTipo, CodArt, Value, MatrOpr, pallet);
#if false
List<TransizioneStatiModel> listTransit = new List<TransizioneStatiModel>();
TransizioneStatiModel? rigaTrans = null;
switch (tipoInput)
@@ -4355,7 +4355,8 @@ namespace MP.IOC.Data
default:
break;
}
}
#endif
}
/// <summary>
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>8.16.2604.2916</Version>
<Version>8.16.2604.2918</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MP-IOC </i>
<h4>Versione: 8.16.2604.2916</h4>
<h4>Versione: 8.16.2604.2918</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
8.16.2604.2916
8.16.2604.2918
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>8.16.2604.2916</version>
<version>8.16.2604.2918</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>