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(DbConfig.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.nProjId).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.ProdDbId = currProd.ProdDbId; currProj.Locked = true; // salvo dbCtx.SaveChanges(); ResetController(); return done; } public bool DeleteProd(int ProdId) { bool done = false; var currProd = FindByProdId(ProdId); // sel dei proj da aggiornare... var proj2update = dbCtx .ProjList .Where(x => x.ProdDbId == currProd.ProdDbId) .ToList(); // sel dei MachGroup da prod var machGroup2del = dbCtx .MachGroupList .Where(x => x.ProdDbId == currProd.ProdDbId) .ToList(); // selezione dei part da machgroup var part2del = dbCtx .PartList .Where(x => x.MachGroup.ProdDbId == currProd.ProdDbId) .ToList(); try { // update proj... foreach (var item in proj2update) { item.ProdDbId = null; } //// salvo //dbCtx.SaveChanges(); // remove from database dbCtx.PartList.RemoveRange(part2del); //// salvo //dbCtx.SaveChanges(); dbCtx.MachGroupList.RemoveRange(machGroup2del); //// salvo //dbCtx.SaveChanges(); dbCtx.ProdList.Remove(currProd); // salvo dbCtx.SaveChanges(); ResetController(); 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) { var answ = dbCtx .ProdList .Where(x => x.ProdDbId == ProdDbId) .SingleOrDefault(); // forzo rilettura if (answ != null) { dbCtx.Entry(answ).Reload(); } return answ; } /// /// Get record by ProdId /// /// /// public ProdModel FindByProdId(int ProdId) { var answ = dbCtx .ProdList .Where(x => x.ProdId == ProdId) .SingleOrDefault(); // forzo rilettura if (answ != null) { dbCtx.Entry(answ).Reload(); } return answ; } /// /// 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, currProd.PType); } /// /// 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, x.PType)).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; } /// /// Verifica prod assegnato a supervisor: /// ...se c'e' anche un solo machgroup del prod assegnato ad un supervisor o in stato 0 (dovrebbe essere la stessa cosa?) /// /// /// public bool IsAnyInSupervisor(int ProdId) { // cerco se ci siano assegnati a supervisor var numAssigned = dbCtx .MachGroupList .Where(x => x.Prod.ProdId == ProdId && (!string.IsNullOrEmpty(x.SupervisorId) || x.State >= 0)) .Count(); return numAssigned > 0; } /// /// 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(); ResetController(); return currProd; } /// /// Reinizializzaizone del controller /// public void ResetController() { // Re-Initialize database context dbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING); } /// /// 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(); ResetController(); 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) { #if false var currMG = dbCtx .MachGroupList .Where(x => x.Prod.ProdId == ProdId && x.MachGroupId == item.Id) .SingleOrDefault(); #endif var currMG = MachGroupController.man.FindByMachGroupId(ProdId, item.Id); 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(); // registro modifica StatusMap StatusMapController.man.UpdateAction(currMG.SupervisorId, ProdId, currMG.MachGroupId, Core.StatusMapItemType.MachGroup, Core.StatusMapOpType.MachGroupMod, ""); } } else { itemsMG2Add.Add(convCurrMG); // registro modifica StatusMap StatusMapController.man.UpdateAction(currMG.SupervisorId, ProdId, currMG.MachGroupId, Core.StatusMapItemType.MachGroup, Core.StatusMapOpType.MachGroupAdd, ""); } } // 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) { var currMG = MachGroupController.man.FindByMachGroupId(ProdId, item.Id); int MachGroupDbId = currMG.MachGroupDbId; bool addMg = false; bool modMg = false; // 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(); modMg = true; } } else { PartList2Add.Add(convCurrPartM); addMg = true; } } // verifico se salvare... if (modMg) { StatusMapController.man.UpdateAction(currMG.SupervisorId, ProdId, currMG.MachGroupId, Core.StatusMapItemType.MachGroup, Core.StatusMapOpType.MachGroupMod, ""); } if(addMg) { StatusMapController.man.UpdateAction(currMG.SupervisorId, ProdId, currMG.MachGroupId, Core.StatusMapItemType.MachGroup, Core.StatusMapOpType.MachGroupAdd, ""); } } // aggiungo PartList dbCtx.PartList.AddRange(PartList2Add); // Commit changes dbCtx.SaveChanges(); // aggiorno valore isNew a false x PROD currData.IsNew = false; // Commit changes dbCtx.SaveChanges(); ResetController(); } catch (Exception exc) { Console.WriteLine($"EXCEPTION on UpdateMachGroup: {exc}"); } return currData; } #endregion Public Methods } }