using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Volo.Abp.Guids; using Volo.Abp.ObjectMapping; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Wms.DataExchange.Domain; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp; using Win_in.Sfs.Wms.DataExchange.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.WMS.PurchasePrice; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Incoming; public class PurchasePriceReader : IReader { private readonly IPurchasePriceManager _iPurchasePriceManager; private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly ILogger _logger; private readonly IGuidGenerator _guidGenerator; private readonly IConfiguration _configuration; private readonly IPurchasePriceSheetAppService _purchasePriceAppService; private readonly IObjectMapper _objectMapper; public PurchasePriceReader( IPurchasePriceManager iPurchasePriceManager , IIncomingFromExternalManager incomingFromExternalManager , IGuidGenerator guidGenerator , ILogger logger , IConfiguration configuration, IPurchasePriceSheetAppService purchasePriceSheetAppService, IObjectMapper objectMapper ) { _guidGenerator = guidGenerator; _configuration = configuration; _iPurchasePriceManager = iPurchasePriceManager; _incomingFromExternalManager = incomingFromExternalManager; _logger = logger; _purchasePriceAppService = purchasePriceSheetAppService; _objectMapper = objectMapper; } public virtual async Task> ReadAsync() { //从Tyrp读取待处理PurchasePrice var toBeProcessedPurchasePrices = await _iPurchasePriceManager.GetToBeProcessedListAsync().ConfigureAwait(false); if (!toBeProcessedPurchasePrices.Any()) { _logger.LogInformation("no PurchasePrices"); return new List(); } //获取wms采购单价数据 SfsBaseDataRequestInputBase input = new SfsBaseDataRequestInputBase(); var wmsPurchasePrices = await _purchasePriceAppService.GetAllListByFilterAsync(input).ConfigureAwait(false); var wmsToPurchasePriceExchangeDtos = _objectMapper.Map, List>(wmsPurchasePrices); List eosToBomExchangeDtos = new List(); foreach (var toBeProcessedPurchasePrice in toBeProcessedPurchasePrices) { var purchasePrice = BuildScrapNoteOrderExchangeMes(toBeProcessedPurchasePrice); eosToBomExchangeDtos.Add(purchasePrice); } //和wms和eos数据进行比较,获取需要处理得数据 var updateDatas = eosToBomExchangeDtos.Except(wmsToPurchasePriceExchangeDtos).ToList(); if (!updateDatas.Any()) { _logger.LogInformation("no PurchasePrices"); return new List(); } //PurchasePrice逐一转换为PurchasePrice var incomingDataList = BuildIncomingFromExternalFromBomAsync(updateDatas, toBeProcessedPurchasePrices); await _incomingFromExternalManager.CreateBulkAsync(incomingDataList).ConfigureAwait(false); return incomingDataList; } private List BuildIncomingFromExternalFromBomAsync(List updateDatas,List toBeProcessedPurchasePrices) { var incomingDataList = new List(); foreach (var data in updateDatas) { var item = toBeProcessedPurchasePrices.FirstOrDefault(r => r.ismout_part == data.ItemCode && r.ismout_vend == data.SupplierCode); var incomingData = BuildIncomingFromExternal(item); incomingData.SetEffectiveDate(DateTime.Now); try { incomingData.DestinationDataContent = JsonSerializer.Serialize(data); incomingData.SetId(_guidGenerator.Create()); } catch (Exception ex) { incomingData.SetError(EnumExchangeDataErrorCode.Exception, ex.Message, ex.ToString()); } incomingDataList.Add(incomingData); } return incomingDataList; } private IncomingFromExternal BuildIncomingFromExternal(ismout PurchasePrice) { var incomingData = new IncomingFromExternal() { DataType = EnumIncomingDataType.PurchasePrice.ToString(), DataAction = EnumExchangeDataAction.Add, SourceSystem = EnumSystemType.ERP.ToString(), SourceDataId = PurchasePrice.ismout_part, SourceDataGroupCode = PurchasePrice.ismout_part, SourceDataDetailCode = PurchasePrice.ismout_vend, SourceDataContent = JsonSerializer.Serialize(PurchasePrice), WriteTime = DateTime.Now, Writer = nameof(TyrpIncomingBackgroundWorker), DestinationSystem = EnumSystemType.ERP.ToString(), }; return incomingData; } private static PurchasePriceExchangeDto BuildScrapNoteOrderExchangeMes(ismout PurchasePrice) { var price = new PurchasePriceExchangeDto() { ItemCode = PurchasePrice.ismout_part, SupplierCode = PurchasePrice.ismout_vend, PurchasePrice = PurchasePrice.ismout_price, Description = "接口同步", }; return price; } }