diff --git a/MP-TAB-SERV/Components/MachineBlock.razor.cs b/MP-TAB-SERV/Components/MachineBlock.razor.cs index ce34dee6..3ede46ee 100644 --- a/MP-TAB-SERV/Components/MachineBlock.razor.cs +++ b/MP-TAB-SERV/Components/MachineBlock.razor.cs @@ -4,7 +4,6 @@ using Microsoft.JSInterop; using MP.Data.DatabaseModels; using MP.Data.Services; using NLog; -using static Org.BouncyCastle.Math.EC.ECCurve; namespace MP_TAB_SERV.Components { @@ -17,6 +16,11 @@ namespace MP_TAB_SERV.Components [Parameter] public bool FullMode { get; set; } = true; + [Parameter] + public int Height { get; set; } = 0; + + [Parameter] + public string IdxMacchSub { get; set; } = ""; [Parameter] public int keepAliveMin { get; set; } = 5; @@ -30,9 +34,6 @@ namespace MP_TAB_SERV.Components [Parameter] public int Width { get; set; } = 0; - [Parameter] - public int Height { get; set; } = 0; - #endregion Public Properties #region Public Methods @@ -96,6 +97,9 @@ namespace MP_TAB_SERV.Components #region Protected Properties + [Inject] + protected IConfiguration config { get; set; } = null!; + protected ProdAdvDispl.ProdCounter CurrCount { get @@ -123,14 +127,13 @@ namespace MP_TAB_SERV.Components [Inject] protected NavigationManager NavMan { get; set; } = null!; + [Inject] + protected TabDataService TabDServ { get; set; } = null!; + #endregion Protected Properties #region Protected Methods - - [Inject] - protected IConfiguration config { get; set; } = null!; - protected override async Task OnAfterRenderAsync(bool firstRender) {//await Task.Delay(500); if (firstRender) @@ -158,20 +161,21 @@ namespace MP_TAB_SERV.Components } } - protected override async Task OnParametersSetAsync() + protected override void OnParametersSet() { isLoading = RecMSE == null; - await setGaugeVals(); - await Task.Delay(1); + // controllo SE avessi idxMacchSub --> rileggo! + if (!string.IsNullOrEmpty(IdxMacchSub) && RecMSE != null) + { + RecMSE = TabDServ.MseGetSub(RecMSE.IdxMacchina, IdxMacchSub, true); + } + setGaugeVals(); } - protected async Task setGaugeVals() + protected void setGaugeVals() { - await Task.Delay(1); - Log.Info("MBlock 01"); if (RecMSE != null) { - Log.Info("MBlock 02"); innerCircleVals.Clear(); outerCircleVals.Clear(); currMaxVal = int.Parse(RecMSE.NumPezzi.ToString()!); @@ -184,7 +188,7 @@ namespace MP_TAB_SERV.Components { outerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#1367FD", Value = RecMSE.extraVal }); } - Log.Info("MBlock 03"); + //Log.Trace($"MBlock | {RecMSE.IdxMacchina} | 03"); } else { diff --git a/MP-TAB-SERV/Components/OdlMan.razor b/MP-TAB-SERV/Components/OdlMan.razor index 380cd23c..355f0de0 100644 --- a/MP-TAB-SERV/Components/OdlMan.razor +++ b/MP-TAB-SERV/Components/OdlMan.razor @@ -3,231 +3,292 @@
- @if (needConfProd) + @if (isProcessing) { -
-
@lblWarnHead
-
@lblWarnBody @numPz2Conf.ToString("N0") pz NC
-
- @if (!odlOk) - { -
- -
- } + + } else { -
- Slave machine man -
-
- Check articolo in revisione -
- @if (cancelSetupEnabled) + @if (isSlave) { -
- -
- } - - @if (showOdlDetail) - { -
-
-
-

Verifica parametri attrezzaggio

-
-
-
-
-
- P.ODL: -
-
- @currPodl.IdxPromessa.ToString("N0") -
-
-
-
- Rif: -
-
- @currPodl.KeyRichiesta -
-
-
-
- Cod: -
-
- @currPodl.CodArticolo -
-
-
-
-
-
- Articolo: -
-
- @currPodl.DescArticolo -
-
-
-
-
-
- Pezzi: -
-
- @currPodl.NumPezzi.ToString("N0") -
-
-
-
- TCiclo: -
-
- @currPodl.Tcassegnato.ToString("N2") -
-
-
-
- Pz/pallet: -
-
- @currPodl.PzPallet -
-
-
-
- +
+
+
@(Traduci("lblWarnHeadSlave"))
+
@(Traduci("lblWarnBodySlave"))
} - -
-
- - -
- - -
-
-
-
- @if (idxPOdlSel > 0) + else + { + @if (needConfProd) { - +
+
+
@lblWarnHead
+
@lblWarnBody @numPz2Conf.ToString("N0") pz NC
+
+
+ @if (!odlOk) + { +
+ +
+ } } else { - - } -
- @if (idxPOdlSel > 0) - { -
- - -
-
- -
-
- Pz Pallet + @if (showSplitOdlOnTavVal || showReopOdlTav) + { +
+
+
+ @if (showSplitOdlOnTavVal) + { + + } +
+
+ @if (showReopOdlTav) + { + + } +
+
- + } +
+ Check articolo in revisione
-
- } - - -
-
-
- -
-
- -
-
-
-
-
-
- -
-
-
- - + @if (cancelSetupEnabled) + { +
+
-
-
-
-
-
-
- -
-
- - @*
+ } + + @if (!inAttr && !showOdlDetail) + { +
+ +
+ } + + @if (showOdlDetail || inAttr) + { +
-
+
+
+

@titleOdlDetail

+
+
+ @if (idxPOdlSel == 0 && !inAttr) + { + + } +
+
+
-
- <%: lblCreaOdl %> +
+
+ P.ODL: +
+
+ @currPodl.IdxPromessa.ToString("N0") +
+
+
+
+ Rif: +
+
+ @currPodl.KeyRichiesta +
+
+
+
+ Cod: +
+
+ @currPodl.CodArticolo +
+
+
+
+
+
+ Articolo: +
+
+ @currPodl.DescArticolo +
+
+
+
+
+
+ Pezzi: +
+
+ @currPodl.NumPezzi.ToString("N0") +
+
+
+
+ TCiclo: +
+
+ @if (currOdl != null && currOdl.Tcassegnato > 0) + { + @currOdl.Tcassegnato.ToString("N2") + } + else + { + @currPodl.Tcassegnato.ToString("N2") + } +
+
+
+
+ Pz/pallet: +
+
+ @currPodl.PzPallet +
-
- +
-
*@ +
+ } + + @if (!inAttr) + { +
+ @if (idxPOdlSel > 0) + { + + } + else + { + + } +
+
+
+ + +
+ + +
+
+
+ } + @if (idxPOdlSel > 0 || inAttr) + { +
+
+ + +
+
+
+ +
+
+ Pz Pallet +
+ +
+
+ } + + @if (inAttr) + { +
+ +
+ } + else + { + if (odlOk) + { +
+
+ + +
+
+ } + } + @if (!inAttr && enableFixSetup) + { +
+ +
+ } +
+
-
+
+ + @*
+
+
+
+
+ <%: lblCreaOdl %>
-
- @lblOut
+
+
+ +
+
+
*@ +
+
+ @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