using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Volo.Abp.ObjectMapping; 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.PutawayNote; using Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Outgoing; public class PutawayNoteConverter : IOutgoingConverter { private readonly string billtype = "2002"; private readonly IOutgoingFromWmsManager _outgoingFromWmsManager; private readonly IOutgoingToExternalManager _outgoingToExternalManager; private readonly IObjectMapper _objectMapper; private readonly IPurchaseOrderAppService _purchaseOrderAppService; public PutawayNoteConverter( IOutgoingFromWmsManager outgoingFromWmsManager , IOutgoingToExternalManager outgoingToExternalManager , IObjectMapper objectMapper ,IPurchaseOrderAppService purchaseOrderAppService ) { _outgoingFromWmsManager = outgoingFromWmsManager; _outgoingToExternalManager = outgoingToExternalManager; _objectMapper = objectMapper; _purchaseOrderAppService = purchaseOrderAppService; } public virtual async Task> ConvertAsync() { var outgoingToExternalList = new List(); //获取要同步得数据 var outgoingFromWmsList = await _outgoingFromWmsManager.GetToBeProcessedListAsync(EnumOutgoingDataType.Putaway, EnumSystemType.ERP).ConfigureAwait(false); foreach (var outgoingFromWms in outgoingFromWmsList) { #region 主表 var wmsReceipt = JsonSerializer.Deserialize(outgoingFromWms.DataContent); var exchangeReceipt = _objectMapper.Map(wmsReceipt); var putawayNote = BuildDataInterface(exchangeReceipt); var outgoingToExternal = new OutgoingToExternal() { DataType = EnumOutgoingDataType.Putaway.ToString(), TableType = EnumExchangeTableType.MainTable, DataAction = outgoingFromWms.DataAction, SourceSystem = EnumSystemType.WMS.ToString(), SourceDataId = wmsReceipt.Id.ToString(), SourceDataGroupCode = wmsReceipt.Number, SourceDataDetailCode = wmsReceipt.Number, Writer = nameof(TyrpOutgoingBackgroundWorker), DestinationSystem = EnumSystemType.ERP.ToString(), DestinationDataId = "", }; outgoingToExternal.SetEffectiveDate(outgoingFromWms.EffectiveDate); outgoingToExternal.SourceDataContent = JsonSerializer.Serialize(exchangeReceipt); outgoingToExternal.DestinationDataContent = JsonSerializer.Serialize(putawayNote); outgoingToExternalList.Add(outgoingToExternal); #endregion var sumDetails= wmsReceipt.Details.GroupBy(r => new { r.ItemCode, r.PoNumber, r.ToLocationErpCode }).Select(p => new PutawayNoteDetailDTO { ItemCode = p.Key.ItemCode, PoNumber = p.Key.PoNumber, ToLocationErpCode = p.Key.ToLocationErpCode ,Qty=p.Sum(x=>x.Qty)}).ToList(); #region 明细 foreach (var detail in sumDetails) { var outgoingDetailToExternal = new OutgoingToExternal() { DataType = EnumOutgoingDataType.Putaway.ToString(), TableType = EnumExchangeTableType.DetailTable, DataAction = outgoingFromWms.DataAction, SourceSystem = EnumSystemType.WMS.ToString(), SourceDataId = detail.Id.ToString(), SourceDataGroupCode = wmsReceipt.Number, SourceDataDetailCode = detail.ItemCode, Writer = nameof(TyrpOutgoingBackgroundWorker), DestinationSystem = EnumSystemType.ERP.ToString(), DestinationDataId = "", }; outgoingDetailToExternal.SetEffectiveDate(outgoingFromWms.EffectiveDate); var exchangeReceiptDetail = _objectMapper.Map(detail); outgoingDetailToExternal.SourceDataContent = JsonSerializer.Serialize(exchangeReceiptDetail); var putawayNoteDetail = BuildDataInterfaceDetail(exchangeReceipt, exchangeReceiptDetail, putawayNote.scontrol_dt_w); try { //通过采购订单号查询采购订单要求到货日期 var order = await _purchaseOrderAppService.GetByNumberAsync(putawayNoteDetail.scmsend_orderno).ConfigureAwait(false); if (order != null) { putawayNoteDetail.scmsend_delv_date = order.DueDate.ToString("yyyyMMdd"); } } catch (Exception ex) { outgoingDetailToExternal.SetError(EnumExchangeDataErrorCode.Exception, ex.InnerException==null?ex.Message: ex.InnerException.Message, ex.ToString()); } outgoingDetailToExternal.DestinationDataContent = JsonSerializer.Serialize(putawayNoteDetail); outgoingToExternalList.Add(outgoingDetailToExternal); } #endregion } //插入到中间表OutgoingToExternal await _outgoingToExternalManager.CreateManyAsync(outgoingToExternalList).ConfigureAwait(false); //将outgoingFromWms数据归档 await _outgoingFromWmsManager.ArchiveManyAsync(outgoingFromWmsList).ConfigureAwait(false); return outgoingToExternalList; } /// /// 构建主表 /// /// /// private Scontrol BuildDataInterface(PutawayNoteExchangeDto exchangeOrder) { var ret = new Scontrol() { scontrol_nbr = exchangeOrder.Number, scontrol_dt_w = DateTime.Now.ToString("yyyyMMdd HH:mm:ss"), scontrol_stat = "Y", scontrol_dt_k = "", scontrol_type = billtype, scontrol_id = 0,//明细中最大scmsend_id }; return ret; } /// /// 构建明细 /// /// /// /// private Scmsend BuildDataInterfaceDetail(PutawayNoteExchangeDto exchangeOrder, PutawayNoteDetailExchangeDto exchangeDetailOrder, string dt_w) { var ret = new Scmsend() { scmsend_type = billtype, scmsend_dt_w = dt_w, scmsend_nbr = exchangeOrder.Number, scmsend_stat1 = "0", scmsend_part = exchangeDetailOrder.ItemCode, scmsend_delv_date = exchangeOrder.DueDate.ToString("yyyyMMdd"), scmsend_orderno = exchangeDetailOrder.PoNumber, scmsend_loc = exchangeDetailOrder.ToLocationErpCode, scmsend_date = exchangeOrder.ActiveDate.ToString("yyyyMMdd"), scmsend_qty = exchangeDetailOrder.Qty, scmsend_wipd_loc = "", scmsend_userid = "WMS" }; return ret; } }