-
-
-
-
-
- @*
+ }
+
+ @if (!inAttr && !showOdlDetail)
+ {
+
+
+
+ }
+
+ @if (showOdlDetail || inAttr)
+ {
+
-
+ }
+
+ @if (!inAttr)
+ {
+
+ @if (idxPOdlSel > 0)
+ {
+
+ }
+ else
+ {
+
+ }
+
+
+ }
+ @if (idxPOdlSel > 0 || inAttr)
+ {
+
+
+
+
+
+
+
+ }
+
+ @if (inAttr)
+ {
+
+
+
+ }
+ else
+ {
+ if (odlOk)
+ {
+
+
+
+
+
+
+ }
+ }
+ @if (!inAttr && enableFixSetup)
+ {
+
+
+
+ }
+
+
-
+
+
+ @*
+
+ @lblOut
+
+ }
+ }
}
\ No newline at end of file
diff --git a/MP-TAB-SERV/Components/OdlMan.razor.cs b/MP-TAB-SERV/Components/OdlMan.razor.cs
index 1bee710b..c166639a 100644
--- a/MP-TAB-SERV/Components/OdlMan.razor.cs
+++ b/MP-TAB-SERV/Components/OdlMan.razor.cs
@@ -1,4 +1,6 @@
using global::Microsoft.AspNetCore.Components;
+using Microsoft.JSInterop;
+using MP.Data;
using MP.Data.DatabaseModels;
using MP.Data.Objects;
using MP.Data.Services;
@@ -25,13 +27,8 @@ namespace MP_TAB_SERV.Components
#region Protected Fields
- protected bool enableRPO = true;
- protected bool forceCloseOdl = true;
-
protected PzProdModel? prodMacchina = null;
- protected int PzPallet = 1;
-
#endregion Protected Fields
#region Protected Properties
@@ -82,17 +79,29 @@ namespace MP_TAB_SERV.Components
}
}
+ [Inject]
+ protected IJSRuntime JSRuntime { get; set; } = null!;
+
protected List
ListODL { get; set; } = new List();
+ [Inject]
+ protected MailService MailServ { get; set; } = null!;
+
+ [Inject]
+ protected StatusData MDataService { get; set; } = null!;
+
[Inject]
protected MessageService MServ { get; set; } = null!;
+ [Inject]
+ protected NavigationManager NavMan { get; set; } = null!;
+
///
/// Verifica ODL OK (ovvero caricato x macchina...)
///
protected bool odlOk
{
- get => (RecMSE != null && RecMSE.IdxOdl > 0);
+ get => IdxOdl > 0;
}
protected bool ShowAll
@@ -122,6 +131,31 @@ namespace MP_TAB_SERV.Components
#region Protected Methods
+ ///
+ /// Gestione display avanzamento step
+ ///
+ ///
+ protected async Task advStep(int currStep)
+ {
+ currVal = currStep;
+ nextVal = currVal + 1;
+ await InvokeAsync(StateHasChanged);
+ }
+
+ protected async Task CheckAttr()
+ {
+ // verifico attrezzaggio su macchina corrente o se multi su parent
+ string idxMacc2check = isMulti ? IdxMaccParent : IdxMaccSel;
+ StatoMacchineModel rigaStato = TabDServ.StatoMacchina(idxMacc2check);
+ //calcolo stato attrezzaggio, hard coded!!!
+ inAttr = (rigaStato.IdxStato == 2);
+ // se in attr --> carico podlCurr...
+ if (inAttr && RecMSE != null)
+ {
+ await ReloadXDL(false);
+ }
+ }
+
///
/// Aggiorno...
///
@@ -140,7 +174,7 @@ namespace MP_TAB_SERV.Components
protected string getIdxMaccParent()
{
string answ = IdxMaccSel;
- // se � multi controllo
+ // se fosse multi controllo
if (isMulti)
{
// verifico se SIA una tavola (ha char "#")
@@ -154,72 +188,206 @@ namespace MP_TAB_SERV.Components
return answ;
}
- protected override async Task OnInitializedAsync()
- {
- //baseLang = SMServ.GetConf("baseLang");
- numDayOdl = SMServ.GetConfInt("numDaySelOdl");
- confRett = SMServ.GetConfBool("confRett");
- enableSplitODL = SMServ.GetConfBool("enableSplitODL");
- modoConfProd = SMServ.GetConfInt("modoConfProd");
- enableRPO = SMServ.GetConfBool("enableRPO");
- if (RecMSE != null)
- {
- IdxMaccSel = RecMSE.IdxMacchina;
- IdxMaccParent = getIdxMaccParent();
- await ReloadData(true);
- }
- checkAll();
- }
-
- protected override async Task OnParametersSetAsync()
- {
- isMulti = SMServ.DictMacchMulti[RecMSE?.IdxMacchina] == 1;
- await ReloadData(false);
- }
-
- protected void SaveTCRich(decimal newTCRich)
- {
- tcRichAttr = newTCRich;
- }
-
- protected async Task SetMacc(string selIdxMacc)
+ ///
+ /// Effettua ripresa ODL su tavola
+ ///
+ ///
+ ///
+ protected async Task OdlReopenTav()
{
+ MaxVal = 3;
+ int currStep = 0;
+ await advStep(currStep);
isProcessing = true;
- await Task.Delay(10);
- IdxMaccSel = selIdxMacc;
- await DoUpdate();
+ // chiamo stored x riprendere ODL (toglie data chiusura...)
+ var rowRes = TabDServ.OdlReopenOdlMacc(IdxMaccSel);
+ if (rowRes != null && rowRes.IdxOdl > 0)
+ {
+ // messaggio utente
+ string evText = "Registrato riapertura ODL {0} | art {1}";
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine(String.Format(evText, rowRes.IdxOdl, rowRes.CodArticolo));
+ lblOut = sb.ToString();
+ }
+ await advStep(currStep++);
+ // update button x setup da altra tavola...
+ checkAll();
+ // faccio refresh e riporto
+ await RefreshData();
+ await CheckAttr();
+ await advStep(currStep++);
+ // chiudo update...
isProcessing = false;
- await Task.Delay(10);
+ }
+
+ ///
+ /// Effettua split ODL da ALTRA tavola su tav corrente
+ ///
+ ///
+ ///
+ protected async Task OdlSetSameAsOtherTav()
+ {
+ MaxVal = 3;
+ int currStep = 0;
+ await advStep(currStep);
+ isProcessing = true;
+ // se ho ODL su altra macchina...
+ if (IdxOdlAltra > 0)
+ {
+ await TabDServ.OdlDividiDaAltraTavola(IdxOdlAltra, MatrOpr, IdxMaccSel);
+ // messaggio utente
+ string evText = "Registrata inizio attrezzaggio da split ODL {0} (come da altra tavola)";
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine(String.Format(evText, IdxOdlAltra));
+ lblOut = sb.ToString();
+ }
+ await advStep(currStep++);
+ // update button x setup da altra tavola...
+ checkAll();
+ // faccio refresh e riporto
+ await RefreshData();
+ await CheckAttr();
+ await advStep(currStep++);
+ // chiudo update...
+ isProcessing = false;
+ }
+
+ ///
+ /// Registrazione Fine Setup / Inizio Produzione
+ ///
+ ///
+ ///
+ protected async Task OdlSetupEnd()
+ {
+ TimeSpan estDur = TimeSpan.FromMinutes((double)tcRichAttr * currPodl.NumPezzi);
+ string stima = estDur.TotalHours > 1 ? $"{estDur.TotalHours:N1} ore" : $"{estDur.TotalMinutes:N1} min";
+ if (!await JSRuntime.InvokeAsync("confirm", $"PODL: {currPodl.IdxPromessa}{Environment.NewLine}Art: [{currPodl.CodArticolo}] {currPodl.DescArticolo}{Environment.NewLine}Pezzi: {currPodl.NumPezzi:N0} * TCiclo: {tcRichAttr:N3}min{Environment.NewLine}Tempo stimato: {stima}{Environment.NewLine}{Environment.NewLine}Confermi la chiusura della fase di attrezzaggio?"))
+ return;
+
+ // preparo gestione progress display
+ MaxVal = 8;
+ int currStep = 0;
+ await advStep(currStep);
+ isProcessing = true;
+ await confermaProdOdl(true);
+ await advStep(currStep++);
+ // se vedesse TCRich a zero lo reimposta a quello assegnato...
+ if (tcRichAttr == 0)
+ {
+ tcRichAttr = currPodl.Tcassegnato;
+ }
+ // leggo idxOdl da ultimo odl attivo x macchina
+ var currOdl = await TabDServ.OdlCurrByMacc(IdxMaccSel, false);
+ int idxODLStart = currOdl.IdxOdl;
+ int idxEvento = 1; // !!!HARD CODED
+
+ // aggiorno note e tempo setup
+ await TabDServ.OdlUpdate(idxODLStart, MatrOpr, tcRichAttr, PzPallet, noteAttr);
+ // controllo se TC Assegnato != TCRichiesto allora invio email x verifiche...
+ if (currOdl.Tcassegnato != tcRichAttr)
+ {
+ // invio email!
+ await SendWarnTcChangeReq(idxODLStart, currOdl.Tcassegnato, tcRichAttr);
+ }
+ await advStep(currStep++);
+
+ // processo chiusura setup
+ string evText = "Registrata inizio produzione per ODL {0}";
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine(String.Format(evText, idxODLStart));
+ await processaEvento(IdxMaccSel, idxEvento, sb.ToString(), idxODLStart);
+ // indico INIZIO SETUP su REDIS come EXE della macchina...
+ string ts = string.Format("{0:yyMMdd}T{0:HHmmss.fff}Z", DateTime.Now);
+ TabDServ.addTask4Machine(IdxMaccSel, taskType.stopSetup, $"TS:{ts}|MATR:{MatrOpr}|ODL:{idxODLStart}");
+ await advStep(currStep++);
+ // se è multi processo chiusura setup x altra tavola...
+ if (isMulti)
+ {
+ sb.AppendLine("---");
+ var tabOdlAltra = await TabDServ.OdlCurrByMacc(idxMaccAltraTav, true);
+ int idxOdlAltra = tabOdlAltra.IdxOdl;
+ sb.AppendLine(String.Format(evText, idxOdlAltra));
+ await processaEvento(idxMaccAltraTav, idxEvento, String.Format(evText, idxOdlAltra), idxOdlAltra);
+ // invio su seconda tavola
+ TabDServ.addTask4Machine(idxMaccAltraTav, taskType.stopSetup, $"TS:{ts}|MATR: {MatrOpr}| Master Machine: {IdxMaccSel}");
+ }
+ await advStep(currStep++);
+ // se è master --> chiamo update child!
+ if (isMaster)
+ {
+ // invio eventi ad IOB slave...
+ var slaveList = SMServ.ListM2S
+ .Where(x => x.IdxMacchina.Equals(IdxMaccSel, StringComparison.InvariantCultureIgnoreCase))
+ .ToList();
+ foreach (var machine in slaveList)
+ {
+ // invio chiusura attrezzaggio
+ ts = string.Format("{0:yyMMdd}T{0:HHmmss.fff}Z", DateTime.Now);
+ string outData = $"TS:{ts}|MATR:{MatrOpr}|ODL:{idxODLStart}";
+ await processaEvento(machine.IdxMacchinaSlave, idxEvento, sb.ToString(), idxODLStart);
+ TabDServ.addTask4Machine(machine.IdxMacchinaSlave, taskType.fixStopSetup, outData);
+ }
+
+ // hard coded 60gg last
+ await TabDServ.OdlFixMachineSlave(IdxMaccSel, 60, 1);
+ }
+ await advStep(currStep++);
+ // se c'è gestione SchedaTecnica --> chiamo procedura update x lotti
+ if (enableSchedaTecnica)
+ {
+ await TabDServ.ElencoLottiUpsertByOdl(idxODLStart, true);
+ }
+ await advStep(currStep++);
+
+ // riporto stringa
+ lblOut = sb.ToString().Replace("---", "
");
+ // update buttons...
+ checkAll();
+ // reset vari
+ IdxPOdlSel = 0;
+ inAttr = false;
+ IdxPOdlSel = 0;
+ RecMSE = null;
+ await advStep(currStep++);
+ // faccio refresh e riporto
+ await RefreshData();
+ await CheckAttr();
+ // chiudo update...
+ isProcessing = false;
+ //await InvokeAsync(StateHasChanged);
+ // qui rimando a pag principale...
+ NavMan.NavigateTo("status-map", true);
}
///
/// Dichiarazione inizio attrezzaggio PODL indicato
///
///
- protected async Task StartSetup()
+ protected async Task OdlSetupStart()
{
- /***************************************************
- * comprende gestione machineSlave x fix ODL master --> slave
- *
- ***************************************************/
+ TimeSpan estDur = TimeSpan.FromMinutes((double)tcRichAttr * currPodl.NumPezzi);
+ string stima = estDur.TotalHours > 1 ? $"{estDur.TotalHours:N1} ore" : $"{estDur.TotalMinutes:N1} min";
+ if (!await JSRuntime.InvokeAsync("confirm", $"PODL: {currPodl.IdxPromessa}{Environment.NewLine}Art: [{currPodl.CodArticolo}] {currPodl.DescArticolo}{Environment.NewLine}Pezzi: {currPodl.NumPezzi:N0} * TCiclo: {tcRichAttr:N3}min{Environment.NewLine}Tempo stimato: {stima}{Environment.NewLine}{Environment.NewLine}Confermi inizio della fase di attrezzaggio?"))
+ return;
- bool inAttr = false;
+ //if (!await JSRuntime.InvokeAsync("confirm", $"Confermi inizio della fase di attrezzaggio per l'articolo [{currPodl.CodArticolo}] {currPodl.DescArticolo}?"))
+ // return;
+ /***************************************************
+ * comprende gestione machineSlave x fix ODL master --> slave
+ *
+ ***************************************************/
+
+ // preparo gestione progress display
+ MaxVal = 11;
+ int currStep = 0;
+ await advStep(currStep);
+ isProcessing = true;
DateTime adesso = DateTime.Now;
- // se fosse multi mi chiedo se sia DAVVERO in attrezzaggio...
- if (isMulti)
- {
- try
- {
- // controllo se NON SONO gi� in attrezzaggio...
- var rigaStato = TabDServ.StatoMacchina(IdxMaccParent);
- inAttr = (rigaStato.IdxStato == 2);
- }
- catch
- { }
- }
+ await advStep(currStep++);
// proseguo
int idxODL_curr = 0;
await confermaProdOdl(false);
+ await advStep(currStep++);
if (IdxPOdlSel > 0)
{
// se vedesse TCRich a zero lo reimposta a quello assegnato...
@@ -227,7 +395,7 @@ namespace MP_TAB_SERV.Components
{
tcRichAttr = currPodl.Tcassegnato;
}
- if (enableSplitODL)
+ if (enableSplitODL && !forceCloseOdl)
{
// splitto VECCHIO ODL (se fosse rimasto qualcosa da produrre e ne sia rimasto uno.......)
try
@@ -250,6 +418,7 @@ namespace MP_TAB_SERV.Components
Log.Error($"Error StartSetup.01{Environment.NewLine}{exc}");
}
}
+ await advStep(currStep++);
// 2018.07.24 verifico se devo lavorare come ODL classico o come RPO (Richiesta /
// Promessa / ODL)
if (enableRPO)
@@ -268,12 +437,14 @@ namespace MP_TAB_SERV.Components
// salvo ODL Current
idxODL_curr = IdxPOdlSel;
}
+ await advStep(currStep++);
// process evento
int idxEvento = 2; // !!!HARD CODED
string evText = "Registrato inizio attrezzaggio per ODL {0}";
StringBuilder sb = new StringBuilder();
sb.AppendLine(String.Format(evText, idxODL_curr));
- processaEvento(IdxMaccSel, idxEvento, sb.ToString(), idxODL_curr);
+ await processaEvento(IdxMaccSel, idxEvento, sb.ToString(), idxODL_curr);
+ await advStep(currStep++);
// indico INIZIO SETUP su REDIS come EXE della macchina...
string ts = string.Format("{0:yyMMdd}T{0:HHmmss.fff}Z", DateTime.Now);
string outData = $"TS:{ts}|MATR:{MatrOpr}|ODL:{idxODL_curr}";
@@ -293,12 +464,13 @@ namespace MP_TAB_SERV.Components
TabDServ.MachineParamUpdate(IdxMaccSel, "setComm", setCommVal);
TabDServ.MachineParamUpdate(IdxMaccSel, "setPzComm", setPzCommVal);
TabDServ.addTask4Machine(IdxMaccSel, taskType.setParameter, "ForceUpdate");
+ await advStep(currStep++);
// li aggiungo ANCHE sui PLC slave se ci sono...
if (isMaster)
{
// calcolo gli slave...
var slaveList = SMServ.ListM2S
- .Where(x => x.IdxMacchina.Equals(RecMSE?.IdxMacchina, StringComparison.InvariantCultureIgnoreCase))
+ .Where(x => x.IdxMacchina.Equals(IdxMaccSel, StringComparison.InvariantCultureIgnoreCase))
.ToList();
foreach (var machine in slaveList)
{
@@ -314,6 +486,7 @@ namespace MP_TAB_SERV.Components
TabDServ.addTask4Machine(machine.IdxMacchinaSlave, taskType.setParameter, "ForceUpdate");
}
}
+ await advStep(currStep++);
}
catch (Exception exc)
{
@@ -350,18 +523,19 @@ namespace MP_TAB_SERV.Components
// update buttons...
checkAll();
}
+ await advStep(currStep++);
// se fosse master --> chiamo update child!
if (isMaster)
{
// hard coded 60gg last
await TabDServ.OdlFixMachineSlave(IdxMaccSel, 60, 1);
}
+ await advStep(currStep++);
// resetto contapezzi redis...
await TabDServ.saveCounter(IdxMaccSel, "0");
// imposto ODL su redis...
TabDServ.saveCurrODL(IdxMaccSel, idxODL_curr);
- // salvo odl selezionato
- idxOdl = idxODL_curr;
+ await advStep(currStep++);
}
else
{
@@ -369,20 +543,266 @@ namespace MP_TAB_SERV.Components
}
// refresh finale
+ var tmpTCR = tcRichAttr;
checkBtnStatus();
fixSplitBtn(false);
-#if false
- // sollevo evento!
- if (eh_reqUpdate != null)
- {
- eh_reqUpdate(this, new EventArgs());
- }
-#endif
+ // faccio refresh e riporto
+ await TabDServ.FlushCache("ODL");
+ IdxPOdlSel = 0;
+ RecMSE = null;
+ await RefreshData();
+ await CheckAttr();
+ inAttr = true;
+ tcRichAttr = tmpTCR;
+ isProcessing = false;
+ await InvokeAsync(StateHasChanged);
}
- protected void togOdlDetail()
+ protected override async Task OnInitializedAsync()
+ {
+ //baseLang = SMServ.GetConf("baseLang");
+ numDayOdl = SMServ.GetConfInt("numDaySelOdl");
+ confRett = SMServ.GetConfBool("confRett");
+ enableSplitODL = SMServ.GetConfBool("enableSplitODL");
+ modoConfProd = SMServ.GetConfInt("modoConfProd");
+ enableRPO = SMServ.GetConfBool("enableRPO");
+ enableSchedaTecnica = SMServ.GetConfBool("enableSchedaTecnica");
+ enableFixSetup = SMServ.GetConfBool("OptEnableFixSetup");
+ showSplitOdlOnTav = SMServ.GetConfBool("showSplitOdlOnTav");
+ showReopenOdlTav = SMServ.GetConfBool("showReopenOdlTav");
+ gPeriodReopenOdlTav = SMServ.GetConfInt("gPeriodReopenOdlTav");
+ string rawEmailDest = SMServ.GetConf("_adminEmail");
+ emailAdmDest = rawEmailDest.Split(',').ToList();
+ if (RecMSE != null)
+ {
+ IdxMaccSel = RecMSE.IdxMacchina;
+ IdxMaccParent = getIdxMaccParent();
+ // verifica stato inAttr
+ await CheckAttr();
+ await ReloadData(true);
+ }
+ checkAll();
+ }
+
+ protected override async Task OnParametersSetAsync()
+ {
+ isMulti = SMServ.DictMacchMulti[RecMSE?.IdxMacchina] == 1;
+ await ReloadData(false);
+ }
+
+ protected async Task ProdEnd()
+ {
+ if (!await JSRuntime.InvokeAsync("confirm", $"Confermi fine produzione?"))
+ return;
+
+ // preparo gestione progress display
+ MaxVal = 7;
+ isProcessing = true;
+ int currStep = 0;
+ await advStep(currStep);
+ // leggo idxOdl da ultimo odl attivo x macchina
+ var currOdl = await TabDServ.OdlCurrByMacc(IdxMaccSel, false);
+ int idxODLCurr = currOdl.IdxOdl;
+ int idxEvento = 7; // !!!HARD CODED
+ // confermo prod vecchio ODL
+ await confermaProdOdl(false);
+ await advStep(currStep++);
+
+ // se chk flaggato ovvero richiesta di chiudere ODL procedo come prima (chiudendo ODL
+ // senza averne altri...)
+ if (forceCloseOdl)
+ {
+ // aggiungo try/catch x capire se sia qui che si "impasta" in chiusura ODL
+ try
+ {
+ // processo x macchina selezionata
+ await TabDServ.OdlFineProd(idxODLCurr, IdxMaccSel);
+ string evText = "Registrata fine produzione per ODL {0}";
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine(String.Format(evText, idxODLCurr));
+ await processaEvento(IdxMaccSel, idxEvento, sb.ToString(), idxODLCurr);
+ await advStep(currStep++);
+ // se è multi processo ANCHE x altra tavola...
+ if (isMulti)
+ {
+ sb.AppendLine("---");
+ var tabOdlAltra = await TabDServ.OdlCurrByMacc(idxMaccAltraTav, true);
+ int idxOdlAltra = tabOdlAltra.IdxOdl;
+ await TabDServ.OdlFineProd(idxOdlAltra, idxMaccAltraTav);
+ sb.AppendLine(String.Format(evText, idxOdlAltra));
+ await processaEvento(idxMaccAltraTav, idxEvento, String.Format(evText, idxOdlAltra), idxOdlAltra);
+ }
+ await advStep(currStep++);
+ // se è master --> chiamo update child!
+ if (isMaster)
+ {
+ // hard coded 60gg last
+ await TabDServ.OdlFixMachineSlave(IdxMaccSel, 60, 1);
+ }
+ await advStep(currStep++);
+ // riporto stringa
+ lblOut = sb.ToString().Replace("---", "
");
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione in operazione chiusura ODL!{Environment.NewLine}{exc}");
+ // navigo!
+ NavMan.NavigateTo($"machine-detail");
+ }
+ }
+ // altrimenti split ODL x completare IN FUTURO la produzione...
+ else
+ {
+ try
+ {
+ // effettuo split su nuovo ODL
+ await TabDServ.OdlSplit(idxODLCurr, MatrOpr, IdxMaccSel, currOdl.Tcassegnato, PzPallet, $"Fine Produzione, Sospensione ODL {idxODLCurr}, generato residuo con pari TCiclo: {currOdl.Tcassegnato}", false, 0);
+ // processo chiusura setup
+ await processaEvento(IdxMaccSel, idxEvento, $"Registrata fine produzione per ODL {idxODLCurr}, nuovo ODL per quantità residua", idxODLCurr);
+
+ await advStep(currStep++);
+ // se è multi processo ANCHE x altra tavola...
+ if (isMulti)
+ {
+ var tabOdlAltra = await TabDServ.OdlCurrByMacc(idxMaccAltraTav, true);
+ int idxOdlAltra = tabOdlAltra.IdxOdl;
+ // effettuo split su nuovo ODL
+ await TabDServ.OdlSplit(idxOdlAltra, MatrOpr, idxMaccAltraTav, tabOdlAltra.Tcassegnato, PzPallet, $"Fine Produzione, Sospensione ODL {idxOdlAltra}, generato residuo con pari TCiclo: {tabOdlAltra.Tcassegnato}", false, 0);
+ // processo chiusura setup
+ await processaEvento(idxMaccAltraTav, idxEvento, $"Registrata fine produzione per ODL {idxOdlAltra}, nuovo ODL per quantità residua", idxOdlAltra);
+ }
+ await advStep(currStep++);
+ // se è master --> chiamo update child!
+ if (isMaster)
+ {
+ // hard coded 60gg last
+ await TabDServ.OdlFixMachineSlave(IdxMaccSel, 60, 1);
+ }
+ // sistemo buttons!
+ fixSplitBtn(false);
+ await advStep(currStep++);
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione in operazione Chiusura + Split ODL su nuovo! {Environment.NewLine}{exc}");
+ // navigo!
+ NavMan.NavigateTo($"machine-detail");
+ }
+ }
+ await advStep(currStep++);
+ // faccio refresh e riporto
+ IdxPOdlSel = 0;
+ RecMSE = null;
+ currOdl = new ODLExpModel();
+ inAttr = false;
+ IdxPOdlSel = 0;
+ forceCloseOdl = true;
+ //await Task.Delay(250);
+ await RefreshData();
+ await CheckAttr();
+ await advStep(currStep++);
+ isProcessing = false;
+ await InvokeAsync(StateHasChanged);
+ //NavMan.NavigateTo(NavMan.Uri, true);
+ }
+
+ protected async Task RefreshData()
+ {
+ // refresh tabella dati tablet...
+ RecMSE = null;
+ // rileggo e salvo..
+ var ListMSE = await MDataService.MseGetAll(true);
+ if (ListMSE != null)
+ {
+ // salvo in LocalStorage...
+ await MServ.SaveMse(ListMSE);
+ // aggiorno MSE attuale
+ RecMSE = ListMSE.Find(x => x.IdxMacchina == IdxMaccSel);
+ await E_Updated.InvokeAsync(ListMSE);
+ }
+ // update dati liste ODL
+ await ReloadData(true);
+ }
+
+ protected void SaveTCRich(decimal newTCRich)
+ {
+ tcRichAttr = newTCRich;
+ }
+
+ protected async Task SendFixEndSetup()
+ {
+ if (!await JSRuntime.InvokeAsync("confirm", $"Confermi invio FIX chiusura atrtezzaggio ad impianto?"))
+ return;
+
+ string ts = string.Format("{0:yyMMdd}T{0:HHmmss.fff}Z", DateTime.Now);
+ string outData = $"TS:{ts}|MATR:{MatrOpr}|ODL:{IdxOdl}";
+ TabDServ.addTask4Machine(IdxMaccSel, taskType.fixStopSetup, outData);
+ outData = "Inserita richiesta invio Fix chiusura attrezzaggio " + outData;
+ lblOut = outData;
+ // se è master --> chiamo update child!
+ if (isMaster)
+ {
+ // invio eventi ad IOB slave...
+ var slaveList = SMServ.ListM2S
+ .Where(x => x.IdxMacchina.Equals(IdxMaccSel, StringComparison.InvariantCultureIgnoreCase))
+ .ToList();
+ foreach (var machine in slaveList)
+ {
+ // invio chiusura attrezzaggio
+ outData = $"TS:{ts}|MATR:{MatrOpr}|ODL:{IdxOdl}|master machine:{IdxMaccSel}";
+ TabDServ.addTask4Machine(machine.IdxMacchinaSlave, taskType.fixStopSetup, outData);
+ }
+ }
+ }
+
+ [Parameter]
+ public EventCallback E_MachSel { get; set; }
+
+ protected async Task SendWarnTcChangeReq(int idxOdl, decimal tcAss, decimal tcRich)
+ {
+ // carico altri parametri email...
+ string oggetto = SMServ.GetConf("oggettoChgTc");
+ string corpoChgTc = SMServ.GetConf("corpoChgTc");
+ string mittente = SMServ.GetConf("_fromEmail");
+ string baseUrlAdmin = SMServ.GetConf("baseUrlAdmin");
+ string pageUrlApprODL = SMServ.GetConf("pageUrlApprODL");
+ string pageUrl = $"{baseUrlAdmin}{pageUrlApprODL}";
+ string corpo = $"ODL: {idxOdl} | TC Assegnato: {tcAss:N3} | TC Rich: {tcRich}{Environment.NewLine}{Environment.NewLine}";
+ corpo += string.Format(corpoChgTc, Environment.NewLine, pageUrl);
+ corpo = corpo.Replace($"{Environment.NewLine}", "
");
+ MailKitMailData mData = new MailKitMailData()
+ {
+ From = mittente,
+ To = emailAdmDest,
+ Subject = oggetto,
+ Body = corpo
+ };
+ bool done = await MailServ.SendAsync(mData);
+ if (done)
+ {
+ Log.Info($"Inviata email notifica TC da approvare per ODL {idxOdl} inviato a {string.Join(",", emailAdmDest)}");
+ }
+ else
+ {
+ Log.Error($"Errore in invio email notifica TC da approvare per ODL {idxOdl} | tentato invio a {string.Join(",", emailAdmDest)}");
+ }
+ }
+
+ protected async Task SetMacc(string selIdxMacc)
+ {
+ IdxMaccSel = selIdxMacc;
+ await DoUpdate();
+ await E_MachSel.InvokeAsync(selIdxMacc);
+ }
+
+ protected async Task ToggleOdlDetail()
{
showOdlDetail = !showOdlDetail;
+ // se devo mostrare, carico dati ODL!
+ if (showOdlDetail)
+ {
+ await ReloadXDL(true);
+ }
}
protected string Traduci(string lemma)
@@ -400,15 +820,29 @@ namespace MP_TAB_SERV.Components
private bool confRett = true;
+ private double currVal = 0;
+
+ private List emailAdmDest = new List();
+
+ private bool enableFixSetup = false;
+
+ private bool enableRPO = true;
+
+ private bool enableSchedaTecnica = false;
+
private bool enableSplitODL = false;
+ private int expTimeMsec = 500;
+
+ private bool forceCloseOdl = true;
+
+ private int gPeriodReopenOdlTav = 1;
+
private string IdxMaccSel = "";
- private int idxOdl = 0;
-
private int idxPOdlSel = 0;
- private bool isInAttr = false;
+ private bool inAttr = false;
private bool isInProd = false;
@@ -424,16 +858,26 @@ namespace MP_TAB_SERV.Components
private string lblOut = "";
+ private int MaxVal = 10;
+
private int modoConfProd = 0;
+ private double nextVal = 0;
+
private string noteAttr = "";
private int numDayOdl = 5;
+ private int PzPallet = 1;
+
private bool showAll = false;
private bool showOdlDetail = false;
+ private bool showReopenOdlTav = false;
+
+ private bool showSplitOdlOnTav = false;
+
private decimal tcRichAttr = 1;
#endregion Private Fields
@@ -448,18 +892,67 @@ namespace MP_TAB_SERV.Components
set { MServ.UserPrefGet("Lang"); }
}
+ private string cssDetailOdl
+ {
+ get => IdxPOdlSel > 0 ? "bg-primary text-light" : "bg-warning";
+ }
+
+ private ODLExpModel currOdl { get; set; } = new ODLExpModel();
+
private PODLExpModel currPodl { get; set; } = new PODLExpModel();
+ ///
+ /// Verifica se l'ALTRA macchina NON abbia ODL valido (== 0)
+ ///
+ private bool emptyOdlAltraMacc
+ {
+ get => IdxOdlAltra == 0;
+ }
+
+ ///
+ /// Verifica se la macchina NON abbia ODL valido (== 0)
+ ///
+ private bool emptyOdlMacc
+ {
+ get => IdxOdl == 0;
+ }
+
+ private bool endProdDisabled
+ {
+ get => !odlOk || needConfProd;
+ }
+
///
/// Variabile idxMacc parent x selezione ODL
///
private string IdxMaccParent { get; set; } = "";
+ ///
+ /// Valore calcolato key ODL corrente...
+ ///
private int IdxOdl
{
get => RecMSE != null ? RecMSE.IdxOdl ?? 0 : 0;
}
+ ///
+ /// Valore calcolato key ODL altra tavola attivo...
+ ///
+ private int IdxOdlAltra
+ {
+ get
+ {
+ int answ = 0;
+ var pUpd = Task.Run(async () =>
+ {
+ var tabOdlAltra = await TabDServ.OdlCurrByMacc(idxMaccAltraTav, false);
+ answ = tabOdlAltra.IdxOdl;
+ });
+ pUpd.Wait();
+ return answ;
+ }
+ }
+
private string lblWarnBody
{
get => odlOk ? Traduci("ConfProdBeforeContinueBody") : Traduci("setOdlBeforeContinueBody");
@@ -505,6 +998,102 @@ namespace MP_TAB_SERV.Components
}
}
+ ///
+ /// Verifica visibilità btn riprendi ODL su 2° tavola SE:
+ /// - sia un impianto MULTI (= con + tavole)
+ /// - sia disattrezzata la tavola
+ /// - in tab congif: se sia abilitato la ripresa ODL sulla seconda tavola
+ /// - in tab config: sia il grace period
+ /// - NON SIANO passati i minuti indicati dalla chiusura
+ ///
+ private bool showReopOdlTav
+ {
+ get
+ {
+ bool answ = false;
+ // se è multi controllo
+ if (isMulti)
+ {
+ // verifico se NON HA ODL...
+ if (emptyOdlMacc)
+ {
+ // verifico SE siamo nel gracePeriod... chiuso da meno di 1h
+ DateTime adesso = DateTime.Now;
+ DateTime dtChiusura = DateTime.Now.AddHours(-1);
+ try
+ {
+ var lastOdl = TabDServ.OdlLastByMacc(IdxMaccSel, true);
+ if (lastOdl != null)
+ {
+ dtChiusura = lastOdl.DataFine ?? DateTime.Now.AddHours(-1);
+ }
+ }
+ catch
+ { }
+
+ // ora verifico SE E SOLO SE è ANCORA in attrezzaggio
+ if (inAttr)
+ {
+ // ora verifico SE ALTRA TAVOLA ha ODL...
+ if (dtChiusura.AddMinutes(gPeriodReopenOdlTav) > adesso)
+ {
+ answ = showReopenOdlTav;
+ }
+ }
+ }
+ }
+ return answ;
+ }
+ }
+
+ ///
+ /// Verifica visibilità btn split ODL su 2° tavola SE:
+ /// - sia un impianto MULTI (= con + tavole)
+ /// - sia già attrezzata la prima tavola
+ /// - in tab Congif: se sia abilitato lo split ODL sulla seconda tavola
+ /// - la macchina SIA ANCORA in attrezzaggio (2019.07.08) = 2
+ ///
+ private bool showSplitOdlOnTavVal
+ {
+ get
+ {
+ bool answ = false;
+ // se è multi controllo
+ if (isMulti)
+ {
+ // verifico se NON HA ODL ma ce l'ha altra tavola...
+ if (emptyOdlMacc)
+ {
+ // ora verifico SE ALTRA TAVOLA ha ODL...
+ if (!emptyOdlAltraMacc)
+ {
+ // ora verifico SE E SOLO SE è ANCORA in attrezzaggio
+ if (inAttr)
+ {
+ answ = showSplitOdlOnTav;
+ }
+ }
+ }
+ }
+ return answ;
+ }
+ }
+
+ private string titleOdlDetail
+ {
+ get => IdxPOdlSel > 0 ? "Verifica parametri attrezzaggio NUOVO PODL" : inAttr ? "Parametri PODL in Attrezzaggio" : "Parametri ODL Corrente";
+ }
+
+ private string txtBtnOdlDetail
+ {
+ get => showOdlDetail ? "Nascondi Dettaglio ODL" : "MOSTRA Dettaglio ODL Corrente";
+ }
+
+ private string txtForceCloseOdl
+ {
+ get => forceCloseOdl ? Traduci("ForceCloseODL") : Traduci("SplitCurrODL");
+ }
+
#endregion Private Properties
#region Private Methods
@@ -794,7 +1383,7 @@ namespace MP_TAB_SERV.Components
inCmd2 = await TabDServ.EvListInsert(newRecParent, Enums.tipoInputEvento.barcode);
}
// chiamo refresh MSE
- TabDServ.RicalcMse(idxMaccCurr, 0);
+ await TabDServ.RicalcMse(idxMaccCurr, 0);
lblOut = userMsg;
// loggo USR MSG
Log.Info(userMsg);
@@ -823,13 +1412,26 @@ namespace MP_TAB_SERV.Components
prodMacchina = rawData.FirstOrDefault() ?? new PzProdModel();
}
}
+ // imposto tcRichAttr in base allo stato...
+ if (odlOk)
+ {
+ // prendo TCRich da ODL...
+ if (IdxOdl > 0)
+ {
+ tcRichAttr = currOdl.TCRichAttr;
+ }
+ else
+ {
+ tcRichAttr = currPodl.Tcassegnato;
+ }
+ }
}
private async Task ReloadPOdlDetailData()
{
if (IdxPOdlSel > 0)
{
- currPodl = await TabDServ.PODLExp_getByKey(IdxPOdlSel);
+ await ReloadXDL(false);
// controllo se � cambiato PODL
if (IdxPOdlSel != lastIdxPOdl)
{
@@ -839,6 +1441,40 @@ namespace MP_TAB_SERV.Components
}
}
+ private async Task ReloadXDL(bool reloadFromOdl)
+ {
+ int currIdxPOdl = IdxPOdlSel;
+ if (RecMSE != null)
+ {
+ if (reloadFromOdl)
+ {
+ currIdxPOdl = RecMSE.IdxPOdl ?? 0;
+ }
+ // se ho PODL valido...
+ if (currIdxPOdl > 0)
+ {
+ currPodl = await TabDServ.PODLExp_getByKey(currIdxPOdl);
+ }
+ else
+ {
+ currPodl = new PODLExpModel()
+ {
+ IdxOdl = RecMSE.IdxOdl ?? 0,
+ KeyRichiesta = "-",
+ CodArticolo = RecMSE.CodArticolo,
+ DescArticolo = RecMSE.CodArticolo,
+ NumPezzi = RecMSE.NumPezzi,
+ Tcassegnato = RecMSE.TCAssegnato
+ };
+ }
+ }
+ // update a runtime dati ODL se assegnato
+ if (currPodl.IdxOdl > 0)
+ {
+ currOdl = await TabDServ.OdlByIdx(currPodl.IdxOdl, false);
+ }
+ }
+
#endregion Private Methods
}
}
\ No newline at end of file
diff --git a/MP-TAB-SERV/Components/ProdConfirm.razor.cs b/MP-TAB-SERV/Components/ProdConfirm.razor.cs
index 0206570d..b9867dc0 100644
--- a/MP-TAB-SERV/Components/ProdConfirm.razor.cs
+++ b/MP-TAB-SERV/Components/ProdConfirm.razor.cs
@@ -165,9 +165,9 @@ namespace MP_TAB_SERV.Components
// effettua conferma con conf da DB del tipo (giorni / turni / periodo
bool fatto = effettuaConfermaProd();
// refresh tabella dati tablet...
- TabDServ.RicalcMse(IdxMaccSel, 0);
+ await TabDServ.RicalcMse(IdxMaccSel, 0);
// rileggo e salvo..
- var ListMSE = await MDataService.MseGetAll();
+ var ListMSE = await MDataService.MseGetAll(true);
if (ListMSE != null)
{
// salvo in LocalStorage...
diff --git a/MP-TAB-SERV/Components/SelTempoMSMC.razor b/MP-TAB-SERV/Components/SelTempoMSMC.razor
index 380f5379..76a84cea 100644
--- a/MP-TAB-SERV/Components/SelTempoMSMC.razor
+++ b/MP-TAB-SERV/Components/SelTempoMSMC.razor
@@ -23,6 +23,6 @@
}
- @lblTempo
+ → @lblTempo
diff --git a/MP-TAB-SERV/Components/SelTempoMSMC.razor.cs b/MP-TAB-SERV/Components/SelTempoMSMC.razor.cs
index 11a1b619..19fdc160 100644
--- a/MP-TAB-SERV/Components/SelTempoMSMC.razor.cs
+++ b/MP-TAB-SERV/Components/SelTempoMSMC.razor.cs
@@ -218,7 +218,7 @@ namespace MP_TAB_SERV.Components
{
get
{
- string answ = tcMode == "mc" ? $"--> {TempoMS.TotalMinutes:N0}:{TempoMS:ss} (min:sec)" : $"--> {TempoMC:0.000} (min.cent)";
+ string answ = tcMode == "mc" ? $"{TempoMS.TotalMinutes:N0}:{TempoMS:ss} (min:sec)" : $"{TempoMC:0.000} (min.cent)";
return answ;
}
}
diff --git a/MP-TAB-SERV/MP-TAB-SERV.csproj b/MP-TAB-SERV/MP-TAB-SERV.csproj
index 940aadd3..4fc13f95 100644
--- a/MP-TAB-SERV/MP-TAB-SERV.csproj
+++ b/MP-TAB-SERV/MP-TAB-SERV.csproj
@@ -3,7 +3,7 @@
net6.0
enable
- 6.16.2311.810
+ 6.16.2311.1019
enable
MP_TAB_SERV
diff --git a/MP-TAB-SERV/Pages/ODL.razor b/MP-TAB-SERV/Pages/ODL.razor
index 8fdeb1fa..cea8d71f 100644
--- a/MP-TAB-SERV/Pages/ODL.razor
+++ b/MP-TAB-SERV/Pages/ODL.razor
@@ -7,6 +7,6 @@
}
else
{
-
-
+
+
}
diff --git a/MP-TAB-SERV/Pages/ODL.razor.cs b/MP-TAB-SERV/Pages/ODL.razor.cs
index 6e382c7d..fd99ee58 100644
--- a/MP-TAB-SERV/Pages/ODL.razor.cs
+++ b/MP-TAB-SERV/Pages/ODL.razor.cs
@@ -23,25 +23,6 @@ namespace MP_TAB_SERV.Pages
await ReloadData();
}
- #endregion Protected Methods
-
- #region Private Methods
-
- private async Task ReloadData()
- {
- if (string.IsNullOrEmpty(IdxMacc))
- {
- IdxMacc = await MsgServ.IdxMaccGet();
- // recupero MSE macchina....
- if (!string.IsNullOrEmpty(IdxMacc))
- {
- CurrMSE = await MsgServ.GetMachineMse(IdxMacc);
- }
- }
- }
-
-
-
protected async Task RefreshData(List
newList)
{
var ListMSE = newList;
@@ -69,6 +50,30 @@ namespace MP_TAB_SERV.Pages
}
}
+ private string IdxMaccSubSel = "";
+
+ protected void SetMacc(string selIdxMacc)
+ {
+ IdxMaccSubSel = selIdxMacc;
+ }
+
+ #endregion Protected Methods
+
+ #region Private Methods
+
+ private async Task ReloadData()
+ {
+ if (string.IsNullOrEmpty(IdxMacc))
+ {
+ IdxMacc = await MsgServ.IdxMaccGet();
+ // recupero MSE macchina....
+ if (!string.IsNullOrEmpty(IdxMacc))
+ {
+ CurrMSE = await MsgServ.GetMachineMse(IdxMacc);
+ }
+ }
+ }
+
#endregion Private Methods
}
}
\ No newline at end of file
diff --git a/MP-TAB-SERV/Pages/ProdStop.razor.cs b/MP-TAB-SERV/Pages/ProdStop.razor.cs
index 3715eb4f..e76ce62c 100644
--- a/MP-TAB-SERV/Pages/ProdStop.razor.cs
+++ b/MP-TAB-SERV/Pages/ProdStop.razor.cs
@@ -66,7 +66,7 @@ namespace MP_TAB_SERV.Pages
protected SharedMemService SMServ { get; set; } = null!;
[Inject]
- protected TabDataService TabServ { get; set; } = null!;
+ protected TabDataService TabDServ { get; set; } = null!;
#endregion Protected Properties
@@ -87,7 +87,7 @@ namespace MP_TAB_SERV.Pages
var rigaEvento = SMServ.GetEventRow(IdxEv);
if (rigaEvento != null)
{
- var rigaStato = TabServ.StatoMacchina(IdxMacc);
+ var rigaStato = TabDServ.StatoMacchina(IdxMacc);
// processo evento...
if (insRealtime)
{
@@ -103,14 +103,14 @@ namespace MP_TAB_SERV.Pages
pallet = rigaStato.pallet
};
// se realtime
- await TabServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.barcode);
+ await TabDServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.barcode);
// resetta il microstato in modo da ricevere successive info HW
- TabServ.resetMicrostatoMacchina(IdxMacc);
+ TabDServ.resetMicrostatoMacchina(IdxMacc);
}
else
{
// in primis disabilito insert...
- TabServ.MacchinaSetInsEnab(IdxMacc, false);
+ TabDServ.MacchinaSetInsEnab(IdxMacc, false);
// calcolo evento
string evento = $"{IdxEv}";
@@ -128,7 +128,7 @@ namespace MP_TAB_SERV.Pages
try
{
// cerco da 1 sec DOPO evento...
- var tabNext = TabServ.DDB_getNext(IdxMacc, DtRif.AddSeconds(1));
+ var tabNext = TabDServ.DDB_getNext(IdxMacc, DtRif.AddSeconds(1));
DateTime nextEvDT = tabNext != null ? tabNext.InizioStato : DateTime.Now.AddMinutes(-1);
@@ -145,7 +145,7 @@ namespace MP_TAB_SERV.Pages
MatrOpr = MatrOpr,
pallet = rigaStato.pallet
};
- await TabServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.barcode);
+ await TabDServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.barcode);
// update commento apertura!
commento = $"999 - Dich StartEvt: {evento} [{codRich}]";
@@ -159,11 +159,11 @@ namespace MP_TAB_SERV.Pages
MatrOpr = MatrOpr,
pallet = rigaStato.pallet
};
- await TabServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.barcode);
+ await TabDServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.barcode);
// eseguo ricalcolo!
DateTime startRicalcolo = DtRif.AddMinutes(minAnticipoRicalcolo);
// eseguo ricalcolo periodo..
- await TabServ.DDB_DoRecalc(IdxMacc, startRicalcolo, 1, rdm_nEvStep, rdm_nEvCheck, rdm_ChkOnly);
+ await TabDServ.DDB_DoRecalc(IdxMacc, startRicalcolo, 1, rdm_nEvStep, rdm_nEvCheck, rdm_ChkOnly);
// chiamo registrazione commento...
if (noteEdit != null)
{
@@ -177,7 +177,7 @@ namespace MP_TAB_SERV.Pages
}
// riabilito insert... anche se non dovrebbe servire x stored ricalcolo precedente...
- TabServ.MacchinaSetInsEnab(IdxMacc, true);
+ TabDServ.MacchinaSetInsEnab(IdxMacc, true);
}
// mostro esito
alertCss = "alert-succes";
@@ -190,9 +190,9 @@ namespace MP_TAB_SERV.Pages
}
}
// faccio refresh x singola macchina 2019.03.26
- TabServ.RicalcMse(IdxMacc, 0);
+ await TabDServ.RicalcMse(IdxMacc, 0);
// rileggo e salvo..
- var ListMSE = await MDataService.MseGetAll();
+ var ListMSE = await MDataService.MseGetAll(true);
if (ListMSE != null)
{
// salvo in LocalStorage...
@@ -268,7 +268,7 @@ namespace MP_TAB_SERV.Pages
{
CurrMSE = await MServ.GetMachineMse(IdxMacc);
}
- var eventsAll = await TabServ.AnagEventiGetByMacch(IdxMacc);
+ var eventsAll = await TabDServ.AnagEventiGetByMacch(IdxMacc);
if (eventsAll != null)
{
events2show = eventsAll.Where(x => x.EventoTablet).OrderBy(x => x.Label).ToList();
diff --git a/MP-TAB-SERV/Pages/StatusMap.razor b/MP-TAB-SERV/Pages/StatusMap.razor
index 72bf0725..250dd569 100644
--- a/MP-TAB-SERV/Pages/StatusMap.razor
+++ b/MP-TAB-SERV/Pages/StatusMap.razor
@@ -2,17 +2,11 @@
@page "/home"
@page "/status-map"
-
+
@if (ListMSE == null || ListMSE.Count == 0 || isCalcSize)
{
- @*@for (int i = 0; i < 10; i++)
- {
-
- @*
-
- }*@
-
+
}
else
{
diff --git a/MP-TAB-SERV/Pages/StatusMap.razor.cs b/MP-TAB-SERV/Pages/StatusMap.razor.cs
index de20447a..cbc1c392 100644
--- a/MP-TAB-SERV/Pages/StatusMap.razor.cs
+++ b/MP-TAB-SERV/Pages/StatusMap.razor.cs
@@ -96,6 +96,8 @@ namespace MP_TAB_SERV.Pages
{
await getWDim();
isCalcSize = false;
+ ListMSE = await MDataService.MseGetAll(true);
+ await InvokeAsync(StateHasChanged);
}
if (ListMSE != null)
{
@@ -104,21 +106,20 @@ namespace MP_TAB_SERV.Pages
}
}
- protected override async Task OnInitializedAsync()
+ protected override void OnInitialized()
{
var df = MServ.UserPrefGet("DefCardMode");
ShowCard = df == "shrink" ? false : true;
isCalcSize = true;
ListMSE = null;
SetupConf();
- ListMSE = await MDataService.MseGetAll();
}
- protected async Task RefreshData(List
newList)
+ protected void SaveData(List newList)
{
+ //await Task.Delay(1);
ListMSE = newList;
- await InvokeAsync(StateHasChanged);
- //Log.Trace("StatusMap | RefreshData");
+ //await InvokeAsync(StateHasChanged);
}
#endregion Protected Methods
diff --git a/MP-TAB-SERV/Pages/_Layout.cshtml b/MP-TAB-SERV/Pages/_Layout.cshtml
index e190a339..24f41386 100644
--- a/MP-TAB-SERV/Pages/_Layout.cshtml
+++ b/MP-TAB-SERV/Pages/_Layout.cshtml
@@ -7,19 +7,20 @@
-
+ @* *@
+
+
+
- @* *@
-
-
+
@* *@
diff --git a/MP-TAB-SERV/Resources/ChangeLog.html b/MP-TAB-SERV/Resources/ChangeLog.html
index 2715a404..84db16e8 100644
--- a/MP-TAB-SERV/Resources/ChangeLog.html
+++ b/MP-TAB-SERV/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MAPOSPEC
- Versione: 6.16.2311.810
+ Versione: 6.16.2311.1019
Note di rilascio:
-
diff --git a/MP-TAB-SERV/Resources/VersNum.txt b/MP-TAB-SERV/Resources/VersNum.txt
index 44006065..0c7d7816 100644
--- a/MP-TAB-SERV/Resources/VersNum.txt
+++ b/MP-TAB-SERV/Resources/VersNum.txt
@@ -1 +1 @@
-6.16.2311.810
+6.16.2311.1019
diff --git a/MP-TAB-SERV/Resources/manifest.xml b/MP-TAB-SERV/Resources/manifest.xml
index 61987369..d91e2e95 100644
--- a/MP-TAB-SERV/Resources/manifest.xml
+++ b/MP-TAB-SERV/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 6.16.2311.810
+ 6.16.2311.1019
https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/MP-TAB-SERV.zip
https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/ChangeLog.html
false
diff --git a/MP-TAB-SERV/_Imports.razor b/MP-TAB-SERV/_Imports.razor
index 1d557bbf..8e3ed34c 100644
--- a/MP-TAB-SERV/_Imports.razor
+++ b/MP-TAB-SERV/_Imports.razor
@@ -15,3 +15,4 @@
@using MP.Data.Services
@using Newtonsoft.Json
@using NLog
+@using EgwCoreLib.Razor
diff --git a/MP-TAB-SERV/appsettings.json b/MP-TAB-SERV/appsettings.json
index a1811dec..57300304 100644
--- a/MP-TAB-SERV/appsettings.json
+++ b/MP-TAB-SERV/appsettings.json
@@ -10,10 +10,11 @@
"ConnectionStrings": {
"Redis": "iis01.egalware.com:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false",
//"Redis": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false",
- "MP.All": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=Blazor.ServerApp;",
- "MP.Mon": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=Blazor.ServerApp;",
+ "MP.All": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.TAB3;",
+ "MP.Mon": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.TAB3;",
"Mp.IS": "Server=SQL2016DEV;Database=MoonPro_IS_EdilChim; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.INVE;",
- "MP.Tab": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=Blazor.ServerApp;"
+ "MP.Tab": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.TAB3;",
+ "MP.Mag": "Server=SQL2016DEV;Database=MoonPro_MAG; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.TAB3;"
},
"OptConf": {
"msRefresh": "2000",
diff --git a/MP.Data/Constants.cs b/MP.Data/Constants.cs
index 0fde3879..ea73a57c 100644
--- a/MP.Data/Constants.cs
+++ b/MP.Data/Constants.cs
@@ -17,6 +17,11 @@
// REDIS KEY Dati correnti
public static readonly string CONF_MON_KEY = $"{BASE_HASH}:Conf:MonDispData";
+
+
+ public static string redisMseKey = "MP:MON:Cache:MSE";
+ public static string redisMseKeySingle = "MP:MON:Cache:MseSingle";
+
#endregion Public Fields
}
}
\ No newline at end of file
diff --git a/MP.Data/Controllers/MpSpecController.cs b/MP.Data/Controllers/MpSpecController.cs
index 2bb17d59..0b7b7aaa 100644
--- a/MP.Data/Controllers/MpSpecController.cs
+++ b/MP.Data/Controllers/MpSpecController.cs
@@ -555,7 +555,7 @@ namespace MP.Data.Controllers
public async Task
> FluxLogDataRedux(string idxMaccSel, List fluxList, Periodo currPeriodo, Enums.ValSelection valMode, Enums.DataInterval intReq, int maxItem)
{
List procStats = new List();
- Log.Info($"Inizio FluxLogDataRedux | idxMaccSel: {idxMaccSel} | periodo: {currPeriodo.Inizio} --> {currPeriodo.Fine}");
+ Log.Info($"Inizio FluxLogDataRedux | idxMaccSel: {idxMaccSel} | periodo: {currPeriodo.Inizio:yyyy-MM-dd} --> {currPeriodo.Fine:yyyy-MM-dd}");
TimeSpan step = TimeSpan.FromHours(1);
switch (intReq)
{
@@ -595,6 +595,8 @@ namespace MP.Data.Controllers
// dbContext x ogni singolo flusso
using (var dbCtx = new MoonProContext(_configuration))
{
+ // opzionalmente timeout comandi a 2 minuti... NON usato x ora e da testare
+ //dbCtx.Database.SetCommandTimeout(TimeSpan.FromMinutes(2));
// li processo per intervallo richiesto, cercando dati nel periodo e
// selezionando VC
while (!setCompleted)
@@ -609,10 +611,7 @@ namespace MP.Data.Controllers
numRecProc += numRec;
if (numRec > maxItem)
{
- if (dtCursStart > currPeriodo.Fine)
- {
- setCompleted = true;
- }
+
List listPeriodi = new List();
switch (valMode)
@@ -669,6 +668,7 @@ namespace MP.Data.Controllers
// incremento dt fine periodo
dtCursStart = dtCursEnd;
dtCursEnd = dtCursStart.Add(step);
+ setCompleted = dtCursStart >= currPeriodo.Fine;
}
}
// fermo cronometro e salvo su DB...
@@ -684,7 +684,7 @@ namespace MP.Data.Controllers
};
procStats.Add(currStat);
}
- Log.Info($"FINE FluxLogDataRedux | idxMaccSel: {idxMaccSel} | periodo: {currPeriodo.Inizio} --> {currPeriodo.Fine}");
+ Log.Info($"FINE FluxLogDataRedux | idxMaccSel: {idxMaccSel} | periodo: {currPeriodo.Inizio:yyyy-MM-dd} --> {currPeriodo.Fine:yyyy-MM-dd}");
return procStats;
}
diff --git a/MP.Data/Controllers/MpTabController.cs b/MP.Data/Controllers/MpTabController.cs
index f6210b4a..50a5b34f 100644
--- a/MP.Data/Controllers/MpTabController.cs
+++ b/MP.Data/Controllers/MpTabController.cs
@@ -487,6 +487,34 @@ namespace MP.Data.Controllers
_configuration = null;
}
+ ///
+ /// Fix ODL per Elenco Lotti
+ ///
+ ///
+ ///
+ ///
+ public bool ElencoLottiUpsertByOdl(int idxOdl, bool flgStorico)
+ {
+ bool fatto = false;
+ using (var dbCtx = new MoonPro_MagContext(_configuration))
+ {
+ try
+ {
+ var IdxOdl = new SqlParameter("@IdxOdl", idxOdl);
+ var FlgStorico = new SqlParameter("@flgStorico", flgStorico);
+ var result = dbCtx
+ .Database
+ .ExecuteSqlRaw("EXEC stp_EL_UpsertByOdl @IdxODL, @flgStorico", IdxOdl, FlgStorico);
+ fatto = result != 0;
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione durante ElLottiUpsertByOdl{Environment.NewLine}{exc}");
+ }
+ }
+ return fatto;
+ }
+
//stp_DDB_getNextByMacchinaFrom
///
/// Eliminazione record EventList (SE trovato)
@@ -737,6 +765,35 @@ namespace MP.Data.Controllers
return fatto;
}
+ ///
+ /// Dati MSE x singola macchina SUB (tipicamente TAV)
+ ///
+ ///
+ ///
+ ///
+ public List MseGetSub(string idxMacc, string idxMacchSub)
+ {
+ List dbResult = new List();
+ using (var dbCtx = new MoonProContext(_configuration))
+ {
+ try
+ {
+ var IdxMacc = new SqlParameter("@IdxMacchina", idxMacc);
+ var IdxMacchSub = new SqlParameter("@IdxMacchSub", idxMacchSub);
+ dbResult = dbCtx
+ .DbSetMSE
+ .FromSqlRaw("EXEC stp_MSE_getByIdxMacchAndSub @IdxMacchina, @IdxMacchSub", IdxMacc, IdxMacchSub)
+ .AsNoTracking()
+ .ToList();
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione durante MseGetSub{Environment.NewLine}{exc}");
+ }
+ }
+ return dbResult;
+ }
+
///
/// ODL da key
///
@@ -754,7 +811,7 @@ namespace MP.Data.Controllers
var OnlyUnused = new SqlParameter("@onlyUnused", onlyUnused);
dbResult = dbCtx
.DbSetODLExp
- .FromSqlRaw("EXEC stp_ODL_getByIdx @IdxOdl, @onlyUnused", IdxOdl, onlyUnused)
+ .FromSqlRaw("EXEC stp_ODL_getByIdx @IdxOdl, @onlyUnused", IdxOdl, OnlyUnused)
.AsNoTracking()
.ToList();
}
@@ -793,6 +850,36 @@ namespace MP.Data.Controllers
return dbResult;
}
+ ///
+ /// Attrezzo stesso ODL dell'altra tavola
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool OdlDividiDaAltraTavola(int idxODL, int matrOpr, string idxMacchinaTo)
+ {
+ bool fatto = false;
+ using (var dbCtx = new MoonProContext(_configuration))
+ {
+ try
+ {
+ var IdxODL = new SqlParameter("@idxODL", idxODL);
+ var MatrOpr = new SqlParameter("@MatrOpr", matrOpr);
+ var IdxMaccTo = new SqlParameter("@IdxMacchinaTo", idxMacchinaTo);
+ var result = dbCtx
+ .Database
+ .ExecuteSqlRaw("EXEC stp_ODL_dividiDaAltraTav @idxODL, @MatrOpr, @IdxMacchinaTo", IdxODL, MatrOpr, IdxMaccTo);
+ fatto = result != 0;
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione durante OdlDividiDaAltraTavola{Environment.NewLine}{exc}");
+ }
+ }
+ return fatto;
+ }
+
///
/// Registro fine prod ODL
///
@@ -887,6 +974,33 @@ namespace MP.Data.Controllers
return fatto;
}
+ ///
+ /// Ultimo ODL data macchina
+ ///
+ ///
+ ///
+ public List OdlLastByMacc(string idxMacchina)
+ {
+ List dbResult = new List();
+ using (var dbCtx = new MoonProContext(_configuration))
+ {
+ try
+ {
+ var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
+ dbResult = dbCtx
+ .DbSetODL
+ .FromSqlRaw("EXEC stp_ODL_getLastByMacchina @IdxMacchina", IdxMacchina)
+ .AsNoTracking()
+ .ToList();
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione durante OdlLastByMacc{Environment.NewLine}{exc}");
+ }
+ }
+ return dbResult;
+ }
+
///
/// Elenco ODL data macchina e periodo
///
@@ -918,6 +1032,33 @@ namespace MP.Data.Controllers
return dbResult;
}
+ ///
+ /// Riapertura ULTIMO ODL data macchina
+ ///
+ ///
+ ///
+ public List OdlReopenOdlMacc(string idxMacchina)
+ {
+ List dbResult = new List();
+ using (var dbCtx = new MoonProContext(_configuration))
+ {
+ try
+ {
+ var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
+ dbResult = dbCtx
+ .DbSetODL
+ .FromSqlRaw("EXEC stp_ODL_reopenOdlMacc @IdxMacchina", IdxMacchina)
+ .AsNoTracking()
+ .ToList();
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione durante OdlReopenOdlMacc{Environment.NewLine}{exc}");
+ }
+ }
+ return dbResult;
+ }
+
///
/// Setup ODL Postumo
///
@@ -1016,6 +1157,37 @@ namespace MP.Data.Controllers
return fatto;
}
+ ///
+ /// Update ODL (es: in setup x chiusura attrezzaggio)
+ ///
+ ///
+ ///
+ ///
+ public bool OdlUpdate(int idxODL, int matrOpr, decimal tCRichAttr, int pzPallet, string note)
+ {
+ bool answ = false;
+ using (var dbCtx = new MoonProContext(_configuration))
+ {
+ try
+ {
+ var IdxODL = new SqlParameter("@idxODL", idxODL);
+ var MatrOpr = new SqlParameter("@MatrOpr", matrOpr);
+ var TCRichAttr = new SqlParameter("@TCRichAttr", tCRichAttr);
+ var PzPallet = new SqlParameter("@PzPallet", pzPallet);
+ var Note = new SqlParameter("@Note", note);
+ var result = dbCtx
+ .Database
+ .ExecuteSqlRaw("EXEC stp_ODL_updateSetup @IdxODL, @MatrOpr, @TCRichAttr, @PzPallet, @Note", IdxODL, MatrOpr, TCRichAttr, PzPallet, Note);
+ answ = result != 0;
+ }
+ catch (Exception exc)
+ {
+ Log.Error($"Eccezione durante OdlUpdate{Environment.NewLine}{exc}");
+ }
+ }
+ return answ;
+ }
+
///
/// Stato prod macchina
///
diff --git a/MP.Data/DatabaseModels/ElencoLottiModel.cs b/MP.Data/DatabaseModels/ElencoLottiModel.cs
new file mode 100644
index 00000000..509e8f61
--- /dev/null
+++ b/MP.Data/DatabaseModels/ElencoLottiModel.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+
+#nullable disable
+//
+// This is here so CodeMaid doesn't reorganize this document
+//
+namespace MP.Data.DatabaseModels
+{
+ [Table("ElencoLotti")]
+ public partial class ElencoLottiModel
+ {
+ #region Public Properties
+
+ [Key]
+ public string Lotto { get; set; } = "";
+ public int IdxODL { get; set; } = 0;
+ [MaxLength(50)]
+ public string RifExt { get; set; } = "";
+ [MaxLength(50)]
+ public string TipoLotto { get; set; } = "";
+ [MaxLength(50), Column("CodArt")]
+ public string CodArticolo { get; set; } = "";
+ [MaxLength(50)]
+ public string CodStato { get; set; } = "";
+ [MaxLength(50)]
+ public string Origine { get; set; } = "";
+ public DateTime? DtCrea { get; set; }
+ [MaxLength(250)]
+ public string Note { get; set; } = "";
+ public decimal QtaOrig { get; set; } = 0;
+ public int NumUdc { get; set; } = 1;
+ public decimal QtaCurr { get; set; } = 0;
+ public DateTime? DtMod { get; set; }
+ public bool Attivo { get; set; } = false;
+ [MaxLength(250)]
+ public string DescrArt { get; set; } = "";
+ [MaxLength(50)]
+ public string CodArtExt { get; set; } = "";
+ [MaxLength(50)]
+ public string DescStato { get; set; } = "";
+
+ #endregion Public Properties
+ }
+}
\ No newline at end of file
diff --git a/MP.Data/DatabaseModels/ODLExpModel.cs b/MP.Data/DatabaseModels/ODLExpModel.cs
index dbfd429e..e2ed9a4b 100644
--- a/MP.Data/DatabaseModels/ODLExpModel.cs
+++ b/MP.Data/DatabaseModels/ODLExpModel.cs
@@ -21,6 +21,7 @@ namespace MP.Data.DatabaseModels
public string IdxMacchina { get; set; }
public int NumPezzi { get; set; }
public decimal Tcassegnato { get; set; }
+ public decimal TCRichAttr { get; set; }
public DateTime? DataInizio { get; set; }
public DateTime? DataFine { get; set; }
[MaxLength(2500)]
diff --git a/MP.Data/DatabaseModels/PODLExpModel.cs b/MP.Data/DatabaseModels/PODLExpModel.cs
index ff1c3cfc..018da8b1 100644
--- a/MP.Data/DatabaseModels/PODLExpModel.cs
+++ b/MP.Data/DatabaseModels/PODLExpModel.cs
@@ -47,10 +47,18 @@ namespace MP.Data.DatabaseModels
get
{
string answ = "*";
- var allData = KeyRichiesta.Split('_');
- if (allData.Length > 0)
+ if (!string.IsNullOrEmpty(KeyRichiesta))
{
- answ = allData[0];
+ try
+ {
+ var allData = KeyRichiesta.Split('_');
+ if (allData.Length > 0)
+ {
+ answ = allData[0];
+ }
+ }
+ catch
+ { }
}
return answ;
}
diff --git a/MP.Data/MoonPro_MagContext.cs b/MP.Data/MoonPro_MagContext.cs
new file mode 100644
index 00000000..84436a9a
--- /dev/null
+++ b/MP.Data/MoonPro_MagContext.cs
@@ -0,0 +1,86 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.Extensions.Configuration;
+using MP.Data.DatabaseModels;
+using NLog;
+
+#nullable disable
+//
+// This is here so CodeMaid doesn't reorganize this document
+//
+namespace MP.Data
+{
+ public partial class MoonPro_MagContext : DbContext
+ {
+ #region Private Fields
+
+ private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
+
+ private IConfiguration _configuration;
+
+ #endregion Private Fields
+
+ #region Public Constructors
+
+ ///
+ /// Indispensabile x prima generazione migrations EFCore
+ ///
+
+ [Obsolete("This constructor should never be used directly, and is only needed to generate entityframework stuff. Connection string can be adapted as pleased.")]
+ public MoonPro_MagContext()
+ {
+ }
+
+ public MoonPro_MagContext(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ }
+
+ public MoonPro_MagContext(DbContextOptions options) : base(options)
+ {
+ }
+
+ #endregion Public Constructors
+
+ #region Public Properties
+
+
+ public virtual DbSet DbSetElLotti { get; set; }
+
+ #endregion Public Properties
+
+ #region Private Methods
+
+ partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
+
+ #endregion Private Methods
+
+ #region Protected Methods
+
+ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+ {
+ if (!optionsBuilder.IsConfigured)
+ {
+ string connString = _configuration.GetConnectionString("Mp.Mag");
+ if (!string.IsNullOrEmpty(connString))
+ {
+ optionsBuilder.UseSqlServer(connString);
+ }
+ else
+ {
+ optionsBuilder.UseSqlServer("Server=SQL2016DEV;Database=MoonPro_MAG;Trusted_Connection=True;");
+ }
+ }
+ }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ modelBuilder.HasAnnotation("Relational:Collation", "SQL_Latin1_General_CP1_CI_AS");
+
+ OnModelCreatingPartial(modelBuilder);
+ }
+
+ #endregion Protected Methods
+ }
+}
\ No newline at end of file
diff --git a/MP.Data/Services/StatusData.cs b/MP.Data/Services/StatusData.cs
index 5eb81cec..3c1782c9 100644
--- a/MP.Data/Services/StatusData.cs
+++ b/MP.Data/Services/StatusData.cs
@@ -118,7 +118,7 @@ namespace MP.Data.Services
stopWatch.Start();
List? result = new List();
// cerco in redis...
- RedisValue rawData = redisDb.StringGet(redisMseKey);
+ RedisValue rawData = redisDb.StringGet(Constants.redisMseKey);
if (rawData.HasValue && !forceDb)
{
result = JsonConvert.DeserializeObject>($"{rawData}");
@@ -131,7 +131,7 @@ namespace MP.Data.Services
result = await Task.FromResult(dbController.MseGetAll(maxAge));
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
- await redisDb.StringSetAsync(redisMseKey, rawData, TimeSpan.FromMilliseconds(maxAge));
+ await redisDb.StringSetAsync(Constants.redisMseKey, rawData, TimeSpan.FromMilliseconds(maxAge));
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"Read from DB: {ts.TotalMilliseconds}ms");
@@ -165,7 +165,9 @@ namespace MP.Data.Services
private static IConfiguration _configuration = null!;
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
private int maxAge = 2000;
- private string redisMseKey = "MP:MON:Cache:MSE";
+#if false
+ private string redisMseKey = "MP:MON:Cache:MSE";
+#endif
#endregion Private Fields
diff --git a/MP.Data/Services/TabDataService.cs b/MP.Data/Services/TabDataService.cs
index 5aaec095..fa9b90de 100644
--- a/MP.Data/Services/TabDataService.cs
+++ b/MP.Data/Services/TabDataService.cs
@@ -10,6 +10,7 @@ using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
+using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -574,6 +575,29 @@ namespace MP.Data.Services
dbInveController.Dispose();
}
+ ///
+ /// Fix ODL per Elenco Lotti
+ ///
+ ///
+ ///
+ ///
+ public async Task ElencoLottiUpsertByOdl(int idxOdl, bool flgStorico)
+ {
+ bool answ = false;
+ try
+ {
+ // inserisco evento
+ answ = dbTabController.ElencoLottiUpsertByOdl(idxOdl, flgStorico);
+ await FlushCache("EL");
+ }
+ catch (Exception exc)
+ {
+ string logMsg = $"Eccezione in ElencoLottiUpsertByOdl | idxOdl: {idxOdl} | flgStorico: {flgStorico}{Environment.NewLine}{exc}";
+ Log.Error(logMsg);
+ }
+ return answ;
+ }
+
///
/// Elimina una riga in EventList se trovata
///
@@ -1121,6 +1145,7 @@ namespace MP.Data.Services
answ = dbTabController.OdlFineProd(idxODL, idxMacchina);
await FlushCache("ODL");
await FlushCache("PODL");
+ await FlushCache("VSODL");
}
catch (Exception exc)
{
@@ -1130,6 +1155,33 @@ namespace MP.Data.Services
return answ;
}
+
+ ///
+ /// Attrezzo stesso ODL dell'altra tavola
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task OdlDividiDaAltraTavola(int idxODL, int matrOpr, string idxMacchinaTo)
+ {
+ bool answ = false;
+ try
+ {
+ // inserisco evento
+ answ = dbTabController.OdlDividiDaAltraTavola(idxODL, matrOpr, idxMacchinaTo);
+ await FlushCache("ODL");
+ await FlushCache("PODL");
+ await FlushCache("VSODL");
+ }
+ catch (Exception exc)
+ {
+ string logMsg = $"Eccezione in OdlDividiDaAltraTavola | idxODL: {idxODL} | matrOpr: {matrOpr} | idxMacchinaTo: {idxMacchinaTo}{Environment.NewLine}{exc}";
+ Log.Error(logMsg);
+ }
+ return answ;
+ }
+
///
/// Fix ODL per macchine SLAVE
///
@@ -1146,6 +1198,7 @@ namespace MP.Data.Services
answ = dbTabController.OdlFixMachineSlave(idxMacchina, numDayPrev, doInsert);
await FlushCache("ODL");
await FlushCache("PODL");
+ await FlushCache("VSODL");
}
catch (Exception exc)
{
@@ -1174,6 +1227,7 @@ namespace MP.Data.Services
answ = dbTabController.OdlInizioSetup(idxODL, matrOpr, idxMacchina, tcRich, pzPallet, note);
await FlushCache("ODL");
await FlushCache("PODL");
+ await FlushCache("VSODL");
}
catch (Exception exc)
{
@@ -1183,6 +1237,72 @@ namespace MP.Data.Services
return answ;
}
+ ///
+ /// Ultimo ODL data macchina
+ ///
+ ///
+ ///
+ ///
+ public ODLModel OdlLastByMacc(string idxMacchina, bool forceDb)
+ {
+ string source = "DB";
+ Stopwatch sw = new Stopwatch();
+ sw.Start();
+ ODLModel result = new ODLModel();
+ // cerco in redis...
+ string currKey = $"{redisBaseKey}:ODL:{idxMacchina}:LAST";
+ RedisValue rawData = redisDb.StringGet(currKey);
+ if (rawData.HasValue && !forceDb)
+ {
+ result = JsonConvert.DeserializeObject($"{rawData}");
+ source = "REDIS";
+ }
+ else
+ {
+ var results = dbTabController.OdlLastByMacc(idxMacchina);
+ // riordino
+ result = results.FirstOrDefault();
+ // serializzp e salvo...
+ rawData = JsonConvert.SerializeObject(result);
+ redisDb.StringSet(currKey, rawData, UltraLongCache);
+ }
+ if (result == null)
+ {
+ result = new ODLModel();
+ }
+ sw.Stop();
+ Log.Debug($"OdlLastByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms");
+ return result;
+ }
+
+ ///
+ /// Riapertura ULTIMO ODL data macchina
+ ///
+ ///
+ ///
+ public ODLModel OdlReopenOdlMacc(string idxMacchina)
+ {
+ string source = "DB";
+ Stopwatch sw = new Stopwatch();
+ sw.Start();
+ ODLModel result = new ODLModel();
+ // cerco in redis...
+ string currKey = $"{redisBaseKey}:ODL:{idxMacchina}:LAST";
+ var results = dbTabController.OdlReopenOdlMacc(idxMacchina);
+ // riordino
+ result = results.FirstOrDefault();
+ // serializzp e salvo...
+ var rawData = JsonConvert.SerializeObject(result);
+ redisDb.StringSet(currKey, rawData, UltraLongCache);
+ if (result == null)
+ {
+ result = new ODLModel();
+ }
+ sw.Stop();
+ Log.Debug($"OdlReopenOdlMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms");
+ return result;
+ }
+
///
/// Elenco ODL data macchina e periodo
///
@@ -1236,6 +1356,8 @@ namespace MP.Data.Services
// inserisco evento
answ = dbTabController.OdlSetupPostumo(idxODL, idxMacchina);
await FlushCache("ODL");
+ await FlushCache("PODL");
+ await FlushCache("VSODL");
}
catch (Exception exc)
{
@@ -1260,6 +1382,8 @@ namespace MP.Data.Services
// inserisco evento
answ = dbTabController.OdlSetupPromPostuma(idxPromOdl, matrOpr, idxMacchina);
await FlushCache("ODL");
+ await FlushCache("PODL");
+ await FlushCache("VSODL");
}
catch (Exception exc)
{
@@ -1289,6 +1413,8 @@ namespace MP.Data.Services
// inserisco evento
answ = dbTabController.OdlSplit(idxODL, matrOpr, idxMacchina, TCRich, pzPallet, note, startNewOdl, qtyRich);
await FlushCache("ODL");
+ await FlushCache("PODL");
+ await FlushCache("VSODL");
}
catch (Exception exc)
{
@@ -1298,6 +1424,31 @@ namespace MP.Data.Services
return answ;
}
+ ///
+ /// Update ODL (es: in setup x chiusura attrezzaggio)
+ ///
+ ///
+ ///
+ ///
+ public async Task OdlUpdate(int idxODL, int matrOpr, decimal tCRichAttr, int pzPallet, string note)
+ {
+ bool answ = false;
+ try
+ {
+ // inserisco evento
+ answ = dbTabController.OdlUpdate(idxODL, matrOpr, tCRichAttr, pzPallet, note);
+ await FlushCache("ODL");
+ await FlushCache("PODL");
+ await FlushCache("VSODL");
+ }
+ catch (Exception exc)
+ {
+ string logMsg = $"Eccezione in OdlUpdate | idxODL: {idxODL} | matrOpr: {matrOpr} | tCRichAttr: {tCRichAttr} | pzPallet: {pzPallet} | note: {note}{Environment.NewLine}{exc}";
+ Log.Error(logMsg);
+ }
+ return answ;
+ }
+
///
/// Stato prod macchina
///
@@ -1836,12 +1987,56 @@ namespace MP.Data.Services
/// idx macchina da confermare
/// Num massimo secondi di "vecchiaia" del dato
///
- public bool RicalcMse(string idxMacchina, int maxAgeSec)
+ public async Task RicalcMse(string idxMacchina, int maxAgeSec)
{
bool answ = false;
answ = dbTabController.RicalcMse(idxMacchina, maxAgeSec);
+ await FlushCache(Constants.redisMseKey);
return answ;
}
+ ///
+ /// Recupera un valore MSE x una macchina sub specifica
+ ///
+ ///
+ ///
+ ///
+ ///
+ public MappaStatoExpl MseGetSub(string idxMacc, string idxMacchSub, bool forceDb)
+ {
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+ MappaStatoExpl result = new MappaStatoExpl();
+ // cerco in redis...
+ string currKey = $"{Constants.redisMseKeySingle}:{idxMacchSub}";
+ RedisValue rawData = redisDb.StringGet(currKey);
+ if (rawData.HasValue && !forceDb)
+ {
+ result = JsonConvert.DeserializeObject($"{rawData}");
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ Log.Debug($"Read from REDIS: {ts.TotalMilliseconds}ms");
+ }
+ else
+ {
+ var rawResult = dbTabController.MseGetSub(idxMacc, idxMacchSub);
+ if (rawResult != null && rawResult.Count > 0)
+ {
+ result = rawResult.FirstOrDefault();
+ }
+ // serializzp e salvo...
+ rawData = JsonConvert.SerializeObject(result);
+ redisDb.StringSet(currKey, rawData, UltraLongCache);
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ Log.Debug($"Read from DB: {ts.TotalMilliseconds}ms");
+ }
+ if (result == null)
+ {
+ result = new MappaStatoExpl();
+ }
+ return result;
+ }
+
///
/// Processa registrazione di un counter x una data macchina IOB
diff --git a/MP.INVE/MP.INVE.csproj b/MP.INVE/MP.INVE.csproj
index c3d99f3d..5baf9457 100644
--- a/MP.INVE/MP.INVE.csproj
+++ b/MP.INVE/MP.INVE.csproj
@@ -5,7 +5,7 @@
enable
enable
MP.INVE
- 6.16.2310.308
+ 6.16.2311.1009
diff --git a/MP.INVE/Resources/ChangeLog.html b/MP.INVE/Resources/ChangeLog.html
index 70a2d92f..7e65988e 100644
--- a/MP.INVE/Resources/ChangeLog.html
+++ b/MP.INVE/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MAPOINVE
- Versione: 6.16.2310.308
+ Versione: 6.16.2311.1009
Note di rilascio:
-
diff --git a/MP.INVE/Resources/VersNum.txt b/MP.INVE/Resources/VersNum.txt
index f08bb28c..cf39a0ed 100644
--- a/MP.INVE/Resources/VersNum.txt
+++ b/MP.INVE/Resources/VersNum.txt
@@ -1 +1 @@
-6.16.2310.308
+6.16.2311.1009
diff --git a/MP.INVE/Resources/manifest.xml b/MP.INVE/Resources/manifest.xml
index ac1073d8..17c95f0b 100644
--- a/MP.INVE/Resources/manifest.xml
+++ b/MP.INVE/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 6.16.2310.308
+ 6.16.2311.1009
https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/MP.INVE.zip
https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/ChangeLog.html
false
diff --git a/MP.Land/MP.Land.csproj b/MP.Land/MP.Land.csproj
index 33bbb0e9..2cc99106 100644
--- a/MP.Land/MP.Land.csproj
+++ b/MP.Land/MP.Land.csproj
@@ -3,7 +3,7 @@
net6.0
MP.Land
- 6.16.2310.1615
+ 6.16.2311.1009
diff --git a/MP.Land/Resources/ChangeLog.html b/MP.Land/Resources/ChangeLog.html
index 5fb28cd2..2076f49f 100644
--- a/MP.Land/Resources/ChangeLog.html
+++ b/MP.Land/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo gestione Programmi MAPO
-
Versione: 6.16.2310.1615
+ Versione: 6.16.2311.1009
Note di rilascio:
diff --git a/MP.Land/Resources/VersNum.txt b/MP.Land/Resources/VersNum.txt
index 1dd72699..cf39a0ed 100644
--- a/MP.Land/Resources/VersNum.txt
+++ b/MP.Land/Resources/VersNum.txt
@@ -1 +1 @@
-6.16.2310.1615
+6.16.2311.1009
diff --git a/MP.Land/Resources/manifest.xml b/MP.Land/Resources/manifest.xml
index fd7a9843..e09e8ed5 100644
--- a/MP.Land/Resources/manifest.xml
+++ b/MP.Land/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 6.16.2310.1615
+ 6.16.2311.1009
https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/MP.Land.zip
https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/ChangeLog.html
false
diff --git a/MP.Mon/MP.Mon.csproj b/MP.Mon/MP.Mon.csproj
index 6a6c7d78..da0d3b9d 100644
--- a/MP.Mon/MP.Mon.csproj
+++ b/MP.Mon/MP.Mon.csproj
@@ -4,7 +4,7 @@
net6.0
enable
enable
- 6.16.2309.2613
+ 6.16.2311.1009
diff --git a/MP.Mon/Resources/ChangeLog.html b/MP.Mon/Resources/ChangeLog.html
index b01f63a6..84b1ad62 100644
--- a/MP.Mon/Resources/ChangeLog.html
+++ b/MP.Mon/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MON MAPO
-
Versione: 6.16.2309.2613
+ Versione: 6.16.2311.1009
Note di rilascio:
-
diff --git a/MP.Mon/Resources/VersNum.txt b/MP.Mon/Resources/VersNum.txt
index 1ab5b9e0..cf39a0ed 100644
--- a/MP.Mon/Resources/VersNum.txt
+++ b/MP.Mon/Resources/VersNum.txt
@@ -1 +1 @@
-6.16.2309.2613
+6.16.2311.1009
diff --git a/MP.Mon/Resources/manifest.xml b/MP.Mon/Resources/manifest.xml
index 0848489c..7f9f2b8b 100644
--- a/MP.Mon/Resources/manifest.xml
+++ b/MP.Mon/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 6.16.2309.2613
+ 6.16.2311.1009
https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/MP.Mon.zip
https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/ChangeLog.html
false
diff --git a/MP.Prog/MP.Prog.csproj b/MP.Prog/MP.Prog.csproj
index b14be2a3..b174b88b 100644
--- a/MP.Prog/MP.Prog.csproj
+++ b/MP.Prog/MP.Prog.csproj
@@ -3,7 +3,7 @@
net6.0
MP.Prog
- 6.16.2304.0419
+ 6.16.2311.1009
diff --git a/MP.Prog/Resources/ChangeLog.html b/MP.Prog/Resources/ChangeLog.html
index efe63704..2076f49f 100644
--- a/MP.Prog/Resources/ChangeLog.html
+++ b/MP.Prog/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo gestione Programmi MAPO
-
Versione: 6.16.2304.0419
+ Versione: 6.16.2311.1009
Note di rilascio:
diff --git a/MP.Prog/Resources/VersNum.txt b/MP.Prog/Resources/VersNum.txt
index 4bc5312b..cf39a0ed 100644
--- a/MP.Prog/Resources/VersNum.txt
+++ b/MP.Prog/Resources/VersNum.txt
@@ -1 +1 @@
-6.16.2306.0612
+6.16.2311.1009
diff --git a/MP.Prog/Resources/manifest.xml b/MP.Prog/Resources/manifest.xml
index 1ffe0627..c58eb5ec 100644
--- a/MP.Prog/Resources/manifest.xml
+++ b/MP.Prog/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 6.16.2304.0419
+ 6.16.2311.1009
https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/MP.Prog.zip
https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/ChangeLog.html
false
diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj
index f3196714..e5ed1dd8 100644
--- a/MP.SPEC/MP.SPEC.csproj
+++ b/MP.SPEC/MP.SPEC.csproj
@@ -5,7 +5,7 @@
enable
enable
MP.SPEC
- 6.16.2310.2609
+ 6.16.2311.1016
diff --git a/MP.SPEC/Pages/FluxLogStatus.razor.cs b/MP.SPEC/Pages/FluxLogStatus.razor.cs
index 54fa4511..dd2233f6 100644
--- a/MP.SPEC/Pages/FluxLogStatus.razor.cs
+++ b/MP.SPEC/Pages/FluxLogStatus.razor.cs
@@ -85,6 +85,11 @@ namespace MP.SPEC.Pages
currVal = (currStep - 1) * stepVal;
nextVal = currStep * stepVal;
await InvokeAsync(StateHasChanged);
+ // periodo: fix per imporre fine alla mezzanotte di oggi (= processo tutto ieri)
+ if (CurrPeriodo.Fine > DateTime.Today)
+ {
+ CurrPeriodo.Fine = DateTime.Today;
+ }
// processo i flussi 1:1 x mandare update ad avanzamento
await MDataServ.FluxLogDataRedux(idxMaccSel, new List { item }, CurrPeriodo, ValMode, IntReq, NumItem);
currStep++;
diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html
index 4dc4e658..8d44feee 100644
--- a/MP.SPEC/Resources/ChangeLog.html
+++ b/MP.SPEC/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo MAPOSPEC
-
Versione: 6.16.2310.2609
+ Versione: 6.16.2311.1016
Note di rilascio:
-
diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt
index 2468fb4d..e1f886bd 100644
--- a/MP.SPEC/Resources/VersNum.txt
+++ b/MP.SPEC/Resources/VersNum.txt
@@ -1 +1 @@
-6.16.2310.2609
+6.16.2311.1016
diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml
index 78903994..a93e69cf 100644
--- a/MP.SPEC/Resources/manifest.xml
+++ b/MP.SPEC/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 6.16.2310.2609
+ 6.16.2311.1016
https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip
https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html
false
diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj
index 467d18d6..c653bf46 100644
--- a/MP.Stats/MP.Stats.csproj
+++ b/MP.Stats/MP.Stats.csproj
@@ -4,8 +4,8 @@
net6.0
MP.Stats
826e877c-ba70-4253-84cb-d0b1cafd4440
- 6.16.2307.0515
- 6.16.2307.0515
+ 6.16.2311.1009
+ 6.16.2311.1009
diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html
index 9c312fc0..fc337935 100644
--- a/MP.Stats/Resources/ChangeLog.html
+++ b/MP.Stats/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
Modulo statistiche MAPO
-
Versione: 6.16.2307.0515
+ Versione: 6.16.2311.1009
Note di rilascio:
diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt
index b889c064..cf39a0ed 100644
--- a/MP.Stats/Resources/VersNum.txt
+++ b/MP.Stats/Resources/VersNum.txt
@@ -1 +1 @@
-6.16.2307.0515
+6.16.2311.1009
diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml
index b31b6727..39ed393f 100644
--- a/MP.Stats/Resources/manifest.xml
+++ b/MP.Stats/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 6.16.2307.0515
+ 6.16.2311.1009
https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip
https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html
false