Files

1079 lines
27 KiB
C#

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Linq;
namespace NKC_SDK
{
/// <summary>
/// Classe che rappresenta stato ordine ricevuto via REDIS da NESTING
/// </summary>
public class baseNestAnsw
{
#region Public Properties
/// <summary>
/// ID univoco invio del TASK
/// </summary>
public string EnvNum { get; set; } = "";
/// <summary>
/// Elenco errori riscontrati
/// </summary>
public List<ErrorRep> ErrorList { get; set; } = null;
/// <summary>
/// Tempo STIMATO di taglio calcolato dal Nesting espresso in Secondi
/// </summary>
public double EstimatedWorktime { get; set; } = 0;
/// <summary>
/// Codice della amcchina x cui si effettua richiesta
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public mType MachineType { get; set; } = mType.Multiax;
/// <summary>
/// Tipo di ordine richiesto
/// </summary>
//[JsonConverter(typeof(StringEnumConverter))]
public oType OrderType { get; set; } = oType.BatchRequest;
/// <summary>
/// Tempo di processing del Nesting espresso in Secondi
/// </summary>
public double ProcessingRuntime { get; set; } = 0;
/// <summary>
/// Note libere del nesting
/// </summary>
public string ProcessNotes { get; set; } = "";
/// <summary>
/// Status del processo di nesting
/// </summary>
public procStatus ProcessStatus { get; set; } = procStatus.waiting;
/// <summary>
/// Tipo di processing richiesto
/// 1 = stima
/// 2 = nesting
/// 3 = stima estesa: elenco ordini con tempo x ogni ordine (ORD.RIGA) + numero part + List<CART>...
/// </summary>
public int ProcType { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// Classe che rappresenta la richiesta di processing di NESTING da inserire in REDIS
/// </summary>
public class batchRequest
{
#region Public Properties
/// <summary>
/// ID del processo richiesto (generato in fase di import)
/// </summary>
public int BatchId { get; set; }
/// <summary>
/// Indica se sia richeisto di generare l'PNG per OGNI pezzo processato
/// default: false
/// </summary>
public bool CreatePng { get; set; } = false;
/// <summary>
/// ID univoco dell'invio del TASK
/// </summary>
public string EnvNum { get; set; } = "";
/// <summary>
/// Codice della macchina x cui si effettua richiesta
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public mType MachineType { get; set; }
/// <summary>
/// tempo massimo permesso x nesting (secondi)
/// </summary>
public int MaxTime { get; set; }
/// <summary>
/// Indice di partenza (per carrelli, bins...)
/// </summary>
public int NumIndexStart { get; set; } = 1;
/// <summary>
/// Elenco ordini richiesti da processare / nestare
/// </summary>
public List<Order> OrderList { get; set; }
/// <summary>
/// Tipo di ordine richiesto
/// </summary>
// riportato a numero
//[JsonConverter(typeof(StringEnumConverter))]
public oType OrderType { get; set; }
/// <summary>
/// Tipo di processing richiesto
/// 1 = stima
/// 2 = nesting
/// 3 = stima extended
/// </summary>
public int ProcType { get; set; }
#endregion Public Properties
}
/// <summary>
/// Classe che rappresenta la richiesta di AZIONI al NESTING
/// </summary>
public class commandRequest
{
#region Public Properties
/// <summary>
/// Richiesta per il nesting: DoNesting / HaltNesting
/// </summary>
public string ActionRequested { get; set; }
/// <summary>
/// ID del processo richiesto (generato in fase di import)
/// </summary>
public int BatchID { get; set; }
#endregion Public Properties
}
/// <summary>
/// Valori decodificati
/// </summary>
public class decodedData
{
#region Public Properties
/// <summary>
/// Codice decodificato
/// </summary>
public string code { get; set; } = "";
/// <summary>
/// Codice decodificato in formato INT
/// </summary>
public int codeInt { get; set; } = 0;
/// <summary>
/// Tipo codice decodificato
/// </summary>
public codeType codeType { get; set; } = codeType.UNK;
/// <summary>
/// Descrizione associata
/// </summary>
public string description { get; set; } = "";
/// <summary>
/// Dato letto RAW
/// </summary>
public string rawData { get; set; } = "";
#endregion Public Properties
}
/// <summary>
/// Oggetto errore da poter rispondere con chiamate x stima/nesting
/// </summary>
public class ErrorRep
{
#region Public Properties
/// <summary>
/// Descrizione estesa (human readable) dell'errore
/// </summary>
public string Description { get; set; } = "";
/// <summary>
/// DataOra registrazione record
/// </summary>
public DateTime DtRif { get; set; } = DateTime.Now;
/// <summary>
/// Tipo di errore
/// </summary>
public string ErrType { get; set; } = "NA";
/// <summary>
/// Chiave di riferimento PARENT per l'errore (es il codice del batch, dell'item)
/// es: BatchId.OrderId.Row
/// </summary>
public string ParentUid { get; set; } = "A.B.C";
/// <summary>
/// Chiave univoca per l'errore
/// es: BatchId.OrderId.Row.PartId...
/// </summary>
public string Uid { get; set; } = "A.B.C.D";
#endregion Public Properties
}
/// <summary>
/// Oggetto KIT
/// </summary>
public class Kit
{
#region Public Properties
/// <summary>
/// Codice KIT da cod ordine ext
/// </summary>
public string KitExtCode { get; set; } = "";
/// <summary>
/// ID KIT (da DB)
/// </summary>
public int KitId { get; set; } = 0;
/// <summary>
/// Elenco Items da produrre x KIT
/// </summary>
public List<Part> PartList { get; set; }
#endregion Public Properties
}
public class MachineStatData
{
#region Public Properties
/// <summary>
/// Codice macchina
/// </summary>
public string Machine { get; set; } = "WRK000";
/// <summary>
/// record registrati dalla macchina
/// </summary>
public List<MachineStatRecord> Records { get; set; } = new List<MachineStatRecord>();
#endregion Public Properties
}
public class MachineStatRecord
{
#region Public Properties
/// <summary>
/// Codice evento/stato
/// 00 = KeepAlive --> imposto dataora/drift
/// </summary>
public string Code { get; set; } = "";
/// <summary>
/// DataOra dell'informazione (clock mittente)
/// </summary>
public DateTime DtRecord { get; set; } = DateTime.Now;
/// <summary>
/// Valore / carico associato all'invio (opzionale)
/// </summary>
public string Payload { get; set; } = "";
/// <summary>
/// Codice postazione
/// </summary>
public string Station { get; set; } = "";
#endregion Public Properties
}
/// <summary>
/// Definizione classe x materiali
/// </summary>
public class Material
{
#region Public Properties
public DateTime ApprovDate { get; set; } = DateTime.Now;
public string ApprovUser { get; set; } = "";
public decimal L_mm { get; set; } = 0;
public string MatDesc { get; set; } = "";
public string MatDtmx { get; set; } = "";
public int MatExtCode { get; set; } = 0;
public int MatId { get; set; } = 0;
public decimal T_mm { get; set; } = 0;
public decimal W_mm { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// dati del materiale
/// </summary>
public class MaterialData
{
#region Public Properties
/// <summary>
/// Codice P/N del materiale (cliente)
/// </summary>
public string MaterialDescription { get; set; }
/// <summary>
/// Identificativo univoco del materiale (DA ANAGRAFICA db)
/// </summary>
public int MaterialId { get; set; }
/// <summary>
/// Codice P/N del materiale (cliente)
/// </summary>
public string MaterialPN { get; set; }
#endregion Public Properties
}
/// <summary>
/// Dati di un Cart post nesting
/// </summary>
public class NestBin
{
#region Public Properties
/// <summary>
/// Indice del BIN nel TAKT / giorno
/// </summary>
public int BinIndex { get; set; } = 0;
/// <summary>
/// Codice ITEM esterno da cliente (HFA)
/// </summary>
public string PartExtCode { get; set; } = "";
/// <summary>
/// Elenco dei PART/ITEM dell'Ordine
/// </summary>
public List<Part> PartList { get; set; }
/// <summary>
/// Revisione ITEM esterno da cliente (HFA)
/// </summary>
public string PartRev { get; set; } = "";
#endregion Public Properties
}
/// <summary>
/// Struttura stack
/// </summary>
public class NestBunk
{
#region Public Properties
/// <summary>
/// Identificativo univoco stack
/// </summary>
public String BunkId { get; set; } = "";
/// <summary>
/// Indice del Bunk
/// </summary>
public int BunkIndex { get; set; } = 0;
/// <summary>
/// Num di fogli nello stack
/// </summary>
public int NumSheet
{
get
{
int answ = 0;
if (SheetList != null)
{
answ = SheetList.Count;
}
return answ;
}
}
/// <summary>
/// Elenco Sheet previsti
/// </summary>
public List<NestSheet> SheetList { get; set; }
#endregion Public Properties
}
/// <summary>
/// Dati di un Cart post nesting
/// </summary>
public class NestCart
{
#region Public Properties
/// <summary>
/// Indice del CART nel TAKC / giorno
/// </summary>
public int CartIndex { get; set; } = 0;
/// <summary>
/// Elenco dei KIT dell'ordine
/// </summary>
public List<Kit> KitList { get; set; }
/// <summary>
/// Tempo previsto per produrre il Cart
/// </summary>
public double ProcTime { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// Dati di un foglio di Remnant
/// </summary>
public class NestRemn
{
#region Public Properties
/// <summary>
/// Dimensione L del remnant
/// </summary>
public decimal L_mm { get; set; } = 0;
/// <summary>
/// Dimensione W del remnant
/// </summary>
public decimal W_mm { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// Risposta NESTING x la STIMA iniziale ESTESA (chiede dati a livello di ORDERS aggregati)
/// </summary>
public class nestReplyBatchExtEst : nestReplyBatchInitial
{
#region Public Properties
/// <summary>
/// Elenco ordini con dati processing
/// </summary>
public List<OrderPrev> EstOrderList { get; set; }
#endregion Public Properties
}
/// <summary>
/// Risposta NESTING x la STIMA iniziale
/// </summary>
public class nestReplyBatchFinal : orderStatus
{
#region Public Properties
/// <summary>
/// Elenco Bin
/// </summary>
public List<NestBin> BinList { get; set; } = new List<NestBin>();
/// <summary>
/// Elenco Stack previsti
/// </summary>
public List<NestBunk> BunkList { get; set; } = new List<NestBunk>();
/// <summary>
/// Elenco Carts
/// </summary>
public List<NestCart> CartList { get; set; } = new List<NestCart>();
#endregion Public Properties
}
/// <summary>
/// Risposta NESTING x la STIMA iniziale
/// </summary>
public class nestReplyBatchInitial : orderStatus
{
#region Public Properties
/// <summary>
/// Elenco Items da produrre x ordine
/// </summary>
public List<Part> PartList { get; set; }
#endregion Public Properties
}
public class nestReplyOffOrd : orderStatus
{
#region Public Properties
/// <summary>
/// Path x folder dei vari CNC dell'offline order
/// </summary>
public string CncPath { get; set; } = "";
/// <summary>
/// Path x folder dei vari SVG offline order da mostrare
/// </summary>
public string DrawingPath { get; set; } = "";
#endregion Public Properties
}
/// <summary>
/// Classe Sheet x Nesting
/// </summary>
public class NestSheet
{
#region Public Properties
/// <summary>
/// SVG del lavoro previsto
/// </summary>
public string Drawing { get; set; } = "";
/// <summary>
/// Tempo STIMATO di taglio calcolato dal Nesting espresso in Secondi
/// </summary>
public double EstimatedWorktime { get; set; } = 0;
/// <summary>
/// Programma x Machining
/// </summary>
public string MachiningProgram { get; set; } = "";
/// <summary>
/// Materiale
/// </summary>
public int MatId { get; set; }
/// <summary>
/// Elenco Part da produrre x ordine
/// </summary>
public List<Part> PartList { get; set; } = null;
/// <summary>
/// Programma x printing
/// </summary>
public string PrintProgram { get; set; } = "";
/// <summary>
/// Eventuale remnant
/// </summary>
public NestRemn Remnant { get; set; }
/// <summary>
/// Identificativo univoco Sheet
/// </summary>
public String SheetId { get; set; } = "";
/// <summary>
/// Indice dello sheet
/// </summary>
public int SheetIndex { get; set; } = 0;
/// <summary>
/// Resa (OEE) dell'impiego del materiale
/// </summary>
public double SurfaceOEE
{
get
{
double answ = 0;
try
{
answ = SurfaceWork / SurfaceTotal;
}
catch
{ }
return answ;
}
}
/// <summary>
/// Superficie totale del foglio lavorato (= materiale)
/// </summary>
public double SurfaceTotal { get; set; } = 1;
/// <summary>
/// Superficie WORK (lavorata/tagliata) del foglio lavorato (= somma area dei pezzi disposti)
/// </summary>
public double SurfaceWork { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// Struttura Ordine passata a NESTING
/// </summary>
public class Order
{
#region Public Properties
/// <summary>
/// Plant di destinazione
/// </summary>
public string DestPlant { get; set; }
/// <summary>
/// Elenco dei KIT dell'ordine
/// </summary>
public List<Kit> KitList { get; set; }
/// <summary>
/// Cod ordine di NKC
/// </summary>
public string OrderCod { get; set; }
/// <summary>
/// Codice ordine esterno da cliente (HFA)
/// </summary>
public string OrderExtCode { get; set; }
/// <summary>
/// ID Ordine (da DB)
/// </summary>
public int OrderId { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// Informazioni ordine tornate da Nesting (previsione)
/// </summary>
public class OrderPrev : Order
{
#region Public Properties
/// <summary>
/// Num totale BIN predisposti
/// </summary>
public int NumBin { get; set; } = 0;
/// <summary>
/// Num totale CART predisposti
/// </summary>
public int NumCart { get; set; } = 0;
/// <summary>
/// Num part previste per ordine
/// </summary>
public int NumPart { get; set; } = 0;
/// <summary>
/// Tempo totale in %
/// </summary>
public double Quota { get; set; } = 0;
/// <summary>
/// Tempo totale in minuti
/// </summary>
public double TotTime { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// Classe simulazione di un assegnazione di un set di ordini (compreso score)
/// </summary>
public class OrderSetSim
{
#region Public Properties
/// <summary>
/// Valore attuale (somma dei punteggi degli elementi)
/// </summary>
public double ActualValue
{
get
{
return OrderSet.Sum(x => x.Value);
}
}
/// <summary>
/// Valore score (scostamento target/actual)
/// </summary>
public double IndexScore
{
get
{
return Math.Abs(TargetValue - ActualValue);
}
}
/// <summary>
/// Vettore Ordini + durate
/// </summary>
public Dictionary<int, double> OrderSet { get; set; } = new Dictionary<int, double>();
/// <summary>
/// Valore target durate desiderate
/// </summary>
public double TargetValue { get; set; } = 0;
#endregion Public Properties
}
/// <summary>
/// Classe che rappresenta stato ordine ricevuto via REDIS da NESTING
/// </summary>
public class orderStatus : baseNestAnsw
{
#region Public Properties
/// <summary>
/// ID del processo di Nesting in corso (generato in fase di import)
/// </summary>
public int BatchID { get; set; }
#endregion Public Properties
}
/// <summary>
/// Struttura Item passata a NESTING
/// </summary>
public class Part
{
#region Public Properties
/// <summary>
/// Path del disegno CAD dell'item da produrre x NESTING
/// </summary>
public string CadFilePath { get; set; }
/// <summary>
/// ID del materiale dell'item
/// </summary>
public int MatId { get; set; }
/// <summary>
/// Parametri opzionali (es x risposta NESTING)
/// </summary>
public Dictionary<string, string> OptParameters { get; set; } = null;
/// <summary>
/// Codice Datamatrix dell'ITEM
/// </summary>
public string PartDtmx { get; set; } = "";
/// <summary>
/// Codice ITEM esterno da cliente (HFA)
/// </summary>
public string PartExtCode { get; set; } = "";
/// <summary>
/// Cod ITEM di NKC
/// </summary>
public int PartId { get; set; } = 0;
/// <summary>
/// Quantità di Item per SINGOLO ordine
/// </summary>
public int PartQty { get; set; }
/// <summary>
/// Revisione ITEM esterno da cliente (HFA)
/// </summary>
public string PartRev { get; set; } = "";
#endregion Public Properties
}
/// <summary>
/// Descrizione di un ITEM in fase di scarico
/// </summary>
public class PartUnload : Part
{
#region Public Properties
/// <summary>
/// Destinazione dell'item
/// </summary>
public ItemDest NextDest { get; set; } = ItemDest.Undef;
/// <summary>
/// Elenco di Secop opzionali (es T-NUT, RoundEdge)
/// </summary>
public List<string> SecOp { get; set; } = new List<string>();
/// <summary>
/// Stato dell'item
/// </summary>
public ItemStatus Status { get; set; } = ItemStatus.Undef;
#endregion Public Properties
}
/// <summary>
/// Classe che rappresenta i BUNK da lavorare
/// </summary>
public class ProdBunk
{
#region Public Properties
/// <summary>
/// Identificativo univoco BUNK / Stack
/// </summary>
public int BunkId { get; set; }
/// <summary>
/// Codice dataMatrix del BUNK
/// </summary>
public string DataMatrix { get; set; }
/// <summary>
/// Data inizio processing dello Stack
/// </summary>
public DateTime DtEnd { get; set; }
/// <summary>
/// Data inizio processing del BUNK
/// </summary>
public DateTime DtStart { get; set; }
/// <summary>
/// Numero di Sheets da lavorare
/// </summary>
public int NumSheets
{
get
{
int answ = 0;
try
{
answ = SheetList.Count;
}
catch
{ }
return answ;
}
}
/// <summary>
/// Elenco dei pannelli(sheets) dello Stack
/// </summary>
public List<ProdSheet> SheetList { get; set; }
/// <summary>
/// Stato dello Stack di pannelli
/// </summary>
public CStatus Status { get; set; }
#endregion Public Properties
}
/// <summary>
/// Singolo Pannello IN LAVORAZIONE
/// </summary>
public class ProdSheet
{
#region Public Properties
/// <summary>
/// Tempi processo x fase CNC
/// </summary>
public WorkData Machining { get; set; }
/// <summary>
/// Materiale
/// </summary>
public MaterialData Material { get; set; }
/// <summary>
/// Tempi processo x fase printing
/// </summary>
public WorkData Printing { get; set; }
/// <summary>
/// Identificativo univoco pannello
/// </summary>
public int SheetId { get; set; }
/// <summary>
/// Stato del pannello
/// </summary>
public PStatus Status { get; set; }
/// <summary>
/// Tempi processo x scarico
/// </summary>
public WorkData Unloading { get; set; }
#endregion Public Properties
}
/// <summary>
/// Estensione classe sheet comprensiva di BunkId
/// </summary>
public class ProdSheetExt : ProdSheet
{
#region Public Properties
/// <summary>
/// Identificativo univoco BUNK / Stack
/// </summary>
public int BunkId { get; set; }
/// <summary>
/// INDICE del pannello (valido per BUNK)
/// </summary>
public int SheetIndex { get; set; }
/// <summary>
/// Indica che tutte le date (printing, working, unloading) sono vuote = Waiting / NON iniziato
/// </summary>
public bool Waiting
{
get
{
return Printing.Waiting && Machining.Waiting && Unloading.Waiting;
}
}
/// <summary>
/// Indica che tutte le date (printing, working, unloading) sono VALIDE = completato
/// </summary>
public bool Done
{
get
{
return Printing.Done && Machining.Done && Unloading.Done;
}
}
#endregion Public Properties
}
/// <summary>
/// Classe che rappresenta un insieme di Sheet da lavorare (contenuti in 1 o + bunk)
/// </summary>
public class SheetWorkList
{
#region Public Properties
/// <summary>
/// Codice impianto/macchina
/// </summary>
public string Machine { get; set; } = "WRK000";
/// <summary>
/// Numero di Sheets da lavorare
/// </summary>
public int NumSheets
{
get
{
int answ = 0;
try
{
answ = SheetList.Count;
}
catch
{ }
return answ;
}
}
/// <summary>
/// Elenco dei pannelli (sheets) in lavorazione
/// </summary>
public List<ProdSheetExt> SheetList { get; set; }
#endregion Public Properties
}
/// <summary>
/// Dati della lavorazione
/// </summary>
public class WorkData
{
#region Public Properties
/// <summary>
/// Data fine processing
/// </summary>
public DateTime? DtEnd { get; set; }
/// <summary>
/// Data inizio processing
/// </summary>
public DateTime? DtStart { get; set; }
/// <summary>
/// Percorso del programma da eseguire
/// </summary>
public string ProgramPath { get; set; }
/// <summary>
/// Indica che la lavorazione è stata eseguita con successo (default = true)
/// </summary>
public bool Success { get; set; }
/// <summary>
/// Tempo di lavorazione in minuti decimali
/// </summary>
public double WorkTimeMin
{
get
{
double answ = 0;
if (DtStart != null && DtEnd != null)
{
try
{
answ = ((DateTime)DtEnd).Subtract((DateTime)DtStart).TotalMinutes;
}
catch
{ }
}
return answ;
}
}
/// <summary>
/// Verifica data Start
/// </summary>
public bool OkS
{
get
{
return DtStart != null;
}
}
/// <summary>
/// Verifica data End
/// </summary>
public bool OkE
{
get
{
return DtEnd != null;
}
}
/// <summary>
/// Tutte date null --> in attesa
/// </summary>
public bool Waiting
{
get
{
return DtStart == null && DtEnd == null;
}
}
/// <summary>
/// Tutte date NOT null --> completato
/// </summary>
public bool Done
{
get
{
return DtStart != null && DtEnd != null;
}
}
#endregion Public Properties
}
}