using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Win_in.Sfs.Wms.DataExchange.Domain; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.MesOut; using Win_in.Sfs.Wms.DataExchange.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.WMS.ProductReceiptNote; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent; public class MesOutReader : IReader { private readonly IMesOutManager _mesOutManager; private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly ILogger _logger; public MesOutReader( IMesOutManager mesOutManager , IIncomingFromExternalManager incomingFromExternalManager , ILogger logger ) { _mesOutManager = mesOutManager; _incomingFromExternalManager = incomingFromExternalManager; _logger = logger; } public virtual async Task> ReadAsync() { //从MES读取待处理MesOut var toBeProcessedMwsOuts = await _mesOutManager.GetToBeProcessedListAsync().ConfigureAwait(false); if (!toBeProcessedMwsOuts.Any()) { _logger.LogInformation("no productreceipts"); return new List(); } //MesOut逐一转换为ProductReceiptNote var incomingDataList = BuildIncomingFromExternalFromShipAsync(toBeProcessedMwsOuts); await _incomingFromExternalManager.CreateManyAsync(incomingDataList).ConfigureAwait(false); //更新MES数据状态 await _mesOutManager.UpdateProcessedListAsync(toBeProcessedMwsOuts).ConfigureAwait(false); return incomingDataList; } private static List BuildIncomingFromExternalFromShipAsync(List toBeProcessedMesOuts) { var incomingDataList = new List(); foreach (var mesOut in toBeProcessedMesOuts) { var incomingData = BuildIncomingFromExternal(mesOut); incomingData.SetEffectiveDate(DateTime.ParseExact(mesOut.Mesout_date, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture)); incomingData.SetSuccess(); try { var productReceiptNote = BuildProductReceiptNoteCreateInput(mesOut); incomingData.DestinationDataContent = JsonSerializer.Serialize(productReceiptNote); } catch (Exception ex) { incomingData.SetError(EnumExchangeDataErrorCode.Exception, ex.Message, ex.ToString()); } incomingDataList.Add(incomingData); } return incomingDataList; } private static IncomingFromExternal BuildIncomingFromExternal(MesOut mesOut) { var incomingData = new IncomingFromExternal() { DataType = EnumIncomingDataType.ProductReceipt.ToString(), DataAction = EnumExchangeDataAction.Add, SourceSystem = EnumSystemType.MES.ToString(), SourceDataId = mesOut.Mesout_ref_nbr.ToString(), SourceDataGroupCode = mesOut.Mesout_ref_nbr.ToString(), SourceDataDetailCode = mesOut.Mesout_part, SourceDataContent = JsonSerializer.Serialize(mesOut), WriteTime = DateTime.Now, Writer = nameof(MesIncomingBackgroundWorker), DestinationSystem = EnumSystemType.WMS.ToString(), }; return incomingData; } private static ProductReceiptNoteExchangeDto BuildProductReceiptNoteCreateInput(MesOut mesOut) { var productReceiptNote = new ProductReceiptNoteExchangeDto() { CompleteTime = DateTime.ParseExact(mesOut.Mesout_dt, "yyyyMMdd HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture), ActiveDate = DateTime.ParseExact(mesOut.Mesout_date, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture) }; var productReceiptNoteDetail = new ProductReceiptNoteDetailExchangeDto() { RawLocationCode = mesOut.Mesout_id, ItemCode = mesOut.Mesout_part, Qty = mesOut.Mesout_move, LocationErpCode = mesOut.Mesout_loc, Remark = mesOut.memo }; productReceiptNote.Detail = productReceiptNoteDetail; return productReceiptNote; } }