Completo modirifa x gestione errori su sync

This commit is contained in:
Samuele Locatelli
2024-02-09 18:47:49 +01:00
parent 3b33c1a34d
commit aab825d4fc
@@ -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;
}
}
}
}