Files
magman/TestConsoleApp/MagmanController.cs
2024-07-01 15:21:53 +02:00

353 lines
14 KiB
C#

using EgwProxy.DataLayer.Controllers;
using EgwProxy.DataLayer.DbModel;
using EgwProxy.MagMan;
using EgwProxy.MagMan.DTO;
using NLog;
using NLog.Fluent;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Configuration;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
namespace DemoApp
{
public class MagmanController
{
#region Public Constructors
/// <summary>
/// Init controller gestione MagmanSync
/// </summary>
/// <param name="serverUrl">URL del server</param>
/// <param name="authToken">Token di autorizzazione</param>
public MagmanController(string ServerAddress, string AuthToken)
{
commLib = new DataSyncro(ServerAddress, AuthToken);
bool servOk = commLib.CheckRemote();
Log.Info($"Avviato MagmanController | server: {ServerAddress} | timeout: standard (500ms)| CheckRemote OK: {servOk}");
}
#endregion Public Constructors
#region Public Enums
/// <summary>
/// Enum del risultato della sincronizzazione
/// 0: ALL_OK
/// </summary>
public enum SyncResult
{
ALL_OK = 0,
ERR_ND,
ERR_ServerKo,
ERR_CloudMatNotSent,
ERR_CloudResNotSent,
ERR_SrcMatNotFound,
ERR_MergeMatEmpty,
ERR_CloudMatEmpty,
ERR_Res2SendEmpty,
ERR_InvSendError,
ERR_AliasMatEmpty,
ERR_CloudAliasNotSent,
ERR_ProjIdNotFound,
ERR_ProjNotSync,
RES_CheckChanged,
RES_CheckEqual,
RES_CheckND,
ERR_AllProjSyncUncomplete,
ERR_LogMaccSyncUncomplete,
ERR_ProjCloudIdNotFound
}
#endregion Public Enums
#region Public Methods
/// <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>
/// <param name="tryFixProj">Ture: cerca di sistemare prodId e prodId prima di inviare</param>
/// <returns></returns>
public SyncResult CloudLogMaccSyncro(int batchSize = 50, int num2send = 1000, bool tryFixProj = false)
{
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;
// se richiesto PRIMA fa il try-fix prodId e prodId
if (tryFixProj)
{
bool fixDone = lmDbContr.TryFixProjCloudId();
}
// 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 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 invio info avanzamento di un SINGOLO PROD dato il suo Id + info avanzamento
/// </summary>
/// <param name="prodId">ID del progetto (locale)</param>
/// <param name="procTime">Tempo complessivo di lavorazione</param>
/// <param name="valAct">
/// Valore attuale a completamento (tipicamente numero barre/num pezzi DA FARE)
/// </param>
/// <param name="valMax">
/// Valore massimo a completamento (tipicamente numero barre/num pezzi DA FARE)
/// </param>
/// <returns>Risultato sincronizzazione</returns>
public SyncResult ProjSendProg(int prodId, double procTime, double valAct, double valMax)
{
SyncResult answ = SyncResult.ERR_ND;
// verifico server ok
bool servOk = commLib.CheckRemote();
if (!servOk)
{
answ = SyncResult.ERR_ServerKo;
}
else
{
using (ProdController dbContr = new ProdController())
{
// in primis recupero item
var currRec = dbContr.FindByProdId(prodId);
if (currRec == null)
{
answ = SyncResult.ERR_ProjIdNotFound;
}
else
{
// verifico ci sia cloud ID...
if (currRec.ProjCloudId == 0)
{
answ = SyncResult.ERR_ProjCloudIdNotFound;
}
else
{
try
{
// preparo obj da inviare...
ProjectProgrDTO projProgrDTO = new ProjectProgrDTO()
{
ProjCloudId = currRec.ProjCloudId,
ValAct = valAct,
ValMax = valMax,
ProcTimeReal = procTime
};
// invio e recupero ID...
bool fatto = commLib.ProjectProgrSend(projProgrDTO);
// se inviato, faccio upgrade locale...
if (!fatto)
{
answ = SyncResult.ERR_ProjNotSync;
}
else
{
answ = SyncResult.ALL_OK;
}
}
catch
{
answ = SyncResult.ERR_ServerKo;
}
}
}
}
}
return answ;
}
/// <summary>
/// Esegue sync di un SINGOLO PROD (cloud proj):
/// - legge il progetto locale + upload x sync (verso cloud)
/// - riceve ID cloud e aggiorna in locale...
/// </summary>
/// <param name="ProdId">Id del Prod da sincronizzare (invio dati con eventuale fix prodId)</param>
/// <returns>Risultato sincronizzazione</returns>
public SyncResult ProjSyncro(int ProdId)
{
int cloudId = 0;
SyncResult answ = ProjSyncro(ProdId, ref cloudId);
return answ;
}
/// <summary>
/// Esegue sync di un SINGOLO PROD (cloud proj):
/// - legge il progetto locale + upload x sync (verso cloud)
/// - riceve ID cloud e aggiorna in locale...
/// </summary>
/// <param name="ProdId">Id del Prod da sincronizzare (invio dati con eventuale fix prodId)</param>
/// <param name="ProjCloudId">
/// Id del Prod in rete (eventualmente creato) che verrà RESTITUITO x reference
/// </param>
/// <returns>Risultato sincronizzazione</returns>
public SyncResult ProjSyncro(int ProdId, ref int ProjCloudId)
{
SyncResult answ = SyncResult.ERR_ND;
// verifico server ok
bool servOk = commLib.CheckRemote();
if (!servOk)
{
answ = SyncResult.ERR_ServerKo;
}
else
{
using (ProdController dbContr = new ProdController())
{
// in primis recupero item
var currRec = dbContr.FindByProdId(ProdId);
if (currRec == null)
{
answ = SyncResult.ERR_ProjIdNotFound;
}
else
{
try
{
// preparo obj da inviare...
var projDto = ProdController.ConvToDto(currRec);
// invio e recupero ID...
ProjCloudId = commLib.ProjectSend(projDto);
// se inviato, faccio upgrade locale...
if (ProjCloudId == 0)
{
answ = SyncResult.ERR_ProjNotSync;
}
else
{
// verifico SE SIA da scrivere cloud ID...
if (ProjCloudId != currRec.ProjCloudId)
{
dbContr.UpdateCloudId(ProdId, ProjCloudId);
}
answ = SyncResult.ALL_OK;
}
}
catch
{
answ = SyncResult.ERR_ServerKo;
}
}
}
}
return answ;
}
#endregion Public Methods
#region Private Fields
private DataSyncro commLib = null;
/// <summary>
/// Istanza logger
/// </summary>
private NLog.Logger Log = LogManager.GetCurrentClassLogger();
#endregion Private Fields
}
}