Files

371 lines
14 KiB
C#

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using MongoDB.Driver;
using MP.Data.DbModels;
using NLog;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using static MP.Core.Objects.Enums;
namespace MP.Data.Repository.IOC
{
public class IocRepository : BaseRepository, IIocRepository
{
#region Public Constructors
public IocRepository(IDbContextFactory<MoonProContext> ctxFactory) : base(ctxFactory)
{
}
#endregion Public Constructors
#region Public Methods
/// <inheritdoc />
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 = await CreateContextAsync();
//await using var tx = await dbCtx.Database.BeginTransactionAsync(IsolationLevel.ReadCommitted);
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
};
// ✅ prima chiamata ASYNC
rigaTrans = (await dbCtx.DbSetSMES
.FromSqlRaw(sql, pIdxMacchina, pIdxTipo)
.AsNoTracking()
.ToListAsync()
).FirstOrDefault();
}
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);
// eseguo solo se evento manuale/barcode
if (tipoInput == tipoInputEvento.barcode)
{
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
//await tx.CommitAsync();
return true;
}
catch (Exception ex)
{
//await tx.RollbackAsync();
// Log dettagliato errore
Log.Error(ex, $"Errore in CheckCambiaStatoBatchAsync: {IdxMacchina} | {tipoInput}");
throw; // O return false; se il chiamante gestisce fallimenti
}
}
/// <inheritdoc />
public async Task<List<ConfigModel>> ConfigGetAllAsync()
{
await using var dbCtx = await CreateContextAsync();
var dbResult = await dbCtx
.DbSetConfig
.AsNoTracking()
.OrderBy(x => x.Chiave)
.ToListAsync();
return dbResult;
}
/// <inheritdoc />
public async Task<List<DatiMacchineModel>> DatiMacchineGetAllAsync()
{
await using var dbCtx = await CreateContextAsync();
var dbResult = await dbCtx
.DbSetDatiMacchine
.AsNoTracking()
.OrderBy(x => x.IdxMacchina)
.ToListAsync();
return dbResult;
}
/// <inheritdoc />
public async Task<bool> EvListMicroStatoInsertAsync(MicroStatoMacchinaModel newRecMsm, EventListModel newRecEv)
{
await using var dbCtx = await CreateContextAsync();
//// eseguo in transazione...
//await using var tx = await dbCtx.Database.BeginTransactionAsync(IsolationLevel.ReadCommitted);
try
{
// inizio con record microstato...
var actRec = await dbCtx
.DbSetMicroStatoMacc
.FindAsync(newRecMsm.IdxMacchina);
//.SingleOrDefaultAsync();
if (actRec == null)
{
dbCtx.DbSetMicroStatoMacc.Add(newRecMsm);
}
else
{
actRec.IdxMicroStato = newRecMsm.IdxMicroStato;
actRec.InizioStato = newRecMsm.InizioStato;
actRec.Value = newRecMsm.Value;
// Update() allega l'entità e segna tutti i campi come Modified
dbCtx.DbSetMicroStatoMacc.Update(actRec);
}
// ora record EVList
dbCtx.DbSetEvList.Add(newRecEv);
// EF Core 8 raggruppa automaticamente INSERT/UPDATE in un batch
var rowsAffected = await dbCtx.SaveChangesAsync();
//await tx.CommitAsync();
return rowsAffected > 0;
}
catch (Exception ex)
{
//await tx.RollbackAsync();
// Log dettagliato errore
Log.Error(ex, $"Errore in EvListMicroStatoInsertAsync: {newRecEv.IdxMacchina}");
throw;
}
}
/// <inheritdoc />
public async Task<bool> KeepAliveUpsertAsync(string IdxMacc, DateTime OraServer, DateTime OraMacc)
{
await using var dbCtx = await CreateContextAsync();
bool fatto = false;
var currRec = await dbCtx
.DbSetKeepAlive
.Where(x => x.IdxMacchina == IdxMacc)
.FirstOrDefaultAsync();
if (currRec != null)
{
currRec.DataOraServer = OraServer;
currRec.DataOraMacchina = OraMacc;
dbCtx.Entry(currRec).State = EntityState.Modified;
}
else
{
KeepAliveModel newRec = new KeepAliveModel()
{
IdxMacchina = IdxMacc,
DataOraMacchina = OraMacc,
DataOraServer = OraServer,
DataOraStart = DateTime.Now
};
dbCtx
.DbSetKeepAlive
.Add(newRec);
}
fatto = await dbCtx.SaveChangesAsync() > 0;
return fatto;
}
/// <inheritdoc />
public async Task<List<Macchine2SlaveModel>> Macchine2SlaveAsync()
{
await using var dbCtx = await CreateContextAsync();
List<Macchine2SlaveModel> dbResult = await dbCtx
.DbSetM2S
.AsNoTracking()
.OrderBy(x => x.IdxMacchina)
.ToListAsync();
return dbResult;
}
/// <inheritdoc />
public async Task<MacchineModel?> MacchineGetByIdxAsync(string IdxMacchina)
{
await using var dbCtx = await CreateContextAsync();
MacchineModel dbResult = await dbCtx
.DbSetMacchine
.FirstOrDefaultAsync(x => x.IdxMacchina == IdxMacchina);
return dbResult;
}
/// <inheritdoc />
public async Task<bool> MacchineUpsertAsync(MacchineModel entity)
{
await using var dbCtx = await CreateContextAsync();
// Recuperiamo l'entità tracciata dal context
var trackedEntity = await dbCtx
.DbSetMacchine
.FirstOrDefaultAsync(x => x.IdxMacchina == entity.IdxMacchina);
if (trackedEntity != null)
{
// Aggiorna i valori dell'entità tracciata con quelli della nuova
dbCtx.Entry(trackedEntity).CurrentValues.SetValues(entity);
}
else
{
dbCtx.DbSetMacchine.Update(entity);
}
return await dbCtx.SaveChangesAsync() > 0;
}
/// <inheritdoc />
public async Task<List<MicroStatoMacchinaModel>> MicroStatoMacchinaGetByIdxMaccAsync(string IdxMacc)
{
await using var dbCtx = await CreateContextAsync();
List<MicroStatoMacchinaModel> dbResult = new List<MicroStatoMacchinaModel>();
dbResult = await dbCtx
.DbSetMicroStatoMacc
.Where(x => x.IdxMacchina == IdxMacc)
.AsNoTracking()
.ToListAsync();
return dbResult;
}
/// <inheritdoc />
public async Task<bool> MicroStatoMacchinaUpsertAsync(MicroStatoMacchinaModel newRec)
{
await using var dbCtx = await CreateContextAsync();
bool fatto = false;
var actRec = await dbCtx
.DbSetMicroStatoMacc
.Where(x => x.IdxMacchina == newRec.IdxMacchina)
.AsNoTracking()
.FirstOrDefaultAsync();
if (actRec == null)
{
dbCtx
.DbSetMicroStatoMacc
.Add(newRec);
}
else
{
actRec.IdxMicroStato = newRec.IdxMicroStato;
actRec.InizioStato = newRec.InizioStato;
actRec.Value = newRec.Value;
dbCtx.Entry(actRec).State = EntityState.Modified;
}
fatto = await dbCtx.SaveChangesAsync() > 0;
return fatto;
}
/// <inheritdoc />
public async Task<bool> SignalLogInsertAsync(SignalLogModel newRec)
{
await using var dbCtx = await CreateContextAsync();
var currRec = dbCtx
.DbSetSignalLog
.Add(newRec);
return await dbCtx.SaveChangesAsync() > 0;
}
/// <inheritdoc />
public async Task<List<TransizioneIngressiModel>> StateMachineIngressiAsync(int idxFam)
{
await using var dbCtx = await CreateContextAsync();
var IdxFamIn = new SqlParameter("@IdxFamigliaIngresso", idxFam);
var dbResult = await dbCtx
.DbSetSMI
.FromSqlRaw("exec dbo.stp_TRI_getByIdxFamIng @IdxFamigliaIngresso", IdxFamIn)
.AsNoTracking()
.ToListAsync();
return dbResult;
}
/// <inheritdoc />
public async Task<StatoProdModel> StatoProdMacchinaAsync(string idxMacchina, DateTime dtReq)
{
await using var dbCtx = await CreateContextAsync();
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
var DataOra = new SqlParameter("@DataOra ", dtReq);
var dbResult = (await dbCtx
.DbSetStatoProd
.FromSqlRaw("EXEC stp_StatoProd_getByMacchina @IdxMacchina, @DataOra ", IdxMacchina, DataOra)
.AsNoTracking()
.ToListAsync())
.FirstOrDefault();
return dbResult;
}
/// <inheritdoc />
public async Task<VMSFDModel?> VMSFDGetByMaccAsync(string idxMacc)
{
await using var dbCtx = await CreateContextAsync();
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacc);
var dbResult = (await dbCtx
.DbSetMSFD
.FromSqlRaw("exec dbo.stp_MSFD_getMacc @IdxMacchina", IdxMacchina)
.AsNoTracking()
.ToListAsync())
.FirstOrDefault();
return dbResult;
}
/// <inheritdoc />
public async Task<List<VMSFDModel>> VMSFDGetMultiByMaccAsync(string idxMacc)
{
await using var dbCtx = await CreateContextAsync();
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacc);
var dbResult = await dbCtx
.DbSetMSFD
.FromSqlRaw("exec dbo.stp_MSFD_getMulti @IdxMacchina", IdxMacchina)
.AsNoTracking()
.ToListAsync();
return dbResult;
}
#endregion Public Methods
#region Protected Fields
protected static NLog.Logger Log = LogManager.GetCurrentClassLogger();
#endregion Protected Fields
}
}