using System; using System.Collections.Generic; using System.Linq; using System.Text; using EgtBEAMWALL.DataLayer.DatabaseModels; namespace EgtBEAMWALL.DataLayer.Controllers { public class ProdController : IDisposable { #region Private Fields private DatabaseContext dbCtx; #endregion Private Fields #region Public Fields public static ProdController man = new ProdController(); #endregion Public Fields #region Public Constructors public ProdController() { // Initialize database context dbCtx = new DatabaseContext(Constants.CONNECTION_STRING); } #endregion Public Constructors #region Protected Methods /// /// Get LAST paginated data from DB (DESC ordered) /// /// /// protected List GetLastDbModelDesc(int numRecord) { // se numRecord = 0 --> passo tutti if (numRecord == 0) { numRecord = dbCtx.ProdList.Count(); } // retrieve return dbCtx .ProdList .OrderByDescending(x => x.ProdId) .Take(numRecord) .ToList(); } protected List ProjIdByProd(int ProdId) { return DbManager.obj.ProjCtr.GetByProdAsc(ProdId).Select(y => y.ProjId).ToList(); } #endregion Protected Methods #region Public Methods /// /// Aggiunta di un PROJ ad un PROD /// /// /// /// public bool AddProj(int ProdId, int ProjId) { bool done = false; // cerco Prod var currProd = dbCtx .ProdList .Where(x => x.ProdId == ProdId) .FirstOrDefault(); // cerco Proj var currProj = dbCtx .ProjList .Where(x => x.ProjId == ProjId) .FirstOrDefault(); // lo aggiorno currProj.ProjDbId = currProd.ProdDbId; currProj.Locked = true; // salvo dbCtx.SaveChanges(); return done; } public bool DeleteProd(int ProdId) { bool done = false; var currProd = FindByProdId(ProdId); // sel delle BTLParts da proj var machGroup2del = dbCtx .MachGroupList .Where(x => x.ProdDbId == currProd.ProdDbId); try { // remove from database dbCtx.MachGroupList.RemoveRange(machGroup2del); dbCtx.ProdList.Remove(currProd); // Commit changes dbCtx.SaveChanges(); done = true; } catch (Exception exc) { Console.WriteLine($"EXCEPTION on DeleteProd: {exc}"); } return done; } public void Dispose() { // Clear database context dbCtx.Dispose(); } /// /// Get record by ProdDbId /// /// /// public ProdModel FindByProdDbId(int ProdDbId) { return dbCtx .ProdList .Where(x => x.ProdDbId == ProdDbId) .SingleOrDefault(); } /// /// Get record by ProdId /// /// /// public ProdModel FindByProdId(int ProdId) { return dbCtx .ProdList .Where(x => x.ProdId == ProdId) .SingleOrDefault(); } /// /// Get record by ProdId ass Core.ProdFileM /// /// /// public Core.ProdFileM FindCoreByProdId(int ProdId) { var currProd = FindByProdId(ProdId); return Core.ProdFileM.CreateProdFileM(currProd.ProdId, ProjIdByProd(ProdId), currProd.DtCreated, currProd.Description); } /// /// Elenco progetti /// /// /// public List GetLastDesc(int numRecord) { List result = new List(); var dbResult = GetLastDbModelDesc(numRecord); // conversione result = dbResult.Select(x => Core.ProdFileM.CreateProdFileM(x.ProdId, ProjIdByProd(x.ProdId), x.DtCreated, x.Description)).ToList(); return result; } /// /// Fornisce nuovo indice VUOTO da usare (allocando sul DB) /// /// /// public int GetNextIndex(int ProjId) { int nextId = 0; // cerco se ne ho ALMENO 1.... var numRec = dbCtx.ProdList.Count(); if (numRec == 0) { nextId = 1; } else { // retrieve ultimo... var maxRecord = dbCtx .ProdList .OrderByDescending(x => x.ProdId) .Take(1) .FirstOrDefault(); // incremento nextId = maxRecord.ProdId + 1; } // creo nuovo PROD... var newProd = dbCtx .ProdList .Add(new ProdModel() { ProdId = nextId, Locked = true, DtCreated = DateTime.Now }); // cerco Proj var currProj = dbCtx .ProjList .Where(x => x.ProjId == ProjId) .FirstOrDefault(); // aggiungo proj-prod currProj.ProdDbId = newProd.ProdDbId; currProj.Locked = true; // Commit changes dbCtx.SaveChanges(); return nextId; } /// /// Manage Lock by ProdId (proj & prod) /// /// ProjID /// Stato Lock da impostare /// public ProdModel LockByProdId(int ProdId, bool Locked) { // seleziono il prod... var currProd = dbCtx .ProdList .Where(x => x.ProdId == ProdId) .SingleOrDefault(); if (currProd != null) { currProd.Locked = Locked; dbCtx.Entry(currProd).State = System.Data.Entity.EntityState.Modified; var currProj = dbCtx .ProjList .Where(x => x.ProdDbId == currProd.ProdDbId) .ToList(); //currProj.ForEach(x => x.Locked = Locked); foreach (var item in currProj) { item.Locked = Locked; dbCtx.Entry(item).State = System.Data.Entity.EntityState.Modified; } } dbCtx.SaveChanges(); return currProd; } /// /// Update single PROD /// /// /// public bool Update(ProdModel updItem) { bool done = false; var item2update = dbCtx .ProdList .Where(x => x.ProdDbId == updItem.ProdDbId) .SingleOrDefault(); try { // update, vers 1... dbCtx.Entry(item2update).CurrentValues.SetValues(updItem); //// update, vers 2 //dbCtx.PartList.Remove(item2del); //dbCtx.PartList.Add(updItem); // Commit changes dbCtx.SaveChanges(); done = true; } catch { } return done; } /// /// Update record su DB x elenco MachGroup: /// - NON vengono eliminati record (se ce ne son altri sul DB non saranno toccati) /// - i record ESISTENTI (per MachGroup.ID) saranno aggiornati (tranne start/end/status) /// - i record NON ESISTENTI (per MachGroup.ID) saranno AGGIUNTI (tranne start/end/status) /// /// Id del Prod /// Elenco MachGroup da associare /// public ProdModel UpdateMachGroup(int ProdId, List MachGroupList) { // Recupero il PROD ProdModel currData = FindByProdId(ProdId); try { // preparo elenco List itemsMG2Add = new List(); List MachGroupList2Add = new List(); List PartList2Add = new List(); // cerco le MG esistenti --> aggiorno foreach (var item in MachGroupList) { var currMG = dbCtx .MachGroupList .Where(x => x.Prod.ProdId == ProdId && x.MachGroupId == item.Id) .SingleOrDefault(); var convCurrMG = MachGroupController.ConvertFromCore(item, currData.ProdDbId); if (currMG != null) { // se non identico x equality limitata a ViewOptim... if (!currMG.ViewOptimEquals(convCurrMG)) { // aggiorno con nuovi valori ricevuti currMG.H = convCurrMG.H; currMG.L = convCurrMG.L; currMG.W = convCurrMG.W; currMG.Material = convCurrMG.Material; currMG.Name = convCurrMG.Name; // salvo dbCtx.SaveChanges(); } } else { itemsMG2Add.Add(convCurrMG); } } // aggiungo MachGroup dbCtx.MachGroupList.AddRange(itemsMG2Add); // Commit changes dbCtx.SaveChanges(); // verifico di nuovo l'elenco delle MG x le relative PART... foreach (var item in MachGroupList) { int MachGroupDbId = MachGroupController.man.FindByMachGroupId(item.Id).MachGroupDbId; // verifico se uguali o meno... foreach (var currPartM in item.PartMList) { var currPart = dbCtx .PartList .Where(x => x.MachGroup.Prod.ProdId == ProdId && x.MachGroup.MachGroupId == item.Id && x.PartId == currPartM.nPartId) .SingleOrDefault(); var convCurrPartM = PartController.ConvertFromCore(currPartM, MachGroupDbId); if (currPart != null) { // se non identico x equality limitata a ViewOptim... if (!currPart.ViewOptimEquals(convCurrPartM)) { // aggiorno con nuovi valori ricevuti currPart.H = convCurrPartM.H; currPart.L = convCurrPartM.L; currPart.W = convCurrPartM.W; currPart.Material = convCurrPartM.Material; currPart.CALC_State = convCurrPartM.CALC_State; currPart.ROT = convCurrPartM.ROT; currPart.PDN = convCurrPartM.PDN; currPart.NAM = convCurrPartM.NAM; // salvo dbCtx.SaveChanges(); } } else { PartList2Add.Add(convCurrPartM); } } } // aggiungo PartList dbCtx.PartList.AddRange(PartList2Add); // Commit changes dbCtx.SaveChanges(); // aggiorno valore isNew a false x PROD currData.IsNew = false; // Commit changes dbCtx.SaveChanges(); } catch (Exception exc) { Console.WriteLine($"EXCEPTION on UpdateMachGroup: {exc}"); } return currData; } #endregion Public Methods } }