Merge branch 'Release/AddFluxLogDecimation01'
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
<EgwCoreLib.Razor.PeriodoSel CurrPeriodo="CurrPeriodo" E_PeriodoSel="SetPeriodo"></EgwCoreLib.Razor.PeriodoSel>
|
||||
<div class="mt-2">
|
||||
<EgwCoreLib.Razor.PeriodoSel CurrPeriodo="CurrPeriodo" E_PeriodoSel="SetPeriodo"></EgwCoreLib.Razor.PeriodoSel>
|
||||
</div>
|
||||
|
||||
<ShowProcessing Message="Invio in corso" IsProcessing="@isSending"></ShowProcessing>
|
||||
@if (isProcessing)
|
||||
@@ -7,61 +9,63 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
<table class="table table-dark table-sm table-striped">
|
||||
<thead>
|
||||
<tr class="text-start1">
|
||||
<th>
|
||||
Elenco Allarmi
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in ListPaged)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
<div class="row">
|
||||
<div class="col-6 col-md-8 small">
|
||||
<div>
|
||||
Mem: <b>@($"{item.MemAddress}.{@item.MemIndex}")</b>
|
||||
</div>
|
||||
<div class="text-danger">
|
||||
<b>@item.ValDecoded</b>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-md-4 text-end small">
|
||||
<div class="d-flex flex-row-reverse">
|
||||
<div class="px-1">
|
||||
<div class="text-truncate">
|
||||
@($"{item.DtRif:ddd dd.MM.yy HH:mm:ss}") <i class="fa fa-clock-o" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div class="text-truncate">
|
||||
@($"{item.Duration:N2} min") <i class="fa fa-hourglass-end" aria-hidden="true"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-1">
|
||||
@if (!string.IsNullOrEmpty(item.UserAck))
|
||||
{
|
||||
<b>@item.UserAck</b> <i class="fa fa-user" aria-hidden="true"></i>
|
||||
}
|
||||
</div>
|
||||
<div class="px-1">
|
||||
@if (item.ReqNotify != 0)
|
||||
{
|
||||
<button class="btn btn-sm btn-primary py-0" @onclick="() => SendNotify(item)">Invia <i class="fa fa-envelope" aria-hidden="true"></i></button>
|
||||
}
|
||||
@if (item.ReqAck != 0)
|
||||
{
|
||||
<button class="btn btn-sm btn-warning py-0" @onclick="() => DoAck(item)">Set <i class="fa fa-exclamation-triangle" aria-hidden="true"></i></button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<div class="cardObj p-2 mt-2 mb-2">
|
||||
<table class="table table-dark table-sm table-striped">
|
||||
<thead>
|
||||
<tr class="text-start1">
|
||||
<th>
|
||||
Elenco Allarmi
|
||||
</th>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in ListPaged)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
<div class="row">
|
||||
<div class="col-6 col-md-8 small">
|
||||
<div>
|
||||
Mem: <b>@($"{item.MemAddress}.{@item.MemIndex}")</b>
|
||||
</div>
|
||||
<div class="text-danger">
|
||||
<b>@item.ValDecoded</b>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-md-4 text-end small">
|
||||
<div class="d-flex flex-row-reverse">
|
||||
<div class="px-1">
|
||||
<div class="text-truncate">
|
||||
@($"{item.DtRif:ddd dd.MM.yy HH:mm:ss}") <i class="fa fa-clock-o" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div class="text-truncate">
|
||||
@($"{item.Duration:N2} min") <i class="fa fa-hourglass-end" aria-hidden="true"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-1">
|
||||
@if (!string.IsNullOrEmpty(item.UserAck))
|
||||
{
|
||||
<b>@item.UserAck</b> <i class="fa fa-user" aria-hidden="true"></i>
|
||||
}
|
||||
</div>
|
||||
<div class="px-1">
|
||||
@if (item.ReqNotify != 0)
|
||||
{
|
||||
<button class="btn btn-sm btn-primary py-0" @onclick="() => SendNotify(item)">Invia <i class="fa fa-envelope" aria-hidden="true"></i></button>
|
||||
}
|
||||
@if (item.ReqAck != 0)
|
||||
{
|
||||
<button class="btn btn-sm btn-warning py-0" @onclick="() => DoAck(item)">Set <i class="fa fa-exclamation-triangle" aria-hidden="true"></i></button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<EgwCoreLib.Razor.DataPager currPage="@PageNum" PageSize="@NumRecPage" totalCount="@TotalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
|
||||
}
|
||||
@@ -22,6 +22,7 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
await Task.Delay(1);
|
||||
await InvokeAsync(() => StateHasChanged());
|
||||
//Log.Trace("CmpFooter Timer elapsed");
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
@@ -29,7 +30,6 @@ namespace MP_TAB_SERV.Components
|
||||
public void StartTimer()
|
||||
{
|
||||
int tOutPeriod = 5000;
|
||||
//int.TryParse(Configuration["ReloadStatusTimer"], out tOutPeriod);
|
||||
aTimer = new System.Timers.Timer(tOutPeriod);
|
||||
aTimer.Elapsed += ElapsedTimer;
|
||||
aTimer.Enabled = true;
|
||||
@@ -44,6 +44,7 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
var rawVers = typeof(Program).Assembly.GetName().Version; ;
|
||||
version = rawVers != null ? rawVers : new Version("0.0.0.0");
|
||||
StartTimer();
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
@@ -21,8 +21,8 @@ else
|
||||
<EgwCoreLib.Razor.PeriodoSel CurrPeriodo="CurrPeriodo" E_PeriodoSel="SetPeriodo"></EgwCoreLib.Razor.PeriodoSel>
|
||||
}
|
||||
<ShowProcessing Message="Caricamento" IsProcessing="@isProcessing"></ShowProcessing>
|
||||
<div class="card">
|
||||
<div class="card-header bg-dark">
|
||||
<div class="cardObj p-2 mt-2">
|
||||
<div class="mb-1 fs-6">
|
||||
<button class="btn btn-primary btn-lg text-light w-100" @onclick="ToggleBtn">
|
||||
<i class="fa fa-wrench"></i> @ConfTitle
|
||||
</button>
|
||||
@@ -33,8 +33,6 @@ else
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="">
|
||||
@* </div>
|
||||
<div class="form-floating"> *@
|
||||
<label class="form-label text-light">Note controllo NON superato (opzionali)</label>
|
||||
<textarea class="form-control" @bind="@noteKo" style="height: 6rem;"></textarea>
|
||||
</div>
|
||||
@@ -57,7 +55,7 @@ else
|
||||
}
|
||||
}
|
||||
</div>
|
||||
<div class="card-body bg-secondary p-1">
|
||||
<div class="bg-secondary p-1 mb-1">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
|
||||
@@ -65,7 +63,7 @@ else
|
||||
<thead>
|
||||
<tr class="text-start1">
|
||||
<th>
|
||||
Elenco Controlli
|
||||
Registro Controlli
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@@ -64,7 +64,9 @@ namespace MP_TAB_SERV.Components
|
||||
if (RecMSE != null)
|
||||
{
|
||||
IdxMaccSel = RecMSE.IdxMacchina;
|
||||
CurrPeriodo = new Periodo(PeriodSet.ThisWeek);
|
||||
DateTime fine = DateTime.Today.AddDays(1);
|
||||
DateTime inizio = fine.AddDays(-8);
|
||||
CurrPeriodo = new Periodo(inizio, fine);
|
||||
await doUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<div class="">
|
||||
<div class="p-0">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<button class="btn btn-lg bg-info text-dark w-100" @onclick="ToggleCtrl">
|
||||
<i class="fa-solid fa-comments"></i>
|
||||
|
||||
<span class="fs-4 fw-bold">@Title</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (ShowDetail)
|
||||
{
|
||||
<div class="p-1">
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Tipol.</span>
|
||||
<select @bind="@TagCodeSel" class="form-select">
|
||||
@foreach (var item in ListComplete)
|
||||
{
|
||||
<option value="@item.TagCode">@item.TagDescr</option>
|
||||
}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Data Ora</span>
|
||||
<input type="datetime-local" class="form-control text-end" @bind="@DateSel">
|
||||
<button class="btn btn-secondary" @onclick="resetDate"><i class="fa-solid fa-arrow-rotate-right"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 my-1">
|
||||
<div class="form-floating">
|
||||
<textarea type="text" class="form-control" id="floatingComm" @bind="@UserComment"></textarea>
|
||||
<label for="floatingComm">Dichiarazione</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<button class="@BtnCss w-100" @onclick="DoSave"><i class="fa-solid fa-floppy-disk"></i> @BtnText</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -0,0 +1,212 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class DeclarEditor
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<bool> E_Updated { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public RegistroDichiarazioniModel? EditRec
|
||||
{
|
||||
get => currRec;
|
||||
set
|
||||
{
|
||||
if (currRec != value && value != null)
|
||||
{
|
||||
IsNewRec = false;
|
||||
ShowDetail = true;
|
||||
currRec = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Parameter]
|
||||
public MappaStatoExpl? RecMSE { get; set; } = null;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
protected string BtnCss
|
||||
{
|
||||
get => IsNewRec ? "btn btn-success" : "btn btn-primary";
|
||||
}
|
||||
|
||||
protected string BtnText
|
||||
{
|
||||
get => IsNewRec ? "Salva Nuova Dichiarazione" : "Aggiorna Dichiarazione";
|
||||
}
|
||||
|
||||
protected DateTime DateSel
|
||||
{
|
||||
get => currRec.DtRec.Round(TimeSpan.FromSeconds(1));
|
||||
set
|
||||
{
|
||||
if (currRec.DtRec != value)
|
||||
{
|
||||
currRec.DtRec = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected List<AnagTagsModel> ListComplete { get; set; } = new List<AnagTagsModel>();
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected SharedMemService SMServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabServ { get; set; } = null!;
|
||||
|
||||
protected string TagCodeSel
|
||||
{
|
||||
get => currRec.TagCode;
|
||||
set
|
||||
{
|
||||
if (currRec.TagCode != value)
|
||||
{
|
||||
currRec.TagCode = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected string Title
|
||||
{
|
||||
get => ShowDetail ? "Nascondi Inserimento Dichiarazione" : "Mostra Inserimento Dichiarazione";
|
||||
}
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected void doCancel()
|
||||
{
|
||||
DoReset();
|
||||
}
|
||||
|
||||
protected async Task DoSave()
|
||||
{
|
||||
if (IsNewRec)
|
||||
{
|
||||
// inserisco
|
||||
await TabServ.RegDichiarInsert(currRec);
|
||||
}
|
||||
else
|
||||
{
|
||||
// altrimetni update...
|
||||
await TabServ.RegDichiarUpdate(currRec);
|
||||
}
|
||||
|
||||
// reset
|
||||
DoReset();
|
||||
ToggleCtrl();
|
||||
await E_Updated.InvokeAsync(true);
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
currRec = new RegistroDichiarazioniModel()
|
||||
{
|
||||
DtRec = DateTime.Now,
|
||||
IdxMacchina = IdxMacc,
|
||||
TagCode = TagCodeSel,
|
||||
MatrOpr = MatrOpr,
|
||||
ValString = UserComment
|
||||
};
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task ReloadData()
|
||||
{
|
||||
ListComplete = await TabServ.AnagTagsOrd();
|
||||
}
|
||||
|
||||
protected void resetDate()
|
||||
{
|
||||
DateSel = DateTime.Now;
|
||||
}
|
||||
|
||||
protected void ToggleCtrl()
|
||||
{
|
||||
ShowDetail = !ShowDetail;
|
||||
DateSel = DateTime.Now;
|
||||
if (!ShowDetail)
|
||||
{
|
||||
IsNewRec = true;
|
||||
UserComment = "";
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private bool IsNewRec = true;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string CodArt
|
||||
{
|
||||
get => RecMSE != null ? RecMSE.CodArticolo : "";
|
||||
}
|
||||
|
||||
private RegistroDichiarazioniModel currRec { get; set; } = new RegistroDichiarazioniModel();
|
||||
|
||||
private string IdxMacc
|
||||
{
|
||||
get => RecMSE != null ? RecMSE.IdxMacchina : "";
|
||||
}
|
||||
|
||||
private int idxOdl { get; set; } = 0;
|
||||
|
||||
private int IdxOdl
|
||||
{
|
||||
get => idxOdl;
|
||||
set => idxOdl = value;
|
||||
}
|
||||
|
||||
private int MatrOpr
|
||||
{
|
||||
get => MServ.MatrOpr;
|
||||
}
|
||||
|
||||
private bool ShowDetail { get; set; } = false;
|
||||
|
||||
private string UserComment
|
||||
{
|
||||
get => currRec.ValString.Trim();
|
||||
set
|
||||
{
|
||||
if (currRec.ValString != value)
|
||||
{
|
||||
currRec.ValString = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private void DoReset()
|
||||
{
|
||||
UserComment = "";
|
||||
DateSel = DateTime.Now;
|
||||
ShowDetail = true;
|
||||
IsNewRec = true;
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,74 @@
|
||||
<h3>DeclarList</h3>
|
||||
|
||||
|
||||
@code {
|
||||
<MachSel RecMSE="RecMSE" E_MachSel="SetMacc"></MachSel>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<h2>Tipo Selezione</h2>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch fs-3">
|
||||
<input class="form-check-input" type="checkbox" @bind="@useOdl">
|
||||
<label class="form-check-label">@selMessage</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (useOdl)
|
||||
{
|
||||
<MachineSelOdl IdxMacchina="@IdxMaccSel" E_OdlSel="SetOdl"></MachineSelOdl>
|
||||
}
|
||||
else
|
||||
{
|
||||
<EgwCoreLib.Razor.PeriodoSel CurrPeriodo="CurrPeriodo" E_PeriodoSel="SetPeriodo"></EgwCoreLib.Razor.PeriodoSel>
|
||||
}
|
||||
<ShowProcessing Message="Caricamento" IsProcessing="@isProcessing"></ShowProcessing>
|
||||
<div class="cardObj p-2 mt-2">
|
||||
<div class="">
|
||||
<DeclarEditor RecMSE="@RecMSE" EditRec="CurrRec" E_Updated="doUpdate"></DeclarEditor>
|
||||
</div>
|
||||
<div class="p-1">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
|
||||
<table class="table table-dark table-sm table-striped">
|
||||
<thead>
|
||||
<tr class="text-start1">
|
||||
<th></th>
|
||||
<th>Tag</th>
|
||||
<th>Data</th>
|
||||
<th>Oper</th>
|
||||
<th>Macchina</th>
|
||||
<th class="text-end">Dichiarazione</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in ListPaged)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
<button class="btn btn-primary" @onclick="()=>SetEdit(item)"><i class="fa-solid fa-pen"></i></button>
|
||||
</td>
|
||||
<td>
|
||||
<i class="@item.CssClass" aria-hidden="true"></i>
|
||||
</td>
|
||||
<td>
|
||||
@item.DtRec
|
||||
</td>
|
||||
<td>
|
||||
@item.CognNome
|
||||
</td>
|
||||
<td>
|
||||
@item.IdxMacchina
|
||||
</td>
|
||||
<td class="text-end">
|
||||
@item.ValString
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<EgwCoreLib.Razor.DataPager currPage="@PageNum" PageSize="@NumRecPage" totalCount="@TotalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,156 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
using NLog;
|
||||
using Org.BouncyCastle.Asn1.IsisMtt.X509;
|
||||
using static EgwCoreLib.Utils.DtUtils;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class DeclarMan
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public MappaStatoExpl? RecMSE { get; set; } = null;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// Aggiorno valori produzione alla data richiesta...
|
||||
/// </summary>
|
||||
/// <param name="newDate"></param>
|
||||
public async Task doUpdate()
|
||||
{
|
||||
isProcessing = true;
|
||||
await Task.Delay(1);
|
||||
if (!string.IsNullOrEmpty(IdxMaccSel))
|
||||
{
|
||||
ListComplete = await TabDServ.RegDichiarGetFilt(IdxMaccSel, "", 0, IdxOdl, CurrPeriodo.Inizio, CurrPeriodo.Fine);
|
||||
TotalCount = ListComplete.Count;
|
||||
// esegue paginazione
|
||||
UpdateTable();
|
||||
}
|
||||
isProcessing = false;
|
||||
await Task.Delay(1);
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
protected List<RegistroDichiarazioniModel> ListComplete { get; set; } = new List<RegistroDichiarazioniModel>();
|
||||
protected List<RegistroDichiarazioniModel> ListPaged { get; set; } = new List<RegistroDichiarazioniModel>();
|
||||
|
||||
protected void SetEdit(RegistroDichiarazioniModel selRec)
|
||||
{
|
||||
CurrRec = selRec;
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await Task.Delay(1);
|
||||
if (RecMSE != null)
|
||||
{
|
||||
IdxMaccSel = RecMSE.IdxMacchina;
|
||||
DateTime fine = DateTime.Today.AddDays(1);
|
||||
DateTime inizio = fine.AddDays(-8);
|
||||
CurrPeriodo = new Periodo(inizio, fine);
|
||||
await doUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
protected void SaveNumRec(int newNum)
|
||||
{
|
||||
NumRecPage = newNum;
|
||||
UpdateTable();
|
||||
}
|
||||
|
||||
protected void SavePage(int newNum)
|
||||
{
|
||||
PageNum = newNum;
|
||||
UpdateTable();
|
||||
}
|
||||
|
||||
protected async Task SetMacc(string selIdxMacc)
|
||||
{
|
||||
isProcessing = true;
|
||||
await Task.Delay(1);
|
||||
IdxMaccSel = selIdxMacc;
|
||||
await doUpdate();
|
||||
isProcessing = false;
|
||||
await Task.Delay(1);
|
||||
}
|
||||
|
||||
protected async Task SetOdl(int selIdxOdl)
|
||||
{
|
||||
isProcessing = true;
|
||||
await Task.Delay(1);
|
||||
IdxOdl = selIdxOdl;
|
||||
await doUpdate();
|
||||
isProcessing = false;
|
||||
await Task.Delay(1);
|
||||
}
|
||||
|
||||
protected async Task SetPeriodo(Periodo newPeriodo)
|
||||
{
|
||||
CurrPeriodo = newPeriodo;
|
||||
await doUpdate();
|
||||
}
|
||||
|
||||
protected void UpdateTable()
|
||||
{
|
||||
// esegue paginazione
|
||||
if (TotalCount > NumRecPage)
|
||||
{
|
||||
ListPaged = ListComplete.Skip((PageNum - 1) * NumRecPage).Take(NumRecPage).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
ListPaged = ListComplete;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private RegistroDichiarazioniModel? CurrRec { get; set; } = null;
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
private bool isProcessing = false;
|
||||
private int NumRecPage = 10;
|
||||
private int PageNum = 1;
|
||||
private int TotalCount = 0;
|
||||
private bool useOdl = false;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private Periodo CurrPeriodo { get; set; } = new Periodo();
|
||||
|
||||
private string IdxMaccSel { get; set; } = "";
|
||||
|
||||
private int IdxOdl { get; set; } = 0;
|
||||
|
||||
private string selMessage
|
||||
{
|
||||
get => useOdl ? "Periodo da ODL" : "Periodo Libero";
|
||||
}
|
||||
|
||||
#endregion Private Properties
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<div class="card text-dark textCondens">
|
||||
<div class="card-header bg-info text-light">
|
||||
<h4>@Title</h4>
|
||||
</div>
|
||||
<div class="card-body py-1">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<p>
|
||||
<b>@Subtitle</b>
|
||||
</p>
|
||||
@Message
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,20 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class DisabledAlert
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public string Message { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public string Subtitle { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public string Title { get; set; } = "";
|
||||
|
||||
#endregion Public Properties
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
|
||||
<button class="btn btn-warning w-100" @onclick="toggleFixOdl"><i class="fa fa-check"></i> @txtBtnFixOdl</button>
|
||||
@if (showFixOdl)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h1>Riassegnazione ODL</h1>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<h4>Ultimi ODL lavorati:</h4>
|
||||
<table class="table table-dark table-sm table-striped">
|
||||
<thead>
|
||||
<tr class="text-start1">
|
||||
<th>ODL / Articolo</th>
|
||||
<th class="text-end"># Pezzi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in ListPaged)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
<div class="d-flex justify-content-between fw-bold">
|
||||
<div class="px-1">
|
||||
@item.IdxOdl
|
||||
</div>
|
||||
<div class="px-1">
|
||||
@item.CodArticolo
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between small">
|
||||
<div class="px-1">
|
||||
@($"{item.DataInizio:yyyy.MM.dd HH:mm:ss}")
|
||||
</div>
|
||||
<div class="px-1">
|
||||
<i class="fa-solid fa-arrow-right"></i>
|
||||
</div>
|
||||
<div class="px-1">
|
||||
@($"{item.DataFine:yyyy.MM.dd HH:mm:ss}")
|
||||
</div>
|
||||
</div>
|
||||
@if (!string.IsNullOrEmpty(item.Note))
|
||||
{
|
||||
<div class="small text-secondary">
|
||||
@item.Note
|
||||
</div>
|
||||
}
|
||||
</td>
|
||||
<td class="text-end">
|
||||
<div>
|
||||
@item.NumPezzi.ToString("N0")
|
||||
</div>
|
||||
<div class="small">
|
||||
TC: @item.Tcassegnato.ToString("N2") | pz/pallet: @item.PzPallet
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
<EgwCoreLib.Razor.DataPager currPage="@PageNum" PageSize="@NumRecPage" totalCount="@TotalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
|
||||
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<div class="input-group input-group-lg">
|
||||
<input type="text" class="form-control w-25" placeholder="Cerca" aria-label="Cerca">
|
||||
<select class="form-select w-50" @bind="IdxOdlSel">
|
||||
@* <option disabled>Selezionare P.ODL</option> *@
|
||||
@foreach (var item in ListSelODL)
|
||||
{
|
||||
<option value="@item.value">@item.label</option>
|
||||
}
|
||||
</select>
|
||||
<div class="input-group-text">
|
||||
<input class="form-check-input mt-0 me-1" id="chk_all" type="checkbox" @bind="ShowAll">
|
||||
<label class="form-check-label" for="" chk_all">
|
||||
Tutti
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
@if (IdxOdlSel > 0)
|
||||
{
|
||||
<button class="btn btn-lg btn-warning w-100" @onclick="() => SetupOdl()"><i class="fa-solid fa-plus"></i> Imposta ODL</button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class FixOdl
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public string IdxMaccCurr { get; set; } = "";
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Protected Fields
|
||||
|
||||
protected bool enableRPO = true;
|
||||
protected int NumRecPage = 5;
|
||||
protected int PageNum = 1;
|
||||
protected int TotalCount = 0;
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
protected List<ODLModel> ListComplete { get; set; } = new List<ODLModel>();
|
||||
protected List<ODLModel> ListPaged { get; set; } = new List<ODLModel>();
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected NavigationManager NavMan { get; set; } = null!;
|
||||
|
||||
protected bool ShowAll
|
||||
{
|
||||
get => showAll;
|
||||
set
|
||||
{
|
||||
if (showAll != value)
|
||||
{
|
||||
showAll = value;
|
||||
IdxOdlSel = 0;
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
await ReloadData();
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected SharedMemService SMServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
protected string txtBtnFixOdl { get => showFixOdl ? "Nascondi Fix" : "Fix ODL"; }
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
enableRPO = SMServ.GetConfBool("enableRPO");
|
||||
}
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected void SaveNumRec(int newNum)
|
||||
{
|
||||
NumRecPage = newNum;
|
||||
UpdateTable();
|
||||
}
|
||||
|
||||
protected void SavePage(int newNum)
|
||||
{
|
||||
PageNum = newNum;
|
||||
UpdateTable();
|
||||
}
|
||||
|
||||
protected async Task SetupOdl()
|
||||
{
|
||||
await Task.Delay(1);
|
||||
if (!string.IsNullOrEmpty(IdxMaccCurr) && IdxOdlSel > 0)
|
||||
{
|
||||
if (enableRPO)
|
||||
{
|
||||
// registro ODL retroattivamente...
|
||||
await TabDServ.OdlSetupPromPostuma(IdxOdlSel, MServ.MatrOpr, IdxMaccCurr);
|
||||
}
|
||||
else
|
||||
{
|
||||
// registro ODL retroattivamente...
|
||||
await TabDServ.OdlSetupPostumo(IdxOdlSel, IdxMaccCurr);
|
||||
}
|
||||
}
|
||||
|
||||
// redirect
|
||||
NavMan.NavigateTo(NavMan.Uri, true);
|
||||
}
|
||||
|
||||
protected void toggleFixOdl()
|
||||
{
|
||||
showFixOdl = !showFixOdl;
|
||||
}
|
||||
|
||||
protected void UpdateTable()
|
||||
{
|
||||
// esegue paginazione
|
||||
if (TotalCount > NumRecPage)
|
||||
{
|
||||
ListPaged = ListComplete.Skip((PageNum - 1) * NumRecPage).Take(NumRecPage).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
ListPaged = ListComplete;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private bool showAll = false;
|
||||
private bool showFixOdl = true;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private int IdxOdlSel { get; set; } = 0;
|
||||
private List<vSelOdlModel> ListSelODL { get; set; } = new List<vSelOdlModel>();
|
||||
private int numDayOdl { get; set; } = 30;
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private async Task ReloadData()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(IdxMaccCurr))
|
||||
{
|
||||
ListSelODL = await TabDServ.VSOdlGetUnused(IdxMaccCurr, ShowAll, numDayOdl);
|
||||
DateTime dateTo = DateTime.Today.AddDays(1);
|
||||
DateTime dateFrom = dateTo.AddMonths(-1);
|
||||
ListComplete = await TabDServ.OdlListByMaccPeriodo(IdxMaccCurr, dateFrom, dateTo);
|
||||
TotalCount = ListComplete.Count;
|
||||
// esegue paginazione
|
||||
UpdateTable();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -1,34 +1,51 @@
|
||||
<div class="card">
|
||||
<div class="card-header text-center">
|
||||
<div>
|
||||
<i class="fa-solid fa-microchip" style="font-size: 5rem;"></i>
|
||||
</div>
|
||||
<div>
|
||||
<span>IOB Details</span>
|
||||
<div class="d-flex justify-content-between flex-wrap mt-2">
|
||||
<div class="col-6 flex-fill ">
|
||||
<div class="p-2 h-100">
|
||||
<div class="cardObj p-2 h-100">
|
||||
<div class="fs-6 text-secondary">Iob Type</div>
|
||||
<div class="d-flex justify-content-center flex-wrap align-items-center">
|
||||
@if(infosIob.iType == MP.Data.Objects.Enums.IobType.rPi)
|
||||
{
|
||||
<img src="/images/linuxLogo.png" style="height: 70px; width: 70px" />
|
||||
}
|
||||
else if (infosIob.iType == MP.Data.Objects.Enums.IobType.WIN || infosIob.iType == MP.Data.Objects.Enums.IobType.ND)
|
||||
{
|
||||
<img src="/images/winLogo.png" style="height: 70px; width: 70px" />
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item d-flex justify-content-between">
|
||||
<div>Machine Code: </div>
|
||||
<div class="fw-bold">@idxMacch</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between">
|
||||
<div>IOB Type: </div>
|
||||
<div class="fw-bold"><i class="fa-brands fa-windows"></i> @infosIob.iType</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between">
|
||||
<div>IOB Name: </div>
|
||||
<div class="fw-bold">@infosIob.name</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between">
|
||||
<div>IOB Address: </div>
|
||||
<div class="fw-bold">@infosIob.IP</div>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between">
|
||||
<div>CNC Absolute counter: </div>
|
||||
<div class="fw-bold">@infosIob.CNC_Counter</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="col-6 h-100 flex-fill ">
|
||||
<div class="p-2">
|
||||
<div class="cardObj w-100 p-2">
|
||||
<div class="fs-6 text-secondary">Machine Cod</div>
|
||||
<div class="fs-4 fw-bold">@idxMacch</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-2">
|
||||
<div class="cardObj w-100 p-2">
|
||||
<div class="fs-6 text-secondary">Iob Address</div>
|
||||
<div class="fs-4 fw-bold">@infosIob.IP</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between flex-wrap align-items-centermt-2">
|
||||
<div class="col-6 flex-fill ">
|
||||
<div class="p-2">
|
||||
<div class="cardObj w-100 p-2">
|
||||
<div class="fs-6 text-secondary">Iob Name</div>
|
||||
<div class="fs-4 fw-bold">@infosIob.name</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 h-100 flex-fill ">
|
||||
<div class="p-2">
|
||||
<div class="cardObj w-100 p-2">
|
||||
<div class="fs-6 text-secondary">CNC Absolute counter</div>
|
||||
<div class="fs-4 fw-bold">@infosIob.CNC_Counter</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,26 +1,74 @@
|
||||
@if (currFnq != null)
|
||||
{
|
||||
<div class="col-12 col-sm-6 col-lg-4 my-1 p-2">
|
||||
<div class="card" @onclick="SelectFermo">
|
||||
<div class="card-body @setSemaforo(currFnq.Semaforo)">
|
||||
<div class="text-start fw-bold" style="font-size: 1.8rem;">
|
||||
@currFnq.Stato
|
||||
</div>
|
||||
<div class="text-end" style="font-size: 1.5rem;">
|
||||
@currFnq.CodArticolo
|
||||
<div class="@divCss my-1 p-2 d-flex justify-content-between">
|
||||
<div class="@cardBorder @cardCss">
|
||||
|
||||
<div class="@setSemaforo(currFnq.Semaforo)" style="border-radius: 0.375rem 0 0 0;">
|
||||
<div @onclick="SelectFermo">
|
||||
<div class="text-start fw-bold text-center" style="font-size: 1.3rem;">
|
||||
@currFnq.Stato
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer d-flex justify-content-between bg-dark text-light">
|
||||
<div>
|
||||
@($"{currFnq.InizioStato:yyyy/MM/dd HH:mm:ss}")
|
||||
@*09.10.2023 00:30*@
|
||||
</div>
|
||||
<div>
|
||||
@*7h 30m*@
|
||||
@(MP.Data.Utils.FormDurata(currFnq.DurataMinuti))
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="d-flex justify-content-between text-light p-2 col-10" @onclick="SelectFermo">
|
||||
<div class="col-6">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-3">
|
||||
<i class="fa-solid fa-calendar-days"></i>
|
||||
</div>
|
||||
<div class="col-9">
|
||||
@($"{currFnq.InizioStato:yyyy/MM/dd}")
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-3">
|
||||
<i class="fa-regular fa-clock"></i>
|
||||
</div>
|
||||
<div class="col-9">
|
||||
@($"{currFnq.InizioStato:HH:mm:ss}")
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-3">
|
||||
<i class="fa-solid fa-stopwatch"></i>
|
||||
</div>
|
||||
<div class="col-9">
|
||||
@(MP.Data.Utils.FormDurata(currFnq.DurataMinuti))
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-end col-6 d-flex align-items-center justify-content-end fw-bold" style="font-size: 1.1rem;">
|
||||
<span>
|
||||
@currFnq.CodArticolo
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@if (currNotes.Count > 0)
|
||||
{
|
||||
<div class="col-2 d-flex align-items-center" @onclick="()=>setComments()">
|
||||
<button class="btn btn-sm btn-light text-dark">
|
||||
<i class="fa-solid @chevronDir"></i>
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-100">
|
||||
@if (showComments)
|
||||
{
|
||||
<div class="col-12 overflow-auto p-1 longStopListNotes border-end border-top border-bottom border-2 @borderColor p-2 rounded-end">
|
||||
@foreach (var note in currNotes)
|
||||
{
|
||||
<div class="d-flex justify-content-between align-items-center mb-1 col-12">
|
||||
<button class="btn btn-sm btn-info h-50" @onclick="()=>doSet2Edit(note)"><i class="fa-solid fa-pen-to-square"></i></button>
|
||||
<span class="p-1">@note.Value</span>
|
||||
<button class="btn btn-sm btn-danger h-50" @onclick="()=>doDelete(note)"><i class="fa-solid fa-trash-can"></i></button>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
using System.Data;
|
||||
using System.Reflection.Metadata;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
@@ -11,6 +13,12 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
[Parameter]
|
||||
public FermiNonQualModel currFnq { get; set; } = new FermiNonQualModel();
|
||||
[Parameter]
|
||||
public List<CommentiModel> currNotes { get; set; } = new List<CommentiModel>();
|
||||
[Parameter]
|
||||
public EventCallback<bool> E_relData { get; set; }
|
||||
[Parameter]
|
||||
public EventCallback<CommentiModel> E_setComm { get; set; }
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
@@ -22,6 +30,9 @@ namespace MP_TAB_SERV.Components
|
||||
[Inject]
|
||||
protected NavigationManager NavMan { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
@@ -42,23 +53,79 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#region Private Methods
|
||||
|
||||
protected bool showComments { get; set; } = false;
|
||||
|
||||
protected string divCss
|
||||
{
|
||||
get => showComments ? "col-12" : "col-6 col-sm-6 col-lg-2";
|
||||
}
|
||||
|
||||
protected string cardCss
|
||||
{
|
||||
get => showComments ? "col-6 col-sm-6 col-lg-2" : "col-12";
|
||||
}
|
||||
|
||||
protected string cardContentCss
|
||||
{
|
||||
get => showComments ? "col-6" : "col-12";
|
||||
}
|
||||
protected string chevronDir
|
||||
{
|
||||
get => showComments ? "fa-chevron-left" : "fa-chevron-right";
|
||||
}
|
||||
|
||||
protected async Task setComments()
|
||||
{
|
||||
await Task.Delay(1);
|
||||
showComments = !showComments;
|
||||
}
|
||||
|
||||
protected string cardBorder
|
||||
{
|
||||
get => showComments ? "cardObjNoBL" : "cardObj";
|
||||
}
|
||||
|
||||
|
||||
protected string borderColor { get; set; } = "";
|
||||
|
||||
private string setSemaforo(string sem)
|
||||
{
|
||||
string answ = "";
|
||||
if (sem == "sBl")
|
||||
{
|
||||
answ = "bg-primary text-warning";
|
||||
borderColor = "border-primary";
|
||||
}
|
||||
else if (sem == "sGr")
|
||||
{
|
||||
answ = "bg-secondary text-dark";
|
||||
borderColor = "border-secondary";
|
||||
}
|
||||
else if (sem == "sGi")
|
||||
{
|
||||
answ = "bg-warning text-dark";
|
||||
borderColor = "border-warning";
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
[Inject]
|
||||
protected TabDataService TabServ { get; set; } = null!;
|
||||
protected async Task doDelete(CommentiModel currNote)
|
||||
{
|
||||
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Sicuro di voler eliminare il seguente commento?{Environment.NewLine}[{currNote.Value}]"))
|
||||
return;
|
||||
|
||||
var done = await TabServ.EvListDelete(currNote.IdxMacchina, currNote.InizioStato, currNote.IdxTipo);
|
||||
if (done)
|
||||
{
|
||||
await E_relData.InvokeAsync(true);
|
||||
}
|
||||
|
||||
}
|
||||
protected async Task doSet2Edit(CommentiModel currNote)
|
||||
{
|
||||
await E_setComm.InvokeAsync(currNote);
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
@if (isMulti)
|
||||
{
|
||||
<div class="input-group mb-3">
|
||||
<span class="input-group-text" id="basic-addon1">Selezione Impianto</span>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text" id="basic-addon1"><i class="fa-solid fa-building"></i></span>
|
||||
<select class="form-select form-select-sm" @bind="@IdxMaccSel">
|
||||
@if (ListMacchine == null)
|
||||
{
|
||||
|
||||
@@ -57,7 +57,9 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
|
||||
var listMulti = await TDataService.VMSFDGetAll();
|
||||
ListMacchine = listMulti.Where(x => x.IdxMacchina.Contains($"{RecMSE?.IdxMacchina}#")).ToDictionary(x => x.IdxMacchina, x => $"{x.IdxMacchina.Replace($"{RecMSE?.IdxMacchina}#", "")}");
|
||||
ListMacchine = listMulti
|
||||
.Where(x => x.IdxMacchina.Contains($"{RecMSE?.IdxMacchina}#"))
|
||||
.ToDictionary(x => x.IdxMacchina, x => x.CodMaccArticolo);
|
||||
|
||||
if (ListMacchine.Count > 0 && string.IsNullOrEmpty(idxMaccSel))
|
||||
{
|
||||
|
||||
@@ -31,83 +31,9 @@ else
|
||||
{
|
||||
@if (FullMode)
|
||||
{
|
||||
@*<div class="card mapBlock shadow @RecMSE.Semaforo p-0 m-0" @onclick="ShowDetail">
|
||||
<img src="@ImgUrlMacc(RecMSE.Url)" class="card-img-top" alt="@RecMSE.CodMacchina">
|
||||
<div class="m-1 bg-black">
|
||||
<div class="card-img-overlay p-0 d-flex flex-row-reverse align-items-start rCTop">
|
||||
<div class="labelTopDx px-2 w-100">
|
||||
<div class="row">
|
||||
<div class="col-3 text-start">
|
||||
Art
|
||||
</div>
|
||||
<div class="col-9 text-end fw-bold">
|
||||
@RecMSE.CodArticolo
|
||||
</div>
|
||||
</div>
|
||||
<div class="row small">
|
||||
<div class="col-6 text-start">
|
||||
@($"PODL{RecMSE.IdxPOdl:00000000}")
|
||||
</div>
|
||||
<div class="col-6 text-end">
|
||||
@($"ODL{RecMSE.IdxOdl:00000000}")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card bg-black text-light p-0 rCBot">
|
||||
<div class="row justify-content-center mx-0">
|
||||
<div class="col-12 px-1">
|
||||
<h4 class="text-start mb-0 fw-bold">
|
||||
@RecMSE.Nome
|
||||
</h4>
|
||||
</div>
|
||||
<div class="col-12 p-1 @RecMSE.Semaforo">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="p-0 mr-auto">
|
||||
<b>@RecMSE.DescrizioneStato</b>
|
||||
</div>
|
||||
<div class="p-0">
|
||||
@(formatDurata(RecMSE.Durata))
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 p-0 text-nowrap" style="font-size: 1.2em; line-height: 1.0em;">
|
||||
<div class="row px-1 fw-bold" style="font-size:0.85em;">
|
||||
<div class="col pe-0">
|
||||
<small class="text-success">Confermati</small>
|
||||
</div>
|
||||
<div class="col text-center px-0">
|
||||
<small class="text-warning">Prodotti</small>
|
||||
</div>
|
||||
<div class="col text-end ps-0">
|
||||
<small class="text-light">Ordinati</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row px-1">
|
||||
<div class="col pe-0 text-success">
|
||||
@($"{RecMSE.PezziConf:N0}")
|
||||
</div>
|
||||
<div class="col text-center text-warning px-0">
|
||||
@($"{RecMSE.PezziProd:N0}")
|
||||
</div>
|
||||
<div class="col text-end ps-0">
|
||||
@($"{RecMSE.NumPezzi:N0}")
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col m-1">
|
||||
<ProdAdvDispl CountData="@CurrCount"></ProdAdvDispl>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>*@
|
||||
if (Width > 640)
|
||||
{
|
||||
<div class="card shadow" @onclick="ShowDetail" style="border-radius: 15px">
|
||||
@*<img src="@ImgUrlMacc(RecMSE.Url)" class="card-img-top imgFitToSize" alt="@RecMSE.CodMacchina">*@
|
||||
<div class="card shadow rounded rounded-4 border-secondary" @onclick="ShowDetail">
|
||||
<img src="@ImgUrlMacc(RecMSE.Url)" class="card-img-top imgFitToSize" alt="@RecMSE.CodMacchina">
|
||||
<div class="bg-black">
|
||||
<div class="card-img-overlay p-0 d-flex flex-row-reverse align-items-start rCTop">
|
||||
@@ -118,10 +44,10 @@ else
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-1" style="background-color: #212427; border-radius: 0 0 15px 15px">
|
||||
<div class="@RecMSE.Semaforo p-1" style="border-radius: 15px">
|
||||
<div class="card-body p-1">
|
||||
<div class="@RecMSE.Semaforo borderStd p-1">
|
||||
<div class="d-flex justify-content-center fs-5">
|
||||
<span><b>@RecMSE.DescrizioneStato</b>: @(formatDurata(RecMSE.Durata))</span>
|
||||
<span><b>@RecMSE.DescrizioneStato</b>: @(FormatDurata(RecMSE.Durata))</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between">
|
||||
@@ -130,9 +56,12 @@ else
|
||||
</div>
|
||||
<div class="col-8" style="line-height: 1.6rem;">
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="text-center text-success ">
|
||||
<div class="text-center text-success d-flex justify-content-between">
|
||||
<div>
|
||||
<i class="fa-regular fa-circle-check"></i> @($" {RecMSE.PezziConf:N0}")
|
||||
<i class="fa-regular fa-circle-check"></i> @($" {RecMSE.PezziConf:N0}")
|
||||
</div>
|
||||
<div class="text-danger">
|
||||
+ @($" {0:N0}")
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center text-warning ">
|
||||
@@ -162,13 +91,13 @@ else
|
||||
else
|
||||
{
|
||||
|
||||
<div class="card shadow" @onclick="ShowDetail" style="border-radius: 11px; background: linear-gradient(121deg, rgba(255, 255, 255, 0.20) -0.71%, rgba(255, 255, 255, 0.05) 97.66%); box-shadow: 0px 4px 24px -1px rgba(0, 0, 0, 0.25);">
|
||||
<div class="cardObj shadow" @onclick="ShowDetail">
|
||||
<div class="card-body p-0">
|
||||
<div style="border-radius: 11px;" class="@RecMSE.Semaforo p-1 text-center">
|
||||
<div class="fs-2" style="line-height: 1.8rem;">
|
||||
<div class="@RecMSE.Semaforo borderStd p-1 text-center">
|
||||
<div class="fs-5" style="line-height: 1.8rem;">
|
||||
<b>@RecMSE.Nome</b>
|
||||
<br />
|
||||
<b>@RecMSE.DescrizioneStato</b>: @(formatDurata(RecMSE.Durata))
|
||||
<b>@RecMSE.DescrizioneStato</b>: @(FormatDurata(RecMSE.Durata))
|
||||
</div>
|
||||
</div>
|
||||
@if (showCard)
|
||||
@@ -178,9 +107,16 @@ else
|
||||
<EgwCoreLib.Razor.CircleGaugeMulti Titolo="@($"{currMaxVal}")" Testo="#pz prod" maxVal="@currMaxVal" ListInner="@innerCircleVals" ListOuter="@outerCircleVals" ShowCircleBtn="true"></EgwCoreLib.Razor.CircleGaugeMulti>
|
||||
</div>
|
||||
<div style="font-size: 1rem" class="me-3 col-6">
|
||||
<div class="text-center text-success d-flex justify-content-between">
|
||||
<div class="text-center text-success d-flex justify-content-between pe-2">
|
||||
<div class="col-4"><i class="fa-regular fa-circle-check"></i></div>
|
||||
<div class="col-8">@($"{RecMSE.PezziConf:N0}")</div>
|
||||
<div class="col-8 d-flex justify-content-between">
|
||||
<div>
|
||||
@($"{RecMSE.PezziConf:N0}")
|
||||
</div>
|
||||
<div class="text-danger">
|
||||
+ @($" {0:N0}")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center text-warning d-flex justify-content-between">
|
||||
<div class="col-4"><i class="fa-solid fa-layer-group"></i></div>
|
||||
@@ -203,63 +139,74 @@ else
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="card mapBlock shadow @RecMSE.Semaforo p-0 m-0 col-10">
|
||||
<div class="m-1 bg-black">
|
||||
<div class="card bg-black text-light p-0 rCBot">
|
||||
<div class="row justify-content-center mx-0">
|
||||
<div class="col-12 px-1">
|
||||
<h4 class="text-start mb-0 fw-bold">
|
||||
@RecMSE.Nome
|
||||
</h4>
|
||||
</div>
|
||||
<div class="col-12 p-1 @RecMSE.Semaforo">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="p-0 mr-auto">
|
||||
<b>@RecMSE.DescrizioneStato</b>
|
||||
</div>
|
||||
<div class="p-0">
|
||||
@(formatDurata(RecMSE.Durata))
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 p-0 text-nowrap" style="font-size: 1.2em; line-height: 1.0em;">
|
||||
<div class="row px-1 fw-bold" style="font-size:0.85em;">
|
||||
<div class="col pe-0">
|
||||
<small class="text-success">Confermati</small>
|
||||
</div>
|
||||
<div class="col text-center px-0">
|
||||
<small class="text-warning">Prodotti</small>
|
||||
</div>
|
||||
<div class="col text-end ps-0">
|
||||
<small class="text-light">Ordinati</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row px-1">
|
||||
<div class="col pe-0 text-success">
|
||||
@($"{RecMSE.PezziConf:N0}")
|
||||
</div>
|
||||
<div class="col text-center text-warning px-0">
|
||||
@($"{RecMSE.PezziProd:N0}")
|
||||
</div>
|
||||
<div class="col text-end ps-0">
|
||||
@($"{RecMSE.NumPezzi:N0}")
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col m-1">
|
||||
<ProdAdvDispl CountData="@CurrCount"></ProdAdvDispl>
|
||||
</div>
|
||||
|
||||
<div class="cardObj px-3 py-1">
|
||||
<div class="text-center d-flex justify-content-between ">
|
||||
<div class="col-4">
|
||||
<div class="py-2">
|
||||
<h4 class="text-start mb-0 fw-bold">
|
||||
@RecMSE.Nome
|
||||
</h4>
|
||||
</div>
|
||||
<div style="font-size: 1rem" class="me-3">
|
||||
<div class="text-end text-success d-flex justify-content-between">
|
||||
<div class="col-4"><i class="fa-regular fa-circle-check"></i></div>
|
||||
<div class="col-8 d-flex justify-content-between">
|
||||
<div>
|
||||
@($"{RecMSE.PezziConf:N0}")
|
||||
</div>
|
||||
<div class="text-danger">
|
||||
+ @($" {0:N0}")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-end text-warning d-flex justify-content-between">
|
||||
<div class="col-4"><i class="fa-solid fa-layer-group"></i></div>
|
||||
<div class="col-8">@($"{RecMSE.PezziProd:N0}")</div>
|
||||
</div>
|
||||
<div class="text-end text-primary d-flex justify-content-between">
|
||||
<div class="col-4"><i class="fa-brands fa-stack-overflow"></i></div>
|
||||
<div class="col-8">@($"{RecMSE.extraVal:N0}")</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4" style="max-height: 8rem; max-width: 8rem;">
|
||||
<EgwCoreLib.Razor.CircleGaugeMulti Titolo="@($"{currMaxVal}")" Testo="#pz prod" maxVal="@currMaxVal" ListInner="@innerCircleVals" ListOuter="@outerCircleVals" ShowCircleBtn="true"></EgwCoreLib.Razor.CircleGaugeMulti>
|
||||
</div>
|
||||
<div class="col-4 d-flex flex-wrap justify-content-center align-items-center " style="line-height: 1.6rem;">
|
||||
|
||||
<div>
|
||||
<div class="text-light d-flex justify-content-between small lh-sm">
|
||||
<div class="text-start col-4">ART:</div>
|
||||
<div class="text-end col-8">@($"{RecMSE.CodArticolo}")</div>
|
||||
</div>
|
||||
<div class="text-end text-light d-flex justify-content-between small lh-sm">
|
||||
<div class="text-start col-4">ODL:</div>
|
||||
<div class="text-end col-8">@($"ODL{RecMSE.IdxOdl:00000000}")</div>
|
||||
</div>
|
||||
<div class="text-end text-light d-flex justify-content-between small lh-sm">
|
||||
<div class="text-start col-4">PODL:</div>
|
||||
<div class="text-end col-8">@($"PODL{RecMSE.IdxPOdl:00000000}")</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-2 d-flex flex-wrap align-items-center justify-content-center p-1">
|
||||
<button class="w-100 h-100 btn btn-secondary">
|
||||
<i class="fa-solid fa-file-pdf" style="font-size: 4vw"></i>
|
||||
</button>
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-10 mb-2 px-2 py-1 @RecMSE.Semaforo statusCard">
|
||||
<div class="d-flex justify-content-center ">
|
||||
<div class="p-0 mr-auto me-1">
|
||||
<b>@RecMSE.DescrizioneStato</b> :
|
||||
</div>
|
||||
<div class="p-0">
|
||||
@(FormatDurata(RecMSE.Durata))
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-2">
|
||||
<div class="px-1 w-100">
|
||||
<button class="btn btn-sm btn-secondary w-100"><i class="fa-regular fa-file-pdf"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@ using global::Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
using NLog.Fluent;
|
||||
using static MP_TAB_SERV.Pages.User;
|
||||
using NLog;
|
||||
using static Org.BouncyCastle.Math.EC.ECCurve;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
@@ -12,9 +12,12 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
public string currIpv4 { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public bool FullMode { get; set; } = true;
|
||||
|
||||
|
||||
[Parameter]
|
||||
public int keepAliveMin { get; set; } = 5;
|
||||
|
||||
@@ -24,57 +27,14 @@ namespace MP_TAB_SERV.Components
|
||||
[Parameter]
|
||||
public bool showCard { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime { get; set; } = null!;
|
||||
[Parameter]
|
||||
public int Width { get; set; } = 0;
|
||||
|
||||
[Parameter]
|
||||
public int Height { get; set; } = 0;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
|
||||
protected List<CircleGaugeMulti.CircSegm> innerCircleVals = new List<CircleGaugeMulti.CircSegm>();
|
||||
protected List<CircleGaugeMulti.CircSegm> outerCircleVals = new List<CircleGaugeMulti.CircSegm>();
|
||||
|
||||
protected int currVal1 = 1000;
|
||||
protected int currMaxVal = 1000;
|
||||
protected int maxVal = 1000;
|
||||
public int Height { get; set; } = 0;
|
||||
public int Width { get; set; } = 0;
|
||||
public string currIpv4 { get; set; } = "";
|
||||
|
||||
public class WindowDimension
|
||||
{
|
||||
public int Width { get; set; }
|
||||
public int Height { get; set; }
|
||||
}
|
||||
protected async Task getWDim()
|
||||
{
|
||||
var dimension = await JSRuntime.InvokeAsync<WindowDimension>("getWindowDimensions");
|
||||
Height = dimension.Height;
|
||||
Width = dimension.Width;
|
||||
}
|
||||
|
||||
protected async Task setGaugeVals()
|
||||
{
|
||||
await Task.Delay(1);
|
||||
if (RecMSE != null)
|
||||
{
|
||||
innerCircleVals.Clear();
|
||||
outerCircleVals.Clear();
|
||||
currMaxVal = int.Parse(RecMSE.NumPezzi.ToString()!);
|
||||
innerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#DCFD15", Value = RecMSE.PezziProd });
|
||||
|
||||
if (RecMSE.PezziConf > 0)
|
||||
{
|
||||
innerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#13FD67", Value = RecMSE.PezziConf });
|
||||
}
|
||||
|
||||
if (RecMSE.extraVal > 0)
|
||||
{
|
||||
outerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#1367FD", Value = RecMSE.extraVal });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
@@ -82,27 +42,22 @@ namespace MP_TAB_SERV.Components
|
||||
/// </summary>
|
||||
/// <param name="minuti">minuti</param>
|
||||
/// <returns></returns>
|
||||
public static string formatDurata(double? minuti)
|
||||
public static string FormatDurata(double? minuti)
|
||||
{
|
||||
string answ = "??";
|
||||
if (minuti != null)
|
||||
TimeSpan tempo = TimeSpan.FromMinutes(minuti ?? 0);
|
||||
if (tempo.TotalMinutes < 60)
|
||||
{
|
||||
DateTime tempo = new DateTime();
|
||||
tempo = tempo.AddMinutes((double)minuti);
|
||||
if (minuti < 60)
|
||||
{
|
||||
answ = $"{tempo.Minute:00}:{tempo.Second:00}";
|
||||
}
|
||||
else if (minuti < 1440)
|
||||
{
|
||||
answ = $"{tempo.Hour}h {tempo.Minute}m";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = $"{tempo.DayOfYear}g {tempo.Hour}h";
|
||||
}
|
||||
answ = $"{tempo.Minutes:00}:{tempo.Seconds:00}";
|
||||
}
|
||||
else if (tempo.TotalHours < 24)
|
||||
{
|
||||
answ = $"{tempo.Hours}h {tempo.Minutes}m";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = $"{tempo.Days}g {tempo.Hours}h";
|
||||
}
|
||||
|
||||
return answ;
|
||||
}
|
||||
|
||||
@@ -113,31 +68,12 @@ namespace MP_TAB_SERV.Components
|
||||
/// <returns></returns>
|
||||
public string ImgUrlMacc(string url)
|
||||
{
|
||||
string answ = "";
|
||||
if (string.IsNullOrEmpty(url.ToString()))
|
||||
{
|
||||
//url = "Steamware.png";
|
||||
url = "SIMDP1.png";
|
||||
url = "Steamware.png";
|
||||
}
|
||||
|
||||
// verifico esistenza macchina SMALL...
|
||||
answ = $"images/macchine/small/{url}";
|
||||
string fullPath = Path.Combine(imgBasePath, "wwwroot", answ);
|
||||
if (!File.Exists(fullPath))
|
||||
{
|
||||
// se non ci fosse cerco immagine fullsize
|
||||
answ = $"images/macchine/{url}";
|
||||
fullPath = Path.Combine(imgBasePath, "wwwroot", answ);
|
||||
}
|
||||
|
||||
// altrimenti metto default Steamware
|
||||
if (!File.Exists(fullPath))
|
||||
{
|
||||
//answ = "images/macchine/Steamware.png";
|
||||
answ = "images/macchine/SIMDP1.png";
|
||||
}
|
||||
|
||||
return answ;
|
||||
string fullPath = Path.Combine(imgBasePath, url);
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
@@ -146,8 +82,16 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
protected string baseCss = "sem";
|
||||
|
||||
protected int currMaxVal = 1000;
|
||||
|
||||
protected List<CircleGaugeMulti.CircSegm> innerCircleVals = new List<CircleGaugeMulti.CircSegm>();
|
||||
|
||||
protected int kaFactor = 60 / 2;
|
||||
|
||||
protected int maxVal = 1000;
|
||||
|
||||
protected List<CircleGaugeMulti.CircSegm> outerCircleVals = new List<CircleGaugeMulti.CircSegm>();
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
@@ -156,16 +100,23 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
get
|
||||
{
|
||||
ProdAdvDispl.ProdCounter answ = new ProdAdvDispl.ProdCounter()
|
||||
ProdAdvDispl.ProdCounter answ = new ProdAdvDispl.ProdCounter();
|
||||
if (RecMSE != null)
|
||||
{
|
||||
numPzConf = (int)RecMSE.PezziConf,
|
||||
numPzOrd = (int)RecMSE.NumPezzi,
|
||||
numPzProd = (int)RecMSE.PezziProd
|
||||
};
|
||||
answ = new ProdAdvDispl.ProdCounter()
|
||||
{
|
||||
numPzConf = (int)RecMSE.PezziConf,
|
||||
numPzOrd = (int)RecMSE.NumPezzi,
|
||||
numPzProd = (int)RecMSE.PezziProd
|
||||
};
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
@@ -176,11 +127,15 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
|
||||
[Inject]
|
||||
protected IConfiguration config { get; set; } = null!;
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{//await Task.Delay(500);
|
||||
if (firstRender)
|
||||
{
|
||||
await getWDim();
|
||||
//await getWDim();
|
||||
StateHasChanged();
|
||||
}
|
||||
isLoading = RecMSE == null;
|
||||
@@ -188,18 +143,49 @@ namespace MP_TAB_SERV.Components
|
||||
//return base.OnAfterRenderAsync(firstRender);
|
||||
}
|
||||
|
||||
protected override async void OnInitialized()
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
isLoading = true;
|
||||
// se configurata uso cartella virtuale... altrimenti cartella processo
|
||||
imgBasePath = Environment.CurrentDirectory; // @"C:\Steamware\macchine";
|
||||
await setGaugeVals();
|
||||
var sImgBasePath = config.GetValue<string>("OptConf:ImgBasePath");
|
||||
if (!string.IsNullOrEmpty(sImgBasePath))
|
||||
{
|
||||
imgBasePath = sImgBasePath;
|
||||
}
|
||||
else
|
||||
{
|
||||
imgBasePath = $"{Environment.CurrentDirectory}/images/";
|
||||
}
|
||||
}
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
isLoading = RecMSE == null;
|
||||
await Task.Delay(1);
|
||||
setGaugeVals();
|
||||
}
|
||||
|
||||
protected void setGaugeVals()
|
||||
{
|
||||
if (RecMSE != null)
|
||||
{
|
||||
innerCircleVals.Clear();
|
||||
outerCircleVals.Clear();
|
||||
currMaxVal = int.Parse(RecMSE.NumPezzi.ToString()!);
|
||||
innerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#FFC107", Value = RecMSE.PezziProd });
|
||||
if (RecMSE.PezziConf > 0)
|
||||
{
|
||||
innerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#198754", Value = RecMSE.PezziConf });
|
||||
}
|
||||
if (RecMSE.extraVal > 0)
|
||||
{
|
||||
outerCircleVals.Add(new CircleGaugeMulti.CircSegm() { Color = "#1367FD", Value = RecMSE.extraVal });
|
||||
}
|
||||
//Log.Trace($"MBlock | {RecMSE.IdxMacchina} | 03");
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Info("MBlock NO DATA");
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task ShowDetail()
|
||||
@@ -214,6 +200,7 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
private string imgBasePath = "";
|
||||
private bool isLoading = false;
|
||||
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
/* area semafori*/
|
||||
.sVe {
|
||||
text-align: left;
|
||||
background: #009036;
|
||||
background: #198754;
|
||||
/*background: rgba(0,255,80,.6);*/
|
||||
/*padding: 0px 4px 0px 4px;*/
|
||||
@@ -48,7 +47,7 @@
|
||||
}
|
||||
.sGi {
|
||||
text-align: left;
|
||||
background: #ffec00;
|
||||
background: #ffc107;
|
||||
background: rgba(255, 220, 0, 0.6);
|
||||
color: #fff;
|
||||
/*padding: 0px 4px 0px 4px;*/
|
||||
@@ -76,6 +75,11 @@
|
||||
/*padding: 0px 4px 0px 4px;*/
|
||||
}
|
||||
/*end semafori */
|
||||
.card-body {
|
||||
background-color: currentColor;
|
||||
background-image: linear-gradient(121deg, rgba(255, 255, 255, 0.2) -0.71%, rgba(255, 255, 255, 0.05) 97.66%);
|
||||
border-radius: 0 0 15px 15px;
|
||||
}
|
||||
.imgFitToSize {
|
||||
height: 7.5rem;
|
||||
object-fit: cover;
|
||||
@@ -85,4 +89,10 @@
|
||||
.imgFitToSize {
|
||||
height: 5rem;
|
||||
}
|
||||
.card-body {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
.statusCard {
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
@@ -42,7 +42,6 @@
|
||||
/* area semafori*/
|
||||
.sVe {
|
||||
text-align: left;
|
||||
background: #009036;
|
||||
background: #198754;
|
||||
/*background: rgba(0,255,80,.6);*/
|
||||
/*padding: 0px 4px 0px 4px;*/
|
||||
@@ -52,7 +51,7 @@
|
||||
|
||||
.sGi {
|
||||
text-align: left;
|
||||
background: #ffec00;
|
||||
background: #ffc107;
|
||||
background: rgba(255,220,0,.6);
|
||||
color: #fff;
|
||||
/*padding: 0px 4px 0px 4px;*/
|
||||
@@ -83,6 +82,11 @@
|
||||
/*padding: 0px 4px 0px 4px;*/
|
||||
}
|
||||
/*end semafori */
|
||||
.card-body {
|
||||
background-color: currentColor;
|
||||
background-image: linear-gradient(121deg, rgba(255, 255, 255, 0.20) -0.71%, rgba(255, 255, 255, 0.05) 97.66%);
|
||||
border-radius: 0 0 15px 15px
|
||||
}
|
||||
|
||||
.imgFitToSize {
|
||||
height: 7.5rem;
|
||||
@@ -94,5 +98,14 @@
|
||||
.imgFitToSize{
|
||||
height: 5rem;
|
||||
}
|
||||
.card-body{
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.statusCard {
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.mapBlock{font-family:'Open Sans Condensed',sans-serif;color:#fff;background-image:linear-gradient(#111,#000);min-width:8em;}.labelTopDx{padding:.1em .4em;width:auto;min-height:0;top:0;left:auto;bottom:auto;color:#fff;background:#2200de;background:rgba(33,36,39,.7);border-radius:15px 15px 0 0;}.sVe{text-align:left;background:#009036;background:#198754;color:#fff;}.sGi{text-align:left;background:#ffec00;background:rgba(255,220,0,.6);color:#fff;}.sRo{text-align:left;background-color:#e2001a;background:rgba(240,0,10,.6);color:#fff;}.sBl{text-align:left;background:#3690ff;background:rgba(0,80,255,.6);color:#fff;}.sGr{text-align:left;background-color:#bcbcbc;background:rgba(180,180,180,.6);color:#fff;}.imgFitToSize{height:7.5rem;object-fit:cover;border-radius:15px 15px 0 0;}@media(max-width:640.98px){.imgFitToSize{height:5rem;}}
|
||||
.mapBlock{font-family:'Open Sans Condensed',sans-serif;color:#fff;background-image:linear-gradient(#111,#000);min-width:8em;}.labelTopDx{padding:.1em .4em;width:auto;min-height:0;top:0;left:auto;bottom:auto;color:#fff;background:#2200de;background:rgba(33,36,39,.7);border-radius:15px 15px 0 0;}.sVe{text-align:left;background:#198754;color:#fff;}.sGi{text-align:left;background:#ffc107;background:rgba(255,220,0,.6);color:#fff;}.sRo{text-align:left;background-color:#e2001a;background:rgba(240,0,10,.6);color:#fff;}.sBl{text-align:left;background:#3690ff;background:rgba(0,80,255,.6);color:#fff;}.sGr{text-align:left;background-color:#bcbcbc;background:rgba(180,180,180,.6);color:#fff;}.card-body{background-color:currentColor;background-image:linear-gradient(121deg,rgba(255,255,255,.2) -.71%,rgba(255,255,255,.05) 97.66%);border-radius:0 0 15px 15px;}.imgFitToSize{height:7.5rem;object-fit:cover;border-radius:15px 15px 0 0;}@media(max-width:640.98px){.imgFitToSize{height:5rem;}.card-body{background-color:transparent;}}.statusCard{border-radius:.5rem;}
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
using NLog;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class MseSampler : IDisposable
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<List<MappaStatoExpl>> E_Updated { get; set; }
|
||||
|
||||
/// <summary> Moltiplicatore campionamento:
|
||||
/// HF: se > 1 (mappa)
|
||||
/// LF: se < 1 (dettaglio) </summary>
|
||||
[Parameter]
|
||||
public double SampleMult { get; set; } = 1;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (aTimer != null)
|
||||
{
|
||||
aTimer.Elapsed -= ElapsedTimer;
|
||||
aTimer.Stop();
|
||||
aTimer.Dispose();
|
||||
Log.Info("MseSampler Timer Disposed!");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Fields
|
||||
|
||||
protected int fastTimerMSec = 3000;
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected IConfiguration config { get; set; } = null!;
|
||||
|
||||
protected int fastRefreshMs
|
||||
{
|
||||
get
|
||||
{
|
||||
// tempo variabile tra +/- 10% del target (SampleMult) della freq standard di update MSE
|
||||
int answ = ((int)(fastTimerMSec / SampleMult * rnd.Next(900, 1100))) / 1000;
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected StatusData MDataService { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected void ElapsedTimer(object? source, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
aTimer.Interval = fastRefreshMs;
|
||||
await InvokeAsync(RefreshData);
|
||||
//Log.Trace("MseSampler Timer elapsed");
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
SetupConf();
|
||||
StartTimer();
|
||||
}
|
||||
|
||||
protected void StartTimer()
|
||||
{
|
||||
aTimer = new System.Timers.Timer(fastRefreshMs);
|
||||
aTimer.Elapsed += ElapsedTimer;
|
||||
aTimer.Enabled = true;
|
||||
aTimer.Start();
|
||||
Log.Info("MseSampler Timer started!");
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
private System.Timers.Timer aTimer = null!;
|
||||
|
||||
private Random rnd = new Random();
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private async Task RefreshData()
|
||||
{
|
||||
List<MappaStatoExpl> ListMSE = await MDataService.MseGetAll();
|
||||
await MServ.SaveMse(ListMSE);
|
||||
await E_Updated.InvokeAsync(ListMSE);
|
||||
}
|
||||
|
||||
private void SetupConf()
|
||||
{
|
||||
// sistemo i parametri opzionali...
|
||||
fastTimerMSec = config.GetValue<int>("OptConf:msRefresh");
|
||||
Log.Trace($"MseSampler setupConf | Effettuato setup parametri | fastRefreshMSec: {fastTimerMSec}");
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
<button class="btn btn-lg bg-info w-100" @onclick="ToggleCtrl">
|
||||
<i class="fa-solid fa-star"></i>
|
||||
|
||||
<span class="fs-4 fw-bold">@Title</span>
|
||||
<span class="fs-5 fw-bold">@Title</span>
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -29,6 +29,19 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
[Parameter]
|
||||
public bool CanSave { get; set; } = false;
|
||||
[Parameter]
|
||||
public CommentiModel? CurrComm
|
||||
{
|
||||
set
|
||||
{
|
||||
if (value != null)
|
||||
{
|
||||
DateSel = value.InizioStato;
|
||||
UserComment = value.Value;
|
||||
ShowBtn = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<string> E_CommRec { get; set; }
|
||||
@@ -233,6 +246,7 @@ namespace MP_TAB_SERV.Components
|
||||
UserComment = "";
|
||||
DateSel = DateTime.Now;
|
||||
ShowBtn = true;
|
||||
//StateHasChanged();
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
|
||||
<NotesEditor CanSave="true" Title="Nuovo Commento" RecMSE="@RecMSE" E_Updated="DoUpdate" CurrRecord="@currEv"></NotesEditor>
|
||||
<NotesEditor CanSave="true" Title="Nuovo Commento" RecMSE="@RecMSE" E_Updated="DoUpdate" CurrRecord="@currEv" CurrComm="currComm"></NotesEditor>
|
||||
|
||||
<div class="row mt-1">
|
||||
<div class="col-7 col-sm-8 col-lg-9 pr-1">
|
||||
<div class="col-12 pr-1">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="form-floating">
|
||||
<select class="form-select" @bind="@NumGiorni" id="floatingLabelGG" style="background-color: #4d5052; color: #FFF;">
|
||||
<select class="form-select" @bind="@NumGiorni" id="floatingLabelGG" >
|
||||
@for (int i = 1; i < 11; i++)
|
||||
{
|
||||
<option label="@i" value="@i"></option>
|
||||
@@ -25,7 +25,7 @@
|
||||
<div class="col-6">
|
||||
|
||||
<div class="form-floating">
|
||||
<select class="form-select" @bind="@DurataMin" id="floatingLabelDurMin" style="background-color: #4d5052; color: #FFF;">
|
||||
<select class="form-select" @bind="@DurataMin" id="floatingLabelDurMin">
|
||||
@for (int i = 1; i < 7; i++)
|
||||
{
|
||||
<option label="@(5*i)'" value="@(5*i)"></option>
|
||||
@@ -42,66 +42,13 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-between flex-wrap">
|
||||
@foreach (var item in RecordListFnq)
|
||||
<div class="row flex-wrap">
|
||||
@foreach (var item in RecordListFull)
|
||||
{
|
||||
<LongStopList currFnq="@item"></LongStopList>
|
||||
<LongStopList currFnq="@item.Fermata" currNotes="@item.CommentiFermata" E_relData="reloadAfterDelOrUpd" E_setComm="setCurrComm"></LongStopList>
|
||||
}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-5 col-sm-4 col-lg-3 pl-1">
|
||||
|
||||
<div class="form-floating">
|
||||
<input type="number" class="form-control" @bind="@NumComm" id="commentsNum" style="background-color: #212427; color: #FFF;">
|
||||
<span for="commentsNum"># Commenti</span>
|
||||
</div>
|
||||
|
||||
|
||||
@if (RecordListComments == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else if (RecordListComments.Count == 0)
|
||||
{
|
||||
<div class="alert alert-warning">Nessun record trovato</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var item in RecordListComments)
|
||||
{
|
||||
<div class="my-1 w-100">
|
||||
<div class="card text-white w-100" style="font-size: 1.5rem">
|
||||
<div class="card-header py-0 px-2 mb-0 rCTop fs-3" style="background-color: rgba(33,36,39, .8)">
|
||||
<b>@item.Operatore</b>
|
||||
</div>
|
||||
<div class="card-body bg-dark p-1">
|
||||
|
||||
<div class="bg-dark p-1">
|
||||
@item.Value
|
||||
</div>
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-6 p-2">
|
||||
<button class="btn btn-sm btn-info w-100" @onclick="() => EditRec(item)"><i class="fa fa-edit"></i></button>
|
||||
</div>
|
||||
<div class="col-6 p-2">
|
||||
<button class="btn btn-sm btn-danger w-100" @onclick="() => DeteleRec(item)"><i class="fa fa-trash"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer bg-dark d-flex justify-content-between" style="font-size: .8rem">
|
||||
<div class="text-start p-0">
|
||||
@($"{item.InizioStato:yyyy/MM/dd HH:mm:ss}")
|
||||
</div>
|
||||
<div class="text-end p-0">
|
||||
@item.CodArticolo
|
||||
@($"ODL{item.IdxODL:000000000}")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.DTO;
|
||||
using MP.Data.Services;
|
||||
using NLog.LayoutRenderers.Wrappers;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
@@ -16,17 +18,19 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
protected EventListModel? currEv { get; set; } = null;
|
||||
|
||||
protected int DurataMin
|
||||
{
|
||||
get => _durataMin;
|
||||
get => durataMinCurr;
|
||||
set
|
||||
{
|
||||
if (_durataMin != value)
|
||||
if (durataMinCurr != value)
|
||||
{
|
||||
_durataMin = value;
|
||||
durataMinCurr = value;
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
await ReloadFnq();
|
||||
await ReloadData();
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
@@ -42,34 +46,17 @@ namespace MP_TAB_SERV.Components
|
||||
[Inject]
|
||||
protected NavigationManager NavMan { get; set; } = null!;
|
||||
|
||||
protected int NumComm
|
||||
{
|
||||
get => numComm;
|
||||
set
|
||||
{
|
||||
if (numComm != value)
|
||||
{
|
||||
numComm = value;
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
await ReloadComments();
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected int NumGiorni
|
||||
{
|
||||
get => _numGiorni;
|
||||
get => numGiorniCurr;
|
||||
set
|
||||
{
|
||||
if (_numGiorni != value)
|
||||
if (numGiorniCurr != value)
|
||||
{
|
||||
_numGiorni = value;
|
||||
numGiorniCurr = value;
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
await ReloadFnq();
|
||||
await ReloadData();
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
@@ -78,6 +65,7 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
protected List<CommentiModel>? RecordListComments { get; set; } = new List<CommentiModel>();
|
||||
protected List<FermiNonQualModel> RecordListFnq { get; set; } = new List<FermiNonQualModel>();
|
||||
protected List<FermiCommentatiDTO> RecordListFull { get; set; } = new List<FermiCommentatiDTO>();
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabServ { get; set; } = null!;
|
||||
@@ -95,8 +83,27 @@ namespace MP_TAB_SERV.Components
|
||||
await Task.Delay(1);
|
||||
await TabServ.EvListDelete(currRec.IdxMacchina, currRec.InizioStato, currRec.IdxTipo);
|
||||
// ricarico
|
||||
await ReloadComments();
|
||||
await ReloadFnq();
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task reloadAfterDelOrUpd(bool rel)
|
||||
{
|
||||
if (rel)
|
||||
{
|
||||
await ReloadComments();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
|
||||
protected CommentiModel? currComm { get; set; } = null;
|
||||
|
||||
protected async Task setCurrComm(CommentiModel _CurrComm)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
if(_CurrComm != null)
|
||||
{
|
||||
currComm = _CurrComm;
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task EditRec(CommentiModel currRec)
|
||||
@@ -111,21 +118,27 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
await ReloadComments();
|
||||
await ReloadFnq();
|
||||
if (durataMinCurr != durataMinLast || numGiorniCurr != numGiorniLast)
|
||||
{
|
||||
durataMinLast = durataMinCurr;
|
||||
numGiorniLast = numGiorniCurr;
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
|
||||
protected EventListModel? currEv { get; set; } = null;
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Properties
|
||||
#region Private Fields
|
||||
|
||||
private int _durataMin { get; set; } = 5;
|
||||
private int _numGiorni { get; set; } = 1;
|
||||
private int numComm { get; set; } = 5;
|
||||
private int durataMinCurr = 5;
|
||||
|
||||
#endregion Private Properties
|
||||
private int durataMinLast = 0;
|
||||
|
||||
private int numGiorniCurr = 3;
|
||||
|
||||
private int numGiorniLast = 0;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -140,7 +153,23 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
private async Task ReloadComments()
|
||||
{
|
||||
RecordListComments = await TabServ.CommentiGetLastByMacc(RecMSE?.IdxMacchina, NumComm);
|
||||
RecordListComments = await TabServ.CommentiGetLastByMacc(RecMSE?.IdxMacchina, NumGiorni);
|
||||
}
|
||||
|
||||
private async Task ReloadData()
|
||||
{
|
||||
await ReloadComments();
|
||||
await ReloadFnq();
|
||||
// preparo i DTO...
|
||||
RecordListFull = RecordListFnq
|
||||
.Select(x => new FermiCommentatiDTO()
|
||||
{
|
||||
Fermata = x,
|
||||
CommentiFermata = RecordListComments?
|
||||
.Where(c => c.InizioStato >= x.InizioStato
|
||||
&& c.InizioStato <= x.InizioStato.AddMinutes(x.DurataMinuti))
|
||||
.ToList()
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
private async Task ReloadFnq()
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<MachSel RecMSE="RecMSE" E_MachSel="SetMacc"></MachSel>
|
||||
</div>
|
||||
@if (isProcessing)
|
||||
{
|
||||
<ProgressDisplay RefreshInterval="200" Title="ODL Processing" MaxVal="@MaxVal" CurrVal="@currVal" NextVal="@nextVal" ExpTimeMSec="@expTimeMsec"></ProgressDisplay>
|
||||
<LoadingData Title="Elaborazione..." DisplaySize="LoadingData.CtrlSize.Large" DisplayMode="LoadingData.SpinMode.Growl"></LoadingData>
|
||||
}
|
||||
else
|
||||
{
|
||||
@if (isSlave)
|
||||
{
|
||||
<div class="col-12 my-2">
|
||||
<div class="btn btn-warning w-100">
|
||||
<div class="fs-1">@(Traduci("lblWarnHeadSlave"))</div>
|
||||
<div class="fs-4">@(Traduci("lblWarnBodySlave"))</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
@if (needConfProd)
|
||||
{
|
||||
<div class="col-12 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)
|
||||
{
|
||||
<div class="col-12">
|
||||
<FixOdl IdxMaccCurr="@IdxMaccParent"></FixOdl>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="col-12">
|
||||
Slave machine man
|
||||
</div>
|
||||
<div class="col-12">
|
||||
Check articolo in revisione
|
||||
</div>
|
||||
@if (cancelSetupEnabled)
|
||||
{
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-danger w-100">Annulla Setup ODL <i class="fa-solid fa-ban me-1"></i></button>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (!inAttr && !showOdlDetail)
|
||||
{
|
||||
<div class="col-12 my-1">
|
||||
<button class="btn btn-lg btn-warning w-100" disabled="@inAttr" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-down"></i> @txtBtnOdlDetail</button>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (showOdlDetail || inAttr)
|
||||
{
|
||||
<div class="col-12 my-1">
|
||||
<div class="card">
|
||||
<div class="card-header @cssDetailOdl d-flex justify-content-between">
|
||||
<div>
|
||||
<h4>@titleOdlDetail</h4>
|
||||
</div>
|
||||
<div>
|
||||
@if (idxPOdlSel == 0 && !inAttr)
|
||||
{
|
||||
<button class="btn btn-dark w-100" @onclick="ToggleOdlDetail"><i class="fa-solid fa-chevron-up"></i> @txtBtnOdlDetail</button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
P.ODL:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.IdxPromessa.ToString("N0")
|
||||
</div>
|
||||
</div>
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
Rif:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.KeyRichiesta
|
||||
</div>
|
||||
</div>
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
Cod:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.CodArticolo
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row border-top border-bottom border-secondary">
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
Articolo:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.DescArticolo
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
Pezzi:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.NumPezzi.ToString("N0")
|
||||
</div>
|
||||
</div>
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
TCiclo:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@if (currOdl != null && currOdl.Tcassegnato > 0)
|
||||
{
|
||||
@currOdl.Tcassegnato.ToString("N2")
|
||||
}
|
||||
else
|
||||
{
|
||||
@currPodl.Tcassegnato.ToString("N2")
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
Pz/pallet:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.PzPallet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row">
|
||||
<div class="col text-start fw-bold">
|
||||
@currPodl.Nome
|
||||
</div>
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
Priorita:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@currPodl.Priorita
|
||||
</div>
|
||||
</div>
|
||||
<div class="col d-flex justify-content-between">
|
||||
<div class="px-0 small">
|
||||
Data:
|
||||
</div>
|
||||
<div class="px-0 text-end fw-bold">
|
||||
@($"{currPodl.DueDate:yyyy.MM.dd}")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (!inAttr)
|
||||
{
|
||||
<div class="col-12 col-md-6">
|
||||
@if (idxPOdlSel > 0)
|
||||
{
|
||||
<button class="btn btn-lg btn-primary w-100" @onclick="OdlSetupStart"><i class="fa-solid fa-check me-1"></i> INIZIO Attrezzaggio</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<button class="btn btn-lg btn-primary w-100" disabled="@endProdDisabled" @onclick="ProdEnd"><i class="fa-solid fa-ban me-1"></i>FINE Produzione</button>
|
||||
}
|
||||
</div>
|
||||
<div class="col-12 col-md-6 mb-2">
|
||||
<div class="input-group input-group-lg">
|
||||
<input type="text" class="form-control w-25" placeholder="Cerca" aria-label="Cerca">
|
||||
<select class="form-select w-50" @bind="IdxPOdlSel">
|
||||
@foreach (var item in ListODL)
|
||||
{
|
||||
<option value="@item.value">@item.label</option>
|
||||
}
|
||||
</select>
|
||||
<div class="input-group-text">
|
||||
<input class="form-check-input mt-0 me-1" id="chk_all" type="checkbox" @bind="ShowAll">
|
||||
<label class="form-check-label" for="" chk_all">
|
||||
Tutti
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@if (idxPOdlSel > 0 || inAttr)
|
||||
{
|
||||
<div class="col-12 col-sm-6">
|
||||
<div class="form-floating">
|
||||
<textarea type="text" class="form-control" style="height: 7rem;" @bind="@noteAttr"></textarea>
|
||||
<label for="floatingComm">Note Attrezzaggio (opzionale)</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-sm-6">
|
||||
<SelTempoMSMC TempoMC="@tcRichAttr" modoControllo="SelTempoMSMC.timeControlMode.selettori" E_TCRich="SaveTCRich"></SelTempoMSMC>
|
||||
<div class="input-group">
|
||||
<div class="input-group-text">
|
||||
Pz Pallet
|
||||
</div>
|
||||
<select class="form-select" @bind="PzPallet">
|
||||
@for (int i = 1; i <= 20; i++)
|
||||
{
|
||||
<option value="@i">@i</option>
|
||||
}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (inAttr)
|
||||
{
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-warning w-100" disabled="@needConfProd" @onclick="OdlSetupEnd"><i class="fa-solid fa-check me-1"></i> FINE Attr / INIZIO Prod.</button>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
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 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 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>
|
||||
</div>
|
||||
<div class="col-12 col-md-6 p-2">
|
||||
<button class="btn btn-lg btn-danger w-100" disabled="@needConfProd"><i class="fa-solid fa-circle-exclamation me-1"></i> Creazione ODL Provvisorio</button>
|
||||
@* <div class="col-sm-12" runat="server" id="divOdlProvv">
|
||||
<div class="card">
|
||||
<div class="card-header p-0">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<asp:LinkButton runat="server" ID="lbtShowCreaOdlProvv" CssClass="btn w-100 btn-danger" OnClick="lbtShowCreaOdlProvv_Click"><i class="fa fa-exclamation-circle"></i> <%: lblCreaOdl %></asp:LinkButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-1 table-info text-dark table-secondary">
|
||||
<uc1:cmp_newODL runat="server" ID="cmp_newODL" Visible="false" />
|
||||
</div>
|
||||
</div>
|
||||
</div> *@
|
||||
</div>
|
||||
<div class="col-12 text-center text-danger">
|
||||
@lblOut
|
||||
</div>
|
||||
}
|
||||
}
|
||||
}
|
||||
</div>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +0,0 @@
|
||||
<h3>OdlProdFix</h3>
|
||||
|
||||
@code {
|
||||
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<h3>OdlSetup</h3>
|
||||
|
||||
@code {
|
||||
|
||||
}
|
||||
@@ -1,5 +1,139 @@
|
||||
<h3>ParamsMan</h3>
|
||||
|
||||
@code {
|
||||
|
||||
}
|
||||
<ShowProcessing Message="Caricamento" IsProcessing="@isProcessing"></ShowProcessing>
|
||||
<div class="cardObj p-2 mt-2">
|
||||
<div class="text-center">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="fs-3">
|
||||
Gestione Parametri Macchina
|
||||
</div>
|
||||
<div>
|
||||
<button class="btn btn-primary" @onclick="() => ForceReload()"><i class="fa-solid fa-rotate"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-1">
|
||||
<table class="table table-sm table-dark table-striped mb-0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Parametro
|
||||
</th>
|
||||
<th class="text-center">
|
||||
Valore
|
||||
</th>
|
||||
<th class="text-end">
|
||||
DTime
|
||||
</th>
|
||||
<th class="text-center">
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (ListRecord.Count == 0)
|
||||
{
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<div class="alert alert-warning text-center m-0"><h2>No record found</h2></div>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
else
|
||||
{
|
||||
@foreach (var item in ListRecord)
|
||||
{
|
||||
<tr class="@selectedCss(item.uid)">
|
||||
<td>
|
||||
<div class="row">
|
||||
<div class="col text-start">
|
||||
<div class="fw-bold text-uppercase">
|
||||
@item.description
|
||||
</div>
|
||||
<div class="small smaller">
|
||||
@item.name
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="row">
|
||||
@if (isSelected(item.uid))
|
||||
{
|
||||
<div class="col-12">
|
||||
<div class="input-group">
|
||||
<button class="btn btn-success" @onclick="() => DoSave()"><i class="fa-solid fa-check"></i></button>
|
||||
<input type="text" class="form-control" @bind="reqVal">
|
||||
<button class="btn btn-danger" @onclick="() => DoCancel()"><i class="fa-solid fa-ban"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div class="col-12">
|
||||
<div class="fw-bold">
|
||||
@item.value
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" runat="server" id="divRequest" visible='<%# !string.IsNullOrEmpty(Eval("reqValue").ToString()) %>'>
|
||||
<div class="col-12">
|
||||
<div class="fw-bold text-primary small text-nowrap">
|
||||
<i class="fa fa-hand-o-right" aria-hidden="true"></i>
|
||||
@item.reqValue
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-end">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="fw-light my-0 small text-end text-nowrap">
|
||||
<small class="d-block d-md-none">
|
||||
@($"{item.lastRead:HH:mm:ss}")
|
||||
</small>
|
||||
<small class="d-none d-md-block">
|
||||
@($"{item.lastRead:yyyy.MM.dd HH:mm:ss}")
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (!string.IsNullOrEmpty(item.reqValue))
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="fw-light my-0 text-primary small text-end text-nowrap">
|
||||
<small class="d-block d-md-none">
|
||||
@($"{item.lastRequest:HH:mm:ss}")
|
||||
</small>
|
||||
<small class="d-none d-md-block">
|
||||
@($"{item.lastRequest:yyyy.MM.dd HH:mm:ss}")
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
@if (item.writable)
|
||||
{
|
||||
@if (isSelected(item.uid))
|
||||
{
|
||||
@* <div class="col-12">
|
||||
<div class="input-group">
|
||||
<button class="btn btn-success" @onclick="() => DoSave()"><i class="fa-solid fa-check"></i></button>
|
||||
<button class="btn btn-danger" @onclick="() => ResetReq()"><i class="fa-solid fa-ban"></i></button>
|
||||
</div>
|
||||
</div> *@
|
||||
}
|
||||
else
|
||||
{
|
||||
<button class="btn btn-sm btn-primary" @onclick="() => SelRecord(item)"><i class="fa fa-pencil" aria-hidden="true"></i></button>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="">
|
||||
<div class="text-center"><i>Elenco parametri di configurazione impianto</i></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,174 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.DTO;
|
||||
using MP.Data.Services;
|
||||
using NLog;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class ParamsMan : IDisposable
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public MappaStatoExpl? RecMSE { get; set; } = null;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (aTimer != null)
|
||||
{
|
||||
aTimer.Elapsed -= ElapsedTimer;
|
||||
aTimer.Stop();
|
||||
aTimer.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
protected List<ObjItemDTO> ListRecord { get; set; } = new List<ObjItemDTO>();
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
protected string reqVal { get; set; } = "";
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected async Task DoCancel()
|
||||
{
|
||||
reqVal = "";
|
||||
currItem = null;
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task DoSave()
|
||||
{
|
||||
if (currItem != null)
|
||||
{
|
||||
// invio richiesta e salvo...
|
||||
updateParameter(currItem.uid, reqVal);
|
||||
currItem = null;
|
||||
}
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected void ElapsedTimer(object? source, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
await ReloadData();
|
||||
await InvokeAsync(() => StateHasChanged());
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
|
||||
protected async Task ForceReload()
|
||||
{
|
||||
currItem = null;
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected bool isSelected(string uid)
|
||||
{
|
||||
bool answ = false;
|
||||
if (currItem != null)
|
||||
{
|
||||
answ = uid == currItem.uid;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await Task.Delay(1);
|
||||
setupConf();
|
||||
StartTimer();
|
||||
currItem = null;
|
||||
if (RecMSE != null)
|
||||
{
|
||||
IdxMaccSel = RecMSE.IdxMacchina;
|
||||
await ReloadData();
|
||||
}
|
||||
await Task.Delay(1);
|
||||
}
|
||||
|
||||
protected string selectedCss(string uid)
|
||||
{
|
||||
string answ = "";
|
||||
if (currItem != null)
|
||||
{
|
||||
answ = uid == currItem.uid ? "table-info" : "";
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
protected void SelRecord(ObjItemDTO newRec)
|
||||
{
|
||||
reqVal = newRec.value;
|
||||
currItem = newRec;
|
||||
}
|
||||
|
||||
protected void StartTimer()
|
||||
{
|
||||
//int.TryParse(Configuration["ReloadStatusTimer"], out tOutPeriod);
|
||||
aTimer = new System.Timers.Timer(dtTimerTabParam);
|
||||
aTimer.Elapsed += ElapsedTimer;
|
||||
aTimer.Enabled = true;
|
||||
aTimer.Start();
|
||||
}
|
||||
|
||||
protected void updateParameter(string uid, string reqValue)
|
||||
{
|
||||
Log.Info($"updateParameter | idxMacchina: {IdxMaccSel} | uid: {uid} | reqValue: {reqValue}");
|
||||
TabDServ.MachineParamUpdate(IdxMaccSel, uid, reqValue);
|
||||
Log.Info($"updateParameter | idxMacchina: {IdxMaccSel} | uid: {uid} | done!");
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
private System.Timers.Timer aTimer = null!;
|
||||
private int dtTimerTabParam = 5000;
|
||||
private bool isProcessing = false;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private ObjItemDTO? currItem { get; set; } = null;
|
||||
|
||||
private string IdxMaccSel { get; set; } = "";
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private async Task ReloadData()
|
||||
{
|
||||
isProcessing = true;
|
||||
ListRecord = TabDServ.MachineParamList(IdxMaccSel);
|
||||
await Task.Delay(1);
|
||||
isProcessing = false;
|
||||
}
|
||||
|
||||
private void setupConf()
|
||||
{
|
||||
TabDServ.ConfigGetVal("dtTimerTabParam", ref dtTimerTabParam);
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
<div class="row textCondens mb-1">
|
||||
<div class="col-6 text-end">
|
||||
<div class="textCondens mb-1">
|
||||
@*<div class="col-6 text-end">
|
||||
<b>Gestione stampa etichette <i class="fa fa-long-arrow-right" aria-hidden="true"></i></b>
|
||||
<br />
|
||||
Gestione etichette per l'ODL con modulo MAG
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<a runat="server" href="@navUrl" target="_blank" class="btn btn-success btn-lg w-100">MAG <i class="fa fa-print"></i></a>
|
||||
</div>
|
||||
</div>*@
|
||||
@*<div class="col-6">
|
||||
</div>*@
|
||||
<a runat="server" href="@navUrl" target="_blank" class="btn btn-primary btn-sm w-100 py-2 px-4">MAG</a>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
|
||||
<MachSel RecMSE="RecMSE" E_MachSel="SetMacc"></MachSel>
|
||||
<div class="card bg-secondary">
|
||||
<div class="card-header p-0 bg-success">
|
||||
|
||||
<div class="d-flex justify-content-between mt-2">
|
||||
<div class="col-4">
|
||||
<MachSel RecMSE="RecMSE" E_MachSel="SetMacc"></MachSel>
|
||||
</div>
|
||||
|
||||
<div class="col-8 d-flex justify-content-end">
|
||||
<div class="px-1 col-4">
|
||||
<PrintMag RecMSE="RecMSE"></PrintMag>
|
||||
</div>
|
||||
@if (odlOk)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<button class="btn btn-lg text-light w-100" @onclick="ToggleConfProd">
|
||||
<i class="fa fa-check"></i> @ConfTitle
|
||||
</button>
|
||||
</div>
|
||||
<div class="px-1 col-8">
|
||||
<button class="btn btn-sm @ConfBg py-2 px-4" style="width: 100%" @onclick="ToggleConfProd">
|
||||
<i class="fa-solid fa-check pe-1"></i><span>@ConfTitle</span>
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
@@ -17,141 +22,144 @@
|
||||
<div class="alert alert-warning fs-3">MANCA ODL: conferma NON permessa</div>
|
||||
}
|
||||
</div>
|
||||
<div class="card-body p-0 text-light">
|
||||
@if (showInnov)
|
||||
{
|
||||
<div class="row textCondens text-end bg-dark m-1 p-1" runat="server" id="divInnovazioni" onloadeddata="showConfirmButton()">
|
||||
<div class="col-6 py-1 text-start text-uppercase">
|
||||
<b>Dati Incrementali</b>
|
||||
</div>
|
||||
|
||||
|
||||
@if (showInnov)
|
||||
{
|
||||
<div class="cardBg p-2 mt-2">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-3 p-1">
|
||||
|
||||
<div class="bg-success rounded">
|
||||
<div class="ps-1 fw-bold" style="font-size: .9rem;">Pezzi confermati</div>
|
||||
|
||||
<input class="form-control text-light bg-success border-0" aria-label="Floating label select example" @bind="numPzProdotti2Rec" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)" />
|
||||
</div>
|
||||
<div class="col-6 text-end">
|
||||
<sub>
|
||||
ultima conferma --> @dtReqUpdate.ToString()
|
||||
</sub>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 px-0 align-self-end fw-bold">
|
||||
<label>Pz Prodotti CONFERMATI</label>
|
||||
<input class="form-control fs-2 text-end alert alert-warning py-0 mb-0" @bind="numPzProdotti2Rec" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)">
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 px-0 align-self-end fw-bold">
|
||||
<div class="d-flex justify-content-around">
|
||||
<div>
|
||||
<span class="text-danger">Pz Scarto</span>
|
||||
+
|
||||
<span class="text-success">Pz Buoni</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-2 fs-4">
|
||||
<div class="d-flex justify-content-around">
|
||||
<div>
|
||||
<span runat="server" class="text-danger py-0">@lblPz2RecScarto</span>
|
||||
+
|
||||
<span runat="server" class="text-success py-0">@lblPz2RecBuoni</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 pr-1 align-self-end fw-bold">
|
||||
@*<div class="form-floating">
|
||||
<input class="form-select" id="floatingSelect" aria-label="Floating label select example" />
|
||||
<label for="floatingSelect">Works with selects</label>
|
||||
</div>*@
|
||||
@*<div class="form-floating">
|
||||
<input type="number" class="form-control bg-success" id="floatingInputConf" @bind="numPzProdotti2Rec" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)">
|
||||
<label for="floatingInputConf" class="text-light bg-success fw-bold" style="font-size: .8rem;">
|
||||
Pezzi confermati
|
||||
</label>
|
||||
</div>*@
|
||||
</div>
|
||||
<div class="col-3 p-1">
|
||||
<div class="bg-secondary rounded">
|
||||
@if (enablePzProdLasciati)
|
||||
{
|
||||
<label ID="lblNumLasciati" class="mb-0">Pz Prodotti LASCIATI</label>
|
||||
<input class="form-control fs-2 text-end alert alert-warning py-0 mb-0" @bind="numPzLasciati" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)">
|
||||
<div class="ps-1 fw-bold" style="font-size: .9rem;">Lasciati</div>
|
||||
|
||||
<input class="form-control text-light bg-secondary border-0" aria-label="Floating label select example" @bind="numPzLasciati" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<label class="btn btn-dark text-light btn-lg w-100" Visible="false"> </label>
|
||||
}
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 px-0 align-self-end fw-bold">
|
||||
@if (showConfirm)
|
||||
</div>
|
||||
<div class="col-3 p-1">
|
||||
<div><span class="text-success">Pz Buoni</span> <span>@lblPz2RecBuoni</span></div>
|
||||
<div><span class="text-danger">Pz scarto</span> <span>@lblPz2RecScarto</span></div>
|
||||
</div>
|
||||
<div class="col-3 p-1">
|
||||
@if (showConfirm)
|
||||
{
|
||||
<button class="btn btn-success text-light btn-lg w-100 h-100" @onclick="SalvaConfPz"><i class="fa-regular fa-floppy-disk"></i></button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
}
|
||||
<div class="row textCondens mt-2">
|
||||
<div class="col-4 py-1 text-start text-uppercase">
|
||||
<b>Dati Globali ODL</b>
|
||||
</div>
|
||||
<div class="col-8 d-flex justify-content-end pe-3">
|
||||
<div>
|
||||
<a class="btn btn-info btn-sm w-100 py-2 px-4" style="min-width: 72px; min-height: 39px" href="scrap"><i class="fa fa-bug"></i></a>
|
||||
</div>
|
||||
<div class="ms-2">
|
||||
<a class="btn btn-primary btn-sm w-100 py-2 px-4" style="min-width: 72px; min-height: 39px" href="controls"><i class="fa fa-wrench"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between flex-wrap mt-2">
|
||||
|
||||
<div class="col-6 col-sm-3 p-1">
|
||||
<div class="text-center h-100 w-100 p-2" style=" background-color: #fff3cd; border-radius: .5rem;">
|
||||
<div class="text-truncate">
|
||||
<span class="text-dark small">[A] NUOVI Pz.Prod</span>
|
||||
</div>
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<button class="btn btn-success text-light btn-lg w-100" @onclick="SalvaConfPz"><i class="fa-regular fa-floppy-disk"></i> CONFERMA</button>
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="fw-bold" style="font-size: 3vh">@($"{numPzProdotti2Rec:N0}")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row textCondens">
|
||||
<div class="col-6 py-1 text-start text-uppercase">
|
||||
<b>Dati Globali ODL</b>
|
||||
</div>
|
||||
<div class="col-6 text-end" id="divPeriodo">
|
||||
<sub>
|
||||
Periodo ODL calcolato:
|
||||
<span>@dtInizio</span>
|
||||
-
|
||||
<span>@dtFine</span>
|
||||
</sub>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 p-1">
|
||||
<div class="text-center h-100 w-100 p-2" style=" background-color: #cff4fc; border-radius: .5rem;">
|
||||
<div class="text-truncate">
|
||||
<span class="text-dark small">Pz Prodotti TOT [A+B+C]</span>
|
||||
</div>
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="fw-bold" style="font-size: 3vh">@numPzProdotti.ToString("N0")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 p-1">
|
||||
<div class="text-center h-100 w-100 p-2" style=" background-color: #f8d7da; border-radius: .5rem;">
|
||||
<div class="text-truncate">
|
||||
<span class="text-dark small">[B] Scarti VERS.</span>
|
||||
</div>
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="fw-bold" style="font-size: 3vh">@numPzScaConf.ToString("N0")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 p-1">
|
||||
<div class="text-center h-100 w-100 p-2" style=" background-color: #d1e7dd; border-radius: .5rem;">
|
||||
<div class="text-truncate">
|
||||
<span class="text-dark small">[C] Pz Buoni VERS.</span>
|
||||
</div>
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="fw-bold" style="font-size: 3vh">@numPzBuoniConf.ToString("N0")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-6 col-sm-3 pr-1 py-0 text-end">
|
||||
<div class="alert alert-warning py-1">
|
||||
<div class="text-truncate">
|
||||
[A] NUOVI Pz.Prod
|
||||
</div>
|
||||
<div class="my-0 fw-bold fs-2">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>@numPz2Rec.ToString("N0")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 pl-1 px-sm-1 py-0 text-end">
|
||||
<div class="alert alert-info py-1">
|
||||
<div class="text-truncate">
|
||||
Pz Prodotti TOT [A+B+C]
|
||||
</div>
|
||||
<div class="my-0 fw-bold fs-2">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>@numPzProdotti.ToString("N0")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 pr-1 px-sm-1 py-0 text-end">
|
||||
<div class="alert alert-danger py-1">
|
||||
<div class="text-truncate">
|
||||
[B] Scarti VERS.
|
||||
</div>
|
||||
<div class="my-0 fw-bold fs-2">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>@numPzScaConf.ToString("N0")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 pl-1 py-0 text-end">
|
||||
<div class="alert alert-success py-1">
|
||||
<div class="text-truncate">
|
||||
[C] Pz Buoni VERS.
|
||||
</div>
|
||||
<div class="my-0 fw-bold fs-2">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>@numPzBuoniConf.ToString("N0")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (!string.IsNullOrEmpty(lblOut))
|
||||
|
||||
@@ -18,13 +18,13 @@ namespace MP_TAB_SERV.Components
|
||||
/// registrato nuovo valore
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public EventCallback<bool> E_newVal { get; set; }
|
||||
public EventCallback<bool> E_reset { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// registrato nuovo valore
|
||||
/// Post update restituisco nuova lista dati
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public EventCallback<bool> E_reset { get; set; }
|
||||
public EventCallback<List<MappaStatoExpl>> E_Updated { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Verifica ODL OK (ovvero caricato x macchina...)
|
||||
@@ -39,37 +39,16 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// Aggiorno valori produzione alla data richiesta...
|
||||
/// </summary>
|
||||
/// <param name="newDate"></param>
|
||||
public async Task doUpdate()
|
||||
{
|
||||
isProcessing = true;
|
||||
await Task.Delay(1);
|
||||
datiProdAct = await TabDServ.StatoProdMacchina(IdxMaccSel, dtReqUpdate);
|
||||
// aggiorno visualizzazione...
|
||||
numPzProdotti = datiProdAct.PzTotODL;
|
||||
numPz2Rec = datiProdAct.Pz2RecTot;
|
||||
numPzScaConf = datiProdAct.PzConfScarto;
|
||||
numPzBuoniConf = datiProdAct.PzConfBuoni;
|
||||
numPzProdotti2Rec = datiProdAct.Pz2RecTot;
|
||||
numPzScarto2Rec = datiProdAct.Pz2RecScarto;
|
||||
dtInizio = RecMSE?.DataInizioOdl ?? DateTime.Today.AddMonths(-2);
|
||||
dtFine = dtReqUpdate;
|
||||
isProcessing = false;
|
||||
await Task.Delay(1);
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
protected string ConfBg
|
||||
{
|
||||
get => showInnov ? "bg-warning text-dark" : "bg-success text-light";
|
||||
}
|
||||
|
||||
protected string ConfTitle
|
||||
{
|
||||
get => showInnov ? "Nascondi Conferma" : "Mostra Conferma";
|
||||
get => showInnov ? "Nascondi conferma" : "Mostra conferma";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -126,8 +105,11 @@ namespace MP_TAB_SERV.Components
|
||||
}
|
||||
|
||||
protected int numPzProdotti { get; set; } = 0;
|
||||
|
||||
protected int numPzProdotti2Rec { get; set; } = 0;
|
||||
|
||||
protected int numPzScaConf { get; set; } = 0;
|
||||
|
||||
protected int numPzScarto2Rec { get; set; } = 0;
|
||||
|
||||
[Inject]
|
||||
@@ -140,6 +122,28 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
/// <summary>
|
||||
/// Aggiorno valori produzione alla data richiesta...
|
||||
/// </summary>
|
||||
/// <param name="newDate"></param>
|
||||
protected async Task DoUpdate()
|
||||
{
|
||||
isProcessing = true;
|
||||
await Task.Delay(1);
|
||||
datiProdAct = await TabDServ.StatoProdMacchina(IdxMaccSel, dtReqUpdate);
|
||||
// aggiorno visualizzazione...
|
||||
numPzProdotti = datiProdAct.PzTotODL;
|
||||
numPz2Rec = datiProdAct.Pz2RecTot;
|
||||
numPzScaConf = datiProdAct.PzConfScarto;
|
||||
numPzBuoniConf = datiProdAct.PzConfBuoni;
|
||||
numPzProdotti2Rec = datiProdAct.Pz2RecTot;
|
||||
numPzScarto2Rec = datiProdAct.Pz2RecScarto;
|
||||
dtInizio = RecMSE?.DataInizioOdl ?? DateTime.Today.AddMonths(-2);
|
||||
dtFine = dtReqUpdate;
|
||||
isProcessing = false;
|
||||
await Task.Delay(1);
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
lblOut = "";
|
||||
@@ -150,7 +154,7 @@ namespace MP_TAB_SERV.Components
|
||||
enablePzProdLasciati = SMServ.GetConfBool("enablePzProdLasciati");
|
||||
confRett = SMServ.GetConfBool("confRett");
|
||||
modoConfProd = SMServ.GetConfInt("modoConfProd");
|
||||
await doUpdate();
|
||||
await DoUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,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...
|
||||
@@ -178,10 +182,10 @@ namespace MP_TAB_SERV.Components
|
||||
// sollevo evento!
|
||||
dtReqUpdate = DateTime.Now;
|
||||
numPzLasciati = 0;
|
||||
await doUpdate();
|
||||
isProcessing = false;
|
||||
await DoUpdate();
|
||||
await Task.Delay(1);
|
||||
await E_newVal.InvokeAsync(true);
|
||||
await RefreshData();
|
||||
isProcessing = false;
|
||||
}
|
||||
|
||||
protected void setConfirmBtn(bool newVal)
|
||||
@@ -194,7 +198,7 @@ namespace MP_TAB_SERV.Components
|
||||
isProcessing = true;
|
||||
await Task.Delay(10);
|
||||
IdxMaccSel = selIdxMacc;
|
||||
await doUpdate();
|
||||
await DoUpdate();
|
||||
isProcessing = false;
|
||||
await Task.Delay(10);
|
||||
}
|
||||
@@ -213,8 +217,11 @@ namespace MP_TAB_SERV.Components
|
||||
#region Private Fields
|
||||
|
||||
private bool confRett = false;
|
||||
|
||||
private bool enablePzProdLasciati = false;
|
||||
|
||||
private string lblOut = "";
|
||||
|
||||
private int modoConfProd = 0;
|
||||
|
||||
#endregion Private Fields
|
||||
@@ -222,7 +229,9 @@ namespace MP_TAB_SERV.Components
|
||||
#region Private Properties
|
||||
|
||||
private DateTime dtReqUpdate { get; set; } = DateTime.Now;
|
||||
|
||||
private string IdxMaccSel { get; set; } = "";
|
||||
|
||||
private bool isProcessing { get; set; } = false;
|
||||
|
||||
private int MatrOpr
|
||||
@@ -231,6 +240,7 @@ namespace MP_TAB_SERV.Components
|
||||
}
|
||||
|
||||
private int numPzLasc { get; set; } = 0;
|
||||
|
||||
private bool showConfirm { get; set; } = true;
|
||||
|
||||
private bool showInnov { get; set; } = false;
|
||||
@@ -258,6 +268,13 @@ namespace MP_TAB_SERV.Components
|
||||
return fatto;
|
||||
}
|
||||
|
||||
private async Task RefreshData()
|
||||
{
|
||||
List<MappaStatoExpl> ListMSE = await MDataService.MseGetAll(true);
|
||||
await MServ.SaveMse(ListMSE);
|
||||
await E_Updated.InvokeAsync(ListMSE);
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
#if false
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
.cardBg {
|
||||
border-radius: 0.9375rem;
|
||||
background: linear-gradient(121deg, rgba(255, 255, 255, 0.2) -0.71%, rgba(255, 255, 255, 0.05) 97.66%);
|
||||
box-shadow: 0px 4px 24px -1px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
.cardBg {
|
||||
border-radius: 0.9375rem;
|
||||
background: linear-gradient(121deg, rgba(255, 255, 255, 0.20) -0.71%, rgba(255, 255, 255, 0.05) 97.66%);
|
||||
box-shadow: 0px 4px 24px -1px rgba(0, 0, 0, 0.25);
|
||||
//backdrop-filter: blur(20px);
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
.cardBg{border-radius:.9375rem;background:linear-gradient(121deg,rgba(255,255,255,.2) -.71%,rgba(255,255,255,.05) 97.66%);box-shadow:0 4px 24px -1px rgba(0,0,0,.25);}
|
||||
@@ -1,11 +1,11 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="row mt-2">
|
||||
<div class="col-6">
|
||||
<h2>Piano Produzione - PODL</h2>
|
||||
<h4>Piano Produzione - PODL</h4>
|
||||
<MachSel RecMSE="RecMSE" E_MachSel="SetMacc"></MachSel>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch fs-3">
|
||||
<div class="form-check form-switch fs-6">
|
||||
<input class="form-check-input" type="checkbox" @bind="@OnlyDirect">
|
||||
<label class="form-check-label">Solo Assegnazione Diretta</label>
|
||||
</div>
|
||||
@@ -17,15 +17,15 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="row p-3">
|
||||
<div class="col-12 cardObj p-2">
|
||||
@if (ListPodl.Count == 0)
|
||||
{
|
||||
<div class="alert alert-info fs-4">Nessun record trovato</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<table class="table table-dark table-sm table-striped text-center">
|
||||
<table class="table table-sm table-dark table-striped table-bordered text-center rounded small">
|
||||
<thead>
|
||||
<tr class="text-center">
|
||||
<th>
|
||||
@@ -78,9 +78,9 @@ else
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-lg-6 text-nowrap text-success">
|
||||
TC: @($"{item.Tcassegnato:N2}")
|
||||
TC: @($"{item.Tcassegnato:N2}") (min)
|
||||
<div class="text-secondary textCondens">
|
||||
@TCMinSec(item.Tcassegnato) (min:sec)
|
||||
@TCMinSec(item.Tcassegnato)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -93,7 +93,14 @@ namespace MP_TAB_SERV.Components
|
||||
if (fatto)
|
||||
{
|
||||
TimeSpan ts = TimeSpan.FromMinutes(TC);
|
||||
TC_MinSec = $"{ts.TotalMinutes}:{ts.Seconds:00}";
|
||||
if (ts.TotalHours > 1)
|
||||
{
|
||||
TC_MinSec = $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00} (h:m:s)";
|
||||
}
|
||||
else
|
||||
{
|
||||
TC_MinSec = $"{ts.Minutes:00}:{ts.Seconds:00} (m:s)";
|
||||
}
|
||||
}
|
||||
}
|
||||
return TC_MinSec;
|
||||
|
||||
@@ -1,130 +1,215 @@
|
||||
<div class="accordion my-2" id="accProd">
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="headingOne">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="false" aria-controls="collapseOne">
|
||||
<i class="fa fa-gear"></i><b>Statistiche produzione</b>
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseOne" class="accordion-collapse collapse" aria-labelledby="headingOne" data-bs-parent="#accProd">
|
||||
<div class="accordion-body p-1">
|
||||
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-6 py-1 text-start text-uppercase">
|
||||
<b>Statistiche di produzione</b>
|
||||
</div>
|
||||
<div class="col-6 text-end pe-2">
|
||||
@if (RecMSE != null)
|
||||
{
|
||||
<span>@($"ODL: {RecMSE.IdxOdl}")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Data di inizio</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
@if (RecMSE != null)
|
||||
{
|
||||
<div class="bg-dark text-light text-center fw-bold">
|
||||
<div colspan="4">
|
||||
@($"ODL num: {RecMSE.IdxOdl}, iniziato {RecMSE.DataInizioOdl:ddd yyyy.MM.dd, HH:mm}")
|
||||
</div>
|
||||
</div>
|
||||
<table class="table table-sm table-striped text-center">
|
||||
<thead>
|
||||
<tr class="stdFont" style="text-align: center; font-size: x-small">
|
||||
<td>
|
||||
Cod articolo
|
||||
</td>
|
||||
<td>
|
||||
Nr pezzi lanciati
|
||||
</td>
|
||||
<td>
|
||||
Nr pezzi confermati
|
||||
</td>
|
||||
<td>
|
||||
Nr pezzi fatti
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="rowStyle stdFont fw-bold">
|
||||
<td>
|
||||
@RecMSE.CodArticolo
|
||||
</td>
|
||||
<td>
|
||||
@($"{RecMSE.NumPezzi:N0}") pz.
|
||||
</td>
|
||||
<td>
|
||||
@RecMSE.PezziConf pz.
|
||||
</td>
|
||||
<td>
|
||||
(@($"{RecMSE.PezziProd:N0}") pz.)
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="stdFont" style="text-align: center;">
|
||||
<td>
|
||||
Efficienza Globale
|
||||
</td>
|
||||
<td>
|
||||
Efficienza Lavoro
|
||||
</td>
|
||||
<td>
|
||||
Efficienza Teorica
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="stdFont">
|
||||
<td>
|
||||
<div>
|
||||
@RecMSE.OEE_tot
|
||||
</div>
|
||||
(@RecMSE.OEE_RT_tot)
|
||||
</td>
|
||||
<td>
|
||||
<div>
|
||||
@RecMSE.OEE_wrk
|
||||
</div>
|
||||
(@RecMSE.OEE_RT_wrk)
|
||||
</td>
|
||||
<td>
|
||||
<div>
|
||||
@RecMSE.OEE_run
|
||||
</div>
|
||||
(@RecMSE.OEE_RT_run)
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="stdFont" style="text-align: center;">
|
||||
<td>
|
||||
Tc Medio
|
||||
</td>
|
||||
<td>
|
||||
Tc Lavoro
|
||||
</td>
|
||||
<td>
|
||||
Tc Tecnico
|
||||
</td>
|
||||
<td>
|
||||
Tc impostato
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@*<tr class="stdFont">
|
||||
<td>
|
||||
<div class="fw-bold">
|
||||
@($"{RecMSE.TCMedio:0.###}")
|
||||
</div>
|
||||
(@($"{RecMSE.TCMedioRt:0.###}"))
|
||||
</td>
|
||||
<td>
|
||||
<div class="fw-bold">
|
||||
@($"{RecMSE.TCLav:0.###}")
|
||||
</div>
|
||||
(@($"{RecMSE.TCLavRT:0.###}"))
|
||||
</td>
|
||||
<td>
|
||||
<div class="fw-bold">
|
||||
@($"{RecMSE.TCEff:0.###}")
|
||||
</div>
|
||||
(@($"{RecMSE.TCEffRT:0.###}"))
|
||||
</td>
|
||||
<td>
|
||||
<div class="fw-bold">
|
||||
@($"{RecMSE.TCAssegnato:0.###}")
|
||||
</div>
|
||||
</td>
|
||||
</tr>*@
|
||||
</table>
|
||||
|
||||
<span>@($"{RecMSE.DataInizioOdl:yyyy/MM/dd}")</span>
|
||||
}
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
@if (RecMSE != null)
|
||||
{
|
||||
<span>@($"{RecMSE.DataInizioOdl:HH: mm}")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Cod Articolo</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@RecMSE.CodArticolo</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Nr Pezzi lanciati</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@($"{RecMSE.NumPezzi:N0}") pz.</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small text-nowrap" style="font-size: .8rem">
|
||||
<span>Nr Pezzi confermati</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@($"{RecMSE.PezziConf}") pz.</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="d-flex justify-content-between ">
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Nr pezzi fatti</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>(@($"{RecMSE.PezziProd:N0}") pz.)</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Efficienza globale</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@RecMSE.OEE_tot</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
<span>
|
||||
(@RecMSE.OEE_RT_tot)
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Efficienza lavoro</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@RecMSE.OEE_wrk</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
<span>
|
||||
(@RecMSE.OEE_RT_wrk)
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small text-nowrap" style="font-size: .8rem">
|
||||
<span>Efficienza teorica</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@RecMSE.OEE_run</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
<span>
|
||||
(@RecMSE.OEE_RT_run)
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="d-flex justify-content-between ">
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Tc medio</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>
|
||||
@($"{RecMSE.TCMedio:0.###}")
|
||||
</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
<span>
|
||||
(@($"{RecMSE.TCMedioRt:0.###}"))
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Tc lavoro</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@($"{RecMSE.TCLav:0.###}")</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
<span>
|
||||
(@($"{RecMSE.TCLavRT:0.###}"))
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small">
|
||||
<span>Tc tecnico</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span>@($"{RecMSE.TCEff:0.###}")</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
<span>
|
||||
(@($"{RecMSE.TCEffRT:0.###}"))
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3 p-1 flex-fill">
|
||||
<div class="cardFullHeight p-1">
|
||||
<div class="small text-nowrap" style="font-size: .8rem">
|
||||
<span>Tc impostato</span>
|
||||
</div>
|
||||
<div class="text-center fw-bold">
|
||||
<span> @($"{RecMSE.TCAssegnato:0.###}")</span>
|
||||
</div>
|
||||
<div class="text-center small">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,10 +1,12 @@
|
||||
<div class="p-2 col-3 col-sm-3 col-md-3 col-lg-2 flex-fill">
|
||||
<div class="@objCss text-center card w-100" @onclick="() => ReportSelected()">
|
||||
<div class="card-body text-light">
|
||||
<i class="@objIcon" style="font-size: 8vw"></i>
|
||||
</div>
|
||||
<div class="card-footer text-center h-100 bg-dark text-light opacity-50 p-1">
|
||||
<span class=" text-center" style="font-size: .9rem;">@objTxt</span>
|
||||
<div class=" col-4 col-sm-4 col-md-4 col-lg-2 flex-fill ">
|
||||
<div class="p-2 h-100 w-100">
|
||||
<div class="@objCss text-center card w-100 h-100" @onclick="() => ReportSelected()">
|
||||
<div class="card-body text-light">
|
||||
<i class="@objIcon" style="font-size: 8vw"></i>
|
||||
</div>
|
||||
<div class="card-footer text-center h-100 bg-dark text-light opacity-50 p-1">
|
||||
<span class="d-inline-block text-center text-nowrap text-truncate mw-100" style="font-size: .9rem;">@objTxt</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,39 +1,53 @@
|
||||
<div class="card">
|
||||
<div class="card-header p-0">
|
||||
<div class="fs-6">
|
||||
<div class="p-0">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<button class="btn btn-lg bg-info w-100" @onclick="ToggleCtrl">
|
||||
<button class="btn btn-lg bg-info w-100" @onclick="ToggleCtrl">
|
||||
<i class="fa-solid fa-bug"></i>
|
||||
|
||||
<span class="fs-4 fw-bold">@Title</span>
|
||||
<span class="fw-bold" style="font-size: 1rem;">@Title</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (ShowDetail)
|
||||
{
|
||||
<div class="card-body p-1 bg-dark text-light">
|
||||
<div class="p-1">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="col-5">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text" id="basic-addon1">Data Ora</span>
|
||||
<input type="datetime-local" class="form-control" id="floatDate" @bind="@DateSel">
|
||||
<span class="input-group-text" style="font-size: .9rem;">Num Pz</span>
|
||||
<input type="number" class="form-control text-end" @bind="@NumPz">
|
||||
<button class="btn btn-secondary" @onclick="resetNumPz"><i class="fa-solid fa-arrow-rotate-right"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<button class="btn btn-warning w-100 align-middle" @onclick="doCancel"><i class="fa-solid fa-ban"></i> Annulla</button>
|
||||
<div class="col-7">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text" style="font-size: .9rem;">Data Ora</span>
|
||||
<input type="datetime-local" class="form-control text-end" @bind="@DateSel">
|
||||
<button class="btn btn-secondary" @onclick="resetDate"><i class="fa-solid fa-arrow-rotate-right"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 my-1">
|
||||
<div class="form-floating">
|
||||
<textarea type="text" class="form-control" id="floatingComm" style="height: 6rem;" @bind="@UserComment"></textarea>
|
||||
<label for="floatingComm">Commento</label>
|
||||
<textarea type="text" class="form-control" id="floatingComm" @bind="@UserComment"></textarea>
|
||||
<label for="floatingComm">Commento (opzionale)</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
@if (CanSave)
|
||||
{
|
||||
<button class="btn btn-success w-100" @onclick="doSave"><i class="fa-solid fa-plus"></i> Salva</button>
|
||||
}
|
||||
<div class="row">
|
||||
@foreach (var item in ListComplete)
|
||||
{
|
||||
<div class="col-6 col-lg-4 col-xl-3 mt-2">
|
||||
<button class="btn w-100 btn-lg @($"btn-{item.cssClass}")" @onclick="() => doSave(item)">
|
||||
<i class="@item.icona"></i> <span style="font-size: 1rem;">@item.label</span>
|
||||
</button>
|
||||
<asp:LinkButton ID="hlRegistra" runat="server" OnClick="hlRegistra_Click" CommandArgument='<%# Eval("value") %>' CssClass='<%# "btn w-100 btn-lg btn-" + Eval("cssClass")%>'>
|
||||
|
||||
</asp:LinkButton>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,25 +1,7 @@
|
||||
using global::System;
|
||||
using global::System.Collections.Generic;
|
||||
using global::System.Linq;
|
||||
using global::System.Threading.Tasks;
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using System.Net.Http;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Microsoft.AspNetCore.Components.Routing;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
using Microsoft.AspNetCore.Components.Web.Virtualization;
|
||||
using Microsoft.JSInterop;
|
||||
using MP_TAB_SERV;
|
||||
using MP_TAB_SERV.Shared;
|
||||
using MP_TAB_SERV.Components;
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.DTO;
|
||||
using MP.Data.Services;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
@@ -27,39 +9,12 @@ namespace MP_TAB_SERV.Components
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public bool CanSave { get; set; } = false;
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<string> E_CommRec { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<DateTime> E_DateSel { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<bool> E_Updated { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public MappaStatoExpl? RecMSE { get; set; } = null;
|
||||
|
||||
protected string Title
|
||||
{
|
||||
get => ShowDetail? "Nascondi Registrazione Scarti": "Mostra Registrazione Scarti";
|
||||
}
|
||||
[Parameter]
|
||||
public EventListModel? CurrRecord
|
||||
{
|
||||
set
|
||||
{
|
||||
if (value != null)
|
||||
{
|
||||
DateSel = value.InizioStato ?? DateTime.Now;
|
||||
UserComment = value.Value;
|
||||
ShowDetail = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Protected Properties
|
||||
@@ -72,20 +27,38 @@ namespace MP_TAB_SERV.Components
|
||||
if (dateSel != value)
|
||||
{
|
||||
dateSel = value;
|
||||
E_DateSel.InvokeAsync(value).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected List<vSelCauScartoModel> ListComplete { get; set; } = new List<vSelCauScartoModel>();
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
protected int NumPz
|
||||
{
|
||||
get => numPz;
|
||||
set
|
||||
{
|
||||
if (numPz != value)
|
||||
{
|
||||
numPz = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected SharedMemService SMServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabServ { get; set; } = null!;
|
||||
|
||||
protected string Title
|
||||
{
|
||||
get => ShowDetail ? "Nascondi Registrazione Scarti" : "Mostra Registrazione Scarti";
|
||||
}
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
@@ -95,83 +68,45 @@ namespace MP_TAB_SERV.Components
|
||||
DoReset();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Forza salvataggio impostando data-ora
|
||||
/// </summary>
|
||||
/// <param name="dtRif"></param>
|
||||
/// <returns></returns>
|
||||
public async Task ForceSave(DateTime dtRif)
|
||||
protected async Task doSave(vSelCauScartoModel currCau)
|
||||
{
|
||||
DateSel = dtRif;
|
||||
// ora salvo
|
||||
await doSave();
|
||||
}
|
||||
|
||||
protected async Task doSave()
|
||||
{
|
||||
// registro evento
|
||||
EventListModel newRec = new EventListModel()
|
||||
// registro scarto
|
||||
RegistroScartiModel newRec = new RegistroScartiModel()
|
||||
{
|
||||
IdxMacchina = IdxMacc,
|
||||
InizioStato = DateSel,
|
||||
IdxTipo = idxTipoCommento,
|
||||
CodArticolo = CodArt,
|
||||
Value = UserComment,
|
||||
DataOra = DateSel,
|
||||
Causale = currCau.value,
|
||||
Qta = NumPz,
|
||||
MatrOpr = MatrOpr,
|
||||
pallet = "-"
|
||||
Note = UserComment
|
||||
};
|
||||
// elimino vecchio se c'è...
|
||||
await TabServ.EvListDelete(IdxMacc, DateSel, idxTipoCommento);
|
||||
// inserisco
|
||||
await TabServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.commento);
|
||||
await TabServ.RegScartiInsert(newRec);
|
||||
|
||||
// reset
|
||||
DoReset();
|
||||
//ToggleCtrl();
|
||||
await E_Updated.InvokeAsync(true);
|
||||
}
|
||||
|
||||
protected override void OnInitialized()
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
idxTipoCommento = SMServ.GetConfInt("idxTipoCommento");
|
||||
dltMinRealtime = SMServ.GetConfInt("dltMinRealtime");
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
protected async Task ReloadData()
|
||||
{
|
||||
// verifico SE ci sia una data da usare...
|
||||
bool hasDtRif = await MServ.SessHasVal(MessageService.KeyCommDtRif);
|
||||
if (hasDtRif)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
ShowDetail = false;
|
||||
UserComment = await MServ.CommentoValGet(true);
|
||||
DateSel = await MServ.CommentoDtRifGet(true);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
ListComplete = await TabServ.VSCS_getAll();
|
||||
}
|
||||
|
||||
|
||||
protected int dltMinRealtime = 1;
|
||||
/// <summary>
|
||||
/// Determina se insert sia Realtime o batch con DataOra (in base a diff tra DataOra
|
||||
/// selezionata e realtime, se superiore ad X minuti NON � realtime)
|
||||
/// </summary>
|
||||
protected bool insRealtime
|
||||
protected void resetDate()
|
||||
{
|
||||
get
|
||||
{
|
||||
bool answ = true;
|
||||
try
|
||||
{
|
||||
if (Math.Abs(DateSel.Subtract(DateTime.Now).TotalMinutes) > dltMinRealtime)
|
||||
{
|
||||
answ = false;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
return answ;
|
||||
}
|
||||
DateSel = DateTime.Now;
|
||||
}
|
||||
|
||||
protected void resetNumPz()
|
||||
{
|
||||
NumPz = 1;
|
||||
}
|
||||
|
||||
protected void ToggleCtrl()
|
||||
@@ -185,12 +120,6 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private int idxTipoCommento = 0;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string CodArt
|
||||
@@ -210,7 +139,10 @@ namespace MP_TAB_SERV.Components
|
||||
get => MServ.MatrOpr;
|
||||
}
|
||||
|
||||
private int numPz { get; set; } = 1;
|
||||
|
||||
private bool ShowDetail { get; set; } = true;
|
||||
|
||||
private string userComment { get; set; } = "";
|
||||
|
||||
private string UserComment
|
||||
@@ -221,7 +153,6 @@ namespace MP_TAB_SERV.Components
|
||||
if (userComment != value)
|
||||
{
|
||||
userComment = value;
|
||||
E_CommRec.InvokeAsync(value).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
|
||||
<ScrapEditor CanSave="true" RecMSE="@RecMSE" E_Updated="doUpdate"></ScrapEditor>
|
||||
|
||||
<MachSel RecMSE="RecMSE" E_MachSel="SetMacc"></MachSel>
|
||||
<div class="row">
|
||||
@@ -20,46 +19,16 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
<EgwCoreLib.Razor.PeriodoSel CurrPeriodo="CurrPeriodo" E_PeriodoSel="SetPeriodo"></EgwCoreLib.Razor.PeriodoSel>
|
||||
<div style="font-size: .8rem">
|
||||
<EgwCoreLib.Razor.PeriodoSel CurrPeriodo="CurrPeriodo" E_PeriodoSel="SetPeriodo"></EgwCoreLib.Razor.PeriodoSel>
|
||||
</div>
|
||||
}
|
||||
<ShowProcessing Message="Caricamento" IsProcessing="@isProcessing"></ShowProcessing>
|
||||
<div class="card">
|
||||
<div class="card-header bg-dark">
|
||||
<button class="btn btn-primary btn-lg text-light w-100" @onclick="ToggleBtn">
|
||||
<i class="fa fa-wrench"></i> @ConfTitle
|
||||
</button>
|
||||
@if (showInsert)
|
||||
{
|
||||
@if (showNote)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="">
|
||||
@* </div>
|
||||
<div class="form-floating"> *@
|
||||
<label class="form-label text-light">Note controllo NON superato (opzionali)</label>
|
||||
<textarea class="form-control" @bind="@noteKo" style="height: 6rem;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<button class="btn btn-danger btn-lg w-100" @onclick="SaveKo">Conferma controllo KO</button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="row my-2">
|
||||
<div class="col-6">
|
||||
<button class="btn btn-success w-100" @onclick="SaveOk">OK</button>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<button class="btn btn-danger w-100" @onclick="ShowKo">KO</button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
<div class="cardObj p-2 mt-2">
|
||||
<div class="mb-2">
|
||||
<ScrapEditor RecMSE="@RecMSE" E_Updated="doUpdate"></ScrapEditor>
|
||||
</div>
|
||||
<div class="card-body bg-secondary p-1">
|
||||
<div class="mb-2 p-1">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
|
||||
@@ -67,7 +36,7 @@ else
|
||||
<thead>
|
||||
<tr class="text-start1">
|
||||
<th>
|
||||
Elenco Controlli
|
||||
Registro Scarti
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -81,33 +50,27 @@ else
|
||||
<div>
|
||||
Art: <b>@item.CodArticolo</b>
|
||||
</div>
|
||||
<div>
|
||||
ODL: <b>@($"ODL{item.IdxOdl:000000000}")</b>
|
||||
<div class="@($"text-{item.cssClass}")">
|
||||
<i class="@item.icona"></i> @item.Descrizione
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-2 px-0 text-center">
|
||||
@if (item.EsitoOk)
|
||||
{
|
||||
<i runat="server" class="fa fa-check-circle fs-1 text-success" aria-hidden="true"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
<i runat="server" class="fa fa-ban fs-1 text-danger" aria-hidden="true"></i>
|
||||
}
|
||||
<b class="fs-2">@item.Qta</b> pz
|
||||
</div>
|
||||
<div class="col-5 text-end small">
|
||||
<div class="text-truncate">
|
||||
@($"{item.DataOra:ddd dd.MM.yy HH:mm:ss}") <i class="fa fa-clock-o" aria-hidden="true"></i>
|
||||
@($"{item.DataOra:ddd dd.MM.yy HH:mm:ss}")
|
||||
<i class="fa fa-clock-o" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div class="text-truncate">
|
||||
<b>@item.Operatore</b>
|
||||
<i class="fa fa-user" aria-hidden="true"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 small">
|
||||
<div class="col-12 small text-secondary">
|
||||
@if (!string.IsNullOrEmpty(item.Note))
|
||||
{
|
||||
<div class="text-warning">@item.Note</div>
|
||||
<span>Nota: <b>@item.Note</b></span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -119,7 +82,7 @@ else
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cad-footer">
|
||||
<div>
|
||||
<EgwCoreLib.Razor.DataPager currPage="@PageNum" PageSize="@NumRecPage" totalCount="@TotalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
|
||||
</div>
|
||||
</div>
|
||||
@@ -27,7 +27,7 @@ namespace MP_TAB_SERV.Components
|
||||
await Task.Delay(1);
|
||||
if (!string.IsNullOrEmpty(IdxMaccSel))
|
||||
{
|
||||
ListComplete = await TabDServ.RegControlliFilt(IdxMaccSel, IdxOdl, CurrPeriodo.Inizio, CurrPeriodo.Fine, false);
|
||||
ListComplete = await TabDServ.RegScartiGetFilt(IdxMaccSel, IdxOdl, CurrPeriodo.Inizio, CurrPeriodo.Fine, false);
|
||||
TotalCount = ListComplete.Count;
|
||||
// esegue paginazione
|
||||
UpdateTable();
|
||||
@@ -40,13 +40,10 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
protected string ConfTitle
|
||||
{
|
||||
get => showInsert ? "Nascondi Controllo" : "Registra Controllo";
|
||||
}
|
||||
|
||||
|
||||
protected List<RegistroControlliModel> ListComplete { get; set; } = new List<RegistroControlliModel>();
|
||||
protected List<RegistroControlliModel> ListPaged { get; set; } = new List<RegistroControlliModel>();
|
||||
protected List<RegistroScartiModel> ListComplete { get; set; } = new List<RegistroScartiModel>();
|
||||
protected List<RegistroScartiModel> ListPaged { get; set; } = new List<RegistroScartiModel>();
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
@@ -64,20 +61,14 @@ namespace MP_TAB_SERV.Components
|
||||
if (RecMSE != null)
|
||||
{
|
||||
IdxMaccSel = RecMSE.IdxMacchina;
|
||||
CurrPeriodo = new Periodo(PeriodSet.ThisWeek);
|
||||
DateTime fine = DateTime.Today.AddDays(1);
|
||||
DateTime inizio = fine.AddDays(-8);
|
||||
CurrPeriodo = new Periodo(inizio, fine);
|
||||
await doUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task SaveKo()
|
||||
{
|
||||
isProcessing = true;
|
||||
await TabDServ.RegControlliInsert(IdxMaccSel, MServ.MatrOpr, false, noteKo, DateTime.Now);
|
||||
showInsert = false;
|
||||
showNote = false;
|
||||
await doUpdate();
|
||||
isProcessing = false;
|
||||
}
|
||||
|
||||
|
||||
protected void SaveNumRec(int newNum)
|
||||
{
|
||||
@@ -85,15 +76,7 @@ namespace MP_TAB_SERV.Components
|
||||
UpdateTable();
|
||||
}
|
||||
|
||||
protected async Task SaveOk()
|
||||
{
|
||||
isProcessing = true;
|
||||
await TabDServ.RegControlliInsert(IdxMaccSel, MServ.MatrOpr, true, noteKo, DateTime.Now);
|
||||
showInsert = false;
|
||||
showNote = false;
|
||||
await doUpdate();
|
||||
isProcessing = false;
|
||||
}
|
||||
|
||||
|
||||
protected void SavePage(int newNum)
|
||||
{
|
||||
@@ -127,20 +110,7 @@ namespace MP_TAB_SERV.Components
|
||||
await doUpdate();
|
||||
}
|
||||
|
||||
protected void ShowKo()
|
||||
{
|
||||
showNote = true;
|
||||
}
|
||||
|
||||
protected void ToggleBtn()
|
||||
{
|
||||
showInsert = !showInsert;
|
||||
if (showInsert)
|
||||
{
|
||||
noteKo = "";
|
||||
showNote = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void UpdateTable()
|
||||
{
|
||||
@@ -161,11 +131,8 @@ namespace MP_TAB_SERV.Components
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
private bool isProcessing = false;
|
||||
private string noteKo = "";
|
||||
private int NumRecPage = 10;
|
||||
private int PageNum = 1;
|
||||
private bool showInsert = false;
|
||||
private bool showNote = false;
|
||||
private int TotalCount = 0;
|
||||
private bool useOdl = false;
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
|
||||
<div class="row align-items-center flex-wrap">
|
||||
@*<div class="col-12 text-end">
|
||||
<div class="form-check form-switch fs-3">
|
||||
<input class="form-check-input" type="checkbox" @bind="@ShowMS">
|
||||
<label class="form-check-label">@txtSelMS</label>
|
||||
</div>
|
||||
</div>*@
|
||||
<div class="col-8">
|
||||
@if (tcMode == "mc")
|
||||
{
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Tempo</span>
|
||||
<input type="text" class="form-control" @bind="@txtTempo">
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="input-group my-3">
|
||||
<span class="input-group-text">@labelTempoIN</span>
|
||||
<input type="time" class="form-control" @bind="@selTempoMS" step="1">
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<div class="col-4">
|
||||
→ @lblTempo
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,276 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data.Services;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class SelTempoMSMC
|
||||
{
|
||||
#region Public Enums
|
||||
|
||||
/// <summary>
|
||||
/// modalità di visualizzazione ed interazione controllo tempo
|
||||
/// </summary>
|
||||
public enum timeControlMode
|
||||
{
|
||||
/// <summary>
|
||||
/// controllo textbox
|
||||
/// </summary>
|
||||
testo = 0,
|
||||
|
||||
/// <summary>
|
||||
/// selettori dropdown list
|
||||
/// </summary>
|
||||
selettori = 1
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// modalità tempo principale (Minuti Secondi o Minuti Centesimali=
|
||||
/// </summary>
|
||||
public enum timeMode
|
||||
{
|
||||
/// <summary>
|
||||
/// Minuti Secondi
|
||||
/// </summary>
|
||||
MS = 0,
|
||||
|
||||
/// <summary>
|
||||
/// Minuti Centesimali
|
||||
/// </summary>
|
||||
MC = 1
|
||||
}
|
||||
|
||||
#endregion Public Enums
|
||||
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<decimal> E_TCRich { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// modalità rendering controllo
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public timeControlMode modoControllo { get; set; } = timeControlMode.testo;
|
||||
|
||||
#if false
|
||||
/// <summary>
|
||||
/// modalità controllo tempo
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public timeMode modoTempo { get; set; } = timeMode.MC;
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Valore tempo (centesimale)
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public decimal TempoMC
|
||||
{
|
||||
get => _tempoMC;
|
||||
set
|
||||
{
|
||||
_tempoMC = value;
|
||||
_tempoMS = minCent2Sec(value);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
/// <summary>
|
||||
/// tempo min.cent
|
||||
/// </summary>
|
||||
protected decimal _tempoMC { get; set; } = 0;
|
||||
|
||||
//protected timeMode modoTempo
|
||||
//{
|
||||
// get => ShowMS ? timeMode.MS : timeMode.MC;
|
||||
//}
|
||||
|
||||
[Inject]
|
||||
protected MessageService MsgServ { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// tempo selezionato in formato Minuti Secondi
|
||||
/// </summary>
|
||||
protected DateTime selTempoMS
|
||||
{
|
||||
get => DateTime.Today.Add(TempoMS);
|
||||
set
|
||||
{
|
||||
TempoMS = value.Subtract(value.Date);
|
||||
E_TCRich.InvokeAsync(TempoMC);
|
||||
}
|
||||
}
|
||||
|
||||
protected bool ShowMS { get; set; } = true;
|
||||
|
||||
[Inject]
|
||||
protected SharedMemService SMServ { get; set; } = null!;
|
||||
|
||||
protected string tcMode
|
||||
{
|
||||
get => MsgServ.UserPrefGet("TcMode");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// tempo selezionato in formato Minuti Secondi
|
||||
/// </summary>
|
||||
protected TimeSpan TempoMS
|
||||
{
|
||||
get
|
||||
{
|
||||
return _tempoMS;
|
||||
}
|
||||
set
|
||||
{
|
||||
_tempoMS = value;
|
||||
_tempoMC = minSec2Cent(value);
|
||||
}
|
||||
}
|
||||
|
||||
protected string txtSelMS
|
||||
{
|
||||
get => ShowMS ? Traduci("ShowMS") : Traduci("ShowMC");
|
||||
}
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
/// <summary>
|
||||
/// conversione da tempo minuti centesimali a minuti/secondi
|
||||
/// </summary>
|
||||
/// <param name="valore"></param>
|
||||
/// <returns></returns>
|
||||
protected TimeSpan minCent2Sec(decimal valore)
|
||||
{
|
||||
TimeSpan answ = TimeSpan.FromSeconds((double)valore * 60);
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// conversione da tempo minuti/secondi a minuti centesimali
|
||||
/// </summary>
|
||||
/// <param name="valore"></param>
|
||||
/// <returns></returns>
|
||||
protected decimal minSec2Cent(TimeSpan valore)
|
||||
{
|
||||
decimal answ = 0;
|
||||
decimal.TryParse($"{Math.Floor(valore.TotalMinutes) + (double)valore.Seconds / 60}", out answ);
|
||||
return answ;
|
||||
}
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
//baseLang = SMServ.GetConf("baseLang");
|
||||
}
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
showControls();
|
||||
}
|
||||
|
||||
protected string Traduci(string lemma)
|
||||
{
|
||||
return SMServ.Traduci($"{baseLang}_{lemma}".ToUpper());
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string _baseLang { get; set; } = "IT";
|
||||
|
||||
/// <summary>
|
||||
/// tempo min:sec
|
||||
/// </summary>
|
||||
private TimeSpan _tempoMS { get; set; } = TimeSpan.FromSeconds(1);
|
||||
|
||||
private string baseLang
|
||||
{
|
||||
get => _baseLang;
|
||||
set { MsgServ.UserPrefGet("Lang"); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// INdica il formato del tempo IN INGRESSO (selezionato)
|
||||
/// </summary>
|
||||
private string labelTempoIN
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = "";
|
||||
if (tcMode == "mc")
|
||||
{
|
||||
answ = "min.cent";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "ore:min:sec";
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
private string lblTempo
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = tcMode == "mc" ? $"{TempoMS.TotalMinutes:N0}:{TempoMS:ss} (min:sec)" : $"{TempoMC:0.000} (min.cent)";
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
private string txtTempo
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = tcMode == "mc" ? $"{TempoMC:0.000}" : $"{TempoMS.TotalMinutes:N0}:{TempoMS:ss}";
|
||||
return answ;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (tcMode == "mc")
|
||||
{
|
||||
decimal tMC = 1;
|
||||
decimal.TryParse(value, out tMC);
|
||||
TempoMC = tMC;
|
||||
}
|
||||
else
|
||||
{
|
||||
var tPart = value.Split(':');
|
||||
double min = 0;
|
||||
double sec = 0;
|
||||
double.TryParse((tPart[0]), out min);
|
||||
double.TryParse((tPart[1]), out sec);
|
||||
TimeSpan tMS = TimeSpan.FromMinutes(min).Add(TimeSpan.FromSeconds(sec));
|
||||
TempoMS = tMS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
/// mostra i controlli secondo richiesta
|
||||
/// </summary>
|
||||
private void showControls()
|
||||
{
|
||||
//ddlMinuti.SelectedValue = TempoMS.Minutes.ToString();
|
||||
//if (modoTempo == timeMode.MC)
|
||||
//{
|
||||
// ddlSecondi.SelectedValue = Convert.ToInt32((tempoMC - Math.Floor(tempoMC)) * 100).ToString();
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// ddlSecondi.SelectedValue = TempoMS.Seconds.ToString();
|
||||
//}
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -2,17 +2,17 @@
|
||||
<span class="fa fa-bars fa-lg"></span>
|
||||
</button>
|
||||
<div class="offcanvas offcanvas-end text-start" tabindex="-1" id="offcanvasTabMenu" aria-labelledby="offcanvasTabMenuLabel">
|
||||
<div class="offcanvas-header bg-secondary text-light">
|
||||
<div class="offcanvas-header bg-secondary text-light" style="z-index: 9999">
|
||||
<div class="d-flex flex-row">
|
||||
<div class="p-0">
|
||||
<img src="images/LogoSteamware.png" class="img-fluid" width="40px" />
|
||||
<div class="py-0 px-2">
|
||||
<img src="images/LogoEgw.png" class="img-fluid" width="60" />
|
||||
</div>
|
||||
<div class="p-0 pl-1">
|
||||
<div class="flex-row">
|
||||
<b class="modal-title fs-2">EgalWare</b>
|
||||
</div>
|
||||
<div class="flex-row">
|
||||
<small>Main Menu</small>
|
||||
<small>MES Solutions</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -26,21 +26,30 @@
|
||||
</div>
|
||||
<div class="d-flex flex-column">
|
||||
<div class="list-group">
|
||||
|
||||
@foreach (var item in MenuItems)
|
||||
{
|
||||
<a class="p-2 list-group-item list-group-item-action" href="@item.NavigateUrl"><i class="fa fa-lg @item.icona pe-2"></i> @item.Testo</a>
|
||||
<button class="p-2 list-group-item list-group-item-action @cssActive(item.NavigateUrl) link-underline link-underline-opacity-0 link-underline-opacity-75-hover" @onclick="() => SetPage(item.NavigateUrl)" data-bs-dismiss="offcanvas"><i class="fa fa-lg @item.icona pe-2"></i> @item.Testo</button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="my-4">
|
||||
<button type="button" class="btn btn-secondary w-100" data-bs-dismiss="offcanvas" aria-label="Close">Chiudi</button>
|
||||
</div>
|
||||
<div class="my-4">
|
||||
<div class="d-flex justify-content-center">
|
||||
<div class="py-0 px-2">
|
||||
<img src="images/LogoSteamware.png" class="img-fluid" width="60" />
|
||||
</div>
|
||||
<div class="p-0 pl-1">
|
||||
<div class="flex-row">
|
||||
<b class="modal-title fs-1">MAPO MES</b>
|
||||
</div>
|
||||
<div class="flex-row">
|
||||
<small>TAB Controller - MES Suite</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
|
||||
[Parameter]
|
||||
public List<LinkMenu> MenuItems { get; set; } = new List<LinkMenu>();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data.DatabaseModels;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class SlideMenu
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public List<LinkMenu> MenuItems { get; set; } = new List<LinkMenu>();
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected NavigationManager navManager { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected string cssActive(string currUri)
|
||||
{
|
||||
return navManager.Uri.Contains(currUri) ? "bg-dark text-light" : "";
|
||||
}
|
||||
|
||||
protected async Task SetPage(string tgtUrl)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
navManager.NavigateTo(tgtUrl);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
<div class="card mt-2">
|
||||
<div class="card-header fs-4 bg-info fw-bold">
|
||||
Scheda Tecnica
|
||||
</div>
|
||||
<div class="card-body d-flex justify-content-between flex-wrap">
|
||||
<div class="col-6 p-1">
|
||||
<button class="w-100 btn btn-light shadow p-3">Dati Articolo</button>
|
||||
</div>
|
||||
<div class="col-6 p-1">
|
||||
<button class="w-100 btn btn-light shadow p-3">Materiali</button>
|
||||
</div>
|
||||
<div class="col-6 p-1">
|
||||
<button class="w-100 btn btn-light shadow p-3">Attrezzatura</button>
|
||||
</div>
|
||||
<div class="col-6 p-1">
|
||||
<button class="w-100 btn btn-light shadow p-3">Imballi</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,6 +0,0 @@
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class TechSheetDetail
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<div class="cardObj mt-2">
|
||||
<div class="fs-4 fw-bold p-2">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div>
|
||||
<h4>Scheda Tecnica</h4>
|
||||
</div>
|
||||
<div>
|
||||
@if (inAttr)
|
||||
{
|
||||
<button class="btn btn-lg btn-danger text-uppercase" @onclick="() => ClearOdl()"><i class="fa-solid fa-trash"></i> reset</button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between flex-wrap">
|
||||
<div class="col-12 p-1">
|
||||
<TechSheet_ST_ObjCheck CodArticolo="@CodArticolo" IdxOdl="@IdxOdl" E_Updated="ForceRefresh"></TechSheet_ST_ObjCheck>
|
||||
</div>
|
||||
@if (isProcessing)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else if (ListGruppi.Count == 0)
|
||||
{
|
||||
<div class="alert alert-warning fs-3">ST: Nessun Gruppo Trovato</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var item in ListGruppi)
|
||||
{
|
||||
<div class="col-12 col-md-6 p-1">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<b>@item.DescGruppo</b>
|
||||
</div>
|
||||
<div class="card-body small py-1">
|
||||
<TechSheet_ST_Detail CodArticolo="@CodArticolo" CodGruppo="@item.CodGruppo" IdxOdl="@IdxOdl"></TechSheet_ST_Detail>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,113 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class TechSheetMan
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public MappaStatoExpl? RecMSE { get; set; } = null;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime { get; set; } = null!;
|
||||
|
||||
protected List<ST_AnagGruppi> ListGruppi { get; set; } = new List<ST_AnagGruppi>();
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected async Task ClearOdl()
|
||||
{
|
||||
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Sicuro di voler resettare?"))
|
||||
return;
|
||||
if (IdxOdl > 0)
|
||||
{
|
||||
await TabDServ.ST_CheckCleanByOdl(IdxOdl);
|
||||
}
|
||||
checkReset();
|
||||
}
|
||||
|
||||
protected async Task ForceRefresh()
|
||||
{
|
||||
isProcessing = true;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
await ReloadData();
|
||||
isProcessing = false;
|
||||
}
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
if (RecMSE != null)
|
||||
{
|
||||
CodArticolo = RecMSE.CodArticolo;
|
||||
IdxMaccSel = RecMSE.IdxMacchina;
|
||||
IdxOdl = RecMSE.IdxOdl ?? 0;
|
||||
}
|
||||
await ReloadData();
|
||||
checkReset();
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private string CodArticolo = "";
|
||||
|
||||
private bool inAttr = false;
|
||||
|
||||
private bool isProcessing = false;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string IdxMaccSel { get; set; } = "";
|
||||
|
||||
private int IdxOdl { get; set; } = 0;
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
/// Verifica visibilità reset
|
||||
/// </summary>
|
||||
private void checkReset()
|
||||
{
|
||||
// condizioni booleane
|
||||
inAttr = false;
|
||||
// SOLO SE ho articolo sennò niente reset...
|
||||
if (!string.IsNullOrEmpty(CodArticolo))
|
||||
{
|
||||
// controllo se la macchina è in attrezzaggio...
|
||||
var rigaStato = TabDServ.StatoMacchina(IdxMaccSel);
|
||||
if (rigaStato != null)
|
||||
{
|
||||
inAttr = (rigaStato.IdxStato == 2);
|
||||
}
|
||||
}
|
||||
#if false
|
||||
cmp_ST_objCheck.checkInputData();
|
||||
#endif
|
||||
}
|
||||
|
||||
private async Task ReloadData()
|
||||
{
|
||||
ListGruppi = await TabDServ.ST_AnagGruppiList();
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
@if (showWarning)
|
||||
{
|
||||
<div class="text-danger text-center fs-3">@txtWarning</div>
|
||||
}
|
||||
|
||||
@if (ListRecord.Count == 0)
|
||||
{
|
||||
<div class="alert alert-warning">NO record found</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var item in ListRecord)
|
||||
{
|
||||
<TechSheet_ST_ObjView CurrRec="@item"></TechSheet_ST_ObjView>
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
using global::System;
|
||||
using global::System.Collections.Generic;
|
||||
using global::System.Linq;
|
||||
using global::System.Threading.Tasks;
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using System.Net.Http;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Microsoft.AspNetCore.Components.Routing;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
using Microsoft.AspNetCore.Components.Web.Virtualization;
|
||||
using Microsoft.JSInterop;
|
||||
using MP_TAB_SERV;
|
||||
using MP_TAB_SERV.Shared;
|
||||
using MP_TAB_SERV.Components;
|
||||
using MP.Data;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.DTO;
|
||||
using MP.Data.Services;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class TechSheet_ST_Detail
|
||||
{
|
||||
[Parameter]
|
||||
public string CodArticolo { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public string CodGruppo { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public int IdxOdl { get; set; } = 0;
|
||||
|
||||
|
||||
private bool showWarning = false;
|
||||
private string txtWarning = "";
|
||||
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
if (IdxOdl > 0 && !string.IsNullOrEmpty(CodGruppo))
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabServ { get; set; } = null!;
|
||||
|
||||
private async Task ReloadData()
|
||||
{
|
||||
await Task.Delay(1);
|
||||
ListRecord = await TabServ.STAR_byGrpOdl(CodGruppo, IdxOdl);
|
||||
}
|
||||
|
||||
protected List<ST_ActRow> ListRecord { get; set; } = new List<ST_ActRow>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
@if (showChecks)
|
||||
{
|
||||
<div class="input-group input-group-lg">
|
||||
<span class="input-group-text" id="inputGroup-sizing-default">Verifica</span>
|
||||
<input type="text" class="form-control" @bind="ScanValue">
|
||||
<button class="btn btn-warning text-uppercase"><i class="fa-solid fa-barcode"></i> read</button>
|
||||
</div>
|
||||
@if (!string.IsNullOrEmpty(MessageText))
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-12 text-center @MessageCss">
|
||||
@MessageText
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,222 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Objects;
|
||||
using MP.Data.Services;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class TechSheet_ST_ObjCheck
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public string CodArticolo { get; set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public EventCallback<bool> E_Updated { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public int IdxOdl { get; set; } = 0;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public void checkInputData()
|
||||
{
|
||||
if (IdxOdl > 0)
|
||||
{
|
||||
var rawData = TabDServ.STAR_pendByOdl(IdxOdl);
|
||||
showChecks = rawData.Count > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
showChecks = false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
protected string ScanValue
|
||||
{
|
||||
get => "";
|
||||
set
|
||||
{
|
||||
lastBCodeVal = value;
|
||||
// processo input in async....
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
await processInput();
|
||||
//await InvokeAsync(() => StateHasChanged());
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected SharedMemService SMServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
checkInputData();
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private string lastBCodeVal = "";
|
||||
private string MessageCss = "";
|
||||
private string MessageText = "";
|
||||
private bool showChecks = false;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string CognomeNome
|
||||
{
|
||||
get => MServ.CognomeNome;
|
||||
}
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
/// procedura pricipale decodifica Barcode
|
||||
/// </summary>
|
||||
private async Task processInput()
|
||||
{
|
||||
bool found = false;
|
||||
bool batchOk = false;
|
||||
|
||||
List<ST_ActRow> tabRichieste = TabDServ.STAR_pendByOdl(IdxOdl);
|
||||
List<AnagLottiArca> tabGiacenzeLotto = new List<AnagLottiArca>();
|
||||
|
||||
ST_ActRow? datiBatchCheck;
|
||||
AnagLottiArca? datiLotto;
|
||||
// per prima cosa recupero i valori "Pending" da leggere come candidati...
|
||||
if (tabRichieste != null && tabRichieste.Count > 0)
|
||||
{
|
||||
// cerco per EQ come primo step...
|
||||
var trovatoEq = tabRichieste.Where(x => x.CheckType == "EQ" && x.Value == lastBCodeVal);
|
||||
if (trovatoEq != null && trovatoEq.Count() > 0)
|
||||
{
|
||||
// recupero record..
|
||||
var datiEqCheck = trovatoEq.FirstOrDefault();
|
||||
if (datiEqCheck != null)
|
||||
{
|
||||
// registro trovato
|
||||
found = true;
|
||||
MessageText = $"Parametro acquisito: {lastBCodeVal}";
|
||||
MessageCss = "text-success";
|
||||
// upsert controllo
|
||||
await TabDServ.ST_CheckUpsert(IdxOdl, datiEqCheck.IdxST, datiEqCheck.Oggetto, datiEqCheck.Num, lastBCodeVal, lastBCodeVal, true, CognomeNome, false);
|
||||
}
|
||||
}
|
||||
|
||||
// se non trovato
|
||||
if (!found)
|
||||
{
|
||||
// recupero record.. cercando in giacenza il LOTTO...
|
||||
tabGiacenzeLotto = await TabDServ.LottoEsterno("", lastBCodeVal, "");
|
||||
// controllo condizione tipo BATCH (speciale) - prima solo che CI SIA una
|
||||
// richiesta di questo tipo
|
||||
var trovatoBatch = tabRichieste.Where(x => x.CheckType == "BATCH");
|
||||
if (trovatoBatch != null && trovatoBatch.Count() > 0)
|
||||
{
|
||||
datiBatchCheck = trovatoBatch.FirstOrDefault();
|
||||
if (datiBatchCheck != null && tabGiacenzeLotto != null && tabGiacenzeLotto.Count > 0)
|
||||
{
|
||||
datiLotto = tabGiacenzeLotto.FirstOrDefault();
|
||||
if (datiLotto != null)
|
||||
{
|
||||
// registro trovato
|
||||
found = true;
|
||||
// upsert controllo
|
||||
await TabDServ.ST_CheckUpsert(IdxOdl, datiBatchCheck.IdxST, datiBatchCheck.Oggetto, datiBatchCheck.Num, lastBCodeVal, datiLotto.Cd_AR, true, CognomeNome, false);
|
||||
// conto quanti check ci sono dopo, se calati --> ok altrimenti errore
|
||||
var tabRichiestePost = TabDServ.STAR_pendByOdl(IdxOdl);
|
||||
if (tabRichiestePost.Count < tabRichieste.Count)
|
||||
{
|
||||
MessageText = $"Lotto riconosciuto: {lastBCodeVal} --> {datiLotto.Cd_AR} | Articolo acquisito";
|
||||
MessageCss = "text-success";
|
||||
batchOk = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageText = $"Lotto: {lastBCodeVal} --> {datiLotto.Cd_AR} | Articolo NON richiesto";
|
||||
MessageCss = "text-danger";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!batchOk)
|
||||
{
|
||||
var currDeroga = TabDServ.ST_DerogaGet(CognomeNome, tabRichieste[0].IdxST);
|
||||
// ciclo tra TUTTE le richeiste attive
|
||||
foreach (var item in tabRichieste)
|
||||
{
|
||||
// verifico EVENTUALI deroghe se è deroga x gruppo/tipo/num corretto...
|
||||
if (currDeroga.CanForce && item.CodGruppo == currDeroga.CodGruppo && item.CodTipo == currDeroga.CodTipo && item.Num == currDeroga.Num && item.Oggetto == currDeroga.Oggetto)
|
||||
{
|
||||
// ... forzo accettazione deroga
|
||||
await TabDServ.ST_CheckUpsert(IdxOdl, item.IdxST, item.Oggetto, item.Num, lastBCodeVal, item.Value, true, CognomeNome, true);
|
||||
MessageText = $"Lotto/articolo non valido: {lastBCodeVal} --> Forzato a valido per articolo {item.Value}";
|
||||
MessageCss = "text-warning";
|
||||
TabDServ.ST_DerogaSet(new StCheckOverride() { IdxST = item.IdxST, CanForce = false });
|
||||
batchOk = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// se non trovato
|
||||
if (!found)
|
||||
{
|
||||
if (tabGiacenzeLotto != null && tabGiacenzeLotto.Count > 0)
|
||||
{
|
||||
datiLotto = tabGiacenzeLotto.FirstOrDefault();
|
||||
if (datiLotto != null)
|
||||
{
|
||||
MessageText = $"Lotto: {lastBCodeVal} --> {datiLotto.Cd_AR} | Articolo NON richiesto";
|
||||
MessageCss = "text-danger";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageText = $"Parametro non riconosciuto: {lastBCodeVal}";
|
||||
MessageCss = "text-secondary";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageText = $"Parametro non valido: {lastBCodeVal}";
|
||||
MessageCss = "text-secondary";
|
||||
}
|
||||
|
||||
// sistemo visualizzaizone componente
|
||||
lastBCodeVal = "";
|
||||
checkInputData();
|
||||
// sollevo evento
|
||||
await E_Updated.InvokeAsync(true);
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
@if (CurrRec.CodTipo == "IMG")
|
||||
{
|
||||
<div class="row border-bottom">
|
||||
<div class="col-4 pr-0 text-start">
|
||||
@(Traduci(CurrRec.Label))
|
||||
</div>
|
||||
<div class="col-8 pl-0 text-end">
|
||||
<img CssClass="img-fluid" src="@imageUrl" Height="128" />
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="row border-bottom">
|
||||
<div class="col-4 pr-0 text-start">
|
||||
@(Traduci(CurrRec.Label))
|
||||
</div>
|
||||
<div class="col-8 pl-0 text-end fw-bold @dataCss @derogaCss">
|
||||
@if (CurrRec.ShowMissingData && enableForceParamSchedaTecnica)
|
||||
{
|
||||
if (hasDeroga)
|
||||
{
|
||||
<span class="text-success">Deroga Attiva</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<button class=" btn btn-sm btn-danger py-0 text-light" @onclick="ForceParam"><i class="fa-solid fa-kit-medical"></i></button>
|
||||
}
|
||||
}
|
||||
@if (!string.IsNullOrEmpty(CurrRec.ValueRead))
|
||||
{
|
||||
<small>(@CurrRec.ValueRead) </small>
|
||||
}
|
||||
<span class="px-1">@CurrRec.Value</span>
|
||||
<span>
|
||||
@if (CurrRec.ShowMissingData)
|
||||
{
|
||||
<i class="fa-solid fa-triangle-exclamation text-danger"></i>
|
||||
}
|
||||
@if (CurrRec.ShowCheckedData)
|
||||
{
|
||||
<i class="fa-regular fa-square-check text-success"></i>
|
||||
}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Objects;
|
||||
using MP.Data.Services;
|
||||
|
||||
namespace MP_TAB_SERV.Components
|
||||
{
|
||||
public partial class TechSheet_ST_ObjView
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Parameter]
|
||||
public ST_ActRow CurrRec { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Url immagine SE richiesta
|
||||
/// </summary>
|
||||
public string imageUrl
|
||||
{
|
||||
get
|
||||
{
|
||||
string imgPath = "";
|
||||
string fullPath = "";
|
||||
//check type...
|
||||
if (CurrRec.CodTipo == "IMG")
|
||||
{
|
||||
imgPath = CurrRec.Value;
|
||||
if (!Path.IsPathRooted(imgPath))
|
||||
{
|
||||
// aggiungo base path
|
||||
imgPath = $"images/ST_img/{imgPath}";
|
||||
fullPath = Path.Combine(imgBasePath, "wwwroot", imgPath);
|
||||
}
|
||||
// verifico esistenza file...
|
||||
if (!File.Exists(fullPath))
|
||||
{
|
||||
// metto segnaposto empty
|
||||
imgPath = "images/ST_img/Steamware.png";
|
||||
}
|
||||
}
|
||||
return imgPath;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected NavigationManager NavMan { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected SharedMemService SMServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected async Task ForceParam()
|
||||
{
|
||||
if (!await JSRuntime.InvokeAsync<bool>("confirm", Traduci("ConfirmForceParamST")))
|
||||
return;
|
||||
|
||||
// registro abilitazione forzatura parametro per un periodo limitato
|
||||
StCheckOverride newDeroga = new StCheckOverride()
|
||||
{
|
||||
CanForce = enableForceParamSchedaTecnica,
|
||||
Num = CurrRec.Num,
|
||||
Oggetto = CurrRec.Oggetto,
|
||||
CodTipo = CurrRec.CodTipo,
|
||||
CodGruppo = CurrRec.CodGruppo,
|
||||
IdxST = CurrRec.IdxST,
|
||||
Utente = CognomeNome
|
||||
};
|
||||
// salvo
|
||||
TabDServ.ST_DerogaSet(newDeroga);
|
||||
// redirect
|
||||
NavMan.NavigateTo(NavMan.Uri, true);
|
||||
}
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
imgBasePath = Environment.CurrentDirectory;
|
||||
//baseLang = SMServ.GetConf("baseLang");
|
||||
enableForceParamSchedaTecnica = SMServ.GetConfBool("enableForceParamSchedaTecnica");
|
||||
}
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
if (CurrRec != null)
|
||||
{
|
||||
hasDeroga = false;
|
||||
var currDeroga = TabDServ.ST_DerogaGet(CognomeNome, CurrRec.IdxST);
|
||||
if (currDeroga != null)
|
||||
{
|
||||
hasDeroga = (currDeroga.IdxST == CurrRec.IdxST && currDeroga.CanForce && currDeroga.Num == CurrRec.Num && currDeroga.CodGruppo == CurrRec.CodGruppo && currDeroga.CodTipo == CurrRec.CodTipo && currDeroga.Oggetto == CurrRec.Oggetto);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected string Traduci(string lemma)
|
||||
{
|
||||
return SMServ.Traduci($"{baseLang}_{lemma}".ToUpper());
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private string _baseLang { get; set; } = "IT";
|
||||
private string baseLang
|
||||
{
|
||||
get => _baseLang;
|
||||
set
|
||||
{
|
||||
MServ.UserPrefGet("Lang");
|
||||
}
|
||||
}
|
||||
private bool enableForceParamSchedaTecnica = false;
|
||||
private bool hasDeroga = false;
|
||||
private string imgBasePath = "";
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string dataCss
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = "";
|
||||
if (CurrRec.Required)
|
||||
{
|
||||
if (CurrRec.Value != CurrRec.ExtCode)
|
||||
{
|
||||
answ = " text-danger";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = " text-success";
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
private string derogaCss
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = enableForceParamSchedaTecnica && hasDeroga ? " bg-warning" : "";
|
||||
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
private string CognomeNome
|
||||
{
|
||||
get => MServ.CognomeNome;
|
||||
}
|
||||
|
||||
#endregion Private Properties
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<Version>6.16.2310.1614</Version>
|
||||
<Version>6.16.2311.919</Version>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>MP_TAB_SERV</RootNamespace>
|
||||
</PropertyGroup>
|
||||
@@ -17,8 +17,8 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="EgwCoreLib.Razor" Version="1.4.2310.1312" />
|
||||
<PackageReference Include="EgwCoreLib.Utils" Version="1.4.2310.1312" />
|
||||
<PackageReference Include="EgwCoreLib.Razor" Version="1.4.2310.2417" />
|
||||
<PackageReference Include="EgwCoreLib.Utils" Version="1.4.2310.2417" />
|
||||
<PackageReference Include="StackExchange.Redis" Version="2.2.4" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -42,6 +42,18 @@
|
||||
<ProjectReference Include="..\MP.Data\MP.Data.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Update="wwwroot\images\macchine\small\Steamware.png">
|
||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\images\macchine\Steamware.png">
|
||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\images\ST_img\Steamware.png">
|
||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="logs\.placeholder">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@page "/alarms"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
|
||||
@@ -23,6 +23,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@page "/controls"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
|
||||
@@ -23,6 +23,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@page "/declarations"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
@@ -7,5 +8,5 @@
|
||||
else
|
||||
{
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
<DeclarMan></DeclarMan>
|
||||
<DeclarMan RecMSE="CurrMSE"></DeclarMan>
|
||||
}
|
||||
|
||||
@@ -23,6 +23,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@page "/iob-info"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
|
||||
@@ -1,24 +1,6 @@
|
||||
using global::System;
|
||||
using global::System.Collections.Generic;
|
||||
using global::System.Linq;
|
||||
using global::System.Threading.Tasks;
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using System.Net.Http;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Microsoft.AspNetCore.Components.Routing;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
using Microsoft.AspNetCore.Components.Web.Virtualization;
|
||||
using Microsoft.JSInterop;
|
||||
using MP_TAB_SERV;
|
||||
using MP_TAB_SERV.Shared;
|
||||
using MP_TAB_SERV.Components;
|
||||
using MP.Data;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.DTO;
|
||||
using MP.Data.Services;
|
||||
using NLog;
|
||||
|
||||
namespace MP_TAB_SERV.Pages
|
||||
{
|
||||
@@ -41,6 +23,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
@page "/machine-detail"
|
||||
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
@@ -7,16 +9,6 @@
|
||||
else
|
||||
{
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
<ProdConfirm RecMSE="CurrMSE" E_Updated="RefreshData"></ProdConfirm>
|
||||
<ProdStat RecMSE="CurrMSE"></ProdStat>
|
||||
<PrintMag RecMSE="CurrMSE"></PrintMag>
|
||||
<ProdConfirm RecMSE="CurrMSE" E_newVal="RefreshMBlock"></ProdConfirm>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<a class="btn btn-info btn-lg w-100" href="scrap"><i class="fa fa-bug"></i> Reg. SCARTI</a>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<a class="btn btn-primary btn-lg w-100" href="controls"><i class="fa fa-wrench"></i> Reg. CONTROLLI</a>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,24 @@ namespace MP_TAB_SERV.Pages
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await RefreshMBlock();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
protected async Task RefreshMBlock()
|
||||
{
|
||||
// recupero MSE macchina....
|
||||
@@ -41,7 +59,6 @@ namespace MP_TAB_SERV.Pages
|
||||
{
|
||||
CurrMSE = await MsgServ.GetMachineMse(IdxMacc);
|
||||
}
|
||||
await Task.Delay(1);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@page "/notes"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
|
||||
@@ -23,6 +23,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
@page "/odl"
|
||||
|
||||
<MseSampler SampleMult="0.05" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
</div>
|
||||
<MachSel></MachSel>
|
||||
<OdlProdFix></OdlProdFix>
|
||||
<OdlSetup></OdlSetup>
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
<OdlMan RecMSE="CurrMSE" E_Updated="RefreshData"></OdlMan>
|
||||
}
|
||||
|
||||
@@ -40,6 +40,35 @@ namespace MP_TAB_SERV.Pages
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await RefreshMBlock();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
protected async Task RefreshMBlock()
|
||||
{
|
||||
// recupero MSE macchina....
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
CurrMSE = await MsgServ.GetMachineMse(IdxMacc);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
@page "/parameters"
|
||||
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
</div>
|
||||
<ParamsMan></ParamsMan>
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
<ParamsMan RecMSE="CurrMSE"></ParamsMan>
|
||||
}
|
||||
|
||||
|
||||
@@ -1,24 +1,6 @@
|
||||
using global::System;
|
||||
using global::System.Collections.Generic;
|
||||
using global::System.Linq;
|
||||
using global::System.Threading.Tasks;
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using System.Net.Http;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Microsoft.AspNetCore.Components.Routing;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
using Microsoft.AspNetCore.Components.Web.Virtualization;
|
||||
using Microsoft.JSInterop;
|
||||
using MP_TAB_SERV;
|
||||
using MP_TAB_SERV.Shared;
|
||||
using MP_TAB_SERV.Components;
|
||||
using MP.Data;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.DTO;
|
||||
using MP.Data.Services;
|
||||
using NLog;
|
||||
|
||||
namespace MP_TAB_SERV.Pages
|
||||
{
|
||||
@@ -41,6 +23,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@page "/prod-plan"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
using NLog;
|
||||
|
||||
namespace MP_TAB_SERV.Pages
|
||||
{
|
||||
@@ -23,21 +24,47 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private async Task ReloadData()
|
||||
{
|
||||
if (string.IsNullOrEmpty(IdxMacc))
|
||||
try
|
||||
{
|
||||
IdxMacc = await MsgServ.IdxMaccGet();
|
||||
// recupero MSE macchina....
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
if (string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
CurrMSE = await MsgServ.GetMachineMse(IdxMacc);
|
||||
IdxMacc = await MsgServ.IdxMaccGet();
|
||||
// recupero MSE macchina....
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
CurrMSE = await MsgServ.GetMachineMse(IdxMacc);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Eccerione in ReloadData{Environment.NewLine}{exc}");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
@page "/prod-stop"
|
||||
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
|
||||
@@ -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 = await 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,11 +177,11 @@ 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";
|
||||
lblOut = $"Registrata dichiarazione fermata alle {DateTime.Now:HH:mm:ss}";
|
||||
lblOut = $"Registrata dichiarazione fermata [{rigaEvento.Nome}] alle {DateTime.Now:HH:mm:ss}";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -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...
|
||||
@@ -214,6 +214,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
protected void SetDate(DateTime newDate)
|
||||
{
|
||||
DtRif = newDate;
|
||||
@@ -250,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,5 +1,6 @@
|
||||
@page "/scrap"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
|
||||
@@ -23,6 +23,24 @@ namespace MP_TAB_SERV.Pages
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
|
||||
@@ -2,29 +2,29 @@
|
||||
@page "/home"
|
||||
@page "/status-map"
|
||||
|
||||
|
||||
<MseSampler SampleMult="1.5" E_Updated="SaveData"></MseSampler>
|
||||
<div class="row">
|
||||
@if (ListMSE == null || ListMSE.Count == 0)
|
||||
@if (ListMSE == null || ListMSE.Count == 0 || isCalcSize)
|
||||
{
|
||||
@for (int i = 0; i < 10; i++)
|
||||
{
|
||||
<div class="col-6 col-sm-6 col-md-4 col-lg-3 col-xl-2 mb-2 px-1 bloccoMacc">
|
||||
<MachineBlock></MachineBlock>
|
||||
</div>
|
||||
}
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDefault" @bind="ShowCard">
|
||||
<label class="form-check-label" for="flexSwitchCheckDefault">Default switch checkbox input</label>
|
||||
@if (Width < 640)
|
||||
{
|
||||
|
||||
<div class="d-flex justify-content-center">
|
||||
<label class="form-check-label me-2" for="">Nascondi dettagli</label>
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="flexSwitchCheckDefault" @bind="ShowCard">
|
||||
<label class="form-check-label" for="flexSwitchCheckDefault">Mostra dettagli</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@foreach (var item in ListMSE)
|
||||
{
|
||||
<div class="col-6 col-sm-6 col-md-4 col-lg-4 col-xl-3 mb-2 px-1 bloccoMacc">
|
||||
<MachineBlock RecMSE="@item" FullMode="true" showCard="@ShowCard"></MachineBlock>
|
||||
<MachineBlock RecMSE="@item" FullMode="true" Width="@Width" Height="@Height" showCard="@ShowCard"></MachineBlock>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,90 +1,55 @@
|
||||
using global::Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using MP.Data.Conf;
|
||||
using MP.Data.DatabaseModels;
|
||||
using MP.Data.Services;
|
||||
using NLog;
|
||||
using System.Drawing.Imaging;
|
||||
using System;
|
||||
using System.Runtime.ExceptionServices;
|
||||
|
||||
namespace MP_TAB_SERV.Pages
|
||||
{
|
||||
public partial class StatusMap : IDisposable
|
||||
public partial class StatusMap
|
||||
{
|
||||
#region Protected Fields
|
||||
|
||||
protected bool doAnimate = true;
|
||||
protected int keepAliveMin = 1;
|
||||
protected bool _showCard = false;
|
||||
|
||||
protected int maxCol = 6;
|
||||
|
||||
protected string showArt = "";
|
||||
protected int slowRefreshSec = 300;
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected IConfiguration config { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected StatusData MDataService { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime{ get; set; } = null!;
|
||||
|
||||
protected int slowRefreshMs
|
||||
protected bool ShowCard
|
||||
{
|
||||
get
|
||||
get => _showCard;
|
||||
set
|
||||
{
|
||||
// tempo variabile tra +/- 10% del target
|
||||
int answ = rnd.Next(900, 1100) * slowRefreshSec;
|
||||
return answ;
|
||||
_showCard = value;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
/// <summary>
|
||||
/// Recupera il valore e se trovato aggiorna
|
||||
/// </summary>
|
||||
/// <param name="chiave">Valore da cercare</param>
|
||||
/// <param name="varObj">String in cui salvare il valore se trovato</param>
|
||||
/// <returns></returns>
|
||||
protected bool getConfVal(string chiave, ref string varObj)
|
||||
{
|
||||
bool answ = false;
|
||||
if (CurrConfig != null && CurrConfig.Count > 0)
|
||||
{
|
||||
// sistemo i parametri opzionali...
|
||||
ConfigModel? risultato = CurrConfig.FirstOrDefault(x => x.Chiave == chiave);
|
||||
if (risultato != null)
|
||||
{
|
||||
varObj = risultato.Valore;
|
||||
answ = !string.IsNullOrEmpty(risultato.Valore);
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupera il valore e se trovato aggiorna
|
||||
/// </summary>
|
||||
/// <param name="chiave">Valore da cercare</param>
|
||||
/// <param name="varObj">Int in cui salvare il valore se trovato</param>
|
||||
/// <returns></returns>
|
||||
protected bool getConfValInt(string chiave, ref int varObj)
|
||||
{
|
||||
bool answ = false;
|
||||
if (CurrConfig != null && CurrConfig.Count > 0)
|
||||
{
|
||||
// sistemo i parametri opzionali...
|
||||
ConfigModel? risultato = CurrConfig.FirstOrDefault(x => x.Chiave == chiave);
|
||||
if (risultato != null)
|
||||
{
|
||||
answ = int.TryParse(risultato.Valore, out varObj);
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupera da conf eventuale setup tag dell'IOB indicato
|
||||
/// </summary>
|
||||
@@ -123,8 +88,17 @@ namespace MP_TAB_SERV.Pages
|
||||
return answ;
|
||||
}
|
||||
|
||||
protected bool isCalcSize { get; set; } = false;
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
await getWDim();
|
||||
isCalcSize = false;
|
||||
ListMSE = await MDataService.MseGetAll(true);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
if (ListMSE != null)
|
||||
{
|
||||
// salvo in LocalStorage...
|
||||
@@ -132,49 +106,22 @@ 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;
|
||||
await setupConf();
|
||||
StartTimer();
|
||||
await ReloadData();
|
||||
SetupConf();
|
||||
}
|
||||
|
||||
public void StartTimer()
|
||||
protected void SaveData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
int tOutPeriod = 3000;
|
||||
//int.TryParse(Configuration["ReloadStatusTimer"], out tOutPeriod);
|
||||
aTimer = new System.Timers.Timer(tOutPeriod);
|
||||
aTimer.Elapsed += ElapsedTimer;
|
||||
aTimer.Enabled = true;
|
||||
aTimer.Start();
|
||||
Log.Info("Timer started!");
|
||||
//await Task.Delay(1);
|
||||
ListMSE = newList;
|
||||
//await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
public void ElapsedTimer(object? source, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
var pUpd = Task.Run(async () =>
|
||||
{
|
||||
await ReloadData();
|
||||
await MServ.SaveMse(ListMSE);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
Log.Debug("Timer elapsed");
|
||||
});
|
||||
pUpd.Wait();
|
||||
}
|
||||
|
||||
private System.Timers.Timer aTimer = null!;
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (aTimer != null)
|
||||
{
|
||||
aTimer.Elapsed -= ElapsedTimer;
|
||||
aTimer.Stop();
|
||||
aTimer.Dispose();
|
||||
Log.Info("Timer Disposed!");
|
||||
}
|
||||
}
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
@@ -183,10 +130,6 @@ namespace MP_TAB_SERV.Pages
|
||||
|
||||
private static System.Timers.Timer slowTimer = new System.Timers.Timer(300000);
|
||||
|
||||
private List<ConfigModel>? CurrConfig = null;
|
||||
|
||||
private Random rnd = new Random();
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
@@ -197,39 +140,33 @@ namespace MP_TAB_SERV.Pages
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private async Task ReloadData()
|
||||
private void SetupConf()
|
||||
{
|
||||
ListMSE = await MDataService.MseGetAll();
|
||||
}
|
||||
|
||||
//protected bool ShowCard { get; set; } = false;
|
||||
protected bool _showCard = false;
|
||||
protected bool ShowCard
|
||||
{
|
||||
get => _showCard;
|
||||
set
|
||||
{
|
||||
_showCard = value;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
private async Task setupConf()
|
||||
{
|
||||
CurrConfig = await MDataService.ConfigGetAll();
|
||||
if (CurrConfig != null && CurrConfig.Count > 0)
|
||||
{
|
||||
// sistemo i parametri opzionali...
|
||||
getConfValInt("keepAliveMin", ref keepAliveMin);
|
||||
getConfValInt("MON_maxCol", ref maxCol);
|
||||
int intDoAnim = 0;
|
||||
getConfValInt("doAnimate", ref intDoAnim);
|
||||
doAnimate = intDoAnim == 1;
|
||||
getConfValInt("pageRefreshSec", ref slowRefreshSec);
|
||||
getConfVal("sART", ref showArt);
|
||||
Log.Info($"setupConf | Effettuato setup parametri | keepAlive: {keepAliveMin} | MaxCol: {maxCol} | doAnimate: {doAnimate} | slowRefreshSec: {slowRefreshSec}");
|
||||
}
|
||||
// sistemo i parametri opzionali...
|
||||
TabDServ.ConfigGetVal("MON_maxCol", ref maxCol);
|
||||
TabDServ.ConfigGetVal("sART", ref showArt);
|
||||
Log.Info($"setupConf | Effettuato setup parametri | MaxCol: {maxCol}");
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
protected int Width { get; set; } = 0;
|
||||
protected int Height { get; set; } = 0;
|
||||
|
||||
public class WindowDimension
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
public int Height { get; set; }
|
||||
public int Width { get; set; }
|
||||
|
||||
#endregion Public Properties
|
||||
}
|
||||
protected async Task getWDim()
|
||||
{
|
||||
var dimension = await JSRuntime.InvokeAsync<WindowDimension>("getWindowDimensions");
|
||||
Height = dimension.Height;
|
||||
Width = dimension.Width;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,9 +10,6 @@
|
||||
<tr>
|
||||
<th>Articolo</th>
|
||||
<th>Informazioni</th>
|
||||
@* <th>TCiclo</th> *@
|
||||
@* <th>Note</th> *@
|
||||
@* <th class="text-end">Impianto</th> *@
|
||||
<th>Periodo</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -30,7 +27,6 @@
|
||||
<div class="placeholder col-6"></div>
|
||||
<small class="placeholder col-6"></small>
|
||||
</td>
|
||||
@* <td><span class="placeholder col-12"></span></td> *@
|
||||
<td><span class="placeholder col-12"></span></td>
|
||||
<td class="text-end">
|
||||
<div class="placeholder col-10"></div>
|
||||
@@ -81,8 +77,6 @@
|
||||
<small><b>Fine:</b> @item.DataFine</small>
|
||||
</div>
|
||||
</td>
|
||||
@* <td class="text-end">
|
||||
</td> *@
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,22 @@
|
||||
@page "/tech-sheet"
|
||||
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
</div>
|
||||
<TechSheetDetail></TechSheetDetail>
|
||||
@if (enableSchedaTecnica)
|
||||
{
|
||||
<TechSheetMan RecMSE="CurrMSE"></TechSheetMan>
|
||||
}
|
||||
else
|
||||
{
|
||||
<DisabledAlert Title="@disTitle" Subtitle="@disSubtitle" Message="@disMessage"></DisabledAlert>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@ namespace MP_TAB_SERV.Pages
|
||||
[Inject]
|
||||
protected MessageService MsgServ { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabDServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
@@ -21,10 +24,37 @@ namespace MP_TAB_SERV.Pages
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await ReloadData();
|
||||
SetupConf();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private string disMessage = "Gestione schede tecniche di attrezzaggio, collaudo e verifica procedure di setup. Il modulo opzionale è attivabile su richiesta.";
|
||||
|
||||
private string disSubtitle = "Funzionalità disattivata";
|
||||
|
||||
private string disTitle = "Scheda Tecnica";
|
||||
|
||||
private bool enableSchedaTecnica = false;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private async Task ReloadData()
|
||||
@@ -40,6 +70,11 @@ namespace MP_TAB_SERV.Pages
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupConf()
|
||||
{
|
||||
TabDServ.ConfigGetVal("enableSchedaTecnica", ref enableSchedaTecnica);
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,38 @@
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="my-1 text-center fw-bold fs-3">
|
||||
Preferenze
|
||||
</div>
|
||||
<div>
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">
|
||||
<div class="text-center mb-1 fw-bold">Modalità di inserimento del tempo ciclo</div>
|
||||
<div class="d-flex justify-content-center">
|
||||
<div class="btn-group" role="group" aria-label="Basic outlined example">
|
||||
<button class="btn btn-sm @btnMsStyle" @onclick='()=>setTcMode("ms")'>min:sec</button>
|
||||
<button class="btn btn-sm @btnMcStyle" @onclick='()=>setTcMode("mc")'>min.cent</button>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<div class="text-center mb-1 fw-bold">Lingua</div>
|
||||
<select class="form-select" @bind="langIns">
|
||||
<option value="IT">IT</option>
|
||||
<option value="EN">EN</option>
|
||||
</select>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<div class="text-center mb-1 fw-bold">Modalità di visualizzazione delle macchine in 'Mappa Stato'</div>
|
||||
<div class="d-flex justify-content-center">
|
||||
<div class="btn-group" role="group" aria-label="Basic outlined example">
|
||||
<button class="btn btn-sm @btnShrinkStyle" @onclick='()=>setDefCardMode("shrink")'>Shrink</button>
|
||||
<button class="btn btn-sm @btnFullStyle" @onclick='()=>setDefCardMode("full")'>Full</button>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<button class="w-100 btn btn-success">
|
||||
@@ -61,6 +93,134 @@
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Inject]
|
||||
private MessageService MsgServ { get; set; } = null!;
|
||||
|
||||
protected async Task setTcMode(string tcMode)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
tcModIns = tcMode;
|
||||
}
|
||||
protected async Task setLang(string lang)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
langIns = lang;
|
||||
}
|
||||
protected async Task setDefCardMode(string defCardMode)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
defCardModeIns = defCardMode;
|
||||
}
|
||||
|
||||
protected string btnMsStyle
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = "";
|
||||
if (tcModIns == "ms")
|
||||
{
|
||||
answ = "btn-primary";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "btn-outline-secondary";
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
protected string btnMcStyle
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = "";
|
||||
if (tcModIns == "mc")
|
||||
{
|
||||
answ = "btn-primary";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "btn-outline-secondary";
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
protected string btnShrinkStyle
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = "";
|
||||
if (defCardModeIns == "shrink")
|
||||
{
|
||||
answ = "btn-primary";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "btn-outline-secondary";
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
protected string btnFullStyle
|
||||
{
|
||||
get
|
||||
{
|
||||
string answ = "";
|
||||
if (defCardModeIns == "full")
|
||||
{
|
||||
answ = "btn-primary";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "btn-outline-secondary";
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
|
||||
protected string _tcModIns { get; set; } = "";
|
||||
|
||||
protected string tcModIns
|
||||
{
|
||||
get => _tcModIns;
|
||||
set
|
||||
{
|
||||
if (_tcModIns != value)
|
||||
{
|
||||
_tcModIns = value;
|
||||
MsgServ.UserPrefSave("TcMode", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected string _langIns { get; set; } = "";
|
||||
|
||||
protected string langIns
|
||||
{
|
||||
get => _langIns;
|
||||
set
|
||||
{
|
||||
if (_langIns != value)
|
||||
{
|
||||
_langIns = value;
|
||||
MsgServ.UserPrefSave("Lang", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
protected string _defCardMode { get; set; } = "";
|
||||
|
||||
protected string defCardModeIns
|
||||
{
|
||||
get => _defCardMode;
|
||||
set
|
||||
{
|
||||
if (_defCardMode != value)
|
||||
{
|
||||
_defCardMode = value;
|
||||
MsgServ.UserPrefSave("DefCardMode", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int Height { get; set; } = 0;
|
||||
public int Width { get; set; } = 0;
|
||||
public string currIpv4 { get; set; } = "";
|
||||
@@ -82,6 +242,21 @@
|
||||
}
|
||||
protected async override Task OnInitializedAsync()
|
||||
{
|
||||
var tcPrefItem = MsgServ.UserPrefGet("TcMode");
|
||||
if (tcPrefItem != null)
|
||||
{
|
||||
tcModIns = tcPrefItem;
|
||||
}
|
||||
var langPrefItem = MsgServ.UserPrefGet("Lang");
|
||||
if (langPrefItem != null)
|
||||
{
|
||||
langIns = langPrefItem;
|
||||
}
|
||||
var defCardPrefItem = MsgServ.UserPrefGet("DefCardMode");
|
||||
if (defCardPrefItem != null)
|
||||
{
|
||||
defCardModeIns = defCardPrefItem;
|
||||
}
|
||||
await Task.Delay(1);
|
||||
if (string.IsNullOrEmpty(currIpv4))
|
||||
{
|
||||
|
||||
@@ -1,68 +1,55 @@
|
||||
@page "/workshift"
|
||||
|
||||
<MseSampler SampleMult="0.5" E_Updated="RefreshData"></MseSampler>
|
||||
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null)
|
||||
{
|
||||
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
</div>
|
||||
<div class="row my-2">
|
||||
<div class="col-12 col-md-6 my-2">
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="form-check form-switch fs-2">
|
||||
<input class="form-check-input" type="checkbox" @bind="@T1">
|
||||
<label class="form-check-label" >Turno 1</label>
|
||||
<MachineBlock RecMSE="CurrMSE" FullMode="false"></MachineBlock>
|
||||
<h2>Gestione Turni</h2>
|
||||
<div class="my-2 d-flex justify-content-center">
|
||||
<div class="col-12 col-md-6 my-2 text-center cardObj">
|
||||
<div class="d-flex justify-content-center flex-wrap align-items-center">
|
||||
<div class="col-8">
|
||||
<h2><b>Stato Turni Attivi</b></h2>
|
||||
</div>
|
||||
<div class="col-8 fs-5 @cssByState(T1) p-2 mb-2" style="border-radius: 0.375rem">
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="form-check form-switch fs-2">
|
||||
<input class="form-check-input" type="checkbox" @bind="@T1">
|
||||
<label class="form-check-label">Turno 1</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8 fs-5 @cssByState(T2) p-2 mb-2" style="border-radius: 0.375rem">
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="form-check form-switch fs-2">
|
||||
<input class="form-check-input" type="checkbox" @bind="@T2">
|
||||
<label class="form-check-label">Turno 2</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8 fs-5 @cssByState(T3) p-2 mb-2" style="border-radius: 0.375rem">
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="form-check form-switch fs-2">
|
||||
<input class="form-check-input" type="checkbox" @bind="@T3">
|
||||
<label class="form-check-label">Turno 3</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="form-check form-switch fs-2">
|
||||
<input class="form-check-input" type="checkbox" @bind="@T2">
|
||||
<label class="form-check-label" >Turno 2</label>
|
||||
<div class="d-flex justify-content-center my-2 w-100 px-2">
|
||||
<div class="row w-100" >
|
||||
<div class="col-6 bg-success text-warning" style="border-radius: 0.375rem 0 0 0.375rem; ">
|
||||
Turno Aperto
|
||||
</div>
|
||||
<div class="col-6 bg-secondary" style="border-radius: 0 0.375rem 0.375rem 0; ">
|
||||
Turno Chiuso
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="form-check form-switch fs-2">
|
||||
<input class="form-check-input" type="checkbox" @bind="@T3">
|
||||
<label class="form-check-label" >Turno 3</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-6 my-2 text-center">
|
||||
<div class="row">
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8">
|
||||
<h2><b>Stato Turni Attivi</b></h2>
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8 fs-5 @cssByState(T1)">
|
||||
Turno 1
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8 fs-5 @cssByState(T2)">
|
||||
Turno 2
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8 fs-5 @cssByState(T3)">
|
||||
Turno 3
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
</div>
|
||||
<div class="row my-2">
|
||||
<div class="col-2"></div>
|
||||
<div class="col-4 bg-success text-warning px-2">
|
||||
Turno Aperto
|
||||
</div>
|
||||
<div class="col-4 bg-secondary px-2">
|
||||
Turno Chiuso
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -9,20 +9,86 @@ namespace MP_TAB_SERV.Pages
|
||||
#region Protected Properties
|
||||
|
||||
protected MappaStatoExpl? CurrMSE { get; set; } = null;
|
||||
protected TurniMaccModel currTurni { get; set; } = new TurniMaccModel();
|
||||
protected string IdxMacc { get; set; } = "";
|
||||
|
||||
[Inject]
|
||||
protected MessageService MsgServ { get; set; } = null!;
|
||||
|
||||
protected bool T1
|
||||
{
|
||||
get => currTurni.T1;
|
||||
set
|
||||
{
|
||||
if (currTurni.T1 != value)
|
||||
{
|
||||
currTurni.T1 = value;
|
||||
TabServ.TurnoMacchinaToggle(IdxMacc, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected bool T2
|
||||
{
|
||||
get => currTurni.T2;
|
||||
set
|
||||
{
|
||||
if (currTurni.T2 != value)
|
||||
{
|
||||
currTurni.T2 = value;
|
||||
TabServ.TurnoMacchinaToggle(IdxMacc, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected bool T3
|
||||
{
|
||||
get => currTurni.T3;
|
||||
set
|
||||
{
|
||||
if (currTurni.T3 != value)
|
||||
{
|
||||
currTurni.T3 = value;
|
||||
TabServ.TurnoMacchinaToggle(IdxMacc, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected string cssByState(bool isActive)
|
||||
{
|
||||
return isActive ? "bg-success text-warning" : "bg-secondary";
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
|
||||
protected async Task RefreshData(List<MappaStatoExpl> newList)
|
||||
{
|
||||
var ListMSE = newList;
|
||||
if (!string.IsNullOrEmpty(IdxMacc))
|
||||
{
|
||||
var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc);
|
||||
if (rawData != null)
|
||||
{
|
||||
CurrMSE = rawData;
|
||||
}
|
||||
else
|
||||
{
|
||||
await ReloadData();
|
||||
}
|
||||
}
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Methods
|
||||
@@ -42,52 +108,6 @@ namespace MP_TAB_SERV.Pages
|
||||
}
|
||||
}
|
||||
|
||||
protected bool T1
|
||||
{
|
||||
get => currTurni.T1;
|
||||
set
|
||||
{
|
||||
if (currTurni.T1 != value)
|
||||
{
|
||||
currTurni.T1 = value;
|
||||
TabServ.TurnoMacchinaToggle(IdxMacc, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
protected bool T2
|
||||
{
|
||||
get => currTurni.T2;
|
||||
set
|
||||
{
|
||||
if (currTurni.T2 != value)
|
||||
{
|
||||
currTurni.T2 = value;
|
||||
TabServ.TurnoMacchinaToggle(IdxMacc, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
protected bool T3
|
||||
{
|
||||
get => currTurni.T3;
|
||||
set
|
||||
{
|
||||
if (currTurni.T3 != value)
|
||||
{
|
||||
currTurni.T3 = value;
|
||||
TabServ.TurnoMacchinaToggle(IdxMacc, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected string cssByState(bool isActive)
|
||||
{
|
||||
return isActive ? "bg-success text-warning" : "bg-secondary";
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabServ { get; set; } = null!;
|
||||
protected TurniMaccModel currTurni { get; set; } = new TurniMaccModel();
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -7,19 +7,20 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
@* <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> *@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="description" content="MP TAB" />
|
||||
<meta name="author" content="EgalWare" />
|
||||
<link rel="shortcut icon" href="images/favicon.ico" />
|
||||
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />
|
||||
<base href="~/" />
|
||||
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="lib/font-awesome/css/all.min.css" />
|
||||
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="css/font.min.css" />
|
||||
<link rel="stylesheet" href="css/site.css" />
|
||||
@* <link rel="shortcut icon" href="images/favicon.ico" /> *@
|
||||
<link type="image/x-icon" href="images/favicon.ico" rel="shortcut icon" />
|
||||
<link href="MP-TAB-SERV.styles.css" rel="stylesheet" />
|
||||
<link rel="stylesheet" href="MP-TAB-SERV.styles.css" />
|
||||
<component type="typeof(HeadOutlet)" render-mode="Server" />
|
||||
@* <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" /> *@
|
||||
</head>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>Modulo MAPOSPEC </i>
|
||||
<h4>Versione: 6.16.2310.1614</h4>
|
||||
<h4>Versione: 6.16.2311.919</h4>
|
||||
<br /> Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.16.2310.1614
|
||||
6.16.2311.919
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>6.16.2310.1614</version>
|
||||
<version>6.16.2311.919</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>
|
||||
|
||||
@@ -116,6 +116,10 @@ namespace MP_TAB_SERV.Shared
|
||||
// fix MSFD...
|
||||
var allMSFD = await TDataService.VMSFDGetAll();
|
||||
MStor.SetMsfd(allMSFD);
|
||||
// fix slave
|
||||
var macSlave = await TDataService.Macchine2Slave();
|
||||
MStor.SetM2S(macSlave);
|
||||
|
||||
// fix elenco eventi
|
||||
var allEvents = await TDataService.AnagEventiGetAll();
|
||||
MStor.SetEventi(allEvents);
|
||||
@@ -125,6 +129,15 @@ namespace MP_TAB_SERV.Shared
|
||||
// non da farsi globalmente // fix macchine var allMach = await
|
||||
// MDataService.MacchineByMatrOper(0); MStor.DictMacchine = allMach.ToDictionary(x =>
|
||||
// x.IdxMacchina, x => $"{x.IdxMacchina} | {x.Nome}");
|
||||
|
||||
// fix vocabolario
|
||||
var allVoc = TDataService.VocabolarioGetAll();
|
||||
MStor.SetVocab(allVoc);
|
||||
|
||||
// resetto il tabDServ
|
||||
await TDataService.FlushCache();
|
||||
// ricarica la config...
|
||||
TDataService.SetupConfig();
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
@@ -2,34 +2,6 @@
|
||||
@inject ListSelectDataSrv MDataService
|
||||
|
||||
|
||||
@* <div class="top-row ps-3 navbar navbar-dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="">MP-TAB-SERV</a>
|
||||
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
|
||||
<nav class="flex-column">
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
|
||||
<span class="oi oi-home" aria-hidden="true"></span> Home
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="counter">
|
||||
<span class="oi oi-plus" aria-hidden="true"></span> Counter
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="fetchdata">
|
||||
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
|
||||
</NavLink>
|
||||
</div>
|
||||
</nav>
|
||||
</div> *@
|
||||
|
||||
<div class="nav-scrollable">
|
||||
<div class="bg-dark text-center py-2">
|
||||
@@ -48,28 +20,6 @@
|
||||
</div>
|
||||
}
|
||||
}
|
||||
@*
|
||||
<br />
|
||||
<div class="nav-item px-2">
|
||||
<NavLink class="nav-link px-2" href="" Match="NavLinkMatch.All">
|
||||
<span class="bi bi-house-door-fill" aria-hidden="true"></span> Home
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-2">
|
||||
<NavLink class="nav-link px-2" href="counter">
|
||||
<span class="bi bi-plus-square-fill" aria-hidden="true"></span> Counter
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-2">
|
||||
<NavLink class="nav-link px-2" href="weather">
|
||||
<span class="bi bi-list-nested" aria-hidden="true"></span> Weather
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-2">
|
||||
<NavLink class="nav-link px-2" href="CardDemo">
|
||||
<span class="bi bi-plus-square-fill" aria-hidden="true"></span> CardDemo
|
||||
</NavLink>
|
||||
</div> *@
|
||||
|
||||
</nav>
|
||||
</div>
|
||||
@@ -78,17 +28,4 @@
|
||||
|
||||
[Parameter]
|
||||
public List<LinkMenu> MenuItems { get; set; } = new List<LinkMenu>();
|
||||
|
||||
#if false
|
||||
|
||||
private bool collapseNavMenu = true;
|
||||
|
||||
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
|
||||
|
||||
private void ToggleNavMenu()
|
||||
{
|
||||
collapseNavMenu = !collapseNavMenu;
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -15,3 +15,4 @@
|
||||
@using MP.Data.Services
|
||||
@using Newtonsoft.Json
|
||||
@using NLog
|
||||
@using EgwCoreLib.Razor
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user