Files
gwms/GWMS.Data/Controllers/GWMSController.cs
T
Samuele Locatelli 149f6251f7 Renaming localDbCtx
2021-08-31 16:48:48 +02:00

627 lines
21 KiB
C#

using GWMS.Data.DatabaseModels;
using GWMS.Data.DTO;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace GWMS.Data.Controllers
{
public class GWMSController : IDisposable
{
#region Private Fields
private static IConfiguration _configuration;
private static GWMSContext dbCtx;
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
#endregion Private Fields
#region Public Constructors
public GWMSController(IConfiguration configuration)
{
_configuration = configuration;
dbCtx = new GWMSContext(configuration);
//Log.Info("Avviata classe GWMSController");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Calcola DataOra arrotondata per eccesso secondo intervallo minuti indicato
/// </summary>
/// <param name="dateOrig"></param>
/// <param name="minInt"></param>
/// <returns></returns>
public DateTime DateRoundEnd(DateTime dateOrig, int minInt)
{
int minRound = (int)Math.Ceiling((double)dateOrig.Minute / minInt) * minInt;
DateTime roundDate = dateOrig.Date.AddHours(dateOrig.Hour).AddMinutes(minRound);
return roundDate;
}
public void Dispose()
{
// Clear database context
dbCtx.Dispose();
//Log.Info("Dispose di GWMSController");
}
public List<ConfigModel> GetConfig()
{
var dbResult = dbCtx
.DbSetConfig
.ToList();
return dbResult;
}
public List<ItemModel> GetItems()
{
var dbResult = dbCtx
.DbSetItems
.ToList();
return dbResult;
}
public OrderModel GetOrderByCode(string OrderCode)
{
OrderModel dbResult = new OrderModel();
using (GWMSContext localDbCtx = new GWMSContext(_configuration))
{
dbResult = localDbCtx
.DbSetOrders
.Where(x => (x.OrderCode == OrderCode))
.Include(p => p.Plant)
.Include(s => s.Supplier)
.Include(t => t.Transporter)
.FirstOrDefault();
}
return dbResult;
}
public List<OrderModel> GetOrdersFilt(int PlantId, int SupplierId, int TransporterId, DateTime DtStart, DateTime DtEnd, bool ShowClosed)
{
var dbResult = dbCtx
.DbSetOrders
.Where(x => (x.PlantId == PlantId || PlantId == 0) && (x.SupplierId == SupplierId || SupplierId == 0) && (x.TransporterId == TransporterId || TransporterId == 0) && (x.DtOrder >= DtStart && x.DtOrder <= DtEnd) && (x.ExecutionQty == 0 || ShowClosed))
.Include(p => p.Plant)
.Include(s => s.Supplier)
.Include(t => t.Transporter)
.OrderByDescending(x => x.DtOrder)
.ToList();
return dbResult;
}
public List<OrderModel> GetOrdersOpen(int PlantId)
{
var dbResult = dbCtx
.DbSetOrders
.Where(x => (x.PlantId == PlantId || PlantId == 0) && (x.DtExecStart < x.DtOrder))
.Include(p => p.Plant)
.Include(s => s.Supplier)
.Include(t => t.Transporter)
.OrderByDescending(x => x.DtOrder)
.ToList();
return dbResult;
}
public PlantDetailModel GetPlant(int PlantId)
{
var dbResult = dbCtx
.DbSetPlant
.Where(x => x.PlantId == PlantId)
.FirstOrDefault();
return dbResult;
}
/// <summary>
/// Elenco log registrati x plant
/// </summary>
/// <param name="PlantId">se 0 = tutto</param>
/// <param name="DtMaxDate">consigliato arrotondamento al minuto o multiplo</param>
/// <param name="numRec">num rec max da recuperare</param>
/// <returns></returns>
public List<PlantLogModel> GetPlantLog(int PlantId, DateTime DtMaxDate, int numRec)
{
var dbResult = dbCtx
.DbSetPlantLog
.Where(x => (x.PlantId == PlantId || PlantId == 0) && x.DtEvent <= DtMaxDate)
.OrderByDescending(x => x.DtEvent)
.Take(numRec)
.ToList();
return dbResult;
}
public List<PlantDetailModel> GetPlants()
{
var dbResult = dbCtx
.DbSetPlant
.ToList();
return dbResult;
}
public List<PlantDTO> GetPlantsDTO(int maxRecords)
{
List<PlantDTO> dbResult = new List<PlantDTO>();
using (GWMSContext localDbCtx = new GWMSContext(_configuration))
{
var plantList = localDbCtx
.DbSetPlant
.ToList();
dbResult = plantList
.Select(x => PlantDTO(x.PlantId, maxRecords))
.ToList();
}
return dbResult;
}
/// <summary>
/// Restituisce ultimi eventi rebootlog
/// </summary>
/// <param name="maxNum">num eventi, se 0 = tutti</param>
/// <returns></returns>
public List<RebootLogModel> GetRebootLog(int maxNum = 100)
{
if (maxNum == 0)
{
maxNum = dbCtx.DbRebootLog.Count();
}
var dbResult = dbCtx
.DbRebootLog
.OrderByDescending(x => x.DtEvent)
.Take(maxNum)
.ToList();
return dbResult;
}
public List<SupplierModel> GetSuppliers()
{
var dbResult = dbCtx
.DbSetSupplier
.ToList();
return dbResult;
}
public List<TransporterModel> GetTransporters()
{
var dbResult = dbCtx
.DbSetTransporter
.ToList();
return dbResult;
}
public List<UserModel> GetUsersFilt(UserLevel UsrLvl, int PlantId, int SupplierId, int TransporterId)
{
var dbResult = dbCtx
.DbSetUser
.Where(x => (x.Livello == UsrLvl || UsrLvl == UserLevel.ND) && (x.MaskPlantId == PlantId || PlantId == 0) && (x.MaskSupplierId == SupplierId || SupplierId == 0) && (x.MaskTranspId == TransporterId || TransporterId == 0))
.OrderBy(x => x.Livello)
.ThenBy(x => x.UserName)
.ToList();
return dbResult;
}
public List<WeekPlanModel> GetWeekPlan()
{
List<WeekPlanModel> dbResult = new List<WeekPlanModel>();
using (GWMSContext localDbCtx = new GWMSContext(_configuration))
{
dbResult = localDbCtx
.DbSetPlantSupplWeekPlan
.Include(p => p.Plant)
.Include(s => s.Supplier)
.Include(t => t.Transporter)
.ToList();
}
return dbResult;
}
public bool HasPlantLog()
{
bool answ = false;
try
{
var numRecord = dbCtx
.DbSetPlantLog
.Count();
answ = numRecord > 0;
}
catch
{ }
return answ;
}
/// <summary>
/// Eliminazione di un ordine
/// </summary>
/// <param name="Item2Del"></param>
/// <returns></returns>
public bool OrderDelete(OrderModel Item2Del)
{
bool done = false;
try
{
if (Item2Del != null)
{
dbCtx
.DbSetOrders
.Remove(Item2Del);
dbCtx.SaveChanges();
done = true;
}
}
catch (Exception exc)
{ }
return done;
}
/// <summary>
/// Aggiunta in blocco di Ordini
/// </summary>
/// <param name="newItems"></param>
/// <returns></returns>
public bool OrderInsert(List<OrderModel> newItems)
{
bool done = false;
try
{
dbCtx
.DbSetOrders
.AddRange(newItems);
dbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{ }
return done;
}
/// <summary>
/// Aggiorna un Ordine
/// </summary>
/// <param name="updItem"></param>
/// <returns></returns>
public bool OrderUpdate(OrderModel updItem)
{
bool done = false;
try
{
OrderModel currData = null;
currData = dbCtx
.DbSetOrders
.Where(x => x.OrderId == updItem.OrderId)
.FirstOrDefault();
if (currData != null)
{
using (GWMSContext localDbCtx = new GWMSContext(_configuration))
{
// se ho modificato data --> cambio codice ordine!
if (!localDbCtx.Entry(updItem).OriginalValues["DtOrder"].Equals(localDbCtx.Entry(updItem).CurrentValues["DtOrder"]))
{
updItem.OrderCode = $"O{updItem.Plant.PlantCode}{updItem.DtOrder:yyMMddHHmm}";
updItem.OrderDesc = $"Ordine {updItem.Plant.PlantDesc} - {updItem.DtOrder}";
}
localDbCtx.Entry(updItem).State = EntityState.Modified;
localDbCtx.SaveChanges();
}
}
else
{
dbCtx
.DbSetOrders
.Add(updItem);
dbCtx.SaveChanges();
}
done = true;
}
catch (Exception exc)
{ }
return done;
}
/// <summary>
/// Recupero info PLANT modalità DTO
/// </summary>
/// <param name="PlantId">Impianto</param>
/// <param name="PlantId">Max numero di record da recuperare</param>
/// <returns></returns>
public PlantDTO PlantDTO(int PlantId, int maxRecords)
{
DateTime lastRec = DateTime.Today;
var currPlant = GetPlant(PlantId);
PlantDTO answ = new PlantDTO();
List<TSData> LevelTS = new List<TSData>();
Dictionary<string, double> PressAct = new Dictionary<string, double>();
Dictionary<string, List<TSData>> PressTS = new Dictionary<string, List<TSData>>();
List<TSData> PressMainTS = new List<TSData>();
List<TSData> PressBHTS = new List<TSData>();
List<TSData> PressBLTS = new List<TSData>();
List<TSData> OrderTS = new List<TSData>();
using (GWMSContext localDbCtx = new GWMSContext(_configuration))
{
// recupero dal DB
var rawLevelData = localDbCtx
.DbSetPlantLog
.Where(x => x.FluxType == "Level" && x.PlantId == PlantId)
.OrderByDescending(x => x.DtEvent)
.Take(maxRecords)
.OrderBy(x => x.DtEvent)
.ToList();
var rawMainPressData = localDbCtx
.DbSetPlantLog
.Where(x => x.FluxType == "MainPress" && x.PlantId == PlantId)
.OrderByDescending(x => x.DtEvent)
.Take(maxRecords)
.OrderBy(x => x.DtEvent)
.ToList();
var rawBHPressData = localDbCtx
.DbSetPlantLog
.Where(x => x.FluxType == "PressBH" && x.PlantId == PlantId)
.OrderByDescending(x => x.DtEvent)
.Take(maxRecords)
.OrderBy(x => x.DtEvent)
.ToList();
var rawBLPressData = localDbCtx
.DbSetPlantLog
.Where(x => x.FluxType == "PressBL" && x.PlantId == PlantId)
.OrderByDescending(x => x.DtEvent)
.Take(maxRecords)
.OrderBy(x => x.DtEvent)
.ToList();
var rawOrderData = localDbCtx
.DbSetOrders
.Where(x => x.PlantId == PlantId && x.ExecutionQty == 0)
.OrderByDescending(x => x.DtOrder)
.Take(maxRecords)
.OrderBy(x => x.DtOrder)
.ToList();
LevelTS = rawLevelData
.Select(x => new TSData() { DtEvent = x.DtEvent, ValDouble = x.ValNumber }).ToList();
OrderTS = rawOrderData
.Select(x => new TSData() { DtEvent = x.DtOrder, ValDouble = x.OrderQty }).ToList();
PressMainTS = rawMainPressData
.Select(x => new TSData() { DtEvent = x.DtEvent, ValDouble = x.ValNumber }).ToList();
PressBHTS = rawBHPressData
.Select(x => new TSData() { DtEvent = x.DtEvent, ValDouble = x.ValNumber }).ToList();
PressBLTS = rawBLPressData
.Select(x => new TSData() { DtEvent = x.DtEvent, ValDouble = x.ValNumber }).ToList();
PressTS.Add("Main", PressMainTS);
PressTS.Add("BH", PressBHTS);
PressTS.Add("BL", PressBLTS);
double actLevel = LevelTS.Count > 0 ? LevelTS.OrderByDescending(x => x.DtEvent).Take(1).FirstOrDefault().ValDouble : 0;
double valMain = PressMainTS.Count > 0 ? PressMainTS.OrderByDescending(x => x.DtEvent).Take(1).FirstOrDefault().ValDouble : 0;
double valBH = PressBHTS.Count > 0 ? PressBHTS.OrderByDescending(x => x.DtEvent).Take(1).FirstOrDefault().ValDouble : 0;
double valBL = PressBLTS.Count > 0 ? PressBLTS.OrderByDescending(x => x.DtEvent).Take(1).FirstOrDefault().ValDouble : 0;
lastRec = LevelTS.Count > 0 ? LevelTS.OrderByDescending(x => x.DtEvent).Take(1).FirstOrDefault().DtEvent : DateTime.Today;
PressAct.Add("Main", valMain);
PressAct.Add("BH", valBH);
PressAct.Add("BL", valBL);
// popolo valolri
answ = new PlantDTO()
{
LastUpdate = lastRec,
PlantId = PlantId,
PlantCode = currPlant.PlantCode,
PlantDesc = currPlant.PlantDesc,
LevelAct = actLevel,
LevelMax = currPlant.LevelMax,
LevelReorder = currPlant.LevelReorder,
OrderQtyStd = currPlant.OrderQtyStd,
PressAct = PressAct,
LevelTS = LevelTS,
PressTS = PressTS,
OrderTS = OrderTS
};
}
return answ;
}
/// <summary>
/// Recupero da DB l'ultimo record per ogni flusso
/// </summary>
/// <returns></returns>
public List<PlantLogModel> PlantLogGetLastByFlux(int PlantId)
{
List<PlantLogModel> lastRec = dbCtx
.DbSetPlantLog
.Where(x => x.PlantId == PlantId)
.OrderByDescending(o => o.DtEvent)
.Take(1000)
.AsEnumerable()
.GroupBy(g => g.FluxType)
.Select(s => s.First())
.ToList();
return lastRec;
}
/// <summary>
/// Inserimento di un set di record x plant log
/// </summary>
/// <param name="PlantLogModel">Record da inserire (senza ID...)</param>
/// <returns></returns>
public bool PlantLogInsertNew(List<PlantLogModel> newItems)
{
bool fatto = false;
try
{
dbCtx
.DbSetPlantLog
.AddRange(newItems);
dbCtx.SaveChanges();
fatto = true;
}
catch (Exception exc)
{
Log.Error(exc, $"Eccezione durante PlantLogInsertNew per {newItems.Count} rec");
}
return fatto;
}
public bool RecordRebootLog(RebootLogModel newItem)
{
bool done = false;
try
{
dbCtx
.DbRebootLog
.Add(newItem);
dbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{ }
return done;
}
public void ResetController()
{
dbCtx = new GWMSContext(_configuration);
}
/// <summary>
/// Annulla modifiche su una specifica entity (cancel update)
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public bool rollBackEntity(object item)
{
bool answ = false;
try
{
if (dbCtx.Entry(item).State == EntityState.Deleted || dbCtx.Entry(item).State == EntityState.Modified)
{
dbCtx.Entry(item).Reload();
}
}
catch (Exception exc)
{
Log.Error($"Eccezione in rollBackEntity{Environment.NewLine}{exc}");
}
return answ;
}
/// <summary>
/// Aggiorna un User
/// </summary>
/// <param name="updItem"></param>
/// <returns></returns>
public bool UserUpdate(UserModel updItem)
{
bool done = false;
try
{
var currData = dbCtx
.DbSetUser
.Where(x => x.UserId == updItem.UserId)
.FirstOrDefault();
if (currData != null)
{
dbCtx.Entry(updItem).State = EntityState.Modified;
}
else
{
dbCtx
.DbSetUser
.Add(updItem);
}
dbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{ }
return done;
}
/// <summary>
/// Elimina un item WeekPlan
/// </summary>
/// <param name="selRecord"></param>
/// <returns></returns>
public bool WeekPlanDelete(WeekPlanModel selRecord)
{
bool done = false;
try
{
var item2del = dbCtx
.DbSetPlantSupplWeekPlan
.Where(x => x.WeekPlanId == selRecord.WeekPlanId)
.FirstOrDefault();
dbCtx.DbSetPlantSupplWeekPlan.Remove(item2del);
dbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{ }
return done;
}
/// <summary>
/// Aggiorna un item WeekPlan
/// </summary>
/// <param name="updItem"></param>
/// <returns></returns>
public bool WeekPlanUpdate(WeekPlanModel updItem)
{
bool done = false;
try
{
var currData = dbCtx
.DbSetPlantSupplWeekPlan
.Where(x => x.WeekPlanId == updItem.WeekPlanId)
.FirstOrDefault();
if (currData != null)
{
dbCtx.Entry(updItem).State = EntityState.Modified;
}
else
{
dbCtx
.DbSetPlantSupplWeekPlan
.Add(updItem);
}
dbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{ }
return done;
}
#endregion Public Methods
}
}