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.ObjectMapping; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Label.Application.Contracts; using Win_in.Sfs.Wms.DataExchange.Domain; using Win_in.Sfs.Wms.DataExchange.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.WMS.SuppplierAsn; using Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.EosAgent; public class ShipConverter : IIncomingConverter { private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly IIncomingToWmsManager _incomingToWmsManager; private readonly IObjectMapper _objectMapper; private readonly IItemBasicAppService _itemBasicAppService; private readonly IItemPackAppService _itemPackAppService; private readonly ILogger _logger; private readonly IConfiguration _configuration; public ShipConverter( IIncomingToWmsManager incomingToWmsManager , IObjectMapper objectMapper , IItemBasicAppService itemBasicAppService , IItemPackAppService itemPackAppService , ILogger logger, IConfiguration configuration, IIncomingFromExternalManager incomingFromExternalManager ) { _incomingFromExternalManager = incomingFromExternalManager; _incomingToWmsManager = incomingToWmsManager; _objectMapper = objectMapper; _itemBasicAppService = itemBasicAppService; _itemPackAppService = itemPackAppService; _logger = logger; _configuration = configuration; } public virtual async Task ConvertAsync(List incomingFromExternalList) { if (!incomingFromExternalList.Any()) { _logger.LogInformation("no ships"); return; } //按ShipBillNo合并SupplierAsn var supplierAsnList = await BuildIncomingToWmsOfSupplierAsnAsync(incomingFromExternalList).ConfigureAwait(false); await _incomingToWmsManager.CreateManyAsync(supplierAsnList).ConfigureAwait(false); var purchaseLabelList = await BuildIncomingToWmsOfPurchaseLabelAsync(incomingFromExternalList).ConfigureAwait(false); await _incomingToWmsManager.CreateManyAsync(purchaseLabelList).ConfigureAwait(false); //归档 await _incomingFromExternalManager.ArchiveManyAsync(incomingFromExternalList).ConfigureAwait(false); } private async Task> BuildIncomingToWmsOfPurchaseLabelAsync(List incomingFromExternalList) { var incomingToWmsList = new List(); foreach (var incomingFromExternal in incomingFromExternalList) { var incomingToWms = new IncomingToWms() { DataType = EnumIncomingDataType.PurchaseLabel.ToString(), DataAction = incomingFromExternal.DataAction, SourceSystem = incomingFromExternal.SourceSystem, DataIdentityCode = incomingFromExternal.SourceDataDetailCode, }; incomingToWms.SetEffectiveDate(incomingFromExternal.EffectiveDate); var exchangeAsn = JsonSerializer.Deserialize(incomingFromExternal.DestinationDataContent); var purchaseLabel = await BuildPurchaseLabelCreateDto(exchangeAsn).ConfigureAwait(false); incomingToWms.DataContent = JsonSerializer.Serialize(purchaseLabel); incomingToWmsList.Add(incomingToWms); } return incomingToWmsList; } private async Task BuildPurchaseLabelCreateDto(SupplierAsnExchangeDto exchangeAsn) { var purchaseLabel = _objectMapper.Map(exchangeAsn.Detail); purchaseLabel.AsnNumber = exchangeAsn.Number; purchaseLabel.RpNumber = ""; var item = await _itemBasicAppService.GetByCodeAsync(purchaseLabel.ItemCode).ConfigureAwait(false); if (item != null) { purchaseLabel.ItemName = item.Name; purchaseLabel.ItemDesc1 = item.Desc1; } else { purchaseLabel.ItemName = ""; purchaseLabel.ItemDesc1 = ""; } return purchaseLabel; } private async Task> BuildIncomingToWmsOfSupplierAsnAsync(List incomingDataList) { 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 exchangeAsn = JsonSerializer.Deserialize(first.DestinationDataContent); var wmsAsn = await BuildSupplierAsnCreateInput(exchangeAsn, group).ConfigureAwait(false); incomingToWms.DataContent = JsonSerializer.Serialize(wmsAsn); incomingToWmsList.Add(incomingToWms); } return incomingToWmsList; } private async Task BuildSupplierAsnCreateInput(SupplierAsnExchangeDto exchangeAsn, IGrouping group) { var wmsAsn = _objectMapper.Map(exchangeAsn); wmsAsn.Details = new List(); wmsAsn.RpNumber = ""; wmsAsn.DockCode = ""; wmsAsn.Remark = ""; wmsAsn.TimeWindow = ""; foreach (var incomingFromExternal in group.ToList()) { var asn = JsonSerializer.Deserialize(incomingFromExternal.DestinationDataContent); var wmsAsnDetail = await BuildSupplierAsnDetailInput(asn).ConfigureAwait(false); wmsAsn.Details.Add(wmsAsnDetail); } return wmsAsn; } private async Task BuildSupplierAsnDetailInput(SupplierAsnExchangeDto asn) { var wmsAsnDetail = _objectMapper.Map(asn.Detail); wmsAsnDetail.PoLine = ""; wmsAsnDetail.ConvertRate = 1; wmsAsnDetail.ExpireDate = DateTime.MaxValue; var item = await _itemBasicAppService.GetByCodeAsync(wmsAsnDetail.ItemCode).ConfigureAwait(false); if (item != null) { wmsAsnDetail.ItemName = item.Name; wmsAsnDetail.ItemDesc1 = item.Desc1; wmsAsnDetail.ItemDesc2 = item.Desc2; wmsAsnDetail.SupplierPackUom = item.BasicUom; wmsAsnDetail.SupplierPackQty = item.StdPackQty; wmsAsnDetail.StdPackQty = item.StdPackQty; } return wmsAsnDetail; } }