Merge branch 'release/FixClosePodlAtTime01'

This commit is contained in:
Samuele Locatelli
2023-04-07 19:19:44 +02:00
2 changed files with 72 additions and 66 deletions
+11 -5
View File
@@ -136,14 +136,14 @@ namespace MP_IO.Controllers
}
/// <summary>
/// Chiude PODL --&gt; 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
/// </summary>
/// <param name="id">id macchina</param>
/// <param name="idxOdl">idx dell'ODL da chiudere</param>
/// <returns>bool esecuzione</returns>
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
/// </summary>
/// <param name="id">codice articolo, se vuoto --&gt; non fa nulla</param>
/// <param name="id">codice articolo, se vuoto --> non fa nulla</param>
/// <returns>Json contenente lista oggetti DOSSIER serializzati</returns>
public string getLastDossArt(string id)
{
@@ -1012,7 +1018,7 @@ namespace MP_IO.Controllers
///
/// GET: IOB/getLastDossArt/cod_articolo
/// </summary>
/// <param name="id">codice articolo, se vuoto --&gt; non fa nulla</param>
/// <param name="id">codice articolo, se vuoto --> non fa nulla</param>
/// <returns>Json contenente lista oggetti DOSSIER serializzati</returns>
public string getLastDossByMacc(string id)
{
+61 -61
View File
@@ -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;
}
/// <summary>
/// Effettua calcolo data-ora di riferimento per il server a poartire da
/// </summary>
/// <param name="dtEve"></param>
/// <param name="dtCurr"></param>
/// <returns></returns>
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;
}
/// <summary>
/// restituisce il TempoCiclo effettivo (tecnico) della macchina
/// </summary>
@@ -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);
}
/// <summary>
/// Effettua calcolo data-ora di riferimento per il server a poartire da
/// </summary>
/// <param name="dtEve"></param>
/// <param name="dtCurr"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Recupero dati stato prod da macchina...
/// </summary>