659 lines
23 KiB
C#
659 lines
23 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using EgtBEAMWALL.DataLayer.DatabaseModels;
|
|
using static EgtBEAMWALL.Core.ConstBeam;
|
|
|
|
namespace EgtBEAMWALL.DataLayer.Controllers
|
|
{
|
|
public class ProdController : IDisposable
|
|
{
|
|
#region Private Fields
|
|
|
|
#if false
|
|
private DatabaseContext localDbCtx;
|
|
#endif
|
|
|
|
#endregion Private Fields
|
|
|
|
#region Public Fields
|
|
|
|
public static ProdController man = new ProdController();
|
|
|
|
#endregion Public Fields
|
|
|
|
#region Public Constructors
|
|
|
|
public ProdController()
|
|
{
|
|
#if false
|
|
// Initialize database context
|
|
localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING);
|
|
#endif
|
|
}
|
|
|
|
#endregion Public Constructors
|
|
|
|
#region Protected Methods
|
|
|
|
/// <summary>
|
|
/// Helper conversione modelli
|
|
/// </summary>
|
|
/// <param name="currProd"></param>
|
|
/// <returns></returns>
|
|
protected Core.ProdFileM coreConv(ProdModel currProd)
|
|
{
|
|
Core.ProdFileM answ = Core.ProdFileM.CreateProdFileM(currProd.ProdId, ProjIdByProd(currProd.ProdId), currProd.DtCreated, currProd.Description, currProd.PType, currProd.Machine);
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get LAST paginated data from DB (DESC ordered)
|
|
/// </summary>
|
|
/// <param name="numRecord"></param>
|
|
/// <returns></returns>
|
|
protected List<ProdModel> GetLastDbModelDesc(int numRecord)
|
|
{
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
// se numRecord = 0 --> passo tutti
|
|
if (numRecord == 0)
|
|
{
|
|
numRecord = localDbCtx.ProdList.Count();
|
|
}
|
|
// retrieve
|
|
return localDbCtx
|
|
.ProdList
|
|
.OrderByDescending(x => x.ProdId)
|
|
.Take(numRecord)
|
|
.ToList();
|
|
}
|
|
}
|
|
|
|
protected List<int> ProjIdByProd(int ProdId)
|
|
{
|
|
return DbManager.obj.ProjCtr.GetByProdAsc(ProdId).Select(y => y.nProjId).ToList();
|
|
}
|
|
|
|
#endregion Protected Methods
|
|
|
|
#region Public Methods
|
|
|
|
/// <summary>
|
|
/// Aggiunta di un PROJ ad un PROD
|
|
/// </summary>
|
|
/// <param name="ProdId"></param>
|
|
/// <param name="ProjId"></param>
|
|
/// <returns></returns>
|
|
public bool AddProj(int ProdId, int ProjId)
|
|
{
|
|
bool done = false;
|
|
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
// cerco Prod
|
|
var currProd = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdId == ProdId)
|
|
.FirstOrDefault();
|
|
|
|
// cerco Proj
|
|
var currProj = localDbCtx
|
|
.ProjList
|
|
.Where(x => x.ProjId == ProjId)
|
|
.FirstOrDefault();
|
|
|
|
// lo aggiorno
|
|
currProj.ProdDbId = currProd.ProdDbId;
|
|
currProj.Locked = true;
|
|
|
|
// salvo
|
|
localDbCtx.SaveChanges();
|
|
#if false
|
|
ResetController();
|
|
#endif
|
|
}
|
|
return done;
|
|
}
|
|
|
|
public bool DeleteProd(int ProdId)
|
|
{
|
|
bool done = false;
|
|
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
var currProd = FindByProdId(ProdId);
|
|
|
|
// sel dei proj da aggiornare...
|
|
var proj2update = localDbCtx
|
|
.ProjList
|
|
.Where(x => x.ProdDbId == currProd.ProdDbId)
|
|
.ToList();
|
|
|
|
// sel dei MachGroup da prod
|
|
var machGroup2del = localDbCtx
|
|
.MachGroupList
|
|
.Where(x => x.ProdDbId == currProd.ProdDbId)
|
|
.ToList();
|
|
|
|
// selezione dei part da machgroup
|
|
var part2del = localDbCtx
|
|
.PartList
|
|
.Where(x => x.MachGroup.ProdDbId == currProd.ProdDbId)
|
|
.ToList();
|
|
|
|
try
|
|
{
|
|
// update proj...
|
|
foreach (var item in proj2update)
|
|
{
|
|
item.ProdDbId = null;
|
|
}
|
|
//// salvo
|
|
//localDbCtx.SaveChanges();
|
|
// remove from database
|
|
localDbCtx.PartList.RemoveRange(part2del);
|
|
//// salvo
|
|
//localDbCtx.SaveChanges();
|
|
localDbCtx.MachGroupList.RemoveRange(machGroup2del);
|
|
//// salvo
|
|
//localDbCtx.SaveChanges();
|
|
localDbCtx.ProdList.Remove(currProd);
|
|
// salvo
|
|
localDbCtx.SaveChanges();
|
|
#if false
|
|
ResetController();
|
|
#endif
|
|
done = true;
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
Console.WriteLine($"EXCEPTION on DeleteProd: {exc}");
|
|
}
|
|
}
|
|
return done;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
#if false
|
|
// Clear database context
|
|
localDbCtx.Dispose();
|
|
#endif
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get record by ProdDbId
|
|
/// </summary>
|
|
/// <param name="ProdDbId"></param>
|
|
/// <returns></returns>
|
|
public ProdModel FindByProdDbId(int ProdDbId)
|
|
{
|
|
ProdModel answ;
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
answ = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdDbId == ProdDbId)
|
|
.SingleOrDefault();
|
|
#if false
|
|
// forzo rilettura
|
|
if (answ != null)
|
|
{
|
|
localDbCtx.Entry(answ).Reload();
|
|
}
|
|
#endif
|
|
}
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get record by ProdId
|
|
/// </summary>
|
|
/// <param name="ProdId"></param>
|
|
/// <returns></returns>
|
|
public ProdModel FindByProdId(int ProdId)
|
|
{
|
|
ProdModel answ;
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
answ = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdId == ProdId)
|
|
.SingleOrDefault();
|
|
#if false
|
|
// forzo rilettura
|
|
if (answ != null)
|
|
{
|
|
localDbCtx.Entry(answ).Reload();
|
|
}
|
|
#endif
|
|
}
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get record by ProdId ass Core.ProdFileM
|
|
/// </summary>
|
|
/// <param name="ProdId"></param>
|
|
/// <returns></returns>
|
|
public Core.ProdFileM FindCoreByProdId(int ProdId)
|
|
{
|
|
var currProd = FindByProdId(ProdId);
|
|
if (currProd == null)
|
|
{
|
|
return null;
|
|
}
|
|
return Core.ProdFileM.CreateProdFileM(currProd.ProdId, ProjIdByProd(ProdId), currProd.DtCreated, currProd.Description, currProd.PType, currProd.Machine);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Elenco progetti
|
|
/// </summary>
|
|
/// <param name="numRecord"></param>
|
|
/// <returns></returns>
|
|
public List<Core.ProdFileM> GetLastDesc(int numRecord)
|
|
{
|
|
List<Core.ProdFileM> result = new List<Core.ProdFileM>();
|
|
var dbResult = GetLastDbModelDesc(numRecord);
|
|
// conversione
|
|
result = dbResult.Select(x => Core.ProdFileM.CreateProdFileM(x.ProdId, ProjIdByProd(x.ProdId), x.DtCreated, x.Description, x.PType, x.Machine)).ToList();
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Fornisce nuovo indice VUOTO da usare (allocando sul DB)
|
|
/// </summary>
|
|
/// <param name="ProjId"></param>
|
|
/// <returns></returns>
|
|
public int GetNextIndex(int ProjId)
|
|
{
|
|
int nextId = 0;
|
|
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
// cerco se ne ho ALMENO 1....
|
|
var numRec = localDbCtx.ProdList.Count();
|
|
if (numRec == 0)
|
|
{
|
|
nextId = 1;
|
|
}
|
|
else
|
|
{
|
|
// retrieve ultimo...
|
|
var maxRecord = localDbCtx
|
|
.ProdList
|
|
.OrderByDescending(x => x.ProdId)
|
|
.Take(1)
|
|
.FirstOrDefault();
|
|
// incremento
|
|
nextId = maxRecord.ProdId + 1;
|
|
}
|
|
|
|
// creo nuovo PROD...
|
|
var newProd = localDbCtx
|
|
.ProdList
|
|
.Add(new ProdModel() { ProdId = nextId, Locked = true, DtCreated = DateTime.Now });
|
|
|
|
// cerco Proj
|
|
var currProj = localDbCtx
|
|
.ProjList
|
|
.Where(x => x.ProjId == ProjId)
|
|
.FirstOrDefault();
|
|
|
|
// aggiungo proj-prod
|
|
currProj.ProdDbId = newProd.ProdDbId;
|
|
currProj.Locked = true;
|
|
|
|
// Commit changes
|
|
localDbCtx.SaveChanges();
|
|
}
|
|
return nextId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 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?)
|
|
/// </summary>
|
|
/// <param name="ProdId"></param>
|
|
/// <returns></returns>
|
|
public bool IsAnyInSupervisor(int ProdId)
|
|
{
|
|
int numAssigned = 0;
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
// cerco se ci siano assegnati a supervisor
|
|
numAssigned = localDbCtx
|
|
.MachGroupList
|
|
.Where(x => x.Prod.ProdId == ProdId && (!string.IsNullOrEmpty(x.SupervisorId) || x.State >= 0))
|
|
.Count();
|
|
}
|
|
return numAssigned > 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Manage Lock by ProdId (proj & prod)
|
|
/// </summary>
|
|
/// <param name="ProdId">ProjID</param>
|
|
/// <param name="Locked">Stato Lock da impostare</param>
|
|
/// <returns></returns>
|
|
public ProdModel LockByProdId(int ProdId, bool Locked)
|
|
{
|
|
ProdModel currProd;
|
|
// seleziono il prod...
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
currProd = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdId == ProdId)
|
|
.SingleOrDefault();
|
|
|
|
if (currProd != null)
|
|
{
|
|
currProd.Locked = Locked;
|
|
localDbCtx.Entry(currProd).State = System.Data.Entity.EntityState.Modified;
|
|
|
|
var currProj = localDbCtx
|
|
.ProjList
|
|
.Where(x => x.ProdDbId == currProd.ProdDbId)
|
|
.ToList();
|
|
|
|
//currProj.ForEach(x => x.Locked = Locked);
|
|
foreach (var item in currProj)
|
|
{
|
|
item.Locked = Locked;
|
|
localDbCtx.Entry(item).State = System.Data.Entity.EntityState.Modified;
|
|
}
|
|
}
|
|
|
|
localDbCtx.SaveChanges();
|
|
#if false
|
|
ResetController();
|
|
#endif
|
|
}
|
|
return currProd;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Return Lock by ProdId (proj & prod)
|
|
/// </summary>
|
|
/// <param name="ProdId">ProjID</param>
|
|
/// <returns></returns>
|
|
public bool IsLockByProdId(int ProdId)
|
|
{
|
|
bool bIsLock = false;
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
// seleziono il prod...
|
|
var currProd = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdId == ProdId)
|
|
.FirstOrDefault();
|
|
|
|
if (currProd != null)
|
|
{
|
|
bIsLock = currProd.Locked;
|
|
|
|
var currProj = localDbCtx
|
|
.ProjList
|
|
.Where(x => x.ProdDbId == currProd.ProdDbId)
|
|
.ToList();
|
|
|
|
if (currProj != null && !bIsLock)
|
|
{
|
|
bIsLock = currProj.Any(x => x.Locked);
|
|
}
|
|
}
|
|
}
|
|
return bIsLock;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reinizializzaizone del controller
|
|
/// </summary>
|
|
public void ResetController()
|
|
{
|
|
#if false
|
|
// Re-Initialize database context
|
|
localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING);
|
|
#endif
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update single PROD
|
|
/// </summary>
|
|
/// <param name="updItem"></param>
|
|
/// <returns></returns>
|
|
public bool Update(ProdModel updItem)
|
|
{
|
|
bool done = false;
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
var item2update = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdDbId == updItem.ProdDbId)
|
|
.SingleOrDefault();
|
|
try
|
|
{
|
|
// update, vers 1...
|
|
localDbCtx.Entry(item2update).CurrentValues.SetValues(updItem);
|
|
|
|
//// update, vers 2
|
|
//localDbCtx.PartList.Remove(item2del);
|
|
//localDbCtx.PartList.Add(updItem);
|
|
|
|
// Commit changes
|
|
localDbCtx.SaveChanges();
|
|
#if false
|
|
ResetController();
|
|
#endif
|
|
done = true;
|
|
}
|
|
catch
|
|
{ }
|
|
}
|
|
return done;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 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)
|
|
/// </summary>
|
|
/// <param name="ProdId">Id del Prod</param>
|
|
/// <param name="MachGroupList">Elenco MachGroup da associare</param>
|
|
/// <returns></returns>
|
|
public ProdModel UpdateMachGroup(int ProdId, List<Core.MyMachGroupM> MachGroupList)
|
|
{
|
|
// Recupero il PROD
|
|
ProdModel currData = FindByProdId(ProdId);
|
|
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
try
|
|
{
|
|
// preparo elenco
|
|
List<MachGroupModel> itemsMG2Add = new List<MachGroupModel>();
|
|
|
|
List<Core.MyMachGroupM> MachGroupList2Add = new List<Core.MyMachGroupM>();
|
|
List<PartModel> PartList2Add = new List<PartModel>();
|
|
// cerco le MG esistenti --> aggiorno
|
|
foreach (var item in MachGroupList)
|
|
{
|
|
#if false
|
|
var currMG = localDbCtx
|
|
.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
|
|
localDbCtx.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("", ProdId, item.Id, Core.StatusMapItemType.MachGroup, Core.StatusMapOpType.MachGroupAdd, "");
|
|
}
|
|
}
|
|
// aggiungo MachGroup
|
|
localDbCtx.MachGroupList.AddRange(itemsMG2Add);
|
|
// Commit changes
|
|
localDbCtx.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 modMg = false;
|
|
// verifico se uguali o meno...
|
|
foreach (var currPartM in item.PartMList)
|
|
{
|
|
var currPart = localDbCtx
|
|
.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
|
|
localDbCtx.SaveChanges();
|
|
modMg = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PartList2Add.Add(convCurrPartM);
|
|
modMg = true;
|
|
}
|
|
}
|
|
// verifico se salvare...
|
|
if (modMg)
|
|
{
|
|
StatusMapController.man.UpdateAction(currMG.SupervisorId, ProdId, currMG.MachGroupId, Core.StatusMapItemType.MachGroup, Core.StatusMapOpType.MachGroupMod, "");
|
|
}
|
|
}
|
|
|
|
// aggiungo PartList
|
|
localDbCtx.PartList.AddRange(PartList2Add);
|
|
// Commit changes
|
|
localDbCtx.SaveChanges();
|
|
|
|
// sel dei MachGroup da prod OLD
|
|
List<MachGroupModel> itemsMGOld = localDbCtx
|
|
.MachGroupList
|
|
.Where(x => x.Prod.ProdId == ProdId)
|
|
.ToList();
|
|
// elenco degli ID del MachGroup NON trovati
|
|
List<int> MgId2rem = itemsMGOld.Select(x => x.MachGroupId).Except(MachGroupList.Select(y => y.Id)).ToList();
|
|
// processo i MachGroup eliminati
|
|
foreach (var item in MgId2rem)
|
|
{
|
|
MachGroupController.man.Delete(ProdId, item);
|
|
}
|
|
|
|
// aggiorno valore isNew a false x PROD
|
|
currData.IsNew = false;
|
|
|
|
// Commit changes
|
|
localDbCtx.SaveChanges();
|
|
#if false
|
|
ResetController();
|
|
#endif
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
Console.WriteLine($"EXCEPTION on UpdateMachGroup: {exc}");
|
|
}
|
|
}
|
|
return currData;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update record su DB x PType
|
|
/// </summary>
|
|
/// <param name="ProdId"></param>
|
|
/// <param name="PType"></param>
|
|
/// <returns></returns>
|
|
public Core.ProdFileM UpdatePType(int ProdId, BWType PType)
|
|
{
|
|
ProdModel currData;
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
currData = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdId == ProdId)
|
|
.SingleOrDefault();
|
|
// aggiorno valore BTL
|
|
currData.PType = PType;
|
|
|
|
// Commit changes
|
|
localDbCtx.SaveChanges();
|
|
#if false
|
|
ResetController();
|
|
#endif
|
|
}
|
|
return coreConv(currData);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update record su DB x PType
|
|
/// </summary>
|
|
/// <param name="ProdId"></param>
|
|
/// <param name="Machine"></param>
|
|
/// <returns></returns>
|
|
public Core.ProdFileM UpdateMachine(int ProdId, String Machine)
|
|
{
|
|
ProdModel currData;
|
|
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
|
|
{
|
|
currData = localDbCtx
|
|
.ProdList
|
|
.Where(x => x.ProdId == ProdId)
|
|
.SingleOrDefault();
|
|
// aggiorno valore BTL
|
|
currData.Machine = Machine;
|
|
|
|
// Commit changes
|
|
localDbCtx.SaveChanges();
|
|
#if false
|
|
ResetController();
|
|
#endif
|
|
}
|
|
return coreConv(currData);
|
|
}
|
|
|
|
#endregion Public Methods
|
|
}
|
|
} |