You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
4.2 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Volo.Abp.Guids;
using Win_in.Sfs.Wms.DataExchange.Domain;
using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Eos;
using Win_in.Sfs.Wms.DataExchange.Domain.Shared;
using Win_in.Sfs.Wms.DataExchange.WMS.ItemPack;
namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.EosAgent.Incoming;
public class ProductReader : IReader
{
private readonly IProductManager _productManager;
private readonly IIncomingFromExternalManager _incomingFromExternalManager;
private readonly ILogger<ProductReader> _logger;
private readonly IGuidGenerator _guidGenerator;
public ProductReader(
IProductManager productManager
, IIncomingFromExternalManager incomingFromExternalManager
, ILogger<ProductReader> logger
, IGuidGenerator guidGenerator
)
{
_productManager = productManager;
_incomingFromExternalManager = incomingFromExternalManager;
_logger = logger;
_guidGenerator = guidGenerator;
}
public virtual async Task<List<IncomingFromExternal>> ReadAsync()
{
//获取上次同步的最大Eos更新时间
var maxTimeString = await _incomingFromExternalManager.GetDataByMaxEffectiveDate(EnumIncomingDataType.ItemPack.ToString()).ConfigureAwait(false);
//从EOS读取待处理Product
var toBeProcessedProducts = await _productManager.GetToBeProcessedListAsync(maxTimeString).ConfigureAwait(false);
if (!toBeProcessedProducts.Any())
{
_logger.LogInformation("no products");
return new List<IncomingFromExternal>();
}
//Product逐一转换为ItemPack
var incomingDataList = BuildIncomingFromExternalFromProductAsync(toBeProcessedProducts.Where(r => !string.IsNullOrWhiteSpace(r.Code)).ToList());
await _incomingFromExternalManager.CreateBulkAsync(incomingDataList).ConfigureAwait(false);
return incomingDataList;
}
private List<IncomingFromExternal> BuildIncomingFromExternalFromProductAsync(List<Product> toBeProcessedProducts)
{
var incomingDataList = new List<IncomingFromExternal>();
foreach (var product in toBeProcessedProducts)
{
var incomingData_ItemPack = BuildItemPackIncomingFromExternal(product);
incomingData_ItemPack.SetId(_guidGenerator.Create());
incomingData_ItemPack.SetEffectiveDate(Convert.ToDateTime(product.EosDate));
try
{
var itemPack = BuildItemPackExchangeDto(product);
incomingData_ItemPack.DestinationDataContent = JsonSerializer.Serialize(itemPack);
}
catch (Exception ex)
{
incomingData_ItemPack.SetError(EnumExchangeDataErrorCode.Exception, ex.Message, ex.ToString());
}
incomingDataList.Add(incomingData_ItemPack);
}
return incomingDataList;
}
private IncomingFromExternal BuildItemPackIncomingFromExternal(Product product)
{
var incomingData = new IncomingFromExternal()
{
DataType = EnumIncomingDataType.ItemPack.ToString(),
DataAction = EnumExchangeDataAction.Add,
SourceSystem = EnumSystemType.SCP.ToString(),
SourceDataId = product.ERP,
SourceDataGroupCode = product.ERP,
SourceDataDetailCode = product.ERP,
SourceDataContent = JsonSerializer.Serialize(product),
WriteTime = DateTime.Now,
Writer = nameof(EosIncomingBackgroundWorker),
DestinationSystem = EnumSystemType.WMS.ToString(),
};
return incomingData;
}
private static ItemPackExchangeDto BuildItemPackExchangeDto(Product product)
{
var itemPackDto = new ItemPackExchangeDto()
{
ItemCode = product.ERP,
PackCode = string.IsNullOrWhiteSpace(product.Code) ? product.ERP : product.Code,
PackName = product.Name,
Remark = product.Model,
PackUom = product.UnitCode,
Qty = Convert.ToDecimal(product.PackageCount),
SupplierCode = product.SupplierCode,
};
return itemPackDto;
}
}