Update metodi gestione MagMan
This commit is contained in:
@@ -16,8 +16,6 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
private DataSyncro commLib = null;
|
||||
|
||||
/// <summary>
|
||||
/// Init controller gestione MagmanSync
|
||||
/// </summary>
|
||||
@@ -30,18 +28,21 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
Log.Info($"Avviato MagmanController | server: {ServerAddress} | CheckRemote OK: {servOk}");
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
commLib = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Esegue sync materiali:
|
||||
/// - upload + sync (cloud)
|
||||
/// - download + sync (locale)
|
||||
/// </summary>
|
||||
/// <param name="MatCode">Se "" --> tutti, altrimenti limitatamente al MatCode cercato</param>
|
||||
/// <param name="MatCode">Se "" --> tutti, altrimenti limitatamente al MatCode cercato</param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> MaterialsSync(string MatCode = "")
|
||||
{
|
||||
@@ -85,78 +86,28 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
return answ;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
commLib = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Esegue sync risorse (Materiali + RawItem):
|
||||
/// - upload + sync (cloud)
|
||||
/// - download + sync (locale)
|
||||
/// Esegue registrazione Risorse (RawItems) come CONSUMI effettivi:
|
||||
/// </summary>
|
||||
/// <param name="itemList">Elenco item, saranno inviati x sync (con quantità) SOLO SE RawItemExtId == 0</param>
|
||||
/// <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> ResourcesSync(List<RawItemModel> itemList)
|
||||
public async Task<bool> ResourceSendCons(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
{
|
||||
bool answ = false;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
{
|
||||
using (MaterialsController matDbContr = new MaterialsController())
|
||||
answ = await ResourcesSync(rec2send);
|
||||
if (answ)
|
||||
{
|
||||
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...
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
// 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;
|
||||
@@ -188,35 +139,85 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Esegue registrazione Risorse (RawItems) come CONSUMI effettivi:
|
||||
/// Esegue sync risorse (Materiali + RawItem):
|
||||
/// - upload + sync (cloud)
|
||||
/// - download + sync (locale)
|
||||
/// </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>
|
||||
/// <param name="itemList">
|
||||
/// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId
|
||||
/// == 0
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> ResourceSendCons(int idxProjDbId, List<RawItemModel> rec2send)
|
||||
public async Task<bool> ResourcesSync(List<RawItemModel> itemList)
|
||||
{
|
||||
bool answ = false;
|
||||
// verifico server ok
|
||||
bool servOk = commLib.CheckRemote();
|
||||
if (servOk)
|
||||
{
|
||||
answ = await ResourcesSync(rec2send);
|
||||
if (answ)
|
||||
using (MaterialsController matDbContr = new MaterialsController())
|
||||
{
|
||||
// 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);
|
||||
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 RawItemCloudId==
|
||||
// 0) ...
|
||||
var rec2sync = itemList.Where(x => x.RawItemCloudId == 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);
|
||||
// ciclo sui materiali...
|
||||
if (list2merge != null)
|
||||
{
|
||||
foreach (var item in list2merge)
|
||||
{
|
||||
matDbContr.Upsert(MaterialsController.ConvFromDto(item));
|
||||
// ora processo 1:1 gli items...
|
||||
foreach (var rawItem in item.ItemList)
|
||||
{
|
||||
rawItemDbContr.Upsert(RawItemsController.ConvFromItemDto(rawItem, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private DataSyncro commLib = null;
|
||||
|
||||
/// <summary>
|
||||
/// Istanza logger
|
||||
/// </summary>
|
||||
|
||||
@@ -22,6 +22,46 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione da DTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static MaterialModel ConvFromDto(MaterialDTO currRec)
|
||||
{
|
||||
MaterialModel answ = new MaterialModel()
|
||||
{
|
||||
MatCloudId = currRec.MatCloudId,
|
||||
MatId = currRec.MatLocalId,
|
||||
MatCode = currRec.MatCode,
|
||||
MatDesc = currRec.MatDesc,
|
||||
HMm = currRec.HMm,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione a DTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static MaterialDTO ConvToDto(MaterialModel currRec)
|
||||
{
|
||||
MaterialDTO answ = new MaterialDTO()
|
||||
{
|
||||
MatCloudId = currRec.MatCloudId,
|
||||
MatLocalId = currRec.MatId,
|
||||
MatCode = currRec.MatCode,
|
||||
MatDesc = currRec.MatDesc,
|
||||
HMm = currRec.HMm,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete by key
|
||||
/// </summary>
|
||||
@@ -104,7 +144,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
var item2update = localDbCtx
|
||||
.MaterialsList
|
||||
.Where(x => x.MatId == updItem.MatId
|
||||
|| x.MatExtId == updItem.MatExtId
|
||||
|| x.MatCloudId == updItem.MatCloudId
|
||||
|| (x.MatCode == updItem.MatCode && x.WMm == updItem.WMm && x.HMm == updItem.HMm && x.LMm == updItem.LMm))
|
||||
.SingleOrDefault();
|
||||
|
||||
@@ -129,42 +169,6 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
return fatto;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione a DTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static MaterialDTO ConvToDto(MaterialModel currRec)
|
||||
{
|
||||
MaterialDTO answ = new MaterialDTO() {
|
||||
MatID = currRec.MatId,
|
||||
MatDesc = currRec.MatDesc,
|
||||
MatCode = currRec.MatCode,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm,
|
||||
HMm = currRec.HMm
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
/// <summary>
|
||||
/// Helper conversione da DTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static MaterialModel ConvFromDto(MaterialDTO currRec)
|
||||
{
|
||||
MaterialModel answ = new MaterialModel()
|
||||
{
|
||||
MatExtId = currRec.MatID,
|
||||
MatDesc = currRec.MatDesc,
|
||||
MatCode = currRec.MatCode,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm,
|
||||
HMm = currRec.HMm
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
@@ -22,6 +22,109 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione da ItemDTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <param name="isActive"></param>
|
||||
/// <returns></returns>
|
||||
public static RawItemModel ConvFromItemDto(ItemDTO currRec, bool isActive)
|
||||
{
|
||||
RawItemModel answ = new RawItemModel()
|
||||
{
|
||||
RawItemCloudId = currRec.RawItemCloudId,
|
||||
RawItemId = currRec.RawItemLocalId,
|
||||
QtyAvail = currRec.QtyAvail,
|
||||
HMm = currRec.HMm,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm,
|
||||
MatId = currRec.MatLocalId,
|
||||
IsRemn = currRec.IsRemn,
|
||||
IsActive = isActive,
|
||||
Note = currRec.Note
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione da ResourceExpDTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <param name="matLocalId"></param>
|
||||
/// <returns></returns>
|
||||
public static RawItemModel ConvFromResDto(ResourceExpDTO currRec, int matLocalId)
|
||||
{
|
||||
RawItemModel answ = new RawItemModel()
|
||||
{
|
||||
RawItemCloudId = currRec.RawItemCloudId,
|
||||
RawItemId = currRec.RawItemLocalId,
|
||||
QtyAvail = currRec.Qty,
|
||||
HMm = currRec.HMm,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm,
|
||||
MatId = matLocalId,
|
||||
IsRemn = currRec.IsRemn,
|
||||
IsActive = currRec.IsActive,
|
||||
Note = currRec.Note
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione a ItemDTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static ItemDTO ConvToItemDto(RawItemModel currRec)
|
||||
{
|
||||
ItemDTO answ = new ItemDTO()
|
||||
{
|
||||
MatCloudId = currRec.MaterialNav != null ? currRec.MaterialNav.MatCloudId : 0,
|
||||
MatLocalId = currRec.MatId,
|
||||
RawItemCloudId = currRec.RawItemCloudId,
|
||||
RawItemLocalId = currRec.RawItemId,
|
||||
IsRemn = currRec.IsRemn,
|
||||
QtyAvail = currRec.QtyAvail,
|
||||
HMm = currRec.HMm,
|
||||
LMm = currRec.LMm,
|
||||
WMm = currRec.WMm,
|
||||
Note = currRec.Note
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper conversione a ResourceDTO
|
||||
/// </summary>
|
||||
/// <param name="currRec"></param>
|
||||
/// <returns></returns>
|
||||
public static ResourceDTO ConvToResDto(RawItemModel currRec)
|
||||
{
|
||||
ResourceDTO answ = new ResourceDTO()
|
||||
{
|
||||
RawItemCloudId = currRec.RawItemCloudId,
|
||||
RawItemLocalId = currRec.RawItemId,
|
||||
Qty = currRec.QtyAvail
|
||||
};
|
||||
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()
|
||||
{
|
||||
RawItemCloudId = currRec.RawItemCloudId,
|
||||
RawItemLocalId = currRec.RawItemId,
|
||||
Qty = -Math.Abs(currRec.QtyAvail)
|
||||
};
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete by key
|
||||
/// </summary>
|
||||
@@ -83,7 +186,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
|
||||
{
|
||||
return localDbCtx
|
||||
.RawItemList
|
||||
.Where(x => MatId==0 || x.MatId== MatId)
|
||||
.Where(x => MatId == 0 || x.MatId == MatId)
|
||||
.OrderBy(x => x.LMm)
|
||||
.ThenBy(x => x.WMm)
|
||||
.ToList();
|
||||
@@ -131,75 +234,6 @@ 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>
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<HintPath>..\ExtLibs\EgtWPFLib5.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="EgwProxy.MagMan, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\EgwProxy.MagMan.1.0.2401.2914\lib\EgwProxy.MagMan.dll</HintPath>
|
||||
<HintPath>..\packages\EgwProxy.MagMan.1.0.2401.3108\lib\EgwProxy.MagMan.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
|
||||
@@ -218,6 +218,10 @@
|
||||
<Compile Include="Migrations\202401181534084_AddAliasMaterialRawItemsModel.designer.cs">
|
||||
<DependentUpon>202401181534084_AddAliasMaterialRawItemsModel.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Migrations\202401291722150_FixMatItemCloudId.cs" />
|
||||
<Compile Include="Migrations\202401291722150_FixMatItemCloudId.designer.cs">
|
||||
<DependentUpon>202401291722150_FixMatItemCloudId.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Migrations\Configuration.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Utils.cs" />
|
||||
@@ -269,6 +273,9 @@
|
||||
<EmbeddedResource Include="Migrations\202401181534084_AddAliasMaterialRawItemsModel.resx">
|
||||
<DependentUpon>202401181534084_AddAliasMaterialRawItemsModel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Migrations\202401291722150_FixMatItemCloudId.resx">
|
||||
<DependentUpon>202401291722150_FixMatItemCloudId.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<packages>
|
||||
<package id="BouncyCastle" version="1.8.5" targetFramework="net472" />
|
||||
<package id="DotNetZip" version="1.16.0" targetFramework="net472" />
|
||||
<package id="EgwProxy.MagMan" version="1.0.2401.2914" targetFramework="net472" />
|
||||
<package id="EgwProxy.MagMan" version="1.0.2401.3108" targetFramework="net472" />
|
||||
<package id="EntityFramework" version="6.4.4" targetFramework="net452" />
|
||||
<package id="Google.Protobuf" version="3.21.9" targetFramework="net472" />
|
||||
<package id="K4os.Compression.LZ4" version="1.3.5" targetFramework="net472" />
|
||||
|
||||
Reference in New Issue
Block a user