using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Castle.Components.DictionaryAdapter; using Microsoft.Extensions.Logging; using Volo.Abp.ObjectMapping; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.Domain; using Win_in.Sfs.Wms.DataExchange.WMS.BackFlushNote; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent.Incoming; public class BackFluConverter : IIncomingConverter { private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly IIncomingToWmsManager _incomingToWmsManager; private readonly IItemBasicAppService _itemBasicAppService; private readonly IObjectMapper _objectMapper; private readonly ILogger _logger; private readonly ILocationAppService _locationAppService; public BackFluConverter( IIncomingToWmsManager incomingToWmsManager, IItemBasicAppService itemBasicAppService, IObjectMapper objectMapper, ILogger logger, IIncomingFromExternalManager incomingFromExternalManager, ILocationAppService locationAppService ) { _incomingToWmsManager = incomingToWmsManager; _itemBasicAppService = itemBasicAppService; _objectMapper = objectMapper; _logger = logger; _incomingFromExternalManager = incomingFromExternalManager; _locationAppService = locationAppService; } public virtual async Task ConvertAsync(List incomingFromExternalList) { if (!incomingFromExternalList.Any()) { _logger.LogInformation("no backflus"); return; } var incomingToWmsDataList = await BuildIncomingToWmsOfPurchaseOrderAsync(incomingFromExternalList).ConfigureAwait(false); await _incomingToWmsManager.CreateManyAsync(incomingToWmsDataList).ConfigureAwait(false); //归档 await _incomingFromExternalManager.ArchiveManyAsync(incomingFromExternalList).ConfigureAwait(false); } private async Task> BuildIncomingToWmsOfPurchaseOrderAsync(List incomingDataList) { await Task.CompletedTask.ConfigureAwait(false); var incomingToWmsList = new List(); var groups = incomingDataList.GroupBy(p => p.SourceDataGroupCode); foreach (var group in groups) { var first = group.First(); var incomingToWms = new IncomingToWms() { DataType = first.DataType, DataAction = first.DataAction, SourceSystem = first.SourceSystem, DataIdentityCode = first.SourceDataGroupCode, }; incomingToWms.SetEffectiveDate(first.EffectiveDate); var exchangeBack = JsonSerializer.Deserialize(first.DestinationDataContent); var wmsBack = _objectMapper.Map(exchangeBack); var item1 = await _itemBasicAppService.GetByCodeAsync(wmsBack.ItemCode).ConfigureAwait(false); wmsBack.ProductReceiptNumber = DateTime.Now.ToShortDateString().Replace("/","").Trim(); if (item1 != null) { wmsBack.ItemName = item1.Name; wmsBack.Uom = item1.BasicUom; } else { wmsBack.ItemName = ""; wmsBack.Uom = ""; } wmsBack.Worker = "WMS"; wmsBack.PackingCode = "jiekou"; wmsBack.LocationCode = "jiekou"; wmsBack.LocationArea = "jiekou"; wmsBack.LocationGroup = "jiekou"; wmsBack.LocationErpCode = "jiekou"; wmsBack.ProductionPlanNumber = "jiekou"; wmsBack.Workshop = "jiekou"; wmsBack.ProdLine = "jiekou"; wmsBack.WarehouseCode = "jiekou"; wmsBack.Lot = "jiekou"; wmsBack.Details = new List(); foreach (var incomingFromExternal in group.ToList()) { var back = JsonSerializer.Deserialize(incomingFromExternal.DestinationDataContent); var wmsBackDetail = _objectMapper.Map(back.Detail); wmsBackDetail.Lot = ""; var item = await _itemBasicAppService.GetByCodeAsync(wmsBackDetail.ItemCode).ConfigureAwait(false); if (item != null) { wmsBackDetail.ItemName = item.Name; wmsBackDetail.Uom = item.BasicUom; } else { wmsBackDetail.ItemName = ""; wmsBackDetail.Uom = ""; } var typesAndErpCodeAsync = await _locationAppService.GetListByTypesAndErpCodeAsync(new EditableList() { EnumLocationType.WIP }, wmsBackDetail.LocationErpCode).ConfigureAwait(false); var loctioncode = typesAndErpCodeAsync.First(); wmsBackDetail.LocationCode = loctioncode.Code; wmsBackDetail.WarehouseCode = loctioncode.WarehouseCode; wmsBackDetail.LocationArea = loctioncode.AreaCode; wmsBackDetail.LocationGroup = loctioncode.LocationGroupCode; wmsBackDetail.PackingCode = "jiekou"; wmsBack.Details.Add(wmsBackDetail); } incomingToWms.DataContent = JsonSerializer.Serialize(wmsBack); incomingToWmsList.Add(incomingToWms); } return incomingToWmsList; } }