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 _logger; private readonly IGuidGenerator _guidGenerator; public ProductReader( IProductManager productManager , IIncomingFromExternalManager incomingFromExternalManager , ILogger logger , IGuidGenerator guidGenerator ) { _productManager = productManager; _incomingFromExternalManager = incomingFromExternalManager; _logger = logger; _guidGenerator = guidGenerator; } public virtual async Task> 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(); } //Product逐一转换为ItemPack var incomingDataList = BuildIncomingFromExternalFromProductAsync(toBeProcessedProducts.Where(r => !string.IsNullOrWhiteSpace(r.Code)).ToList()); await _incomingFromExternalManager.CreateBulkAsync(incomingDataList).ConfigureAwait(false); return incomingDataList; } private List BuildIncomingFromExternalFromProductAsync(List toBeProcessedProducts) { var incomingDataList = new List(); 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; } }