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.Bom; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Incoming; public class BomReader : IReader { private readonly IBomManager _ibomManager; private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly ILogger _logger; private readonly IGuidGenerator _guidGenerator; private readonly IObjectMapper _objectMapper; private readonly IBomAppService _bomAppService; private readonly IConfiguration _configuration; public BomReader( IBomManager ibomManager , IIncomingFromExternalManager incomingFromExternalManager , IGuidGenerator guidGenerator , ILogger logger , IBomAppService bomAppService , IObjectMapper objectMapper , IConfiguration configuration ) { _guidGenerator = guidGenerator; _ibomManager = ibomManager; _incomingFromExternalManager = incomingFromExternalManager; _logger = logger; _bomAppService = bomAppService; _objectMapper = objectMapper; _configuration = configuration; } public virtual async Task> ReadAsync() { //从Tyrp读取待处理bom var toBeProcessedBoms = await _ibomManager.GetToBeProcessedListAsync().ConfigureAwait(false); //获取wmsBom数据 SfsBaseDataRequestInputBase input = new SfsBaseDataRequestInputBase(); var wmsBoms = await _bomAppService.GetAllListByFilterAsync(input).ConfigureAwait(false); var wmsToBomExchangeDtos = _objectMapper.Map, List>(wmsBoms); List eosToBomExchangeDtos = new List(); foreach (var toBeProcessedBom in toBeProcessedBoms) { var bom = BuildBomOrderExchangeTyrp(toBeProcessedBom); eosToBomExchangeDtos.Add(bom); } //和wms和eos数据进行比较,获取需要处理得数据 var updateDatas = eosToBomExchangeDtos.Except(wmsToBomExchangeDtos).ToList(); if (!updateDatas.Any()) { _logger.LogInformation("no boms"); return new List(); } List incomingDataList = new List(); foreach (var data in updateDatas) { var item = toBeProcessedBoms.FirstOrDefault(r => r.mes_bom_assy == data.Product && r.mes_bom_part == data.Component); 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(mes_bom bom) { var incomingData = new IncomingFromExternal() { DataType = EnumIncomingDataType.Bom.ToString(), DataAction = EnumExchangeDataAction.Add, SourceSystem = EnumSystemType.ERP.ToString(), SourceDataId = bom.mes_bom_assy.ToString(), SourceDataDetailCode = bom.mes_bom_part.ToString(), SourceDataGroupCode = bom.mes_bom_part.ToString(), SourceDataContent = JsonSerializer.Serialize(bom), WriteTime = DateTime.Now, Writer = nameof(TyrpIncomingBackgroundWorker), DestinationSystem = EnumSystemType.ERP.ToString(), }; return incomingData; } private static BomExchangeDto BuildBomOrderExchangeTyrp(mes_bom bom) { var bm = new BomExchangeDto() { Product = bom.mes_bom_assy, Component = bom.mes_bom_part, BeginTime = DateTime.ParseExact(bom.mes_bom_chg_b, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture), EndTime = DateTime.ParseExact(bom.mes_bom_chg_e, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture), ComponentQty = bom.mes_bom_qty }; return bm; } }