735 lines
19 KiB
C#
735 lines
19 KiB
C#
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Converters;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace MapoSDK
|
|
{
|
|
#region oggetti per scambio dati IO - IOB
|
|
|
|
public class fileEmbed
|
|
{
|
|
/// <summary>
|
|
/// Array di file da inviare
|
|
/// </summary>
|
|
public List<smallFile> fileList { get; set; } = new List<smallFile>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Classe x definire un file (corto) inviato come Json tramite httpost
|
|
/// </summary>
|
|
public class smallFile
|
|
{
|
|
public string fileName { get; set; } = "";
|
|
public string content { get; set; } = "";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Array elementi tipo KeyValuePair inviati come JSon che indicano lo stato LIVE dell'IOB
|
|
/// </summary>
|
|
public class liveIOB
|
|
{
|
|
public List<KeyValuePair<string, string>> dataList { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Array valori tipo flogData inviati come JSon
|
|
/// </summary>
|
|
public class flogJsonPayload
|
|
{
|
|
public List<flogData> fluxData { get; set; }
|
|
}
|
|
/// <summary>
|
|
/// Tracciato FluxLog in formato JSON valido
|
|
/// </summary>
|
|
public class flogData : evData
|
|
{
|
|
/// <summary>
|
|
/// nome del flusso
|
|
/// </summary>
|
|
public string flux { get; set; } = "ND";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Array valori tipo evData inviati come JSon
|
|
/// </summary>
|
|
public class evJsonPayload
|
|
{
|
|
public List<evData> eventList { get; set; }
|
|
}
|
|
/// <summary>
|
|
/// Tracciato InputEvents in formato JSON valido
|
|
/// Derivato da input realtime valore=3&dtEve=20181206180600000&dtCurr=20181206180600000&cnt=999
|
|
/// </summary>
|
|
public class evData
|
|
{
|
|
/// <summary>
|
|
/// Valore del dato di flusso registrato
|
|
/// </summary>
|
|
public string valore { get; set; } = "-";
|
|
/// <summary>
|
|
/// DataOra evento
|
|
/// </summary>
|
|
public DateTime dtEve { get; set; } = DateTime.Now;
|
|
/// <summary>
|
|
/// DataOra corrente della trasmissione
|
|
/// </summary>
|
|
public DateTime dtCurr { get; set; } = DateTime.Now;
|
|
/// <summary>
|
|
/// Contatore incrementale x riordino invio (opzionale)
|
|
/// </summary>
|
|
public int cnt { get; set; } = 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Dati resoconto IOB
|
|
/// </summary>
|
|
public class IOB_data
|
|
{
|
|
public string name;
|
|
public string IP;
|
|
public IobType iType;
|
|
public string typeCss;
|
|
public bool CNC_Counter;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Struttura conf tipo dati
|
|
/// </summary>
|
|
public class dataConf
|
|
{
|
|
/// <summary>
|
|
/// NOME parametro
|
|
/// </summary>
|
|
public string name { get; set; } = "none";
|
|
/// <summary>
|
|
/// DESCRIZIONE parametro
|
|
/// </summary>
|
|
public string description { get; set; } = "";
|
|
/// <summary>
|
|
/// Tipo di dato
|
|
/// </summary>
|
|
[JsonConverter(typeof(StringEnumConverter))]
|
|
public plcDataType tipoMem { get; set; } = plcDataType.Int;
|
|
/// <summary>
|
|
/// Indice nell'area di memoria (da valore iniziale = 0)
|
|
/// </summary>
|
|
public int index { get; set; } = 0;
|
|
/// <summary>
|
|
/// Nome "assoluto" della posizione nell'area di memoria (anche diverso da indice)
|
|
/// </summary>
|
|
public string memAddr { get; set; } = "";
|
|
/// <summary>
|
|
/// Size in byte
|
|
/// </summary>
|
|
public int size { get; set; } = 0;
|
|
/// <summary>
|
|
/// Fattore per eventuale divisione (es leggo 1234 --> 12,34 con factor=100)
|
|
/// </summary>
|
|
public int factor { get; set; } = 1;
|
|
/// <summary>
|
|
/// Valore parametro (come stringa, decimali con ",", default VUOTO), poi LETTO da PLC (o appena scritto)
|
|
/// </summary>
|
|
public string value { get; set; } = "";
|
|
/// <summary>
|
|
/// Valore minimo ammesso (ove usato, es simulazione)
|
|
/// </summary>
|
|
public int minVal { get; set; } = 0;
|
|
/// <summary>
|
|
/// Valore massimo ammesso (ove usato, es simulazione)
|
|
/// </summary>
|
|
public int maxVal { get; set; } = 9999;
|
|
}
|
|
/// <summary>
|
|
/// Classe gestione ITEM di un OBJ (machine) generico (read/write)
|
|
/// </summary>
|
|
public class objItem
|
|
{
|
|
/// <summary>
|
|
/// UID univoco
|
|
/// </summary>
|
|
public string uid { get; set; } = "";
|
|
/// <summary>
|
|
/// NOME item
|
|
/// </summary>
|
|
public string name { get; set; } = "";
|
|
/// <summary>
|
|
/// Valore parametro (come stringa, decimali con ",", default VUOTO), sul CNC/PLC
|
|
/// </summary>
|
|
public string value { get; set; } = "";
|
|
/// <summary>
|
|
/// DataOra ultima lettura
|
|
/// </summary>
|
|
public DateTime lastRead { get; set; } = DateTime.Now.AddHours(-1);
|
|
/// <summary>
|
|
/// Indica se sia abilitato in scrittura (WRITE)
|
|
/// </summary>
|
|
public bool writable { get; set; } = false;
|
|
/// <summary>
|
|
/// Indica il NUOVO valore richiesto x l'item
|
|
/// </summary>
|
|
public string reqValue { get; set; } = "";
|
|
/// <summary>
|
|
/// DataOra ultima richiesta scrittura
|
|
/// </summary>
|
|
public DateTime lastRequest { get; set; } = DateTime.Now.AddDays(-1);
|
|
/// <summary>
|
|
/// Ultimo messaggio associato (conferma scrittura, errore, ...)
|
|
/// </summary>
|
|
public string lastMessage { get; set; } = "";
|
|
#if false
|
|
/// <summary>
|
|
/// Indica se il parametro sia stato salvato (value = newValue) oppure newValue NON impostato
|
|
/// </summary>
|
|
public bool saved
|
|
{
|
|
get
|
|
{
|
|
bool hasData = !string.IsNullOrWhiteSpace(value);
|
|
bool areEqual = value == newValue;
|
|
bool noWriteReq = string.IsNullOrWhiteSpace(newValue);
|
|
return (areEqual || (hasData && noWriteReq));
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Struttura conf tipo dati
|
|
/// </summary>
|
|
public class dataConfTSVC : dataConf
|
|
{
|
|
/// <summary>
|
|
/// Tipo di funzione da applicare al dato
|
|
/// </summary>
|
|
[JsonConverter(typeof(StringEnumConverter))]
|
|
public VC_func func { get; set; } = VC_func.MAX;
|
|
/// <summary>
|
|
/// Periodo campionamento
|
|
/// </summary>
|
|
public int period { get; set; } = 60;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Struttura conf memorie PLC (inizialmente SIEMENS)
|
|
/// </summary>
|
|
public class plcMemMap
|
|
{
|
|
|
|
/// <summary>
|
|
/// Parametri ammessi per IOB x scrittura
|
|
/// </summary>
|
|
public Dictionary<string, dataConf> mMapWrite = new Dictionary<string, dataConf>();
|
|
|
|
|
|
/// <summary>
|
|
/// Parametri ammessi per IOB x lettura
|
|
/// </summary>
|
|
public Dictionary<string, dataConfTSVC> mMapRead = new Dictionary<string, dataConfTSVC>();
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Classe oggetto base TimeSeries
|
|
/// </summary>
|
|
public class tsData
|
|
{
|
|
/// <summary>
|
|
/// Nome Macchina
|
|
/// </summary>
|
|
public string vcMachine { get; set; } = "";
|
|
/// <summary>
|
|
/// Nome della Var Casuale
|
|
/// </summary>
|
|
public string vcName { get; set; } = "";
|
|
/// <summary>
|
|
/// Data-Ora riferimento campione
|
|
/// </summary>
|
|
public DateTime timeStamp { get; set; } = DateTime.Now;
|
|
/// <summary>
|
|
/// Tipo di valore gestito
|
|
/// </summary>
|
|
[JsonConverter(typeof(StringEnumConverter))]
|
|
public plcDataType vcType { get; set; } = plcDataType.Int;
|
|
/// <summary>
|
|
/// Valore in formato stringa (che può venire customizzato)
|
|
/// </summary>
|
|
public string strValue { get; set; } = "";
|
|
/// <summary>
|
|
/// In base al tipo di oggetto restituisce il valore cona deguata conversione......
|
|
/// </summary>
|
|
public object actValue
|
|
{
|
|
get
|
|
{
|
|
object answ = null;
|
|
bool currBool = false;
|
|
int currInt = 0;
|
|
double currDouble = 0;
|
|
switch (vcType)
|
|
{
|
|
case plcDataType.Boolean:
|
|
bool.TryParse(strValue, out currBool);
|
|
answ = currBool;
|
|
break;
|
|
case plcDataType.Int:
|
|
case plcDataType.DInt:
|
|
int.TryParse(strValue, out currInt);
|
|
answ = currInt;
|
|
break;
|
|
case plcDataType.Real:
|
|
double.TryParse(strValue, out currDouble);
|
|
answ = currDouble;
|
|
break;
|
|
case plcDataType.String:
|
|
default:
|
|
answ = strValue;
|
|
break;
|
|
}
|
|
return answ;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Valore intero
|
|
/// </summary>
|
|
public int intVal { get; set; } = 0;
|
|
/// <summary>
|
|
/// Valore float
|
|
/// </summary>
|
|
public float floatVal { get; set; } = 0;
|
|
}
|
|
/// <summary>
|
|
/// Aggregazione dati VC
|
|
/// </summary>
|
|
public class tsGrouped
|
|
{
|
|
/// <summary>
|
|
/// Nome Macchina
|
|
/// </summary>
|
|
public string vcMachine { get; set; } = "";
|
|
/// <summary>
|
|
/// Nome della Var Casuale
|
|
/// </summary>
|
|
public string vcName { get; set; } = "";
|
|
/// <summary>
|
|
/// Unità di Misura
|
|
/// </summary>
|
|
public string UM { get; set; } = "#";
|
|
/// <summary>
|
|
/// Data-Ora riferimento campione
|
|
/// </summary>
|
|
public DateTime timeStamp { get; set; } = DateTime.Now;
|
|
/// <summary>
|
|
/// Valore medio (NON definito)
|
|
/// </summary>
|
|
public object avgValue { get; set; }
|
|
/// <summary>
|
|
/// Periodo di aggregazione di riferimento
|
|
/// </summary>
|
|
public timeWindow period { get; set; } = timeWindow.hour;
|
|
/// <summary>
|
|
/// Campioni effettivi nel periodo
|
|
/// </summary>
|
|
public List<tsData> samples { get; set; }
|
|
}
|
|
|
|
|
|
#region gestione dati FluxLog
|
|
|
|
/// <summary>
|
|
/// Classe oggetto statistiche sui dati
|
|
/// </summary>
|
|
public class varStats
|
|
{
|
|
/// <summary>
|
|
/// Nome della Variabile tracciata
|
|
/// </summary>
|
|
public string varName { get; set; } = "";
|
|
/// <summary>
|
|
/// Num record
|
|
/// </summary>
|
|
public int numRec { get; set; } = 0;
|
|
/// <summary>
|
|
/// Valore medio/mediano
|
|
/// </summary>
|
|
public float avg { get; set; } = 0;
|
|
/// <summary>
|
|
/// Valore max
|
|
/// </summary>
|
|
public float max { get; set; } = 0;
|
|
/// <summary>
|
|
/// Valore min
|
|
/// </summary>
|
|
public float min { get; set; } = 0;
|
|
}
|
|
/// <summary>
|
|
/// Classe oggetto base TimeSeries
|
|
/// </summary>
|
|
public class rawSample
|
|
{
|
|
/// <summary>
|
|
/// Data-Ora riferimento campione
|
|
/// </summary>
|
|
public DateTime timeStamp { get; set; } = DateTime.Now;
|
|
/// <summary>
|
|
/// Valore in formato stringa
|
|
/// </summary>
|
|
public string value { get; set; } = "";
|
|
}
|
|
/// <summary>
|
|
/// Raccolta dati di storici sintetici per Macchina e Variabile
|
|
/// </summary>
|
|
public class histData
|
|
{
|
|
/// <summary>
|
|
/// Macchina
|
|
/// </summary>
|
|
public string macName { get; set; } = "";
|
|
/// <summary>
|
|
/// Tipo di valore registrato (internamente è string)
|
|
/// </summary>
|
|
//[JsonConverter(typeof(StringEnumConverter))]
|
|
public plcDataType varType { get; set; } = plcDataType.Int;
|
|
/// <summary>
|
|
/// Data riferimento campione in formato YMD = yyyyMMdd
|
|
/// </summary>
|
|
public int dateYMD { get; set; } = 0;
|
|
/// <summary>
|
|
/// Periodo di aggregazione di riferimento
|
|
/// </summary>
|
|
//[JsonConverter(typeof(StringEnumConverter))]
|
|
public timeWindow period { get; set; } = timeWindow.day;
|
|
/// <summary>
|
|
/// Statistiche raccolte nel periodo
|
|
/// </summary>
|
|
public List<varStats> stats { get; set; } = null;
|
|
}
|
|
/// <summary>
|
|
/// Raccolta dati di storici raw per Macchina e Variabile
|
|
/// </summary>
|
|
public class rawData
|
|
{
|
|
/// <summary>
|
|
/// Macchina
|
|
/// </summary>
|
|
public string macName { get; set; } = "";
|
|
/// <summary>
|
|
/// Nome della Variabile tracciata
|
|
/// </summary>
|
|
public string varName { get; set; } = "";
|
|
/// <summary>
|
|
/// Tipo di valore registrato (internamente è string)
|
|
/// </summary>
|
|
//[JsonConverter(typeof(StringEnumConverter))]
|
|
public plcDataType varType { get; set; } = plcDataType.Int;
|
|
/// <summary>
|
|
/// Data riferimento campione in formato YMD = yyyyMMdd
|
|
/// </summary>
|
|
public int dateYMD { get; set; } = 0;
|
|
/// <summary>
|
|
/// Periodo di aggregazione di riferimento
|
|
/// </summary>
|
|
//[JsonConverter(typeof(StringEnumConverter))]
|
|
public timeWindow period { get; set; } = timeWindow.day;
|
|
/// <summary>
|
|
/// Dati raw registrati nel periodo
|
|
/// </summary>
|
|
public List<rawSample> samples { get; set; } = null;
|
|
}
|
|
/// <summary>
|
|
/// Classe x inviare messaggi di tipo esecuzione di una generica esecuzione
|
|
/// </summary>
|
|
public class exeResult
|
|
{
|
|
/// <summary>
|
|
/// Esito del risultato
|
|
/// </summary>
|
|
[JsonConverter(typeof(StringEnumConverter))]
|
|
public esitoExec esito { get; set; } = esitoExec.undone;
|
|
/// <summary>
|
|
/// Messaggio associato
|
|
/// </summary>
|
|
public string message { get; set; } = "";
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region gestione ALARMS / CONDITIONS
|
|
|
|
/// <summary>
|
|
/// Definizione classe evento allarme
|
|
/// </summary>
|
|
public class alarmEvent
|
|
{
|
|
/// <summary>
|
|
/// Anno di riferimento allarme (per chiave yyyy.n)
|
|
/// </summary>
|
|
public int yCurr { get; set; } = 0;
|
|
/// <summary>
|
|
/// Contatore incrementale univoco annuale (per chiave yyyy.n)
|
|
/// </summary>
|
|
public int yCounter { get; set; } = 0;
|
|
/// <summary>
|
|
/// Data riferimento campione in formato YMD = yyyyMMdd
|
|
/// </summary>
|
|
public int dateYMD { get; set; } = 0;
|
|
/// <summary>
|
|
/// Data-Ora inizio evento
|
|
/// </summary>
|
|
public DateTime started { get; set; } = DateTime.Now;
|
|
/// <summary>
|
|
/// Data-Ora inizio evento
|
|
/// </summary>
|
|
public DateTime ended { get; set; } = DateTime.Now;
|
|
/// <summary>
|
|
/// Lista delle condizioni di allarme attive ad inizio evento
|
|
/// </summary>
|
|
public List<alarmData> activeConditions { get; set; } = null;
|
|
/// <summary>
|
|
/// Elenco dei dati di tipo FluxLog nei minuti antecedenti l'evento
|
|
/// </summary>
|
|
public List<rawData> blackBoxData { get; set; } = null;
|
|
}
|
|
/// <summary>
|
|
/// Definizione classe evento allarme
|
|
/// </summary>
|
|
public class alarmStats
|
|
{
|
|
/// <summary>
|
|
/// Anno riferimento
|
|
/// </summary>
|
|
public int year { get; set; } = 0;
|
|
/// <summary>
|
|
/// Valore Contatore univoco annuale raggiunto yyyy.n
|
|
/// </summary>
|
|
public int yCounter { get; set; } = 1;
|
|
/// <summary>
|
|
/// Valore cumulato complessivo degli allarmi registrati
|
|
/// </summary>
|
|
public double totalDuration { get; set; } = 0;
|
|
/// <summary>
|
|
/// Durata media annuale allarmi
|
|
/// </summary>
|
|
public double avgDuration
|
|
{
|
|
get
|
|
{
|
|
double answ = 0;
|
|
try
|
|
{
|
|
answ = totalDuration / yCounter;
|
|
}
|
|
catch
|
|
{ }
|
|
return answ;
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Definizione allarme
|
|
/// </summary>
|
|
public class alarmData
|
|
{
|
|
/// <summary>
|
|
/// Codice univoco
|
|
/// </summary>
|
|
public string code { get; set; } = "";
|
|
/// <summary>
|
|
/// Descrizione
|
|
/// </summary>
|
|
public string description { get; set; } = "";
|
|
/// <summary>
|
|
/// Severity (0....1000, minimo...massimo)
|
|
/// </summary>
|
|
public int severity { get; set; } = 0;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region gestione oggetti conf MTConnect
|
|
|
|
/// <summary>
|
|
/// Configurazione delle macchine MTC
|
|
/// </summary>
|
|
public class MtcSetup
|
|
{
|
|
/// <summary>
|
|
/// IdxMacchina cui ci riferiamo
|
|
/// </summary>
|
|
public string idxMacchina { get; set; } = "";
|
|
/// <summary>
|
|
/// Setup della macchina
|
|
/// </summary>
|
|
public List<machDataItem> dataItems { get; set; }
|
|
}
|
|
/// <summary>
|
|
/// Descrittore oggetto DataItem generico
|
|
/// </summary>
|
|
public class machDataItem
|
|
{
|
|
public machDataItem()
|
|
{ }
|
|
/// <summary>
|
|
/// ID generico
|
|
/// </summary>
|
|
public string uuid { get; set; }
|
|
/// <summary>
|
|
/// Categoria oggetto
|
|
/// </summary>
|
|
public DataItemCategory Category { get; set; }
|
|
/// <summary>
|
|
/// Nome / descrizione
|
|
/// </summary>
|
|
public string Name { get; set; }
|
|
/// <summary>
|
|
/// Tipologia principale
|
|
/// </summary>
|
|
public string Type { get; set; }
|
|
/// <summary>
|
|
/// Tipologia specifica
|
|
/// </summary>
|
|
public string SubType { get; set; }
|
|
/// <summary>
|
|
/// Unità di misura
|
|
/// </summary>
|
|
public string Units { get; set; }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region gestione oggetti stato IOB scambiati tra IOB-MAN e IOB-WIN
|
|
|
|
/// <summary>
|
|
/// Rappresentazione dello stato corrente dell'IOB
|
|
/// </summary>
|
|
public class IobWinCurrentState
|
|
{
|
|
/// <summary>
|
|
/// Semaforo IN (IOB-PLC)
|
|
/// </summary>
|
|
public Semaforo SemIn { get; set; } = Semaforo.ND;
|
|
/// <summary>
|
|
/// Semaforo OUT (IOB-MPserver)
|
|
/// </summary>
|
|
public Semaforo SemOut { get; set; } = Semaforo.ND;
|
|
/// <summary>
|
|
/// Contatore IOB
|
|
/// </summary>
|
|
public float counterIOB { get; set; } = 0;
|
|
/// <summary>
|
|
/// Contatore Macchina
|
|
/// </summary>
|
|
public float counterMAC { get; set; } = 0;
|
|
/// <summary>
|
|
/// Lunghezza coda EVENTI in uscita
|
|
/// </summary>
|
|
public int queueEvLen { get; set; } = 0;
|
|
/// <summary>
|
|
/// Lunghezza coda FluxLog in uscita
|
|
/// </summary>
|
|
public int queueFLogLen { get; set; } = 0;
|
|
/// <summary>
|
|
/// DataOra ultima comunicazione IN (con PLC)
|
|
/// </summary>
|
|
public DateTime lastDataIn { get; set; } = DateTime.Now.AddYears(-1);
|
|
/// <summary>
|
|
/// DataOra ultima comunicazione OUT (con MP Server)
|
|
/// </summary>
|
|
public DateTime lastDataOut { get; set; } = DateTime.Now.AddYears(-1);
|
|
/// <summary>
|
|
/// Ultimo stato noto dei parametri in memoria letti da PLC
|
|
/// </summary>
|
|
public Dictionary<string, string> currParams { get; set; } = null;
|
|
}
|
|
#if false
|
|
/// <summary>
|
|
/// Calendario eventi
|
|
/// </summary>
|
|
public class EventsCalendar
|
|
{
|
|
/// <summary>
|
|
/// Lista di eventi
|
|
/// </summary>
|
|
public List<EventDetail> EventsList { get; set; }
|
|
}
|
|
#endif
|
|
/// <summary>
|
|
/// Singolo dettaglio evento
|
|
/// </summary>
|
|
public class EventDetail
|
|
{
|
|
/// <summary>
|
|
/// Data di riferimento
|
|
/// </summary>
|
|
public DateTime when { get; set; }
|
|
/// <summary>
|
|
/// Nome evento
|
|
/// </summary>
|
|
public string what { get; set; } = "";
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#if false
|
|
/// <summary>
|
|
/// Classe definizione parametri singolo ordine produzione
|
|
/// </summary>
|
|
public class OrdineProdArt
|
|
{
|
|
/// <summary>
|
|
/// Codice univoco ordine
|
|
/// </summary>
|
|
public string OrdNum;
|
|
/// <summary>
|
|
/// Articolo associato ad ordine
|
|
/// </summary>
|
|
public Articolo ArtOrd;
|
|
/// <summary>
|
|
/// Quantità Articolo
|
|
/// </summary>
|
|
public int Qta;
|
|
}
|
|
/// <summary>
|
|
/// Oggetto generico articolo
|
|
/// </summary>
|
|
public class Articolo
|
|
{
|
|
/// <summary>
|
|
/// Codice articolo
|
|
/// </summary>
|
|
public string Codice;
|
|
/// <summary>
|
|
/// Descrizione Articolo
|
|
/// </summary>
|
|
public string Descrizione;
|
|
}
|
|
/// <summary>
|
|
/// Classe definizione parametri ordine x KIT di articoli
|
|
/// </summary>
|
|
public class OrdineProdKit
|
|
{
|
|
/// <summary>
|
|
/// Codice univoco ordine
|
|
/// </summary>
|
|
public string OrdNum;
|
|
/// <summary>
|
|
/// Codice KIT
|
|
/// </summary>
|
|
public string Codice;
|
|
/// <summary>
|
|
/// Vettore ordini articolo associati a KIT
|
|
/// </summary>
|
|
public List<OrdineProdArt> OrdiniArt;
|
|
/// <summary>
|
|
/// Quantità KIT
|
|
/// </summary>
|
|
public int Qta;
|
|
}
|
|
#endif
|
|
}
|