Merge remote-tracking branch 'gitlab.seriate/DataLayer' into feature/NewWarehouseTest

This commit is contained in:
Emmanuele Sassi
2024-04-29 18:13:32 +02:00
3 changed files with 160 additions and 89 deletions
@@ -19,6 +19,24 @@ namespace EgtBEAMWALL.DataLayer.Controllers
#region Public Methods
/// <summary>
/// Helper conversione a LogMachineDTO
/// </summary>
/// <param name="currRec"></param>
/// <returns></returns>
public static LogMachineDTO ConvToItemDto(LogMachineModel currRec)
{
LogMachineDTO answ = new LogMachineDTO()
{
DtEvent = currRec.DtEvent,
EvType = (EgwProxy.MagMan.MachLogTypes)currRec.EvType,
ProjCloudId = currRec.ProjId,
SupervId = currRec.SupervId,
VarValue = currRec.VarValue
};
return answ;
}
/// <summary>
/// Conversion of base class to DB model class
/// </summary>
@@ -27,7 +45,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
public LogMachineModel ConvertFromCore(Core.MachLog coreMacLog)
{
int projCloudId = 0;
// calcolo projCloudId da ProjDbId...
// calcolo projCloudId da ProjId...
using (var localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
{
// Add to database
@@ -60,28 +78,10 @@ namespace EgtBEAMWALL.DataLayer.Controllers
/// <returns></returns>
public Core.MachLog ConvertToCore(LogMachineModel dbLog)
{
var newRecord = (Core.MachLog)Core.MachLog.CreateMachLog(dbLog.EvType, dbLog.DtEvent, dbLog.VarValue,dbLog.ProjId, dbLog.SupervId);
var newRecord = (Core.MachLog)Core.MachLog.CreateMachLog(dbLog.EvType, dbLog.DtEvent, dbLog.VarValue, dbLog.ProjId, dbLog.SupervId);
return newRecord;
}
/// <summary>
/// Helper conversione a LogMachineDTO
/// </summary>
/// <param name="currRec"></param>
/// <returns></returns>
public static LogMachineDTO ConvToItemDto(LogMachineModel currRec)
{
LogMachineDTO answ = new LogMachineDTO()
{
DtEvent = currRec.DtEvent,
EvType = (EgwProxy.MagMan.MachLogTypes)currRec.EvType,
ProjCloudId = currRec.ProjId,
SupervId = currRec.SupervId,
VarValue = currRec.VarValue
};
return answ;
}
/// <summary>
/// Create machine LOG record
/// </summary>
@@ -122,7 +122,6 @@ namespace EgtBEAMWALL.DataLayer.Controllers
/// <returns></returns>
public bool Create(Core.MachLog newMachLog)
{
// converto record
var dbLogModel = ConvertFromCore(newMachLog);
return Create(dbLogModel);
@@ -244,7 +243,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
}
/// <summary>
/// Recupero i dati in ordine crescente fino al num max indicato
/// Recupero i dati NON sincronizzati in ordine crescente fino al num max indicato
/// </summary>
/// <param name="dtStart"></param>
/// <param name="dtEnd"></param>
@@ -283,8 +282,8 @@ namespace EgtBEAMWALL.DataLayer.Controllers
if (currRec != null)
{
currRec.DtSent = adesso;
// indico modificato
localDbCtx.Entry(currRec).State = System.Data.Entity.EntityState.Modified;
// indico modificato
localDbCtx.Entry(currRec).State = System.Data.Entity.EntityState.Modified;
}
}
// Salvataggio finale
@@ -69,6 +69,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
RES_CheckChanged,
RES_CheckEqual,
RES_CheckND,
ERR_AllProjSyncUncomplete,
ERR_LogMaccSyncUncomplete
}
@@ -211,6 +212,70 @@ namespace EgtBEAMWALL.DataLayer.Controllers
return answ;
}
/// <summary>
/// Esegue sync dei dati LogMacchina su cloud:
/// - upload
/// - cicla secondo parametri indicati
/// </summary>
/// <param name="batchSize">num record da inviare in ogni singolo batch (std: 50)</param>
/// <param name="num2send">num max di record da inviare (std: 1000)</param>
/// <returns></returns>
public SyncResult CloudLogMaccSyncro(int batchSize = 50, int num2send = 1000)
{
SyncResult answ = SyncResult.ERR_ND;
// verifico server ok
bool servOk = commLib.CheckRemote();
if (!servOk)
{
answ = SyncResult.ERR_ServerKo;
}
else
{
int numSent = 0;
using (LogMachineController lmDbContr = new LogMachineController())
{
bool okSend = false;
// elenco record da inviare...
List<LogMachineModel> recList = lmDbContr.GetUnsentAsc(num2send);
// controllo ci sia qulcosa da inviare...
if (recList.Count > 0)
{
// fintanto che ce ne sono procedo...
while (numSent < num2send)
{
var currList = recList
.Skip(numSent)
.Take(batchSize)
.ToList();
// converto il blocco
var listDto = currList
.Select(x => LogMachineController.ConvToItemDto(x))
.ToList();
// invio!
okSend = commLib.LogMachineSend(listDto);
if (okSend)
{
// registro dati inviati...
lmDbContr.SetDtSent(currList);
Log.Info($"Inviati {batchSize}rec | {numSent} --> {numSent + batchSize}");
numSent += batchSize;
}
// altrimenti esco con errore...
else
{
Log.Info($"Errore in invio: {batchSize}rec | inviati {numSent} di {recList.Count}");
// registro errore
answ = SyncResult.ERR_LogMaccSyncUncomplete;
// condizione uscita
numSent = num2send + 1;
}
}
}
}
}
return answ;
}
/// <summary>
/// Esegue sync dei CloudId x Materiali e RawItems:
/// - upload + sync (cloud)
@@ -311,69 +376,6 @@ namespace EgtBEAMWALL.DataLayer.Controllers
return answ;
}
/// <summary>
/// Esegue sync dei dati LogMacchina su cloud:
/// - upload
/// - cicla secondo parametri indicati
/// </summary>
/// <param name="batchSize">num record da inviare in ogni singolo batch (std: 50)</param>
/// <param name="num2send">num max di record da inviare (std: 1000)</param>
/// <returns></returns>
public SyncResult CloudLogMaccSyncro(int batchSize = 50, int num2send = 1000)
{
SyncResult answ = SyncResult.ERR_ND;
// verifico server ok
bool servOk = commLib.CheckRemote();
if (!servOk)
{
answ = SyncResult.ERR_ServerKo;
}
else
{
int numSent = 0;
using (LogMachineController lmDbContr = new LogMachineController())
{
bool okSend = false;
// elenco record da inviare...
List<LogMachineModel> recList = lmDbContr.GetUnsentAsc(num2send);
// controllo ci sia qulcosa da inviare...
if (recList.Count > 0)
{
// fintanto che ce ne sono procedo...
while (numSent < num2send)
{
var currList = recList
.Skip(numSent)
.Take(batchSize)
.ToList();
// converto il blocco
var listDto = currList
.Select(x => LogMachineController.ConvToItemDto(x))
.ToList();
// invio!
okSend = commLib.LogMachineSend(listDto);
if (okSend)
{
// registro dati inviati...
lmDbContr.SetDtSent(currList);
Log.Info($"Inviati {batchSize}rec | {numSent} --> {numSent + batchSize}");
numSent += batchSize;
}
// altrimenti esco con errore...
else
{
Log.Info($"Errore in invio: {batchSize}rec | inviati {numSent} di {recList.Count}");
// registro errore
answ = SyncResult.ERR_LogMaccSyncUncomplete;
// condizione uscita
numSent = num2send + 1;
}
}
}
}
}
return answ;
}
public void Dispose()
{
commLib = null;
@@ -773,6 +775,58 @@ namespace EgtBEAMWALL.DataLayer.Controllers
return answ;
}
/// <summary>
/// Esegue sync dei dati PROJ su cloud (se NON sincronizzati):
/// </summary>
/// <returns></returns>
public SyncResult ProjAllSyncro()
{
SyncResult answ = SyncResult.ERR_ND;
// verifico server ok
bool servOk = commLib.CheckRemote();
if (!servOk)
{
answ = SyncResult.ERR_ServerKo;
}
else
{
int numSent = 0;
using (ProdController lmDbContr = new ProdController())
{
bool syncEnabled = true;
// elenco record da inviare...
List<ProdModel> recList = lmDbContr.GetUnsentAsc();
// controllo ci sia qulcosa da inviare...
if (recList.Count > 0)
{
foreach (var item in recList)
{
if (syncEnabled)
{
answ = ProjSyncro(item.ProdId);
if (answ != SyncResult.ALL_OK)
{
// disabilito altri sync
syncEnabled = false;
// loggo
Log.Error($"ProjAllSyncro | Errore in sincornizzazione progetto: prodId: {item.ProdId} | prodDbId: {item.ProdDbId} record");
// salvo errore
answ = SyncResult.ERR_AllProjSyncUncomplete;
}
else
{
numSent++;
}
}
}
// loggo completato
Log.Info($"ProjAllSyncro | Eseguita sincronizzazione di {numSent}/{recList.Count} record");
}
}
}
return answ;
}
/// <summary>
/// Esegue sync di un SINGOLO PROD (cloud proj):
/// - legge il progetto locale + upload x sync (verso cloud)
@@ -1591,7 +1645,6 @@ namespace EgtBEAMWALL.DataLayer.Controllers
return answ;
}
#endregion Private Methods
}
}
@@ -586,6 +586,25 @@ namespace EgtBEAMWALL.DataLayer.Controllers
return nextId;
}
/// <summary>
/// Recupero i dati NON sincronizzati in ordine crescente fino al num max indicato
/// </summary>
/// <param name="dtStart"></param>
/// <param name="dtEnd"></param>
/// <returns></returns>
public List<ProdModel> GetUnsentAsc()
{
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
{
// retrieve
return localDbCtx
.ProdList
.Where(x => x.ProjCloudId == 0)
.OrderBy(x => x.ProdDbId)
.ToList();
}
}
/// <summary>
/// Verifica prod assegnato a supervisor: ...se c'e' anche un solo machgroup del prod
/// assegnato ad un supervisor o in stato 0 (dovrebbe essere la stessa cosa?)
@@ -812,7 +831,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
// salvo record PROD
localDbCtx.SaveChanges();
// cerco se ci siano prod colelgati ed aggiorno pure loro...
// cerco se ci siano projects collegati ed aggiorno pure loro...
var projList = localDbCtx
.ProjList
.Where(x => x.ProdDbId == currData.ProdDbId)