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 /// /// Init controller gestione MagmanSync /// /// URL del server /// Token di autorizzazione 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 /// /// Enum del risultato della sincronizzazione /// 0: ALL_OK /// 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 /// /// Esegue sync dei dati LogMacchina su cloud: /// - upload /// - cicla secondo parametri indicati /// /// num record da inviare in ogni singolo batch (std: 50) /// num max di record da inviare (std: 1000) /// Ture: cerca di sistemare prodId e prodId prima di inviare /// 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 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; } /// /// Esegue sync dei dati PROJ su cloud (se NON sincronizzati): /// /// 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 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; } /// /// Esegue invio info avanzamento di un SINGOLO PROD dato il suo Id + info avanzamento /// /// ID del progetto (locale) /// Tempo complessivo di lavorazione /// /// Valore attuale a completamento (tipicamente numero barre/num pezzi DA FARE) /// /// /// Valore massimo a completamento (tipicamente numero barre/num pezzi DA FARE) /// /// Risultato sincronizzazione 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; } /// /// Esegue sync di un SINGOLO PROD (cloud proj): /// - legge il progetto locale + upload x sync (verso cloud) /// - riceve ID cloud e aggiorna in locale... /// /// Id del Prod da sincronizzare (invio dati con eventuale fix prodId) /// Risultato sincronizzazione public SyncResult ProjSyncro(int ProdId) { int cloudId = 0; SyncResult answ = ProjSyncro(ProdId, ref cloudId); return answ; } /// /// Esegue sync di un SINGOLO PROD (cloud proj): /// - legge il progetto locale + upload x sync (verso cloud) /// - riceve ID cloud e aggiorna in locale... /// /// Id del Prod da sincronizzare (invio dati con eventuale fix prodId) /// /// Id del Prod in rete (eventualmente creato) che verrà RESTITUITO x reference /// /// Risultato sincronizzazione 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; /// /// Istanza logger /// private NLog.Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields } }