Files

185 lines
5.9 KiB
C#

namespace EgwCoreLib.Lux.Core.RestPayload
{
/// <summary>
/// Classe per definizione WorkLoad in dettaglio x un dato task (POR tipicamente)
/// </summary>
public class WorkLoadDetailDTO
{
#region Public Constructors
/// <summary>
/// Init classe partendo dal valore serializzato di una stima di lavorabilità di un item d'ordine minimo (POR)
/// </summary>
/// <param name="UID"></param>
/// <param name="rawData"></param>
public WorkLoadDetailDTO(string UID, string rawData)
{
uID = UID;
// deserializzo risultati calcolo
machineCalcResults = JsonConvert.DeserializeObject<List<MachineCalcResultDTO>>(rawData) ?? new List<MachineCalcResultDTO>();
if (!string.IsNullOrEmpty(rawData) && rawData.Count() > 2)
{
// calcolo "esito sinteico" della lavorabilità (NESSUNA part UnHealthy su ogni macchina)
workable = machineCalcResults.Sum(x => x.NumPartsKo) == 0;
// lista completa...
var firstMachine = machineCalcResults.FirstOrDefault();
if (firstMachine != null)
{
listComplete = firstMachine.PartList.Select(x => x.Tag).ToList();
// pezzi lavorabili
listWorkable = MachineCalc.Utils.IntersectTags(machineCalcResults, p => p.CalcResult == Enums.PartVerificationResult.MACHINABLE).ToList();
// cerco l'insieme dei pezzi NON lavorabili
listUnWorkable = MachineCalc.Utils.IntersectTags(machineCalcResults, p => p.CalcResult != Enums.PartVerificationResult.MACHINABLE).ToList();
listVincolated = listComplete
.Except(listWorkable)
.Except(ListUnWorkable)
.ToList();
numKo = listUnWorkable.Count();
numOk = listWorkable.Count();
numOkVin = listVincolated.Count();
// se non ok verifico SE ci siano part unhealty su OGNI macchina (altrimenti è cmq lavorabile
if (!workable)
{
workable = !listUnWorkable.Any();
}
}
}
LoadDetail = MachineCalc.Utils.CalculateIntersections(machineCalcResults);
}
#endregion Public Constructors
#region Public Properties
/// <summary>
/// Elenco effettivo macchine
/// </summary>
public List<string> ListMachines
{
get => machineCalcResults.Select(x => x.Name).OrderBy(x => x).ToList();
}
/// <summary>
/// Elenco Macchine in formato stringa join
/// </summary>
public string ListMachinesJoin
{
get => string.Join(", ", machineCalcResults.Select(x => x.Name).OrderBy(x => x).ToList());
}
/// <summary>
/// Elenco delle etichette parts non OK
/// </summary>
public List<string> ListUnWorkable
{
get => listUnWorkable ?? new List<string>();
}
/// <summary>
/// Elenco parts vincolate (=non ogni impianto)
/// </summary>
public List<string> ListVincolated
{
get => listVincolated ?? new List<string>();
}
/// <summary>
/// Elenco etichette parts OK
/// </summary>
public List<string> ListWorkable
{
get => listWorkable ?? new List<string>();
}
/// <summary>
/// Dettaglio combinazioni carico di lavoro
/// </summary>
public List<MachineTagDTO> LoadDetail { get; set; } = new List<MachineTagDTO>();
public List<MachineCalcResultDTO> MachineCalcResults
{
get => machineCalcResults;
}
/// <summary>
/// Numero di parts non lavorabili
/// </summary>
public int NumKo
{
get => numKo;
}
/// <summary>
/// Num Macchine
/// </summary>
public int NumMachines
{
get => machineCalcResults.Count();
}
/// <summary>
/// Numero di parts lavorabili su OGNI macchina
/// </summary>
public int NumOk
{
get => numOk;
}
/// <summary>
/// Numero pezzi vincolati (su una SOLA macchina)
/// </summary>
public int NumOkVin
{
get => numOkVin;
}
public int NumParts
{
get => listComplete?.Count() ?? 0;
}
/// <summary>
/// Tempo massimo complessivo in ORE
/// </summary>
public decimal TotMaxTime
{
get => LoadDetail != null ? LoadDetail.Max(x => x.MaxTime) : 0;
}
/// <summary>
/// Tempo minimo complessivo in ORE
/// </summary>
public decimal TotMinTime
{
//get => TimeSpan.FromSeconds((double)LoadDetail.Min(x => x.MinTime));
get => LoadDetail.Min(x => x.MinTime);
}
public string UID
{
get => uID;
}
public bool Workable
{
get => workable;
}
#endregion Public Properties
#region Private Fields
private List<string>? listComplete = null;
private List<string>? listUnWorkable = null;
private List<string>? listVincolated = null;
private List<string>? listWorkable = null;
private List<MachineCalcResultDTO> machineCalcResults = new List<MachineCalcResultDTO>();
private int numKo = 0;
private int numOk = 0;
private int numOkVin = 0;
private string uID = "";
private bool workable = false;
#endregion Private Fields
}
}