diff --git a/MP-IO/Controllers/IOBController.cs b/MP-IO/Controllers/IOBController.cs index db25d901..144aec8b 100644 --- a/MP-IO/Controllers/IOBController.cs +++ b/MP-IO/Controllers/IOBController.cs @@ -346,7 +346,7 @@ namespace MP_IO.Controllers } /// /// Processa una chiamata POST per l'invio di un array Json di oggetti plcMemConf - /// PUT: IOB/flogJson/SIMUL_03 + /// PUT: IOB/saveConf/SIMUL_03 /// /// ID dell'IOB /// @@ -388,6 +388,53 @@ namespace MP_IO.Controllers return answ; } /// + /// Processa una chiamata POST per l'invio di un array Json di oggetti di conf DataItems (es per MTC) + /// PUT: IOB/saveDataItems/SIMUL_03 + /// + /// ID dell'IOB + /// + [HttpPost] + public string saveDataItems(string id) + { + string answ = ""; + if (string.IsNullOrWhiteSpace(id)) + { + answ = "Missing IOB"; + } + else + { + // questa classe è derivata da Controller.Response... x cui recupero lo stream in altro modo... + string content = ""; + System.Web.HttpContext.Current.Request.InputStream.Position = 0; + using (var reader = new StreamReader(Request.InputStream, System.Text.Encoding.UTF8, true, 4096, true)) + { + content = reader.ReadToEnd(); + } + // Rest + System.Web.HttpContext.Current.Request.InputStream.Position = 0; + + +#if false + // procedo a deserializzare in blocco l'oggetto... + plcMemMap currMemMap = null; + try + { + // deserializzo. + currMemMap = JsonConvert.DeserializeObject(content); + // se != null --> salvo! + if (currMemMap != null) + { + DataLayer.setIobMemMap(id, currMemMap); + answ = "OK"; + } + } + catch + { } +#endif + } + return answ; + } + /// /// restituisce elenco parametri correnti come una List Json di oggetti objItem /// GET: IOB/getObjItems/SIMUL_03 /// diff --git a/MapoDb/AlarmsArchive.cs b/MapoDb/AlarmsArchive.cs new file mode 100644 index 00000000..2e2fae5a --- /dev/null +++ b/MapoDb/AlarmsArchive.cs @@ -0,0 +1,74 @@ +using MapoSDK; +using MongoDB.Driver; +using System; +using System.Collections.Generic; + +namespace MapoDb +{ + /// + /// Classe gestione ALLARMI coem eventi speciali (documenti registrati su MongoDb) + /// + public class AlarmsArchive + { + string mdbConnString = "mongodb://W2019-MONGODB:27017"; + //string mdbConnString = "mongodb://localhost:27017"; + MongoClient client; + IMongoDatabase database; + public AlarmsArchive() + { + // rifare avvio con lettura da web.config... + client = new MongoClient(mdbConnString); + database = client.GetDatabase("MAPO"); + + } + /// + /// Singleton gestione istanza AlarmsManager + /// + public static AlarmsArchive man = new AlarmsArchive(); + /// + /// Crea una registrazione incidente su MongoDB + /// + /// + /// + /// numero di minuti precedenti di dati FluxLog da includere + /// + public int createIncident(string idxMacchina, List elencoAllarmi, int lastMinutes) + { + int answ = 0; + string currDateStr = ""; + int startYMD = 0; + DateTime adesso = DateTime.Now; + int anno = adesso.Year; + currDateStr = adesso.ToString("yyyyMMdd"); + int.TryParse(currDateStr, out startYMD); + // in primis recupero contatore allarmi correnti, lo incremento salvandolo e genero nuovo documento... + var collAlarmStats = database.GetCollection("AlarmStats"); + var builderAlarmStat = Builders.Filter; + var filtThisYear = builderAlarmStat.Eq(u => u.year, anno); + + var datiCorrenti = collAlarmStats.Find(filtThisYear); + var collAlarmEvents = database.GetCollection("AlarmEvents"); + + List lastFluxLog = new List(); + DS_applicazione.FluxLogDataTable tabDati = DataLayer.obj.taFL.getFiltOrd(idxMacchina, adesso.AddMinutes(-lastMinutes), adesso, true); + if (tabDati.Count > 0) + { + // chiamo procedura x conversione + lastFluxLog = FluxArchive.man.convertTable(tabDati, adesso, timeWindow.free); + } + alarmEvent nuovoAllarme = new alarmEvent() + { + yCurr = anno, + yCounter = answ, + dateYMD = startYMD, + started = DateTime.Now, + blackBoxData = lastFluxLog, + activeConditions = elencoAllarmi + }; + + collAlarmEvents.InsertOne(nuovoAllarme); + + return answ; + } + } +} diff --git a/MapoDb/FluxArchive.cs b/MapoDb/FluxArchive.cs index 351a78a7..5e91d4ba 100644 --- a/MapoDb/FluxArchive.cs +++ b/MapoDb/FluxArchive.cs @@ -138,7 +138,7 @@ namespace MapoDb /// Tabelal dei dati RAW registrati /// Data di riferimento /// Periodo del campionamento desiderato (e passato coi dati che sono relativi a tale periodo...) - protected List convertTable(DS_applicazione.FluxLogDataTable tabDati, DateTime tStamp, timeWindow periodo) + public List convertTable(DS_applicazione.FluxLogDataTable tabDati, DateTime tStamp, timeWindow periodo) { // init oggetti List listaRecords = new List(); diff --git a/MapoDb/MapoDb.csproj b/MapoDb/MapoDb.csproj index 150ef558..c1fb0fa8 100644 --- a/MapoDb/MapoDb.csproj +++ b/MapoDb/MapoDb.csproj @@ -120,6 +120,7 @@ + DS_applicazione.xsd diff --git a/MapoSDK/.editorconfig b/MapoSDK/.editorconfig new file mode 100644 index 00000000..f07b59b1 --- /dev/null +++ b/MapoSDK/.editorconfig @@ -0,0 +1,4 @@ +[*.cs] + +# CA2227: Le proprietà delle raccolte devono essere di sola lettura +dotnet_diagnostic.CA2227.severity = none diff --git a/MapoSDK/Enums.cs b/MapoSDK/Enums.cs index 17def9d2..1c49c2f6 100644 --- a/MapoSDK/Enums.cs +++ b/MapoSDK/Enums.cs @@ -62,6 +62,7 @@ /// public enum timeWindow { + free, hour, day, week, diff --git a/MapoSDK/MapoSDK.csproj b/MapoSDK/MapoSDK.csproj index af77f46a..7d1bba26 100644 --- a/MapoSDK/MapoSDK.csproj +++ b/MapoSDK/MapoSDK.csproj @@ -58,6 +58,7 @@ + diff --git a/MapoSDK/Objects.cs b/MapoSDK/Objects.cs index 3ea9750f..0c4a1f2d 100644 --- a/MapoSDK/Objects.cs +++ b/MapoSDK/Objects.cs @@ -439,6 +439,93 @@ namespace MapoSDK /// public string message { get; set; } = ""; } + /// + /// Definizione classe evento allarme + /// + public class alarmEvent + { + /// + /// Anno di riferimento allarme (per chiave yyyy.n) + /// + public int yCurr { get; set; } = 0; + /// + /// Contatore incrementale univoco annuale (per chiave yyyy.n) + /// + public int yCounter { get; set; } = 0; + /// + /// Data riferimento campione in formato YMD = yyyyMMdd + /// + public int dateYMD { get; set; } = 0; + /// + /// Data-Ora inizio evento + /// + public DateTime started { get; set; } = DateTime.Now; + /// + /// Data-Ora inizio evento + /// + public DateTime ended { get; set; } = DateTime.Now; + /// + /// Lista delle condizioni di allarme attive ad inizio evento + /// + public List activeConditions { get; set; } = null; + /// + /// Elenco dei dati di tipo FluxLog nei minuti antecedenti l'evento + /// + public List blackBoxData { get; set; } = null; + } + /// + /// Definizione classe evento allarme + /// + public class alarmStats + { + /// + /// Anno riferimento + /// + public int year { get; set; } = 0; + /// + /// Valore Contatore univoco annuale raggiunto yyyy.n + /// + public int yCounter { get; set; } = 1; + /// + /// Valore cumulato complessivo degli allarmi registrati + /// + public double totalDuration { get; set; } = 0; + /// + /// Durata media annuale allarmi + /// + public double avgDuration + { + get + { + double answ = 0; + try + { + answ = totalDuration / yCounter; + } + catch + { } + return answ; + } + } + } + /// + /// Definizione allarme + /// + public class alarmData + { + /// + /// Codice univoco + /// + public string code { get; set; } = ""; + /// + /// Descrizione + /// + public string description { get; set; } = ""; + /// + /// Severity (0....1000, minimo...massimo) + /// + public int severity { get; set; } = 0; + } #endregion