using Microsoft.EntityFrameworkCore; using MP.MONO.Core.DTO; using MP.MONO.Data.DbModels; using MP.MONO.Data.DTO; using NLog; using System.Diagnostics; using static MP.MONO.Core.Enums; namespace MP.MONO.Data.Controllers { public class MpDbController : IDisposable { #region Public Constructors public MpDbController() { } #endregion Public Constructors #region Public Methods /// /// Elenco records anagrafica allarmi /// /// public List AlarmListGetAll() { List? dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetAlarmList .OrderBy(x => x.FullValue) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmListGetAll{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Inserimento di un record anagrafica allarmi (o se esiste restituisce quello esistente) /// /// Record da inserire (senza ID...) /// public AlarmListModel? AlarmListInsert(string alarmText) { AlarmListModel? foundRec = new AlarmListModel(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { // verifico che NON esista con pèari descrizione... foundRec = localDbCtx .DbSetAlarmList .FirstOrDefault(x => x.FullValue == alarmText); // se non c'è aggiungo if (foundRec == null) { foundRec = new AlarmListModel() { FullValue = alarmText }; localDbCtx .DbSetAlarmList .Add(foundRec); localDbCtx.SaveChanges(); // rifaccio search foundRec = localDbCtx .DbSetAlarmList .FirstOrDefault(x => x.FullValue == alarmText); } } catch (Exception exc) { Log.Error($"Eccezione durante AlarmListInsert{Environment.NewLine}{exc}"); } } return foundRec; } /// /// Inserimento di una lista record anagrafica allarmi /// /// Lista Record da inserire (senza ID...) /// public async Task AlarmListInsertMany(List newItems) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { await localDbCtx .DbSetAlarmList .AddRangeAsync(newItems); await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante AlarmListInsertMany{Environment.NewLine}{exc}"); } } return fatto; } /// /// Recupero elenco allarmi (ultimi dato "skip") /// /// /// /// /// public async Task> AlarmLogGetFilt(int MachineId, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = await localDbCtx .DbSetAlarmLog .AsNoTracking() .Where(x => x.MachineId == MachineId) .Include(m => m.MachineNav) .OrderByDescending(x => x.AlarmLogId) .Skip(skipRec) .Take(numRec) .ToListAsync(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmLogGetFilt{Environment.NewLine}{exc}"); } } //await Task.Delay(1); return dbResult; } /// Recupero elenco allarmi con data <= alla data di riferimento (ultimi dato /// "skip") public List AlarmLogGetFiltByDate(int MachineId, DateTime dtRif, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetAlarmLog .AsNoTracking() .Where(x => (x.MachineId == MachineId) && (x.DtRif <= dtRif)) .Include(m => m.MachineNav) .OrderByDescending(x => x.AlarmLogId) .Skip(skipRec) .Take(numRec) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmLogGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Inserimento di un record AlarmLog /// /// Record da inserire (senza ID...) /// public async Task AlarmLogInsert(AlarmLogModel newItem) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { localDbCtx .DbSetAlarmLog .Add(newItem); await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante AlarmLogInsert{Environment.NewLine}{exc}"); } } return fatto; } /// /// Inserimento di una lista record AlarmLog /// /// Lista Record da inserire (senza ID...) /// public async Task AlarmLogInsertMany(List newItems) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { if (newItems.Count > 0) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); await localDbCtx .DbSetAlarmLog .AddRangeAsync(newItems); await localDbCtx.SaveChangesAsync(); fatto = true; stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"AlarmLogInsertMany| DB insert | {newItems.Count} rec | {ts.TotalMilliseconds} ms"); } } catch (Exception exc) { Log.Error($"Eccezione durante AlarmLogInsert{Environment.NewLine}{exc}"); } } return fatto; } /// /// Chiude ultimo record dato Id (se fossero + di 1 chiude tutti...) /// /// Id Allarme /// public async Task AlarmRecCloseActive(int AlarmId) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { DateTime adesso = DateTime.Now; var candList = localDbCtx .DbSetAlarmRec .Where(x => x.AlarmId == AlarmId && x.DtStart >= x.DtEnd) .ToList(); foreach (var item in candList) { item.DtEnd = adesso; } await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecCloseActive{Environment.NewLine}{exc}"); } } return fatto; } /// /// Chiude ultimo record di allarmi aperti (avendo verificato zia zero da un pò...) /// /// public async Task AlarmRecCloseStarving() { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { DateTime adesso = DateTime.Now; var candList = localDbCtx .DbSetAlarmRec .Where(x => x.DtStart >= x.DtEnd) .ToList(); foreach (var item in candList) { item.DtEnd = adesso; } await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecCloseStarving{Environment.NewLine}{exc}"); } } return fatto; } /// /// Recupero elenco allarmi Rec ATTIVI (non chiusi) /// /// public List AlarmRecGetActive() { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetAlarmRec .AsNoTracking() .Where(x => x.DtStart >= x.DtEnd) .Include(m => m.AlarmListNav) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecGetActive{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupero elenco allarmi Rec (ultimi dato "skip") /// /// /// /// /// public async Task> AlarmRecGetFilt(int MachineId, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = await localDbCtx .DbSetAlarmRec .AsNoTracking() .Where(x => x.MachineId == MachineId) .Include(m => m.MachineNav) .Include(m => m.AlarmListNav) .OrderByDescending(x => x.DtStart) .Skip(skipRec) .Take(numRec) .ToListAsync(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// Recupero elenco allarmi Rec con data <= a quella di riferimento(ultimi dato /// "skip") public List AlarmRecGetFiltByDate(int MachineId, DateTime dtRif, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetAlarmRec .AsNoTracking() .Where(x => (x.MachineId == MachineId) && (x.DtStart <= dtRif)) .Include(m => m.MachineNav) .Include(m => m.AlarmListNav) .OrderByDescending(x => x.DtStart) .Skip(skipRec) .Take(numRec) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupero lista sommatoria durata eventi allarme per analisi, ordinati in logica di /// pareto (Max-min) /// /// Id Macchina /// inizio analisi (evento deve iniziare/finire entro periodo) /// fine analisi (evento deve iniziare/finire entro periodo) /// durata minima evento per venire considerato, -1 = tutti /// durata massima evento per venire considerato, -1 = tutti /// public List AlarmRecGetParetoDur(int machineId, DateTime dtFrom, DateTime dtTo, int minDur = -1, int maxDur = -1) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { // effettuo il calcolo in + step... var rawData = localDbCtx .DbSetAlarmRec .AsNoTracking() .Where(x => x.MachineId == machineId && (x.DtStart >= dtFrom && x.DtStart <= dtTo) && (x.Duration >= minDur || minDur < 0) && (x.Duration <= maxDur || maxDur < 0)) .ToList(); //dbResult = localDbCtx // .DbSetAlarmRec // .AsNoTracking() // .Where(x => x.MachineId == machineId // && (x.DtStart >= dtFrom && x.DtStart <= dtTo) // && (x.Duration >= minDur || minDur < 0) // && (x.Duration <= maxDur || maxDur < 0)) dbResult = rawData .GroupBy(g => g.AlarmId) .Select(g => new AlarmDurationDTO() { MachineId = machineId, AlarmId = g.Key, Duration = g.Sum(x => x.Duration) }) .ToList() .Join( AlarmListGetAll(), f => f.AlarmId, l => l.AlarmId, (dur, list) => new AlarmDurationDTO() { AlarmId = dur.AlarmId, Duration = dur.Duration, MachineId = dur.MachineId, AlarmDescription = list.FullValue } ) .OrderByDescending(o => o.Duration) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecGetParetoDur{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupero lista di conteggio eventi allarme per analisi, ordinati in logica di pareto (Max-min) /// /// Id Macchina /// inizio analisi (evento deve iniziare DOPO questa data) /// fine analisi (evento deve iniziare prima di questa data) /// durata minima evento per venire considerato, -1 = tutti /// durata massima evento per venire considerato, -1 = tutti /// public List AlarmRecGetParetoFreq(int machineId, DateTime dtFrom, DateTime dtTo, int minDur = -1, int maxDur = -1) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetAlarmRec .AsNoTracking() .Where(x => x.MachineId == machineId && (x.DtStart >= dtFrom && x.DtStart <= dtTo) && (x.Duration >= minDur || minDur < 0) && (x.Duration <= maxDur || maxDur < 0)) .GroupBy(g => g.AlarmId) .Select(g => new AlarmFreqDTO() { MachineId = machineId, AlarmId = g.Key, EventCount = g.Count() }) .ToList() .Join( AlarmListGetAll(), f => f.AlarmId, l => l.AlarmId, (freq, list) => new AlarmFreqDTO() { AlarmId = freq.AlarmId, EventCount = freq.EventCount, MachineId = freq.MachineId, AlarmDescription = list.FullValue } ) .OrderByDescending(o => o.EventCount) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecGetParetoFreq{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Inserimento di un record AlarmRec /// /// Record da inserire (senza ID...) /// public async Task AlarmRecInsert(AlarmRecModel newItem) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); try { // verifico non sia già aperto... verifico eventuali items già aperti da NON // dover aggiungere... var stillOpenAlarms = localDbCtx .DbSetAlarmRec .Where(x => x.DtStart >= x.DtEnd && x.AlarmId == newItem.AlarmId) .Select(x => x.AlarmId) .ToList(); // se ho trovato --> salto! if (stillOpenAlarms != null && stillOpenAlarms.Count > 0) { Log.Error($"Errore: trovato {stillOpenAlarms.Count} istanze già attive | Id: {newItem.AlarmId}"); } else { localDbCtx .DbSetAlarmRec .Add(newItem); await localDbCtx.SaveChangesAsync(); fatto = true; } } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecInsert{Environment.NewLine}{exc}"); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"AlarmRecInsert| DB insert 1 rec | {ts.TotalMilliseconds} ms"); } return fatto; } /// /// Inserimento di una lista record AlarmRec /// /// Lista Record da inserire (senza ID...) /// public bool AlarmRecInsertMany(List newItems) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { if (newItems.Count > 0) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); #if false // verifico eventuali items già aperti da NON dover aggiungere... List? stillOpenAlarms = localDbCtx .DbSetAlarmRec .Where(x => x.DtStart >= x.DtEnd) .Select(x => x.AlarmId) .ToList(); // costruisco l'elenco degli ID allarmi da inserire List? listNewId = newItems .Select(x => x.AlarmId) .Distinct() .ToList(); var alarm2rem = listNewId.Intersect(stillOpenAlarms).ToList(); // andrò ad inserire solo gli item NON già presenti... foreach (var item in alarm2rem) { var item2del = newItems.Where(x => x.AlarmId == item).ToList(); if (item2del != null) { foreach (var singleItem in item2del) { newItems.Remove(singleItem); } } } #endif if (newItems.Count > 0) { // aggiungo localDbCtx .DbSetAlarmRec .AddRange(newItems); // salvo! localDbCtx.SaveChanges(); fatto = true; stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"AlarmRecInsertMany| DB insert | {newItems.Count} rec | {ts.TotalMilliseconds} ms"); } else { stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Allarmi già presenti non reinseriti | {ts.TotalMilliseconds} ms"); } } } catch (Exception exc) { Log.Error($"Eccezione durante AlarmRecInsertMany{Environment.NewLine}{exc}"); } } return fatto; } /// /// Recupero counters da DB /// /// public List CountersGetAll() { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetCounter .AsNoTracking() .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante CountersGetAll{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Inserimento/Update di una lista counters /// /// Lista Record da inserire /// public bool CountersUpsertMany(List newItems) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { if (newItems.Count > 0) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); // x ogni valore cerco... foreach (var item in newItems) { var oldRec = localDbCtx .DbSetCounter .Where(x => x.CCode == item.CCode) .FirstOrDefault(); if (oldRec == null) { localDbCtx .DbSetCounter .Add(item); } else { oldRec.ActualVal = item.ActualVal; localDbCtx.Entry(oldRec).State = EntityState.Modified; } } // salvo le modifiche localDbCtx.SaveChanges(); fatto = true; stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"CountersUpsertMany| DB upsert | {newItems.Count} rec | {ts.TotalMilliseconds} ms"); } } catch (Exception exc) { Log.Error($"Eccezione durante CountersUpsertMany{Environment.NewLine}{exc}"); } } return fatto; } /// /// Recupero DataLogDTO data condizione filtro /// /// ID macchina /// Tipologia di dato richiesto da enum /// Tipo di Flusso /// DT Inizio estrazione /// DT Fine estrazione /// public async Task> DataLogDtoGetFilt(int machineId, DataLogType dataType, string fluxType, DateTime inizio, DateTime fine) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = await localDbCtx .DbSetDataLog .Where(x => (x.MachineId == machineId) && (x.FluxType == fluxType) && (x.DataType == dataType || dataType == DataLogType.ND) && (x.DtRif >= inizio && x.DtRif <= fine)) .Select(r => new DataLogDTO() { DataLogId = r.DataLogId, DtRif = r.DtRif, ValNum = r.ValNum }) .OrderByDescending(x => x.DataLogId) .ToListAsync(); } catch (Exception exc) { Log.Error($"Eccezione durante DataLogDtoGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupero record DataLog data condizione filtro /// /// Tipologia di dato richiesto da enum /// /// /// /// /// public async Task> DataLogGetFilt(DataLogType dataType, DateTime inizio, DateTime fine, int machineId, string fluxType) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = await localDbCtx .DbSetDataLog .Where(x => (x.MachineId == machineId) && (x.FluxType == fluxType) && (x.DataType == dataType || dataType == DataLogType.ND) && (x.DtRif >= inizio && x.DtRif <= fine)) .Include(m => m.MachineNav) .OrderByDescending(x => x.DataLogId) .ToListAsync(); } catch (Exception exc) { Log.Error($"Eccezione durante DataLogGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupero record DataLog data condizione filtro (multi-flusso) /// /// Tipologia di dato richiesto da enum /// /// /// public async Task> DataLogGetFilt(DataLogType dataType, DateTime inizio, DateTime fine) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = await localDbCtx .DbSetDataLog .Where(x => (x.DataType == dataType || dataType == DataLogType.ND) && (x.DtRif >= inizio && x.DtRif <= fine)) .Include(m => m.MachineNav) .OrderByDescending(x => x.DataLogId) .ToListAsync(); } catch (Exception exc) { Log.Error($"Eccezione durante DataLogGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Inserimento di un SET di record DataLog (post aggregazione base VC) /// /// Lista Record da inserire (senza ID...) /// public async Task DataLogInsertMany(List newItems) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { await localDbCtx .DbSetDataLog .AddRangeAsync(newItems); await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante DataLogInsert{Environment.NewLine}{exc}"); } } return fatto; } /// /// Recupero record DataStAg (aggregati) data condizione filtro /// /// /// /// /// /// public List DataStAgGetFilt(int MachineId, string FluxType, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetDataStAg .Where(x => x.MachineId == MachineId && x.FluxType == FluxType) .Include(m => m.MachineNav) .OrderByDescending(x => x.DataStAgId) .Skip(skipRec) .Take(numRec) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante DataLogGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Inserimento di un record DataStAg (aggregati) - creati da ANALYZER che effettua compattazione /// /// Record da inserire (senza ID...) /// public async Task DataStAgInsert(DataStAgModel newItem) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { localDbCtx .DbSetDataStAg .Add(newItem); await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante DataStAgInsert{Environment.NewLine}{exc}"); } } return fatto; } public void Dispose() { // Clear database context //Log.Info("Dispose di GWMSController"); } public ProductionDTO MachineGetProd() { // !!!FIXME TODO... è fake... Random rand = new Random(); int stdCycle = 5; ProductionDTO currMachDto = new ProductionDTO() { Order = "ODL Test", ItemCode = "ART.0000123", ProgName = "P000012", CurrQty = DateTime.Now.Minute + rand.Next(1, 40), OrderQty = 100, CycleTimeMin = rand.NextDouble() * stdCycle, Message = "...simulated data..." }; Task.Delay(400).Wait(); return currMachDto; } /// /// Recupero pareto status impianto /// /// Macchina selezionata /// inizio periodo /// fine periodo /// public List ParetoStatusMach(int MachineId, DateTime from, DateTime to) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetParetoStatus .FromSqlRaw("CALL stp_paretoStatus({0},{1},{2});", MachineId, from.ToString("yyyy-MM-dd"), to.ToString("yyyy-MM-dd")) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante ParetoStatusMach{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupera elenco contatori ammessi /// /// public List PMCounterModelGetAll() { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetCounter .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante PMCounterModelGetAll{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupera elenco Gruppi Macchina PM ammessi /// /// public List PMMachGroupGetAll() { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetPMMachGroup .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante PMMachGroupGetAll{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Eliminazione Record /// /// /// /// public async Task PMTaskDeleteRecord(PrevMaintTaskModel currRec, bool forceDelete) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { var currVal = localDbCtx .DbSetPMTask .Where(x => x.PMTaskId == currRec.PMTaskId) .FirstOrDefault(); if (currVal != null) { // se effettivo delete if (forceDelete) { localDbCtx .DbSetPMTask .Remove(currVal); } else { currVal.IsDisabled = true; } await localDbCtx.SaveChangesAsync(); } fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante PMTaskDeleteRecord{Environment.NewLine}{exc}"); } } return fatto; } /// /// Riabilitazione task disabilitato /// /// /// public async Task PMTaskEnableRecord(PrevMaintTaskModel currRec) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { var currVal = localDbCtx .DbSetPMTask .Where(x => x.PMTaskId == currRec.PMTaskId) .FirstOrDefault(); if (currVal != null) { // se effettivo delete if (currRec.IsDisabled) { currVal.IsDisabled = false; } await localDbCtx.SaveChangesAsync(); } fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante PMTaskEnableRecord{Environment.NewLine}{exc}"); } } return fatto; } /// /// Recupera elenco Topics PM ammessi /// /// public List PMTaskTopicGetAll() { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetPMTopic .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante PMTaskTopicGetAll{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupera elenco User Team PM ammessi /// /// public List PMUTeamGetAll() { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetUTeam .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante PMUTeamGetAll{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupero elenco Task Manut Prev Previsti/Configurati (ultimi dato "skip") /// /// /// /// /// public List PrevMaintTaskGetFilt(int MachineId, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetPMTask .Where(x => x.MachineId == MachineId) .Include(m => m.CounterNav) .Include(m => m.MachGroupNav) .Include(m => m.MachineNav) .Include(m => m.TopicNav) .Include(m => m.UserTeamNav) .OrderBy(x => x.ExtIdx) .Skip(skipRec) .Take(numRec) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante PrevMaintTaskGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Esegue update del record /// /// /// public async Task PrevMaintTaskUpdate(PrevMaintTaskModel editRec) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { var currRec = localDbCtx .DbSetPMTask .Where(x => x.PMTaskId == editRec.PMTaskId) .FirstOrDefault(); if (currRec != null) { currRec.CCode = editRec.CCode; currRec.ExpiryVal = editRec.ExpiryVal; currRec.ExtIdx = editRec.ExtIdx; currRec.PMMGCode = editRec.PMMGCode; currRec.PMTCode = editRec.PMTCode; currRec.PMUTCode = editRec.PMUTCode; currRec.JobDescription = editRec.JobDescription; localDbCtx.Entry(currRec).State = EntityState.Modified; } else { // se nuovo (user edit) --> NON protetto! editRec.Protected = false; localDbCtx .DbSetPMTask .Add(editRec); } await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante PrevMaintTaskUpdate{Environment.NewLine}{exc}"); } } return fatto; } /// /// Inserimento di una lista record Production Log /// /// Lista Record da inserire (senza ID...) /// public async Task ProdLogInsertMany(List newItems) { bool fatto = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { await localDbCtx .DbSetProdLog .AddRangeAsync(newItems); await localDbCtx.SaveChangesAsync(); fatto = true; } catch (Exception exc) { Log.Error($"Eccezione durante ProdLogInsertMany{Environment.NewLine}{exc}"); } } return fatto; } /// /// Effettua chiamata stored x pulizia dati stale/vecchi /// /// /// public List RemoveOldData(int numDay2Keep) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetTaskExec .FromSqlRaw("CALL stp_removeOldData({0});", numDay2Keep) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante RemoveOldData{Environment.NewLine}{exc}"); } } return dbResult; } /// /// genera elenco Task Schedulati missing da schema + attualmente presenti... /// /// /// public async Task SchedMaintTaskCreateMissing(int MachineId) { bool answ = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { List missTask = new List(); // elenco dei task NON disattivati List? allTask = localDbCtx .DbSetPMTask .Where(x => x.MachineId == MachineId && !x.IsDisabled) .Include(i => i.CounterNav) .ToList(); // analizzo task per idx del PMTask var reqTask = allTask .Select(x => x.PMTaskId) .ToList(); var openTask = localDbCtx .DbSetSMTask .Where(x => x.DtExecution == DateTime.MinValue) .Include(m => m.PMTaskeNav) .ToList(); var currTask = openTask .Where(x => x.PMTaskeNav.MachineId == MachineId) .Select(x => x.PMTaskId) .ToList(); // elenco dei SOLI task presenti var listTaskOk = currTask.Intersect(reqTask).ToList(); // dall'elenco di quelli originali elimino presenti --> ho elenco mancanti... foreach (var iTask in allTask) { // se non nell'elenco aggiungo... if (!listTaskOk.Exists(x => x == iTask.PMTaskId)) { missTask.Add(iTask); } } var newRecs = missTask.Select(x => new PendingMaintModel() { CCode = x.CCode, DtCreation = DateTime.Now, ExpiryVal = x.ExpiryVal, PMTaskId = x.PMTaskId, CountStartVal = x.CounterNav.ActualVal }).ToList(); localDbCtx .DbSetSMTask .AddRange(newRecs); // salvo localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione durante SchedMaintTaskGetFilt{Environment.NewLine}{exc}"); } } await Task.Delay(1); return answ; } /// /// Recupero elenco Task Schedulati dati Macchina ed intervento "master" /// /// Macchina selezionata /// ID del PMTask parent /// Num record da saltare /// num rec da recuperare /// public List SchedMaintTaskGetByPMTask(int MachineId, int PMTaskId, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetSMTask .Include(i => i.CounterNav) .Where(x => x.PMTaskeNav.MachineId == MachineId && x.PMTaskId == PMTaskId && x.DtExecution > DateTime.MinValue) .Include(m => m.PMTaskeNav.MachGroupNav) .Include(m => m.CounterNav) .Include(m => m.PMTaskeNav.MachineNav) .Include(m => m.PMTaskeNav.TopicNav) .Include(m => m.PMTaskeNav.UserTeamNav) .OrderByDescending(x => x.DtCreation) .Skip(skipRec) .Take(numRec) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante SchedMaintTaskGetByPMTask{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupero elenco Task Schedulati (ultimi dato "skip") /// /// Macchina selezionata /// Num record da saltare /// num rec da recuperare /// public List SchedMaintTaskGetFilt(int MachineId, int skipRec, int numRec) { List dbResult = new List(); using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { dbResult = localDbCtx .DbSetSMTask .Include(i => i.CounterNav) .Where(x => x.PMTaskeNav.MachineId == MachineId && x.DtExecution == DateTime.MinValue) .Include(m => m.PMTaskeNav.MachGroupNav) .Include(m => m.CounterNav) .Include(m => m.PMTaskeNav.MachineNav) .Include(m => m.PMTaskeNav.TopicNav) .Include(m => m.PMTaskeNav.UserTeamNav) .OrderBy(x => x.PMTaskeNav.ExtIdx) .Skip(skipRec) .Take(numRec) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione durante SchedMaintTaskGetFilt{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Registro esecuzione task schedualto /// /// /// /// /// /// public async Task SchedMaintTaskSetDone(int MachineId, int SMTaskId, DateTime ExecDT, string ExecUser) { bool answ = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { // Aggiorno il task schedulato var dbResult = localDbCtx .DbSetSMTask .Include(i => i.CounterNav) .Where(x => x.PMTaskeNav.MachineId == MachineId && x.SMTaskId == SMTaskId) .FirstOrDefault(); if (dbResult != null) { // aggiorno il record dbResult.DtExecution = ExecDT; dbResult.UserCode = ExecUser; dbResult.ElapsedVal = dbResult.CounterNav.ActualVal - dbResult.CountStartVal; // aggiorno il task parent col numero di task eseguiti... int numDone = localDbCtx .DbSetSMTask .Where(x => x.PMTaskId == dbResult.PMTaskId) .Count(); var parentRecord = localDbCtx .DbSetPMTask .Where(x => x.PMTaskId == dbResult.PMTaskId) .FirstOrDefault(); if (parentRecord != null) { parentRecord.NumTaskDone = numDone; } // eseguo salvataggi! localDbCtx.SaveChanges(); // segno fatto! answ = true; } } catch (Exception exc) { Log.Error($"Eccezione durante SchedMaintTaskSetDone{Environment.NewLine}{exc}"); } } await Task.Delay(1); return answ; } /// /// Inserisce un nuovo record status log calcolando durata da rec precedente.. /// /// /// public async Task StatusLogInsert(StatusLogModel newRec) { bool answ = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { bool needInsert = false; // ultimo inserito... var lastRec = localDbCtx .DbSetStatusLog .Where(x => x.MachineId == newRec.MachineId) .OrderByDescending(x => x.DtRif) .FirstOrDefault(); // se non trovato inserisco comunque if (lastRec == null) { needInsert = true; } // se trovato controllo variazione... else { // se cambia stato... if (lastRec.CodStatus != newRec.CodStatus) { needInsert = true; } // oppure se è passato il giorno... else if (lastRec.DtRif.Date < newRec.DtRif.Date) { needInsert = true; } // calcolo durata vecchio record... lastRec.Duration = (float)DateTime.Now.Subtract(lastRec.DtRif).TotalMinutes; } if (needInsert) { localDbCtx .DbSetStatusLog .Add(newRec); } // salvo localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione durante StatusLogInsert{Environment.NewLine}{exc}"); } } await Task.Delay(1); return answ; } /// /// Registrazione record esecuzione task x log /// /// /// public bool TaskExecInsertLog(List recList) { bool answ = false; using (MapoMonoContext localDbCtx = new MapoMonoContext()) { try { localDbCtx .DbSetTaskExec .AddRange(recList); localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione durante TaskExecInsertLog{Environment.NewLine}{exc}"); } } return answ; } #endregion Public Methods #region Private Fields private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields } }