Aggiunto sync x risorse, inventario, ...
This commit is contained in:
@@ -41,34 +41,42 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// - upload + sync (cloud)
|
||||
/// - download + sync (locale)
|
||||
/// </summary>
|
||||
/// <param name="MatCode">Se "" --> tutti, altrimenti limitatamente al MatCode cercato</param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> SyncMaterials()
|
||||
public async Task<bool> MaterialsSync(string MatCode = "")
|
||||
{
|
||||
bool answ = false;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
{
|
||||
// in primis leggo l'elenco materiali dal DB locale
|
||||
MaterialsController matContr = new MaterialsController();
|
||||
var matListDb = matContr.GetFilt("");
|
||||
if (matListDb != null)
|
||||
using (MaterialsController dbContr = new MaterialsController())
|
||||
{
|
||||
List<MaterialDTO> list2send = matListDb.Select(x => MaterialsController.ConvToDto(x)).ToList();
|
||||
// preparo pacchetto invio...
|
||||
answ = await commLib.MaterialsSend(list2send);
|
||||
// se inviato, scarico x merge locale
|
||||
if (answ)
|
||||
// in primis leggo l'elenco materiali dal DB locale
|
||||
List<MaterialModel> matListDb = dbContr.GetFilt(MatCode);
|
||||
if (matListDb != null)
|
||||
{
|
||||
var list2merge = await commLib.MaterialsGet();
|
||||
// effettuo conversione DTO --> model + merge
|
||||
var list2MergeDb = list2merge.Select(x => MaterialsController.ConvFromDto(x)).ToList();
|
||||
// ciclo...
|
||||
if(list2MergeDb != null)
|
||||
List<MaterialDTO> list2send = matListDb.Select(x => MaterialsController.ConvToDto(x)).ToList();
|
||||
// preparo pacchetto invio...
|
||||
answ = await commLib.MaterialsSend(list2send);
|
||||
// se inviato, scarico x merge locale
|
||||
if (answ)
|
||||
{
|
||||
foreach (var item in list2MergeDb)
|
||||
List<MaterialDTO> list2merge = await commLib.MaterialsGet();
|
||||
// se filtro x materiale processo solo quello...
|
||||
if (!string.IsNullOrEmpty(MatCode))
|
||||
{
|
||||
matContr.Upsert(item);
|
||||
list2merge = list2merge.Where(x => x.MatCode == MatCode).ToList();
|
||||
}
|
||||
// effettuo conversione DTO --> model + merge
|
||||
List<MaterialModel> list2MergeDb = list2merge.Select(x => MaterialsController.ConvFromDto(x)).ToList();
|
||||
// ciclo...
|
||||
if (list2MergeDb != null)
|
||||
{
|
||||
foreach (var item in list2MergeDb)
|
||||
{
|
||||
dbContr.Upsert(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -83,29 +91,124 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Esegue sync delle giacenze RawItems:
|
||||
/// Esegue sync risorse (Materiali + RawItem):
|
||||
/// - upload + sync (cloud)
|
||||
/// - download + sync (locale)
|
||||
/// </summary>
|
||||
/// <param name="MatCode">Se "" --> tutti, altrimenti limitatamente al MatCode cercato</param>
|
||||
/// <param name="itemList">Elenco item, saranno inviati x sync (con quantità) SOLO SE RawItemExtId == 0</param>
|
||||
/// <returns></returns>
|
||||
public bool SyncRawItems(string MatCode)
|
||||
public async Task<bool> ResourcesSync(List<RawItemModel> itemList)
|
||||
{
|
||||
bool answ = false;
|
||||
// to be done
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
{
|
||||
using (MaterialsController matDbContr = new MaterialsController())
|
||||
{
|
||||
using (RawItemsController rawItemDbContr = new RawItemsController())
|
||||
{
|
||||
// per prima cosa invio dati
|
||||
Dictionary<int, MaterialDTO> dictMat = new Dictionary<int, MaterialDTO>();
|
||||
// costruisco elenco materiali da inviare in magazzino (se RawItemExtId== 0) ...
|
||||
var rec2sync = itemList.Where(x => x.RawItemExtId == 0).ToList();
|
||||
foreach (var item in rec2sync)
|
||||
{
|
||||
// verifico se mancasse il materiale nel caso lo aggiungo...
|
||||
if (!dictMat.ContainsKey(item.MatId))
|
||||
{
|
||||
var rigaMat = matDbContr.FindByDbId(item.MatId);
|
||||
if (rigaMat != null)
|
||||
{
|
||||
var rigaMatDto = MaterialsController.ConvToDto(rigaMat);
|
||||
dictMat.Add(item.MatId, rigaMatDto);
|
||||
}
|
||||
}
|
||||
// a questo punto aggiungo item nel DTO del dictionary
|
||||
dictMat[item.MatId].ItemList.Add(RawItemsController.ConvToItemDto(item));
|
||||
}
|
||||
// per ogni materiale faccio invio + rilettura/sync...
|
||||
if (dictMat != null && dictMat.Count > 0)
|
||||
{
|
||||
foreach (var matKVP in dictMat)
|
||||
{
|
||||
// invio!
|
||||
answ = await commLib.InventorySend(matKVP.Value);
|
||||
// ora rileggo dati...
|
||||
if (answ)
|
||||
{
|
||||
List<MaterialDTO> list2merge = await commLib.InventoryGet(matKVP.Key);
|
||||
// effettuo conversione DTO --> model + merge
|
||||
List<MaterialModel> list2MergeDb = list2merge.Select(x => MaterialsController.ConvFromDto(x)).ToList();
|
||||
// ciclo...
|
||||
if (list2MergeDb != null)
|
||||
{
|
||||
foreach (var item in list2MergeDb)
|
||||
{
|
||||
matDbContr.Upsert(item);
|
||||
// ora processo 1:1 gli items...
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Invia un set di consumi (stimati) per gli Item gestiti
|
||||
/// Esegue registrazione Risorse (RawItems) come stima:
|
||||
/// </summary>
|
||||
/// <param name="idxProjDbId">DbId del progetto da inviare</param>
|
||||
/// <param name="recType">tipo di registrazione da inviare (stima, consumo, ...)</param>
|
||||
/// <param name="rec2send">record da inviare, se consumo Qty deve essere negativa</param>
|
||||
/// <param name="idxProjDbId">DB Id del progetto x cui si inviano i dati</param>
|
||||
/// <param name="rec2send">Lista items con quantità prevista</param>
|
||||
/// <returns></returns>
|
||||
public bool SendResource(int idxProjDbId, ProjResState recType, List<ResourceDTO> rec2send)
|
||||
public async Task<bool> ResourceSendEstimate(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
{
|
||||
bool answ = false;
|
||||
// to be done
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
{
|
||||
answ = await ResourcesSync(rec2send);
|
||||
if (answ)
|
||||
{
|
||||
// in primis converto le risorse...
|
||||
List<ResourceDTO> list2send = rec2send.Select(x => RawItemsController.ConvToResDto(x)).ToList();
|
||||
// effettuo invio...
|
||||
answ = await commLib.ResourceSend(idxProjDbId, ProjResState.Estimated, list2send);
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Esegue registrazione Risorse (RawItems) come CONSUMI effettivi:
|
||||
/// </summary>
|
||||
/// <param name="idxProjDbId">DB Id del progetto x cui si inviano i dati</param>
|
||||
/// <param name="rec2send">Lista items e quantità consumate, se fossero positive vengono cambiate di segno...</param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> ResourceSendCons(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
{
|
||||
bool answ = false;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
{
|
||||
answ = await ResourcesSync(rec2send);
|
||||
if (answ)
|
||||
{
|
||||
// in primis converto le risorse...
|
||||
List<ResourceDTO> list2send = rec2send.Select(x => RawItemsController.ConvToResDtoNeg(x)).ToList();
|
||||
// effettuo invio...
|
||||
answ = await commLib.ResourceSend(idxProjDbId, ProjResState.Consumed, list2send);
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using EgtBEAMWALL.DataLayer.DatabaseModels;
|
||||
using EgwProxy.MagMan.DTO;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -130,6 +131,75 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione a ResourceDTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static ResourceDTO ConvToResDto(RawItemModel currRec)
|
||||
{
|
||||
ResourceDTO answ = new ResourceDTO()
|
||||
{
|
||||
RawItemId = currRec.RawItemId,
|
||||
Qty = currRec.QtyAvail
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione a ItemDTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static ItemDTO ConvToItemDto(RawItemModel currRec)
|
||||
{
|
||||
ItemDTO answ = new ItemDTO()
|
||||
{
|
||||
MatID= currRec.MatId,
|
||||
ItemID = currRec.RawItemExtId,
|
||||
QtyAvail= currRec.QtyAvail,
|
||||
HMm = currRec.HMm,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm,
|
||||
Note = currRec.Note
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
/// <summary>
|
||||
/// Helper conversione a ResourceDTO con garanzia valori Qty negativi
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static ResourceDTO ConvToResDtoNeg(RawItemModel currRec)
|
||||
{
|
||||
ResourceDTO answ = new ResourceDTO()
|
||||
{
|
||||
RawItemId = currRec.RawItemId,
|
||||
Qty = - Math.Abs(currRec.QtyAvail)
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
/// <summary>
|
||||
/// Helper conversione da ResourceExpDTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static RawItemModel ConvFromResDto(ResourceExpDTO currRec)
|
||||
{
|
||||
RawItemModel answ = new RawItemModel()
|
||||
{
|
||||
RawItemId = currRec.RawItemId,
|
||||
QtyAvail = currRec.Qty,
|
||||
HMm = currRec.HMm,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm,
|
||||
MatId = currRec.MatId,
|
||||
IsActive = currRec.IsActive,
|
||||
Note = currRec.Note
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
#region Private Fields
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -21,6 +21,11 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
|
||||
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||
public int RawItemId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Codice RawMat univoco e in sync (Identificativo DB esterno del magazzino in sync)
|
||||
/// </summary>
|
||||
public int RawItemExtId { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// ForeignKey Materiale
|
||||
/// </summary>
|
||||
@@ -32,7 +37,7 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
|
||||
public int QtyAvail { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Check if is a Remnant
|
||||
/// Check if is active
|
||||
/// </summary>
|
||||
public bool IsActive { get; set; } = false;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user