Ancora fix gestione ODL

This commit is contained in:
Samuele Locatelli
2023-11-09 18:35:59 +01:00
parent e32600f6d3
commit 8f072b5f8e
14 changed files with 117 additions and 64 deletions
+17 -12
View File
@@ -6,15 +6,17 @@
@if (isProcessing)
{
<ProgressDisplay RefreshInterval="200" Title="ODL Processing" MaxVal="@MaxVal" CurrVal="@currVal" NextVal="@nextVal" ExpTimeMSec="@expTimeMsec"></ProgressDisplay>
<LoadingData Title="Cleaning Up Data" DisplaySize="LoadingData.CtrlSize.Large" DisplayMode="LoadingData.SpinMode.Growl"></LoadingData>
<LoadingData Title="Elaborazione..." DisplaySize="LoadingData.CtrlSize.Large" DisplayMode="LoadingData.SpinMode.Growl"></LoadingData>
}
else
{
@if (needConfProd)
{
<div class="col-12 text-danger">
<div class="fs-3">@lblWarnHead</div>
<div class="small">@lblWarnBody <b>@numPz2Conf.ToString("N0")</b> pz NC</div>
<div class="col-12 text-danger text-center my-2">
<div class="btn btn-danger w-100">
<div class="fs-1">@lblWarnHead</div>
<div class="fs-4">@lblWarnBody <b>@numPz2Conf.ToString("N0")</b> pz NC</div>
</div>
</div>
@if (!odlOk)
{
@@ -41,7 +43,7 @@
@if (!inAttr && !showOdlDetail)
{
<div class="col-12 my-1">
<button class="btn btn-lg btn-outline-warning w-100" disabled="@inAttr" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-down"></i> @txtBtnOdlDetail</button>
<button class="btn btn-lg btn-warning w-100" disabled="@inAttr" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-down"></i> @txtBtnOdlDetail</button>
</div>
}
@@ -56,7 +58,7 @@
<div>
@if (idxPOdlSel == 0 && !inAttr)
{
<button class="btn btn-lg btn-dark w-100" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-up"></i> @txtBtnOdlDetail</button>
<button class="btn btn-dark w-100" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-up"></i> @txtBtnOdlDetail</button>
}
</div>
</div>
@@ -220,15 +222,18 @@
}
else
{
<div class="col-12 col-md-6 p-2">
<div class="form-check form-switch fs-3">
<input class="form-check-input" type="checkbox" @bind="@forceCloseOdl">
<label class="form-check-label">@Traduci("ForceCloseODL")</label>
if (odlOk)
{
<div class="col-12 col-md-6 p-2">
<div class="form-check form-switch fs-3">
<input class="form-check-input" type="checkbox" @bind="@forceCloseOdl">
<label class="form-check-label">@txtForceCloseOdl</label>
</div>
</div>
</div>
}
}
<div class="col-12 col-md-6 p-2">
<button class="btn btn-lg btn-success w-100" @onclick="() => SendFixEndSetup()"><i class="fa-solid fa-wrench me-1"></i> Fix Chiusura Arttrezzaggio (PLC)</button>
<button class="btn btn-lg btn-success w-100" @onclick="() => SendFixEndSetup()"><i class="fa-solid fa-wrench me-1"></i> Fix Chiusura Attrezzaggio (PLC)</button>
</div>
<div class="col-12 col-md-6 p-2">
<button class="btn btn-lg btn-info w-100" disabled="@needConfProd"><i class="fa-solid fa-triangle-exclamation me-1"></i> Mostra Riattrezzaggio</button>
+66 -26
View File
@@ -5,6 +5,7 @@ using MP.Data.DatabaseModels;
using MP.Data.Objects;
using MP.Data.Services;
using NLog;
using System;
using System.Text;
using static MP.Data.Objects.Enums;
@@ -281,12 +282,19 @@ namespace MP_TAB_SERV.Components
checkAll();
// imposto odl...
idxOdl = idxODLStart;
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("/", true);
}
/// <summary>
@@ -312,22 +320,7 @@ namespace MP_TAB_SERV.Components
int currStep = 0;
await advStep(currStep);
isProcessing = true;
DateTime adesso = DateTime.Now;
#if false
// se fosse multi mi chiedo se sia DAVVERO in attrezzaggio...
if (isMulti)
{
try
{
// controllo se NON SONO gia in attrezzaggio...
var rigaStato = TabDServ.StatoMacchina(IdxMaccParent);
inAttr = (rigaStato.IdxStato == 2);
}
catch
{ }
}
#endif
await advStep(currStep++);
// proseguo
int idxODL_curr = 0;
@@ -340,7 +333,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
@@ -480,8 +473,6 @@ namespace MP_TAB_SERV.Components
await TabDServ.saveCounter(IdxMaccSel, "0");
// imposto ODL su redis...
TabDServ.saveCurrODL(IdxMaccSel, idxODL_curr);
// salvo odl selezionato
idxOdl = idxODL_curr;
await advStep(currStep++);
}
else
@@ -490,12 +481,19 @@ namespace MP_TAB_SERV.Components
}
// refresh finale
var tmpTCR = tcRichAttr;
checkBtnStatus();
fixSplitBtn(false);
// faccio refresh e riporto
idxOdl = idxODL_curr;
IdxPOdlSel = 0;
RecMSE = null;
await RefreshData();
await CheckAttr();
inAttr = true;
tcRichAttr = tmpTCR;
isProcessing = false;
await InvokeAsync(StateHasChanged);
}
protected override async Task OnInitializedAsync()
@@ -530,6 +528,7 @@ namespace MP_TAB_SERV.Components
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Confermi fine produzione?"))
return;
// preparo gestione progress display
MaxVal = 7;
isProcessing = true;
@@ -626,18 +625,27 @@ namespace MP_TAB_SERV.Components
}
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...
TabDServ.RicalcMse(IdxMaccSel, 0);
RecMSE = null;
// rileggo e salvo..
var ListMSE = await MDataService.MseGetAll();
var ListMSE = await MDataService.MseGetAll(true);
if (ListMSE != null)
{
// salvo in LocalStorage...
@@ -699,20 +707,44 @@ namespace MP_TAB_SERV.Components
{
showOdlDetail = !showOdlDetail;
// se devo mostrare, carico dati ODL!
if (showOdlDetail && RecMSE != null)
if (showOdlDetail)
{
await ReloadXDL(true);
}
}
private string txtForceCloseOdl
{
get => forceCloseOdl ? Traduci("ForceCloseODL") : Traduci("SplitCurrODL");
}
private async Task ReloadXDL(bool reloadFromOdl)
{
int currIdxPOdl = IdxPOdlSel;
if (reloadFromOdl)
if (RecMSE != null)
{
currIdxPOdl = RecMSE != null ? RecMSE.IdxPOdl ?? 0 : 0;
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
};
}
}
currPodl = await TabDServ.PODLExp_getByKey(currIdxPOdl);
// update a runtime dati ODL se assegnato
if (currPodl.IdxOdl > 0)
{
@@ -1193,7 +1225,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);
@@ -1225,7 +1257,15 @@ namespace MP_TAB_SERV.Components
// imposto tcRichAttr in base allo stato...
if (odlOk)
{
tcRichAttr = currPodl.Tcassegnato; ;
// prendo TCRich da ODL...
if (IdxOdl > 0)
{
tcRichAttr = currOdl.TCRichAttr;
}
else
{
tcRichAttr = currPodl.Tcassegnato;
}
}
}
+2 -2
View File
@@ -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...
+1 -1
View File
@@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<Version>6.16.2311.915</Version>
<Version>6.16.2311.918</Version>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP_TAB_SERV</RootNamespace>
</PropertyGroup>
+13 -13
View File
@@ -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();
+1 -1
View File
@@ -96,7 +96,7 @@ namespace MP_TAB_SERV.Pages
{
await getWDim();
isCalcSize = false;
ListMSE = await MDataService.MseGetAll();
ListMSE = await MDataService.MseGetAll(true);
await InvokeAsync(StateHasChanged);
}
if (ListMSE != null)
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2311.915</h4>
<h4>Versione: 6.16.2311.918</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2311.915
6.16.2311.918
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2311.915</version>
<version>6.16.2311.918</version>
<url>https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/MP-TAB-SERV.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+4
View File
@@ -17,6 +17,10 @@
// REDIS KEY Dati correnti
public static readonly string CONF_MON_KEY = $"{BASE_HASH}:Conf:MonDispData";
public static string redisMseKey = "MP:MON:Cache:MSE";
#endregion Public Fields
}
}
+1 -1
View File
@@ -504,7 +504,7 @@ namespace MP.Data.Controllers
var FlgStorico = new SqlParameter("@flgStorico", flgStorico);
var result = dbCtx
.Database
.ExecuteSqlRaw("EXEC stp_EL_UpsertByOdl @IdxMacchina, @flgStorico, @DoInsert", IdxOdl, FlgStorico);
.ExecuteSqlRaw("EXEC stp_EL_UpsertByOdl @IdxODL, @flgStorico", IdxOdl, FlgStorico);
fatto = result != 0;
}
catch (Exception exc)
+1
View File
@@ -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)]
+5 -3
View File
@@ -118,7 +118,7 @@ namespace MP.Data.Services
stopWatch.Start();
List<MappaStatoExpl>? result = new List<MappaStatoExpl>();
// cerco in redis...
RedisValue rawData = redisDb.StringGet(redisMseKey);
RedisValue rawData = redisDb.StringGet(Constants.redisMseKey);
if (rawData.HasValue && !forceDb)
{
result = JsonConvert.DeserializeObject<List<MappaStatoExpl>>($"{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
+3 -2
View File
@@ -1199,7 +1199,7 @@ namespace MP.Data.Services
answ = dbTabController.OdlInizioSetup(idxODL, matrOpr, idxMacchina, tcRich, pzPallet, note);
await FlushCache("ODL");
await FlushCache("PODL");
await FlushCache("VSODL");
await FlushCache("VSODL");
}
catch (Exception exc)
{
@@ -1893,10 +1893,11 @@ namespace MP.Data.Services
/// <param name="idxMacchina">idx macchina da confermare</param>
/// <param name="maxAgeSec">Num massimo secondi di "vecchiaia" del dato</param>
/// <returns></returns>
public bool RicalcMse(string idxMacchina, int maxAgeSec)
public async Task<bool> RicalcMse(string idxMacchina, int maxAgeSec)
{
bool answ = false;
answ = dbTabController.RicalcMse(idxMacchina, maxAgeSec);
await FlushCache(Constants.redisMseKey);
return answ;
}