Completo modirifa x gestione errori su sync
This commit is contained in:
@@ -15,20 +15,6 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// </summary>
|
||||
public class MagmanController : IDisposable
|
||||
{
|
||||
/// <summary>
|
||||
/// Enum del risultato della sincronizzazione
|
||||
/// 0: ALL_OK
|
||||
/// </summary>
|
||||
public enum SyncResult
|
||||
{
|
||||
ALL_OK = 0,
|
||||
ERR_ND,
|
||||
ERR_ServerKo,
|
||||
ERR_CloudMatNotSent,
|
||||
ERR_SrcMatNotFound,
|
||||
ERR_MergeMatEmpty
|
||||
}
|
||||
|
||||
#region Public Constructors
|
||||
|
||||
/// <summary>
|
||||
@@ -58,6 +44,28 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Public Enums
|
||||
|
||||
/// <summary>
|
||||
/// Enum del risultato della sincronizzazione
|
||||
/// 0: ALL_OK
|
||||
/// </summary>
|
||||
public enum SyncResult
|
||||
{
|
||||
ALL_OK = 0,
|
||||
ERR_ND,
|
||||
ERR_ServerKo,
|
||||
ERR_CloudMatNotSent,
|
||||
ERR_CloudResNotSent,
|
||||
ERR_SrcMatNotFound,
|
||||
ERR_MergeMatEmpty,
|
||||
ERR_CloudMatEmpty,
|
||||
ERR_Res2SendEmpty,
|
||||
ERR_InvSendError
|
||||
}
|
||||
|
||||
#endregion Public Enums
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public void Dispose()
|
||||
@@ -71,7 +79,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// - download + sync (locale)
|
||||
/// </summary>
|
||||
/// <param name="MatCode">Se "" esegue per tutti, altrimenti limitatamente al MatCode cercato</param>
|
||||
/// <returns></returns>
|
||||
/// <returns>Risultato sincronizzazione</returns>
|
||||
public SyncResult MaterialsSyncro(string MatCode = "")
|
||||
{
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
@@ -147,7 +155,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// - download + sync (locale)
|
||||
/// </summary>
|
||||
/// <param name="MatCode">Se "" esegue per tutti, altrimenti limitatamente al MatCode cercato</param>
|
||||
/// <returns></returns>
|
||||
/// <returns>Risultato sincronizzazione</returns>
|
||||
public async Task<SyncResult> MaterialsSyncroAsync(string MatCode = "")
|
||||
{
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
@@ -225,20 +233,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// Lista items e quantità consumate, se fossero positive vengono cambiate di segno...
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public bool ResourceSendCons(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
public SyncResult ResourceSendCons(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
{
|
||||
bool answ = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = ResourcesSync(rec2send);
|
||||
if (answ)
|
||||
if (answ == SyncResult.ALL_OK)
|
||||
{
|
||||
// in primis converto le risorse...
|
||||
List<ResourceDTO> list2send = rec2send.Select(x => RawItemsController.ConvToResDtoNeg(x)).ToList();
|
||||
// effettuo invio...
|
||||
answ = commLib.ResourceSend(idxProjDbId, ProjResState.Consumed, list2send);
|
||||
if (list2send == null || list2send.Count == 0)
|
||||
{
|
||||
answ = SyncResult.ERR_Res2SendEmpty;
|
||||
}
|
||||
else
|
||||
{
|
||||
// effettuo invio...
|
||||
bool resOk = commLib.ResourceSend(idxProjDbId, ProjResState.Consumed, list2send);
|
||||
if (!resOk)
|
||||
{
|
||||
answ = SyncResult.ERR_CloudResNotSent;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = SyncResult.ALL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
@@ -252,20 +279,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// Lista items e quantità consumate, se fossero positive vengono cambiate di segno...
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> ResourceSendConsAsync(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
public async Task<SyncResult> ResourceSendConsAsync(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
{
|
||||
bool answ = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = await ResourcesSyncAsync(rec2send);
|
||||
if (answ)
|
||||
if (answ == SyncResult.ALL_OK)
|
||||
{
|
||||
// in primis converto le risorse...
|
||||
List<ResourceDTO> list2send = rec2send.Select(x => RawItemsController.ConvToResDtoNeg(x)).ToList();
|
||||
// effettuo invio...
|
||||
answ = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Consumed, list2send);
|
||||
if (list2send == null || list2send.Count == 0)
|
||||
{
|
||||
answ = SyncResult.ERR_Res2SendEmpty;
|
||||
}
|
||||
else
|
||||
{
|
||||
// effettuo invio...
|
||||
bool resOk = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Consumed, list2send);
|
||||
if (!resOk)
|
||||
{
|
||||
answ = SyncResult.ERR_CloudResNotSent;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = SyncResult.ALL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
@@ -277,20 +323,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// <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 ResourceSendEstimate(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
public SyncResult ResourceSendEstimate(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
{
|
||||
bool answ = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = ResourcesSync(rec2send);
|
||||
if (answ)
|
||||
if (answ == SyncResult.ALL_OK)
|
||||
{
|
||||
// in primis converto le risorse...
|
||||
List<ResourceDTO> list2send = rec2send.Select(x => RawItemsController.ConvToResDto(x)).ToList();
|
||||
// effettuo invio...
|
||||
answ = commLib.ResourceSend(idxProjDbId, ProjResState.Estimated, list2send);
|
||||
if (list2send == null || list2send.Count == 0)
|
||||
{
|
||||
answ = SyncResult.ERR_Res2SendEmpty;
|
||||
}
|
||||
else
|
||||
{
|
||||
// effettuo invio...
|
||||
bool resOk = commLib.ResourceSend(idxProjDbId, ProjResState.Estimated, list2send);
|
||||
if (!resOk)
|
||||
{
|
||||
answ = SyncResult.ERR_CloudResNotSent;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = SyncResult.ALL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
@@ -302,20 +367,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// <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 async Task<bool> ResourceSendEstimateAsync(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
public async Task<SyncResult> ResourceSendEstimateAsync(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
{
|
||||
bool answ = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = await ResourcesSyncAsync(rec2send);
|
||||
if (answ)
|
||||
if (answ == SyncResult.ALL_OK)
|
||||
{
|
||||
// in primis converto le risorse...
|
||||
List<ResourceDTO> list2send = rec2send.Select(x => RawItemsController.ConvToResDto(x)).ToList();
|
||||
// effettuo invio...
|
||||
answ = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Estimated, list2send);
|
||||
if (list2send == null || list2send.Count == 0)
|
||||
{
|
||||
answ = SyncResult.ERR_Res2SendEmpty;
|
||||
}
|
||||
else
|
||||
{
|
||||
// effettuo invio...
|
||||
bool resOk = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Estimated, list2send);
|
||||
if (!resOk)
|
||||
{
|
||||
answ = SyncResult.ERR_CloudResNotSent;
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = SyncResult.ALL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
@@ -326,12 +410,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// - download + sync (locale)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool ResourcesForceSyncAll()
|
||||
public SyncResult ResourcesForceSyncAll()
|
||||
{
|
||||
bool answ = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
using (MaterialsController matDbContr = new MaterialsController())
|
||||
{
|
||||
@@ -339,23 +427,42 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
{
|
||||
// elenco di tutti i materiali
|
||||
var matListAll = commLib.MaterialsGet();
|
||||
// ciclo 1:1 materiali + inventario
|
||||
foreach (var mat in matListAll)
|
||||
if (matListAll == null || matListAll.Count == 0)
|
||||
{
|
||||
List<MaterialDTO> list2merge = commLib.InventoryGet(mat.MatCloudId);
|
||||
// ciclo sui materiali...
|
||||
if (list2merge != null)
|
||||
answ = SyncResult.ERR_CloudMatEmpty;
|
||||
}
|
||||
else
|
||||
{
|
||||
int numMatOk = 0;
|
||||
int numMat2Write = 0;
|
||||
// ciclo 1:1 materiali + inventario
|
||||
foreach (var mat in matListAll)
|
||||
{
|
||||
foreach (var item in list2merge)
|
||||
List<MaterialDTO> list2merge = commLib.InventoryGet(mat.MatCloudId);
|
||||
// ciclo sui materiali...
|
||||
if (list2merge != null)
|
||||
{
|
||||
_ = matDbContr.Insert(MaterialsController.ConvToModel(item));
|
||||
// ora processo 1:1 gli items...
|
||||
foreach (var rawItem in item.ItemList)
|
||||
numMat2Write += list2merge.Count();
|
||||
foreach (var item in list2merge)
|
||||
{
|
||||
rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true));
|
||||
var newId = matDbContr.Insert(MaterialsController.ConvToModel(item));
|
||||
if (newId > 0)
|
||||
{
|
||||
numMatOk++;
|
||||
// ora processo 1:1 gli items...
|
||||
foreach (var rawItem in item.ItemList)
|
||||
{
|
||||
rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// solo se tutto andato bene esito ALL_OK
|
||||
if (numMat2Write == numMatOk)
|
||||
{
|
||||
answ = SyncResult.ALL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -373,12 +480,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// SOLO SE RawItemCloudId == 0
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public bool ResourcesSync(List<int> MatIdList)
|
||||
public SyncResult ResourcesSync(List<int> MatIdList)
|
||||
{
|
||||
bool fatto = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
using (RawItemsController rawItemDbContr = new RawItemsController())
|
||||
{
|
||||
@@ -388,20 +499,28 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
{
|
||||
// recupero elenco rawItem
|
||||
List<RawItemModel> currList = rawItemDbContr.GetFiltModel(item);
|
||||
// verifico se e cosa aggiungere...
|
||||
foreach (var rawItem in currList)
|
||||
if (currList == null || currList.Count == 0)
|
||||
{
|
||||
if (!rawItemList.Contains(rawItem))
|
||||
answ = SyncResult.ERR_Res2SendEmpty;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// verifico se e cosa aggiungere...
|
||||
foreach (var rawItem in currList)
|
||||
{
|
||||
rawItemList.Add(rawItem);
|
||||
if (!rawItemList.Contains(rawItem))
|
||||
{
|
||||
rawItemList.Add(rawItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// effettuo sync alla fine...
|
||||
fatto = ResourcesSync(rawItemList);
|
||||
answ = ResourcesSync(rawItemList);
|
||||
}
|
||||
}
|
||||
return fatto;
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -413,12 +532,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId==0
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public bool ResourcesSync(List<RawItemModel> itemList)
|
||||
public SyncResult ResourcesSync(List<RawItemModel> itemList)
|
||||
{
|
||||
bool answ = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
using (MaterialsController matDbContr = new MaterialsController())
|
||||
{
|
||||
@@ -446,29 +569,46 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
// per ogni materiale faccio invio + rilettura/sync...
|
||||
if (dictMat != null && dictMat.Count > 0)
|
||||
{
|
||||
int numMatOk = 0;
|
||||
int numMat2Write = 0;
|
||||
foreach (var matKVP in dictMat)
|
||||
{
|
||||
// invio!
|
||||
answ = commLib.InventorySend(matKVP.Value.ItemList);
|
||||
bool invOk = commLib.InventorySend(matKVP.Value.ItemList);
|
||||
// ora rileggo dati...
|
||||
if (answ)
|
||||
if (!invOk)
|
||||
{
|
||||
answ = SyncResult.ERR_InvSendError;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
List<MaterialDTO> list2merge = commLib.InventoryGet(matKVP.Key);
|
||||
// ciclo sui materiali...
|
||||
if (list2merge != null)
|
||||
{
|
||||
numMat2Write += list2merge.Count();
|
||||
foreach (var item in list2merge)
|
||||
{
|
||||
_ = matDbContr.Insert(MaterialsController.ConvToModel(item));
|
||||
// ora processo 1:1 gli items...
|
||||
foreach (var rawItem in item.ItemList)
|
||||
var newId = matDbContr.Insert(MaterialsController.ConvToModel(item));
|
||||
if (newId > 0)
|
||||
{
|
||||
rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true));
|
||||
numMatOk++;
|
||||
// ora processo 1:1 gli items...
|
||||
foreach (var rawItem in item.ItemList)
|
||||
{
|
||||
rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// solo se tutto andato bene esito ALL_OK
|
||||
if (numMat2Write == numMatOk)
|
||||
{
|
||||
answ = SyncResult.ALL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -486,12 +626,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// SOLO SE RawItemCloudId == 0
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> ResourcesSyncAsync(List<int> MatIdList)
|
||||
public async Task<SyncResult> ResourcesSyncAsync(List<int> MatIdList)
|
||||
{
|
||||
bool fatto = true;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
using (RawItemsController rawItemDbContr = new RawItemsController())
|
||||
{
|
||||
@@ -500,13 +644,20 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
{
|
||||
// recupero elenco rawItem
|
||||
var currList = rawItemDbContr.GetFiltModel(item);
|
||||
// effettuo sync...
|
||||
bool callOk = await ResourcesSyncAsync(currList);
|
||||
fatto = fatto && callOk;
|
||||
if (currList == null || currList.Count == 0)
|
||||
{
|
||||
answ = SyncResult.ERR_Res2SendEmpty;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// effettuo sync...
|
||||
answ = await ResourcesSyncAsync(currList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return fatto;
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -519,12 +670,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
/// RawItemCloudId == 0
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> ResourcesSyncAsync(List<RawItemModel> itemList)
|
||||
public async Task<SyncResult> ResourcesSyncAsync(List<RawItemModel> itemList)
|
||||
{
|
||||
bool answ = false;
|
||||
SyncResult answ = SyncResult.ERR_ND;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
if (!servOk)
|
||||
{
|
||||
answ = SyncResult.ERR_ServerKo;
|
||||
}
|
||||
else
|
||||
{
|
||||
using (MaterialsController matDbContr = new MaterialsController())
|
||||
{
|
||||
@@ -553,29 +708,46 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
// per ogni materiale faccio invio + rilettura/sync...
|
||||
if (dictMat != null && dictMat.Count > 0)
|
||||
{
|
||||
int numMatOk = 0;
|
||||
int numMat2Write = 0;
|
||||
foreach (var matKVP in dictMat)
|
||||
{
|
||||
// invio!
|
||||
answ = await commLib.InventorySendAsync(matKVP.Value.ItemList);
|
||||
bool invOk = await commLib.InventorySendAsync(matKVP.Value.ItemList);
|
||||
// ora rileggo dati...
|
||||
if (answ)
|
||||
if (!invOk)
|
||||
{
|
||||
answ = SyncResult.ERR_InvSendError;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
List<MaterialDTO> list2merge = await commLib.InventoryGetAsync(matKVP.Key);
|
||||
// ciclo sui materiali...
|
||||
if (list2merge != null)
|
||||
{
|
||||
numMat2Write += list2merge.Count();
|
||||
foreach (var item in list2merge)
|
||||
{
|
||||
_ = matDbContr.Insert(MaterialsController.ConvToModel(item));
|
||||
// ora processo 1:1 gli items...
|
||||
foreach (var rawItem in item.ItemList)
|
||||
var newId = matDbContr.Insert(MaterialsController.ConvToModel(item));
|
||||
if (newId > 0)
|
||||
{
|
||||
rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true));
|
||||
numMatOk++;
|
||||
// ora processo 1:1 gli items...
|
||||
foreach (var rawItem in item.ItemList)
|
||||
{
|
||||
rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// solo se tutto andato bene esito ALL_OK
|
||||
if (numMat2Write == numMatOk)
|
||||
{
|
||||
answ = SyncResult.ALL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user