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 Org.BouncyCastle.Asn1.Pkcs; using Volo.Abp.Data; 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.ProductReceiptNote; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent; public class MesOutConverter : IIncomingConverter { private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly IIncomingToWmsManager _incomingToWmsManager; private readonly IObjectMapper _objectMapper; private readonly IItemBasicAppService _itemBasicAppService; private readonly ILocationAppService _locationAppService; private readonly ILogger _logger; private readonly IConfiguration _configuration; public MesOutConverter( IIncomingToWmsManager incomingToWmsManager , IObjectMapper objectMapper , IItemBasicAppService itemBasicAppService , ILogger logger, IConfiguration configuration, ILocationAppService locationAppService, IIncomingFromExternalManager incomingFromExternalManager) { _incomingToWmsManager = incomingToWmsManager; _objectMapper = objectMapper; _itemBasicAppService = itemBasicAppService; _logger = logger; _configuration = configuration; _locationAppService = locationAppService; _incomingFromExternalManager = incomingFromExternalManager; } public virtual async Task ConvertAsync(List incomingFromExternalList) { if (!incomingFromExternalList.Any()) { _logger.LogInformation("no productreceipts"); return; } var productReceiptNoteList = await BuildIncomingToWmsOfProductReceiptNoteAsync(incomingFromExternalList).ConfigureAwait(false); await _incomingToWmsManager.CreateManyAsync(productReceiptNoteList).ConfigureAwait(false); //归档 await _incomingFromExternalManager.ArchiveManyAsync(incomingFromExternalList).ConfigureAwait(false); } private async Task> BuildIncomingToWmsOfProductReceiptNoteAsync(List incomingDataList) { List types = new List { EnumLocationType.FG, EnumLocationType.WIP }; 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 exchangeProductReceiptNote = JsonSerializer.Deserialize(first.DestinationDataContent); var wmsProductReceiptNote = _objectMapper.Map(exchangeProductReceiptNote); wmsProductReceiptNote.WorkShop = "";//车间 wmsProductReceiptNote.Worker = "MES";//操作人 wmsProductReceiptNote.ReceiptType = EnumReceiptType.MesScanReceipt;//完工收货方式 wmsProductReceiptNote.Details = new List(); List sumDetails = new List(); foreach (var incomingFromExternal in group.ToList()) { ProductReceiptNoteSumDetailExchangeDto sumdetail = new ProductReceiptNoteSumDetailExchangeDto(); var productReceiptNote = JsonSerializer.Deserialize(incomingFromExternal.DestinationDataContent); var wmsProductReceiptNoteDetail = _objectMapper.Map(productReceiptNote.Detail); var oldNoteDetail= wmsProductReceiptNote.Details.FirstOrDefault(r => r.ItemCode == wmsProductReceiptNoteDetail.ItemCode && r.LocationErpCode == wmsProductReceiptNoteDetail.LocationErpCode); sumdetail.itemCode = wmsProductReceiptNoteDetail.ItemCode; sumdetail.locationCode = wmsProductReceiptNoteDetail.LocationErpCode; sumdetail.Qty = wmsProductReceiptNoteDetail.Qty; sumdetail.Memo = wmsProductReceiptNoteDetail.Remark; sumdetail.MesGuid = incomingFromExternal.SourceDataId; sumDetails.Add(sumdetail); if (oldNoteDetail != null) { oldNoteDetail.Qty = oldNoteDetail.Qty+wmsProductReceiptNoteDetail.Qty; } else { wmsProductReceiptNoteDetail.Lot = ""; //排序批次 wmsProductReceiptNoteDetail.PackingCode = "";//箱标签 wmsProductReceiptNoteDetail.Status = EnumInventoryStatus.OK; wmsProductReceiptNoteDetail.WarehouseCode = "T8"; wmsProductReceiptNoteDetail.LocationArea = ""; wmsProductReceiptNoteDetail.LocationGroup = ""; var loc = await _locationAppService.GetListByTypesAndErpCodeAsync(types, wmsProductReceiptNoteDetail.LocationErpCode, wmsProductReceiptNoteDetail.LocationErpCode).ConfigureAwait(false); if (loc != null) { wmsProductReceiptNoteDetail.LocationCode = loc[0].Code; wmsProductReceiptNoteDetail.LocationArea = loc[0].AreaCode; wmsProductReceiptNoteDetail.LocationGroup = loc[0].LocationGroupCode; wmsProductReceiptNoteDetail.LocationErpCode = loc[0].ErpLocationCode; wmsProductReceiptNoteDetail.HandledToLocationCode = loc[0].Code; wmsProductReceiptNoteDetail.HandledToLocationArea = loc[0].AreaCode; wmsProductReceiptNoteDetail.HandledToLocationGroup = loc[0].LocationGroupCode; wmsProductReceiptNoteDetail.HandledToLocationErpCode = loc[0].ErpLocationCode; wmsProductReceiptNoteDetail.RecommendToLocationCode = loc[0].Code; wmsProductReceiptNoteDetail.RecommendToLocationArea = loc[0].AreaCode; wmsProductReceiptNoteDetail.RecommendToLocationGroup = loc[0].LocationGroupCode; wmsProductReceiptNoteDetail.RecommendToLocationErpCode = loc[0].ErpLocationCode; } var item = await _itemBasicAppService.GetByCodeAsync(wmsProductReceiptNoteDetail.ItemCode).ConfigureAwait(false); if (item != null) { wmsProductReceiptNoteDetail.ItemName = !string.IsNullOrEmpty(item.Name) ? item.Name : ""; wmsProductReceiptNoteDetail.ItemDesc1 = !string.IsNullOrEmpty(item.Desc1) ? item.Desc1 : ""; wmsProductReceiptNoteDetail.ItemDesc2 = !string.IsNullOrEmpty(item.Desc2) ? item.Desc2 : ""; wmsProductReceiptNoteDetail.Uom = !string.IsNullOrEmpty(item.BasicUom) ? item.BasicUom : ""; wmsProductReceiptNoteDetail.ProduceDate = incomingFromExternal.EffectiveDate; wmsProductReceiptNoteDetail.ArriveDate = incomingFromExternal.EffectiveDate; wmsProductReceiptNoteDetail.ExpireDate = wmsProductReceiptNoteDetail.ProduceDate.AddDays(item.GetValidateDays()); } else { //todo 这里不应该做完工 没有零件 wmsProductReceiptNoteDetail.ItemName = ""; wmsProductReceiptNoteDetail.ItemDesc1 = ""; wmsProductReceiptNoteDetail.ItemDesc2 = ""; wmsProductReceiptNoteDetail.Uom = ""; } wmsProductReceiptNote.Details.Add(wmsProductReceiptNoteDetail); } } wmsProductReceiptNote.ExtraProperties = new ExtraPropertyDictionary(); wmsProductReceiptNote.ExtraProperties.Add(first.SourceDataGroupCode, JsonSerializer.Serialize(sumDetails)); incomingToWms.DataContent = JsonSerializer.Serialize(wmsProductReceiptNote); incomingToWmsList.Add(incomingToWms); } return incomingToWmsList; } }