From ea0fd00c50da205888e41823f52476e8b212500c Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 7 Apr 2023 19:19:15 +0200 Subject: [PATCH] update metodo x chiusura PODL a tempo specificato --- MP-IO/Controllers/IOBController.cs | 16 ++-- MapoDb/DataLayer.cs | 122 ++++++++++++++--------------- 2 files changed, 72 insertions(+), 66 deletions(-) diff --git a/MP-IO/Controllers/IOBController.cs b/MP-IO/Controllers/IOBController.cs index 2f31858d..3fdf343b 100644 --- a/MP-IO/Controllers/IOBController.cs +++ b/MP-IO/Controllers/IOBController.cs @@ -136,14 +136,14 @@ namespace MP_IO.Controllers } /// - /// Chiude PODL --> ODL x macchina: + /// Chiude PODL --> ODL x macchina: /// - /// GET: IOB/closePODL/SIMUL_03?idxPOdl=123 + /// GET: IOB/closePODL/SIMUL_03?idxPOdl=123&dtEve=20230323151100000&dtCurr=20230323221100000 /// /// id macchina /// idx dell'ODL da chiudere /// bool esecuzione - public bool closePODL(string id, int idxPOdl) + public bool closePODL(string id, int idxPOdl, string dtEve = "", string dtCurr = "") { bool answ = false; // init obj DataLayer @@ -158,6 +158,12 @@ namespace MP_IO.Controllers int idxOdl = tabPodl[0].IdxODL; // chiamata diretta sul DB... DateTime dtEvento = DateTime.Now; + //se ho una data-ora chiusura la calcolo... + bool rtimeProc = string.IsNullOrEmpty(dtEve); + if (!rtimeProc) + { + dtEvento = DataLayerObj.GetSrvDtEvent(dtEve, dtCurr); + } DataLayerObj.taODL.forceClose(idxOdl, id, dtEvento); } } @@ -977,7 +983,7 @@ namespace MP_IO.Controllers /// /// GET: IOB/getLastDossArt/cod_articolo /// - /// codice articolo, se vuoto --> non fa nulla + /// codice articolo, se vuoto --> non fa nulla /// Json contenente lista oggetti DOSSIER serializzati public string getLastDossArt(string id) { @@ -1012,7 +1018,7 @@ namespace MP_IO.Controllers /// /// GET: IOB/getLastDossArt/cod_articolo /// - /// codice articolo, se vuoto --> non fa nulla + /// codice articolo, se vuoto --> non fa nulla /// Json contenente lista oggetti DOSSIER serializzati public string getLastDossByMacc(string id) { diff --git a/MapoDb/DataLayer.cs b/MapoDb/DataLayer.cs index 8c56ab43..f8a597fe 100644 --- a/MapoDb/DataLayer.cs +++ b/MapoDb/DataLayer.cs @@ -1683,7 +1683,7 @@ namespace MapoDb bool rtimeProc = string.IsNullOrEmpty(dtEve); if (!rtimeProc) { - dtEvent = getSrvDtEvent(dtEve, dtCurr); + dtEvent = GetSrvDtEvent(dtEve, dtCurr); } // verifico NON CI SIA un veto altre chiamate (es split...) - 30 sec di default... @@ -1798,14 +1798,14 @@ namespace MapoDb break; case 2: - // eventuale chiusura vecchio ODL, 5 sec prima... + // eventuale chiusura vecchio ODL, 2 sec prima... if (currODLData.Count > 0) { doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2)); } // avvio PODL: creo nuovo ODL da promessa ed associo taODL.inizioSetupPromessa(idxPODL, MatrOpr, POdlRow.IdxMacchina, POdlRow.TCAssegnato, POdlRow.PzPallet, POdlRow.Note, dtEvent); - // reseetto info PODL + // resetto info PODL resetPODLData(idxPODL); // fix (invio ) dati ODL alla macchina tramite IOB Thread.Sleep(200); @@ -1821,14 +1821,14 @@ namespace MapoDb } // duplico PODL... inserisco nuovo record... taPODL.insertQuery(POdlRow.KeyRichiesta, POdlRow.KeyBCode, true, POdlRow.CodArticolo, POdlRow.CodGruppo, POdlRow.IdxMacchina, POdlRow.NumPezzi, POdlRow.TCAssegnato, POdlRow.DueDate, POdlRow.Priorita, POdlRow.PzPallet, POdlRow.Note); - // recupero odl attivabili... + // recupero PODL attivabili... var podlList = taPODL.getByCodArt(POdlRow.CodArticolo, true); // cerco quello che ha la stessa fase/macchina e + recente... var lastPodl = podlList.Where(x => x.KeyRichiesta == POdlRow.KeyRichiesta && x.IdxMacchina == POdlRow.IdxMacchina).OrderByDescending(x => x.idxPromessa).FirstOrDefault(); int newPODL = lastPodl != null ? lastPodl.idxPromessa : POdlRow.idxPromessa; // avvio (nuovo) PODL taODL.inizioSetupPromessa(idxPODL, MatrOpr, POdlRow.IdxMacchina, POdlRow.TCAssegnato, POdlRow.PzPallet, POdlRow.Note, dtEvent); - // reseetto info PODL + // resetto info PODL resetPODLData(idxPODL); // fix (invio ) dati ODL alla macchina tramite IOB Thread.Sleep(200); @@ -1837,7 +1837,7 @@ namespace MapoDb break; case 4: - // eventuale chiusura vecchio ODL, 5 sec prima... + // eventuale chiusura vecchio ODL, 2 sec prima... if (currODLData.Count > 0) { doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2)); @@ -2074,6 +2074,60 @@ namespace MapoDb return answTab; } + /// + /// Effettua calcolo data-ora di riferimento per il server a poartire da + /// + /// + /// + /// + public DateTime GetSrvDtEvent(string dtEve, string dtCurr) + { + DateTime dataOraEvento = DateTime.Now; + // 2017.09.14 trimmo eventualmente lo zero finale dalle date SE supera i millisecondi... + dtEve = dtEve.Length > 17 ? dtEve.Substring(0, 17) : dtEve; + dtCurr = dtCurr.Length > 17 ? dtCurr.Substring(0, 17) : dtCurr; + DateTime dtEvento, dtCorrente; + // controllo: se ho valori dt x evento e orario DIVERSI per acquisitore IOB calcolo + // dataOraEvento corretto + if (dtEve != dtCurr) + { + Int64 delta = 0; + try + { + // se ho meno decimali x evento rispetto dtCorrente... + if (dtEve.Length < dtCurr.Length) + { + dtEve = dtEve.PadRight(dtCurr.Length, '0'); + } + delta = Convert.ToInt64(dtCurr) - Convert.ToInt64(dtEve); + // se meno di 60'000 ms ... + if (delta < 59999) + { + dataOraEvento = dataOraEvento.AddMilliseconds(-delta); + } + else + { + // in questo caso elimino i MS dalle stringhe e converto i datetime.... + CultureInfo provider = CultureInfo.InvariantCulture; + string format = "yyyyMMddHHmmssfff"; + dtEvento = DateTime.ParseExact(dtEve, format, provider); + dtCorrente = DateTime.ParseExact(dtCurr, format, provider); + Int64 tiks = dtCorrente.Ticks - dtEvento.Ticks; + dataOraEvento = dataOraEvento.AddTicks(-tiks); + } + } + catch (Exception exc) + { + logger.lg.scriviLog($"getSrvDtEvent | Errore calcolo ms evento/ora corrente da device remoto:{Environment.NewLine}" + + $"dtEve : {dtEve}{Environment.NewLine}" + + $"dtCurr: {dtCurr}{Environment.NewLine}" + + $"{exc}", tipoLog.EXCEPTION); + } + } + + return dataOraEvento; + } + /// /// restituisce il TempoCiclo effettivo (tecnico) della macchina /// @@ -2410,7 +2464,7 @@ namespace MapoDb saveCallRec("processFluxLog"); } string answ = ""; - DateTime dataOraEvento = getSrvDtEvent(dtEve, dtCurr); + DateTime dataOraEvento = GetSrvDtEvent(dtEve, dtCurr); // inizio processing vero e proprio INPUT... if (idxMacchina != null && valore != null) { @@ -4443,60 +4497,6 @@ namespace MapoDb SetAllCommandTimeouts(taComm, sqlLongCommandTimeout); } - /// - /// Effettua calcolo data-ora di riferimento per il server a poartire da - /// - /// - /// - /// - private DateTime getSrvDtEvent(string dtEve, string dtCurr) - { - DateTime dataOraEvento = DateTime.Now; - // 2017.09.14 trimmo eventualmente lo zero finale dalle date SE supera i millisecondi... - dtEve = dtEve.Length > 17 ? dtEve.Substring(0, 17) : dtEve; - dtCurr = dtCurr.Length > 17 ? dtCurr.Substring(0, 17) : dtCurr; - DateTime dtEvento, dtCorrente; - // controllo: se ho valori dt x evento e orario DIVERSI per acquisitore IOB calcolo - // dataOraEvento corretto - if (dtEve != dtCurr) - { - Int64 delta = 0; - try - { - // se ho meno decimali x evento rispetto dtCorrente... - if (dtEve.Length < dtCurr.Length) - { - dtEve = dtEve.PadRight(dtCurr.Length, '0'); - } - delta = Convert.ToInt64(dtCurr) - Convert.ToInt64(dtEve); - // se meno di 60'000 ms ... - if (delta < 59999) - { - dataOraEvento = dataOraEvento.AddMilliseconds(-delta); - } - else - { - // in questo caso elimino i MS dalle stringhe e converto i datetime.... - CultureInfo provider = CultureInfo.InvariantCulture; - string format = "yyyyMMddHHmmssfff"; - dtEvento = DateTime.ParseExact(dtEve, format, provider); - dtCorrente = DateTime.ParseExact(dtCurr, format, provider); - Int64 tiks = dtCorrente.Ticks - dtEvento.Ticks; - dataOraEvento = dataOraEvento.AddTicks(-tiks); - } - } - catch (Exception exc) - { - logger.lg.scriviLog($"getSrvDtEvent | Errore calcolo ms evento/ora corrente da device remoto:{Environment.NewLine}" + - $"dtEve : {dtEve}{Environment.NewLine}" + - $"dtCurr: {dtCurr}{Environment.NewLine}" + - $"{exc}", tipoLog.EXCEPTION); - } - } - - return dataOraEvento; - } - /// /// Recupero dati stato prod da macchina... ///