bozza ODL

This commit is contained in:
Samuele Locatelli
2022-08-01 13:34:16 +02:00
parent 66469b9df7
commit 9407b451c7
13 changed files with 386 additions and 97 deletions
+88 -48
View File
@@ -70,15 +70,6 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Elenco valori ammessi x Tipo articoli
/// </summary>
/// <returns></returns>
public List<DatabaseModels.ListValues> AnagTipoArtLV()
{
return ListValuesFilt("AnagArticoli", "Tipo");
}
/// <summary>
/// Elenco valori ammessi x Stati commessa (es Yacht Baglietto)
/// </summary>
@@ -88,29 +79,13 @@ namespace MP.Data.Controllers
return ListValuesFilt("PODL", "StatoComm");
}
/// <summary>
/// Elenco valori link (x home e navMenu laterale)
/// Elenco valori ammessi x Tipo articoli
/// </summary>
/// <returns></returns>
public List<DatabaseModels.LinkMenu> ElencoLink()
public List<DatabaseModels.ListValues> AnagTipoArtLV()
{
return ListLinkFilt("SpecLink");
}
public List<DatabaseModels.LinkMenu> ListLinkFilt(string tipoLink)
{
List<DatabaseModels.LinkMenu> dbResult = new List<DatabaseModels.LinkMenu>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetLinkMenu
.Where(x => x.TipoLink == tipoLink)
.AsNoTracking()
.OrderBy(x => x.ordine)
.ToList();
}
return dbResult;
return ListValuesFilt("AnagArticoli", "Tipo");
}
/// <summary>
@@ -165,25 +140,6 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Elenco tabella Articoli IMPIEGATI (da stored stp_ART_getUsed)
/// </summary>
/// <returns></returns>
public List<DatabaseModels.AnagArticoli> ArticoliGetUsed()
{
List<DatabaseModels.AnagArticoli> dbResult = new List<DatabaseModels.AnagArticoli>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetArticoli
.FromSqlRaw("EXEC stp_ART_getUsed")
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Elenco tabella Articoli da filtro
/// </summary>
@@ -207,6 +163,24 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Elenco tabella Articoli IMPIEGATI (da stored stp_ART_getUsed)
/// </summary>
/// <returns></returns>
public List<DatabaseModels.AnagArticoli> ArticoliGetUsed()
{
List<DatabaseModels.AnagArticoli> dbResult = new List<DatabaseModels.AnagArticoli>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetArticoli
.FromSqlRaw("EXEC stp_ART_getUsed")
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Update Record
/// </summary>
@@ -278,7 +252,7 @@ namespace MP.Data.Controllers
{
dbResult = dbCtx
.DbSetConfig
.Where(x => x.Chiave== updRec.Chiave)
.Where(x => x.Chiave == updRec.Chiave)
.FirstOrDefault();
if (dbResult != null)
{
@@ -294,6 +268,30 @@ namespace MP.Data.Controllers
{
}
/// <summary>
/// Elenco valori link (x home e navMenu laterale)
/// </summary>
/// <returns></returns>
public List<DatabaseModels.LinkMenu> ElencoLink()
{
return ListLinkFilt("SpecLink");
}
public List<DatabaseModels.LinkMenu> ListLinkFilt(string tipoLink)
{
List<DatabaseModels.LinkMenu> dbResult = new List<DatabaseModels.LinkMenu>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetLinkMenu
.Where(x => x.TipoLink == tipoLink)
.AsNoTracking()
.OrderBy(x => x.ordine)
.ToList();
}
return dbResult;
}
/// <summary>
/// Elenco valori ammessi x tabella/colonna
/// </summary>
@@ -353,6 +351,48 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Elenco ODL filtrati x stato, articolo, KeyRich (che contiene stato)
/// </summary>
/// <param name="inCorso">Stato ODL: true=in corso/completato</param>
/// <param name="codArt">Cod articolo</param>
/// <param name="keyRichPart">KeyRich (parziale) da cercare (es cod stato x yacht)</param>
/// <returns></returns>
public List<DatabaseModels.ODLModel> ListODLFilt(bool inCorso, string codArt, string keyRichPart)
{
List<DatabaseModels.ODLModel> dbResult = new List<DatabaseModels.ODLModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetODL
.Where(x => ((inCorso && x.DataFine == null) || (!inCorso && x.DataFine != null)) && (x.KeyRichiesta.Contains(keyRichPart) || keyRichPart == "*") && (x.CodArticolo == codArt || codArt == "*"))
.AsNoTracking()
.OrderBy(x => x.IdxOdl)
.ToList();
}
return dbResult;
}
/// <summary>
/// Elenco PODL non avviati filtrati x articolo, KeyRich (che contiene stato)
/// </summary>
/// <param name="codArt">Cod articolo</param>
/// <param name="keyRichPart">KeyRich (parziale) da cercare (es cod stato x yacht)</param>
/// <returns></returns>
public List<DatabaseModels.PODLModel> ListPODLFilt(string codArt, string keyRichPart)
{
List<DatabaseModels.PODLModel> dbResult = new List<DatabaseModels.PODLModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetPODL
.Where(x => (x.IdxOdl == 0) && (x.KeyRichiesta.Contains(keyRichPart) || keyRichPart == "*") && (x.CodArticolo == codArt || codArt == "*"))
.AsNoTracking()
.OrderBy(x => x.InsertDate)
.ToList();
}
return dbResult;
}
/// <summary>
/// Annulla modifiche su una specifica entity (cancel update)
/// </summary>
+4 -4
View File
@@ -73,9 +73,9 @@ namespace MP.Data.Controllers
/// <param name="numRecord"></param>
/// <param name="searchVal"></param>
/// <returns></returns>
public List<DatabaseModels.ODL> CommesseGetSearch(int numRecord, string searchVal = "")
public List<DatabaseModels.StatsODL> CommesseGetSearch(int numRecord, string searchVal = "")
{
List<DatabaseModels.ODL> dbResult = new List<DatabaseModels.ODL>();
List<DatabaseModels.StatsODL> dbResult = new List<DatabaseModels.StatsODL>();
using (var dbCtx = new MoonPro_STATSContext(_configuration))
{
dbResult = dbCtx
@@ -223,9 +223,9 @@ namespace MP.Data.Controllers
/// <param name="numRecord"></param>
/// <param name="searchVal"></param>
/// <returns></returns>
public List<DatabaseModels.ODL> StatOdlGetAll(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo)
public List<DatabaseModels.StatsODL> StatOdlGetAll(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo)
{
List<DatabaseModels.ODL> dbResult = new List<DatabaseModels.ODL>();
List<DatabaseModels.StatsODL> dbResult = new List<DatabaseModels.StatsODL>();
using (var dbCtx = new MoonPro_STATSContext(_configuration))
{
var dataFrom = new SqlParameter("@dataFrom", DataStart);
+35
View File
@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
namespace MP.Data.DatabaseModels
{
[Table("ODL")]
public partial class ODLModel
{
#region Public Properties
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int IdxOdl { get; set; }
[MaxLength(50)]
public string CodArticolo { get; set; } = "";
[MaxLength(50)]
public string IdxMacchina { get; set; }
public int NumPezzi { get; set; }
public decimal Tcassegnato { get; set; }
public DateTime? DataInizio { get; set; }
public DateTime? DataFine { get; set; }
[MaxLength(2500)]
public string Note { get; set; } = "";
[MaxLength(50)]
public string KeyRichiesta { get; set; }
public int PzPallet { get; set; } = 1;
[MaxLength(50)]
public string CodCli { get; set; } = "";
#endregion Public Properties
}
}
+42
View File
@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
namespace MP.Data.DatabaseModels
{
[Table("PODL")]
public partial class PODLModel
{
#region Public Properties
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int IdxPromessa { get; set; }
[MaxLength(50)]
public string KeyRichiesta { get; set; }
[MaxLength(50)]
public string KeyBCode { get; set; }
public bool Attivabile { get; set; } = false;
public int IdxOdl { get; set; } = 0;
[MaxLength(50)]
public string CodArticolo { get; set; } = "";
[MaxLength(50)]
public string CodGruppo { get; set; } = "";
[MaxLength(50)]
public string IdxMacchina { get; set; }
public int NumPezzi { get; set; } = 1;
public decimal Tcassegnato { get; set; } = 1;
public DateTime? DueDate { get; set; }
public int Priorita { get; set; } = 1;
public int PzPallet { get; set; } = 1;
[MaxLength(2500)]
public string Note { get; set; } = "";
[MaxLength(50)]
public string CodCli { get; set; } = "";
public DateTime InsertDate { get; set; } = DateTime.Now;
#endregion Public Properties
}
}
@@ -5,7 +5,7 @@ using System.Collections.Generic;
namespace MP.Data.DatabaseModels
{
public partial class ODL
public partial class StatsODL
{
#region Public Properties
+2
View File
@@ -42,6 +42,8 @@ namespace MP.Data
public virtual DbSet<AnagGruppi> DbSetAnagGruppi { get; set; }
public virtual DbSet<ListValues> DbSetListValues { get; set; }
public virtual DbSet<LinkMenu> DbSetLinkMenu { get; set; }
public virtual DbSet<ODLModel> DbSetODL { get; set; }
public virtual DbSet<PODLModel> DbSetPODL { get; set; }
#endregion Public Properties
+2 -2
View File
@@ -39,7 +39,7 @@ namespace MP.Data
public virtual DbSet<ResControlli> DbSetControlli { get; set; }
public virtual DbSet<DdbTurni> DbSetDdbTurni { get; set; }
public virtual DbSet<Macchine> DbSetMacchine { get; set; }
public virtual DbSet<ODL> DbSetODL { get; set; }
public virtual DbSet<StatsODL> DbSetODL { get; set; }
public virtual DbSet<ResScarti> DbSetScarti { get; set; }
public virtual DbSet<TurniOee> DbSetTurniOee { get; set; }
public virtual DbSet<UserActionLog> DbSetUserLog { get; set; }
@@ -325,7 +325,7 @@ namespace MP.Data
.HasMaxLength(250);
});
modelBuilder.Entity<ODL>(entity =>
modelBuilder.Entity<StatsODL>(entity =>
{
entity.HasKey(e => e.IdxOdl)
.HasName("PK_ODL_1");
+64
View File
@@ -0,0 +1,64 @@
@using MP.SPEC.Components
@using MP.SPEC.Data
<h3>ODL</h3>
@if (ListRecords == null)
{
<LoadingData></LoadingData>
}
else if (totalCount == 0)
{
<div class="alert alert-warning text-center display-4">Nessun record trovato</div>
}
else
{
<div class="row">
<div class="col-12">
<table class="table table-sm table-striped">
<thead>
<tr>
<th>
@*<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>*@
</th>
<th>Articolo</th>
<th>Macchina</th>
<th># pz</th>
<th>Inizio</th>
<th>Note</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var record in ListRecords)
{
<tr class="@checkSelect(@record.CodArticolo)">
<td>
@*<button @onclick="() => selRecord(record)" class="btn btn-primary btn-sm"><i class="bi bi-pencil-square"></i></button>*@
</td>
<td>
<div>@record.CodArticolo</div>
</td>
<td>
<div class="small">@record.IdxMacchina</div>
</td>
<td>
<div class="small">@record.NumPezzi</div>
</td>
<td>
<div>@record.DataInizio</div>
</td>
<td>@record.Note</td>
<td>
@*@if (ArticoloDelEnabled(record.CodArticolo))
{
<button @onclick="() => deleteRecord(record)" class="btn btn-danger btn-sm"><i class="bi bi-trash-fill"></i></button>
}*@
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
}
+73
View File
@@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using 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.SPEC;
using MP.SPEC.Shared;
using MP.SPEC.Components;
using MP.SPEC.Data;
using MP.Data.DatabaseModels;
namespace MP.SPEC.Components
{
public partial class ListODL
{
private bool isLoading { get; set; } = false;
private List<ODLModel>? ListRecords;
private ODLModel? currRecord = null;
private List<ODLModel>? SearchRecords;
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
[Inject]
protected MessageService MessageService { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
await reloadData();
}
private async Task reloadData()
{
isLoading = true;
SearchRecords = await MDService.ListODLFilt(true, "*","*");
totalCount = SearchRecords.Count;
ListRecords = SearchRecords;//.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
isLoading = false;
}
public string checkSelect(string CodArticolo)
{
string answ = "";
if (currRecord != null)
{
try
{
answ = (currRecord.CodArticolo == CodArticolo) ? "table-info" : "";
}
catch
{ }
}
return answ;
}
private int totalCount = 0;
}
}
+5
View File
@@ -0,0 +1,5 @@
<h3>PODL</h3>
@code {
}
+56 -36
View File
@@ -67,6 +67,38 @@ namespace MP.SPEC.Data
#region Public Methods
public async Task<List<ListValues>> AnagStatiComm()
{
int maxAgeConfig = 5;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List<ListValues>? result = new List<ListValues>();
// cerco in redis...
RedisValue rawData = await redisDb.StringGetAsync(redisStatoCom);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<ListValues>>($"{rawData}");
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagStatiComm Read from REDIS: {ts.TotalMilliseconds}ms");
}
else
{
result = await Task.FromResult(dbController.AnagStatiComm());
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(redisStatoCom, rawData, TimeSpan.FromMinutes(maxAgeConfig));
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagStatiComm Read from DB: {ts.TotalMilliseconds}ms");
}
if (result == null)
{
result = new List<ListValues>();
}
return result;
}
public async Task<List<ListValues>> AnagTipoArtLV()
{
int maxAgeConfig = 5;
@@ -99,8 +131,6 @@ namespace MP.SPEC.Data
return result;
}
/// <summary>
/// Eliminazione record selezionato
/// </summary>
@@ -132,6 +162,28 @@ namespace MP.SPEC.Data
return await dbController.ArticoliUpdateRecord(currRec);
}
/// <summary>
/// Elenco ODL filtrati x stato, articolo, KeyRich (che contiene stato)
/// </summary>
/// <param name="inCorso">Stato ODL: true=in corso/completato</param>
/// <param name="codArt">Cod articolo</param>
/// <param name="keyRichPart">KeyRich (parziale) da cercare (es cod stato x yacht)</param>
/// <returns></returns>
public async Task<List<ODLModel>> ListODLFilt(bool inCorso, string codArt, string keyRichPart)
{
return await Task.FromResult(dbController.ListODLFilt(inCorso, codArt, keyRichPart));
}
/// <summary>
/// Elenco PODL non avviati filtrati x articolo, KeyRich (che contiene stato)
/// </summary>
/// <param name="codArt">Cod articolo</param>
/// <param name="keyRichPart">KeyRich (parziale) da cercare (es cod stato x yacht)</param>
/// <returns></returns>
public async Task<List<PODLModel>> ListPODLFilt(string codArt, string keyRichPart)
{
return await Task.FromResult(dbController.ListPODLFilt(codArt, keyRichPart));
}
/// <summary>
/// Verifica se sia possiubile cancellare articolo dato suo CodArt cercando su redis o su
/// tab veto da DB
@@ -231,38 +283,6 @@ namespace MP.SPEC.Data
return result;
}
public async Task<List<ListValues>> AnagStatiComm()
{
int maxAgeConfig = 5;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List<ListValues>? result = new List<ListValues>();
// cerco in redis...
RedisValue rawData = await redisDb.StringGetAsync(redisStatoCom);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<ListValues>>($"{rawData}");
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagStatiComm Read from REDIS: {ts.TotalMilliseconds}ms");
}
else
{
result = await Task.FromResult(dbController.AnagStatiComm());
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(redisStatoCom, rawData, TimeSpan.FromMinutes(maxAgeConfig));
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagStatiComm Read from DB: {ts.TotalMilliseconds}ms");
}
if (result == null)
{
result = new List<ListValues>();
}
return result;
}
/// <summary>
/// Reset dati cache config
/// </summary>
@@ -391,8 +411,6 @@ namespace MP.SPEC.Data
private int fastRefreshMs = 1000;
private string redisConfKey = "MP:MON:Cache:Config";
private string redisTipoArt = "MP:MON:Cache:TipoArt";
private string redisStatoCom = "MP:MON:Cache:StatoCom";
/// <summary>
/// Oggetto per connessione a REDIS
@@ -406,6 +424,8 @@ namespace MP.SPEC.Data
private IDatabase redisDb = null!;
private string redisMseKey = "MP:MON:Cache:MSE";
private string redisStatoCom = "MP:MON:Cache:StatoCom";
private string redisTipoArt = "MP:MON:Cache:TipoArt";
#endregion Private Fields
+3 -3
View File
@@ -6,7 +6,7 @@
<div class="card">
<div class="card-header table-primary">
<div class="d-flex justify-content-between">
<div class="px-2">
<div class="px-0">
<div class="d-flex justify-content-between">
<div class="px-2">
<h2>Articoli </h2>
@@ -16,7 +16,7 @@
</div>
</div>
</div>
<div class="px-2 align-content-center">
<div class="px-0 align-content-center">
<select @bind="@selAzienda" class="form-select">
@if (ListAziende != null)
{
@@ -101,7 +101,7 @@
</div>
}
</div>
<div class="card-body py-0 px-1">
<div class="card-body">
@if (ListRecords == null)
{
+11 -3
View File
@@ -5,10 +5,10 @@
<div class="card">
<div class="card-header table-primary">
<div class="d-flex justify-content-between">
<div class="px-2">
<div class="px-0">
<h2>Ordini Di Lavoro </h2>
</div>
<div class="px-2">
<div class="px-0">
<div class="d-flex justify-content-between">
<div class="px-2">
ODL Programmati / In Corso
@@ -33,7 +33,15 @@
</div>
</div>
</div>
<div class="card-body py-0 px-1">
<div class="card-body">
@if (showCurrent)
{
<ListODL></ListODL>
}
else
{
<ListPODL></ListPODL>
}
</div>
@*<div class="card-footer py-1">
<DataPager PageSize="numRecord" currPage="currPage" numRecordChanged="ForceReload" numPageChanged="ForceReloadPage" totalCount="totalCount" showLoading="isLoading" />