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; 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.ErpLocationItem; using Win_in.Sfs.Wms.DataExchange.WMS.ItemBasic; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Incoming; public class ErpLocationItemReader : IReader { private readonly IErpLocationItemManager _ilocdoutManager; private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly ILogger _logger; private readonly IGuidGenerator _guidGenerator; private readonly IConfiguration _configuration; private readonly IErpLocationItemAppService _erpLocationItemAppService; private readonly IObjectMapper _objectMapper; public ErpLocationItemReader( IErpLocationItemManager ilocdoutManager , IIncomingFromExternalManager incomingFromExternalManager , IGuidGenerator guidGenerator , ILogger logger , IConfiguration configuration , IErpLocationItemAppService erpLocationItemAppService , IObjectMapper objectMapper ) { _guidGenerator = guidGenerator; _configuration = configuration; _ilocdoutManager = ilocdoutManager; _incomingFromExternalManager = incomingFromExternalManager; _logger = logger; _erpLocationItemAppService = erpLocationItemAppService; _objectMapper = objectMapper; } public virtual async Task> ReadAsync() { //从Tyrp读取待处理locdout var toBeProcessedItems = await _ilocdoutManager.GetToBeProcessedListAsync().ConfigureAwait(false); //获取wms开账数据 SfsBaseDataRequestInputBase input = new SfsBaseDataRequestInputBase(); var wmsErpLocationItems = await _erpLocationItemAppService.GetAllListByFilterAsync(input).ConfigureAwait(false); var wmsToErpLocationItemExchangeDtos = _objectMapper.Map, List>(wmsErpLocationItems); List tyrpToItemBasicExchangeDtos = new List(); foreach (var locdout in toBeProcessedItems) { var erpLocationItem = BuildErpLocationItemExchangeMes(locdout); tyrpToItemBasicExchangeDtos.Add(erpLocationItem); } //和wms和tyrp数据进行比较,获取需要处理得数据 var updateDatas = tyrpToItemBasicExchangeDtos.Except(wmsToErpLocationItemExchangeDtos).ToList(); if (!updateDatas.Any()) { _logger.LogInformation("未读到Tyrp开账数据"); return new List(); } List incomingDataList = new List(); foreach (var data in updateDatas) { var item = toBeProcessedItems.FirstOrDefault(r => r.locdout_loc == data.ErpLocationCode&&r.locdout_part==data.ItemCode); 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); } await _incomingFromExternalManager.CreateBulkAsync(incomingDataList).ConfigureAwait(false); return incomingDataList; } private IncomingFromExternal BuildIncomingFromExternal(locdout locdout) { var incomingData = new IncomingFromExternal() { DataType = EnumIncomingDataType.ErpLocationItem.ToString(), DataAction = EnumExchangeDataAction.Add, SourceSystem = EnumSystemType.ERP.ToString(), SourceDataId = locdout.locdout_loc, SourceDataGroupCode = locdout.locdout_loc, SourceDataDetailCode = locdout.locdout_part, SourceDataContent = JsonSerializer.Serialize(locdout), WriteTime = DateTime.Now, Writer = nameof(TyrpIncomingBackgroundWorker), DestinationSystem = EnumSystemType.ERP.ToString(), }; return incomingData; } private ErpLocationItemExchangeDto BuildErpLocationItemExchangeMes(locdout locdout) { var cust = new ErpLocationItemExchangeDto() { ErpLocationCode = locdout.locdout_loc, ItemCode = locdout.locdout_part, }; return cust; } }