Merge branch 'release/AddDpTask2Exe_01'

This commit is contained in:
Samuele Locatelli
2025-08-01 18:24:16 +02:00
5 changed files with 651 additions and 637 deletions
+26 -9
View File
@@ -54,6 +54,11 @@ namespace MP_IO.Controllers
public string addTask2Exe(string id, string taskName, string taskVal)
{
string answ = "";
// attenzione! poiché nell'URL il carattere "#" viene filtrato ci aspettiamo il carattere "|" che poi trasformiamo ora in "#"
if (!string.IsNullOrEmpty(id))
{
id = id.Replace("|", "#");
}
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
MapoDb.MapoDb connDb = new MapoDb.MapoDb();
DataLayer DataLayerObj = new DataLayer();
@@ -465,7 +470,7 @@ namespace MP_IO.Controllers
public string flog(string id, string flux, string valore, string dtEve, string dtCurr, string cnt)
{
return flog(id, flux, valore, dtEve, dtCurr, cnt, "false");
}
}
#endif
/// <summary>
@@ -539,7 +544,7 @@ namespace MP_IO.Controllers
answ = processFLogJson(id, false, insDone, answ, content);
}
return answ;
}
}
#endif
/// <summary>
@@ -608,7 +613,7 @@ namespace MP_IO.Controllers
// carattere "|" che poi trasformiamo ora in "#"
id = id.Replace("|", "#");
DataLayer DataLayerObj = new DataLayer();
return DataLayerObj.AutoStartOdl(id, true, true, 100, "");
return DataLayerObj.AutoStartOdl(id, true, true, 100, 0, "");
}
/// <summary>
@@ -622,9 +627,11 @@ namespace MP_IO.Controllers
/// <param name="doConfirm"></param>
/// <param name="qtyFromLast"></param>
/// <param name="roundStep"></param>
/// <param name="roundStep"></param>
/// <param name="keyRichiesta">Cod esterno da legare all'ODL x tracciare lotti prod</param>
/// <param name="matrOpr">matricola operatore che effettua la fuzione (default = 0)</param>
/// <returns>Esito chiamata (OK/vuoto)</returns>
public string forceSplitOdlFull(string id, bool doConfirm, bool qtyFromLast, int? roundStep, string keyRichiesta = "")
public string forceSplitOdlFull(string id, bool doConfirm, bool qtyFromLast, int? roundStep, string keyRichiesta = "", int matrOpr = 0)
{
// attenzione! poiché nell'URL il carattere "#" viene filtrato ci aspettiamo il
// carattere "|" che poi trasformiamo ora in "#"
@@ -634,7 +641,7 @@ namespace MP_IO.Controllers
{
roundStep = 100;
}
return DataLayerObj.AutoStartOdl(id, doConfirm, qtyFromLast, (int)roundStep, keyRichiesta);
return DataLayerObj.AutoStartOdl(id, doConfirm, qtyFromLast, (int)roundStep, matrOpr, keyRichiesta);
}
/// <summary>
@@ -649,14 +656,15 @@ namespace MP_IO.Controllers
/// <param name="idxPODL">idx del PDL da avviare</param>
/// <param name="dtEve">data-ora di avvio (opzionale)</param>
/// <param name="dtCurr">data-ora attuale (opzionale)</param>
/// <param name="matrOpr">matricola operatore (default 0)</param>
/// <returns>Esito chiamata (OK/vuoto)</returns>
public string forceStartPOdl(string id, int idxPODL, string dtEve = "", string dtCurr = "")
public string forceStartPOdl(string id, int idxPODL, string dtEve = "", string dtCurr = "", int matrOpr = 0)
{
// attenzione! poiché nell'URL il carattere "#" viene filtrato ci aspettiamo il
// carattere "|" che poi trasformiamo ora in "#"
id = id.Replace("|", "#");
DataLayer DataLayerObj = new DataLayer();
string answ = DataLayerObj.ForceStartPOdl(id, idxPODL, true, dtEve, dtCurr);
string answ = DataLayerObj.ForceStartPOdl(id, idxPODL, true, matrOpr, dtEve, dtCurr);
return answ;
}
@@ -1505,6 +1513,11 @@ namespace MP_IO.Controllers
/// <returns>Json contenente 1..n task da eseguire</returns>
public string getTask2Exe(string id)
{
// attenzione! poiché nell'URL il carattere "#" viene filtrato ci aspettiamo il carattere "|" che poi trasformiamo ora in "#"
if (!string.IsNullOrEmpty(id))
{
id = id.Replace("|", "#");
}
string answ = "";
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
MapoDb.MapoDb connDb = new MapoDb.MapoDb();
@@ -1804,6 +1817,11 @@ namespace MP_IO.Controllers
public string remTask2Exe(string id, string taskName)
{
string answ = "";
// attenzione! poiché nell'URL il carattere "#" viene filtrato ci aspettiamo il carattere "|" che poi trasformiamo ora in "#"
if (!string.IsNullOrEmpty(id))
{
id = id.Replace("|", "#");
}
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
MapoDb.MapoDb connDb = new MapoDb.MapoDb();
DataLayer DataLayerObj = new DataLayer();
@@ -1915,7 +1933,6 @@ namespace MP_IO.Controllers
System.Web.HttpContext.Current.Request.InputStream.Position = 0;
if (content != null)
{
try
{
DataLayer DataLayerObj = new DataLayer();
@@ -2064,7 +2081,7 @@ namespace MP_IO.Controllers
/// <summary>
/// SALVA in blocco un incremento pezzi x macchina restituendo il valore appena inviato o,
/// se mancasse chaive redis, del valore da DB
/// se mancasse chiave REDIS, del valore da DB
///
/// GET: IOB/savePzCountIncAtDate/5?qty=10&dtEve=20230323151100000&dtCurr=20230323221100000
/// </summary>
+1 -1
View File
@@ -24,7 +24,7 @@
<!--altri parametri-->
<add key="CodModulo" value="MoonPro" />
<add key="cacheOnRedis" value="true" />
<add key="maxAgeAppConf_min" value="5" />
<add key="maxAgeAppConf_min" value="30" />
<add key="_logDir" value="~/logs/" />
<add key="logMitigSec" value="30" />
<add key="vetoRedisCheckLimit" value="100" />
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -437,11 +437,11 @@ namespace MoonProTablet.WebUserControls
if (confRett)
{
// confermo al netto dei pezzi lasciati...
fatto = DataLayerObj.confermaProdMacchinaFull(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), numPzConfermati - numPzLasciati, numPzLasciati, numPzScarto2Rec, dtReqUpdate);
fatto = DataLayerObj.confermaProdMacchinaFull(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), numPzConfermati - numPzLasciati, numPzLasciati, numPzScarto2Rec, dtReqUpdate, DataLayerObj.MatrOpr);
}
else
{
fatto = DataLayerObj.confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), numPzConfermati, numPzScarto2Rec, dtReqUpdate);
fatto = DataLayerObj.confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), numPzConfermati, numPzScarto2Rec, dtReqUpdate, DataLayerObj.MatrOpr);
}
return fatto;
}
+51 -54
View File
@@ -20,9 +20,13 @@ namespace MapoDb
/// </summary>
public class DataLayer
{
#region Public Fields
/// <summary>
/// Valori config da tabella corrente
/// </summary>
public DS_Utility.ConfigDataTable ListConfig = new DS_Utility.ConfigDataTable();
/// <summary>
/// Oggetto MapoDb impiegato da DataLayer x i suoi accessi ai dati
/// </summary>
@@ -114,11 +118,6 @@ namespace MapoDb
// init config..
ListConfig = taConfig.GetData();
}
/// <summary>
/// Valori config da tabella corrente
/// </summary>
public DS_Utility.ConfigDataTable ListConfig = new DS_Utility.ConfigDataTable();
/// <summary>
/// Init class
@@ -274,6 +273,16 @@ namespace MapoDb
return mHash($"MachineConfFlux:{idxMacchina}");
}
/// <summary>
/// Hash dati di configurazione IOB in formato YAML x la macchina specificata
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
public static string ConfYamlHash(string idxMacchina)
{
return mHash($"IOB:{idxMacchina}:ConfYaml");
}
/// <summary>
/// Hash dati tabella AnagStati macchina
/// </summary>
@@ -470,15 +479,6 @@ namespace MapoDb
{
return mHash($"MemMap:{idxMacchina}");
}
/// <summary>
/// Hash dati di configurazione IOB in formato YAML x la macchina specificata
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
public static string ConfYamlHash(string idxMacchina)
{
return mHash($"IOB:{idxMacchina}:ConfYaml");
}
/// <summary>
/// Hash Redis contenente i dati MP di una specifico TYPE (es StatusMacchina,
@@ -739,12 +739,13 @@ namespace MapoDb
/// <param name="idxMacchina">macchina</param>
/// <param name="doConfirm">effettuare conferma qty</param>
/// <param name="qtyFromLast">imposta la qty prox ODL da ODL che si chiude</param>
/// <param name="matrOpr">matricola operatore</param>
/// <param name="roundStep">
/// STEP x cui arrotondare la quantità prox ODL (corrente come riferimento)
/// </param>
/// <param name="keyRichiesta">Cod ext da associare all'ODL</param>
/// <returns></returns>
public string AutoStartOdl(string idxMacchina, bool doConfirm, bool qtyFromLast, int roundStep = 100, string keyRichiesta = "")
public string AutoStartOdl(string idxMacchina, bool doConfirm, bool qtyFromLast, int matrOpr, int roundStep = 100, string keyRichiesta = "")
{
string answ = "KO";
DateTime adesso = DateTime.Now;
@@ -815,23 +816,23 @@ namespace MapoDb
if (confRett)
{
// confermo al netto dei pezzi lasciati...
fatto = confermaProdMacchinaFull(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, qtyScarto, adesso);
fatto = confermaProdMacchinaFull(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, qtyScarto, adesso, matrOpr);
if (memLayer.ML.CRB("SlaveConfirmPzProd"))
{
foreach (var machine in slaveList)
{
confermaProdMacchinaFull(machine.IdxMacchinaSlave, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, qtyScarto, adesso);
confermaProdMacchinaFull(machine.IdxMacchinaSlave, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, qtyScarto, adesso, matrOpr);
}
}
}
else
{
fatto = confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, qtyScarto, adesso);
fatto = confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, qtyScarto, adesso, matrOpr);
if (memLayer.ML.CRB("SlaveConfirmPzProd"))
{
foreach (var machine in slaveList)
{
confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, qtyScarto, adesso);
confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, qtyScarto, adesso, matrOpr);
}
}
}
@@ -1198,13 +1199,13 @@ namespace MapoDb
/// <param name="numPzScarto">qta pezzi SCARTO da confermare</param>
/// <param name="DataOraApp">DataOra in cui registrare approvazione</param>
/// <returns></returns>
public bool confermaProdMacchina(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzScarto, DateTime DataOraApp)
public bool confermaProdMacchina(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzScarto, DateTime DataOraApp, int matrOpr)
{
bool answ = false;
try
{
DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd = taPzProd2conf.GetData(idxMacchina.ToString())[0];
taPzProd2conf.stp_ConfermaProduzCompleta(idxMacchina, MatrOpr, rigaProd.DataFrom, DataOraApp, numPzConfermati, numPzScarto, modoConfProd, DataOraApp, true);
taPzProd2conf.stp_ConfermaProduzCompleta(idxMacchina, matrOpr, rigaProd.DataFrom, DataOraApp, numPzConfermati, numPzScarto, modoConfProd, DataOraApp, true);
// indico eseguito!
answ = true;
}
@@ -1228,13 +1229,13 @@ namespace MapoDb
/// <param name="numPzScarto">qta pezzi SCARTO da confermare</param>
/// <param name="DataOraApp">DataOra in cui registrare approvazione</param>
/// <returns></returns>
public bool confermaProdMacchinaFull(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzLasciati, int numPzScarto, DateTime DataOraApp)
public bool confermaProdMacchinaFull(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzLasciati, int numPzScarto, DateTime DataOraApp, int matrOpr)
{
bool answ = false;
try
{
DS_ProdTempi.stp_PzProd_getByMacchinaRow rigaProd = taPzProd2conf.GetData(idxMacchina.ToString())[0];
taPzProd2conf.stp_ConfermaProduzCompletaFull(idxMacchina, MatrOpr, rigaProd.DataFrom, DataOraApp, numPzConfermati, numPzLasciati, numPzScarto, modoConfProd, DataOraApp, true);
taPzProd2conf.stp_ConfermaProduzCompletaFull(idxMacchina, matrOpr, rigaProd.DataFrom, DataOraApp, numPzConfermati, numPzLasciati, numPzScarto, modoConfProd, DataOraApp, true);
// indico eseguito!
answ = true;
}
@@ -1748,10 +1749,11 @@ namespace MapoDb
/// <param name="idxMacchina">macchina</param>
/// <param name="idxPODL">IDX PODL da processare</param>
/// <param name="doConfirm">effettuare conferma qty</param>
/// <param name="matrOpr">effettuare conferma qty</param>
/// <param name="dtEve">data-ora di avvio (opzionale)</param>
/// <param name="dtCurr">data-ora attuale (opzionale)</param>
/// <returns></returns>
public string ForceStartPOdl(string idxMacchina, int idxPODL, bool doConfirm, string dtEve = "", string dtCurr = "")
public string ForceStartPOdl(string idxMacchina, int idxPODL, bool doConfirm, int matrOpr = 0, string dtEve = "", string dtCurr = "")
{
string answ = "KO";
int CurrProdStatus = 0;
@@ -1879,7 +1881,7 @@ namespace MapoDb
// eventuale chiusura vecchio ODL, 2 sec prima...
if (currODLData.Count > 0)
{
doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2));
doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2), matrOpr);
}
// avvio PODL: creo nuovo ODL da promessa ed associo
taODL.inizioSetupPromessa(idxPODL, MatrOpr, POdlRow.IdxMacchina, POdlRow.TCAssegnato, POdlRow.PzPallet, POdlRow.Note, dtEvent);
@@ -1895,7 +1897,7 @@ namespace MapoDb
// eventuale chiusura vecchio ODL
if (currODLData.Count > 0)
{
doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2));
doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2), matrOpr);
}
// 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);
@@ -1918,7 +1920,7 @@ namespace MapoDb
// eventuale chiusura vecchio ODL, 2 sec prima...
if (currODLData.Count > 0)
{
doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2));
doCloseCurrODL(idxMacchina, doConfirm, qtyConf, currODLData, dtEvent.AddSeconds(-2), matrOpr);
}
// avvio PODL: creo nuovo ODL da promessa ed associo
taODL.inizioSetupPromessa(idxPODL, MatrOpr, POdlRow.IdxMacchina, POdlRow.TCAssegnato, POdlRow.PzPallet, POdlRow.Note, dtEvent);
@@ -4094,6 +4096,24 @@ namespace MapoDb
return fatto;
}
/// <summary>
/// Salvataggio YAML completo di configurazione dell'IOB
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="iobConfFull"></param>
/// <returns></returns>
public bool setIobConfYaml(string idxMacchina, string iobConfFull)
{
bool answ = false;
// se ho un area memoria valida...
if (!string.IsNullOrEmpty(iobConfFull))
{
// salvo!
memLayer.ML.setRSV(ConfYamlHash(idxMacchina), iobConfFull);
}
return answ;
}
/// <summary>
/// Salvataggio della mappa di memoria dell'IOB x ulteriori impieghi
/// </summary>
@@ -4113,24 +4133,6 @@ namespace MapoDb
return answ;
}
/// <summary>
/// Salvataggio YAML completo di configurazione dell'IOB
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="iobConfFull"></param>
/// <returns></returns>
public bool setIobConfYaml(string idxMacchina, string iobConfFull)
{
bool answ = false;
// se ho un area memoria valida...
if (!string.IsNullOrEmpty(iobConfFull))
{
// salvo!
memLayer.ML.setRSV(ConfYamlHash(idxMacchina), iobConfFull);
}
return answ;
}
/// <summary>
/// Restituisce il valore booleano se la macchina sia abilitata all'inserimento COMPLETO nel
/// Signal Log
@@ -4649,7 +4651,7 @@ namespace MapoDb
}
}
private bool doCloseCurrODL(string idxMacchina, bool doConfirm, int qtyConf, DS_ProdTempi.ODLDataTable currODLData, DateTime dtEvento)
private bool doCloseCurrODL(string idxMacchina, bool doConfirm, int qtyConf, DS_ProdTempi.ODLDataTable currODLData, DateTime dtEvento, int matrOpr)
{
DateTime adesso = DateTime.Now;
bool fatto = false;
@@ -4661,9 +4663,6 @@ namespace MapoDb
inputComandoMapo resCmd = scriviRigaEventoBarcode(idxMacchina, idxEvento, currODLData[0].CodArticolo, "ODL-CLOSE-ATTR", 0, "", dtEvento, adesso);
if (doConfirm)
{
//// attendo 100 msec
//Thread.Sleep(100);
// modifico la dataEvento
dtEvento.AddMilliseconds(200);
// chiamo conferma produzione...
@@ -4675,11 +4674,11 @@ namespace MapoDb
if (confRett)
{
// confermo al netto dei pezzi lasciati...
fatto = confermaProdMacchinaFull(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, 0, dtEvento);
fatto = confermaProdMacchinaFull(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, 0, dtEvento, matrOpr);
}
else
{
fatto = confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, dtEvento);
fatto = confermaProdMacchina(idxMacchinaSel, memLayer.ML.CRI("modoConfProd"), qtyConf, 0, dtEvento, matrOpr);
}
if (!fatto)
{
@@ -4691,8 +4690,6 @@ namespace MapoDb
Log.Info($"Eccezione in doCloseCurrODL{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
}
}
//// attendo 100 msec
//Thread.Sleep(100);
dtEvento.AddMilliseconds(200);
// chiamo chiusura
MapoDbObj.taODL.forceClose(currODLData[0].IdxODL, idxMacchina, dtEvento);