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.Auth.Application.Contracts; 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.Domain.Fawtyg.Tyrp; using Win_in.Sfs.Wms.DataExchange.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.WMS.PurchaseReturn; using Win_in.Sfs.Wms.DataExchange.WMS.TransferNote; using Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Outgoing; public class TransferNoteConverter : IOutgoingConverter { private readonly string billtype_s = "4002"; private readonly string billtype_w = "4033"; private readonly IOutgoingFromWmsManager _outgoingFromWmsManager; private readonly IOutgoingToExternalManager _outgoingToExternalManager; private readonly IDepartmentAppService _departmentAppService; private readonly IObjectMapper _objectMapper; private readonly IErpLocationAppService _erpLocationAppService; public TransferNoteConverter( IOutgoingFromWmsManager outgoingFromWmsManager , IOutgoingToExternalManager outgoingToExternalManager , IDepartmentAppService departmentAppService , IObjectMapper objectMapper , IErpLocationAppService erpLocationAppService ) { _outgoingFromWmsManager = outgoingFromWmsManager; _outgoingToExternalManager = outgoingToExternalManager; _departmentAppService = departmentAppService; _objectMapper = objectMapper; _erpLocationAppService = erpLocationAppService; } public virtual async Task> ConvertAsync() { var outgoingToExternalList = new List(); List archivelist = new List(); //获取要同步得数据 var outgoingFromWmsList = await _outgoingFromWmsManager.GetToBeProcessedListAsync(EnumOutgoingDataType.Transfer, EnumSystemType.ERP).ConfigureAwait(false); foreach (var outgoingFromWms in outgoingFromWmsList) { var wmsReceipt = JsonSerializer.Deserialize(outgoingFromWms.DataContent); var exchangeReceipt = _objectMapper.Map(wmsReceipt); var department = await _departmentAppService.GetByUsernameAsync(exchangeReceipt.Worker).ConfigureAwait(false); var departmentCode = department == null ? "" : department.Code; var details = wmsReceipt.Details.Where(r => r.FromLocationErpCode != r.ToLocationErpCode).ToList(); List WipDetails = new List(); if (details.Count > 0 && (wmsReceipt.Type != EnumTransSubType.Transfer_Inside.ToString()||wmsReceipt.Type!=EnumTransSubType.Transfer_SplitPacking.ToString())) { string tyrpNumber = outgoingFromWms.TyrpNumber; #region 主表 var outgoingToExternal = new OutgoingToExternal() { // DataType = dataType, TableType = EnumExchangeTableType.MainTable, DataAction = outgoingFromWms.DataAction, SerialNumber=tyrpNumber, SourceSystem = EnumSystemType.WMS.ToString(), SourceDataId = wmsReceipt.Id.ToString(), SourceDataGroupCode = wmsReceipt.Number, SourceDataDetailCode = wmsReceipt.Number, Writer = nameof(TyrpOutgoingBackgroundWorker), DestinationSystem = EnumSystemType.ERP.ToString(), DestinationDataId = "", }; var stat = "1"; outgoingToExternal.SetEffectiveDate(outgoingFromWms.EffectiveDate); outgoingToExternal.SourceDataContent = JsonSerializer.Serialize(exchangeReceipt); string dt_w = DateTime.Now.ToString("yyyyMMdd HH:mm:ss"); if (exchangeReceipt.Type != EnumTransSubType.Transfer_Customer.ToString()) { outgoingToExternal.DataType = EnumOutgoingDataType.TransferForErp.ToString(); var putawayNoteScontrol = BuildScontrolDataInterface(exchangeReceipt, dt_w); outgoingToExternal.DestinationDataContent = JsonSerializer.Serialize(putawayNoteScontrol); WipDetails =details.GroupBy(r => new { r.Number, r.ItemCode, r.FromLocationErpCode , r.ToLocationErpCode }).Select(p => new TransferNoteDetailExchangeDto { Qty = p.Sum(itm => itm.Qty), Number = p.Key.Number, ItemCode = p.Key.ItemCode, FromLocationErpCode = p.Key.FromLocationErpCode, ToLocationErpCode=p.Key.ToLocationErpCode }).ToList(); } else { outgoingToExternal.DataType = EnumOutgoingDataType.TransferForCustom.ToString(); var toLocationErpcode = details[0].ToLocationErpCode; var erplocation = await _erpLocationAppService.GetByCodeAsync(toLocationErpcode).ConfigureAwait(false); if (erplocation?.Type != "2") { stat = "2"; } var location = stat == "1" ? details[0].ToLocationErpCode : details[0].FromLocationErpCode; var putawayNoteWmsoutm = BuildWmsoutmDataInterface(exchangeReceipt, departmentCode, dt_w, tyrpNumber, wmsReceipt.Number, location); outgoingToExternal.DestinationDataContent = JsonSerializer.Serialize(putawayNoteWmsoutm); WipDetails = details.GroupBy(r => new { r.Number, r.ItemCode, r.FromLocationErpCode }).Select(p => new TransferNoteDetailExchangeDto { Qty = p.Sum(itm => itm.Qty), Number = p.Key.Number, ItemCode = p.Key.ItemCode, FromLocationErpCode = p.Key.FromLocationErpCode }).ToList(); } outgoingToExternalList.Add(outgoingToExternal); #endregion #region 明细 foreach (var detail in WipDetails) { var outgoingDetailToExternal = new OutgoingToExternal() { DataType = outgoingToExternal.DataType, TableType = EnumExchangeTableType.DetailTable, DataAction = outgoingFromWms.DataAction, SerialNumber=tyrpNumber, SourceSystem = EnumSystemType.WMS.ToString(), SourceDataId = detail.Number.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(detail); if (exchangeReceipt.Type != EnumTransSubType.Transfer_Customer.ToString()) { var putawayNoteDetailScmsend = BuildScmsendDataInterfaceDetail(exchangeReceipt, detail, dt_w); outgoingDetailToExternal.DestinationDataContent = JsonSerializer.Serialize(putawayNoteDetailScmsend); } else { var putawayNoteDetailWmsoutd = BuildWmsoutdDataInterfaceDetail(tyrpNumber, detail, wmsReceipt.Number); outgoingDetailToExternal.DestinationDataContent = JsonSerializer.Serialize(putawayNoteDetailWmsoutd); } outgoingToExternalList.Add(outgoingDetailToExternal); } #endregion } archivelist.Add(outgoingFromWms); } //插入到中间表OutgoingToExternal await _outgoingToExternalManager.CreateManyAsync(outgoingToExternalList).ConfigureAwait(false); //将outgoingFromWms数据归档 await _outgoingFromWmsManager.ArchiveManyAsync(archivelist).ConfigureAwait(false); return outgoingToExternalList; } /// /// 构建主表(Scontrol) /// /// /// private Scontrol BuildScontrolDataInterface(TransferNoteExchangeDto exchangeOrder, string dt_w) { var ret = new Scontrol() { scontrol_nbr = exchangeOrder.Number, scontrol_dt_w = dt_w, scontrol_stat = "Y", scontrol_dt_k = "", scontrol_type = billtype_s, scontrol_id = 0,//明细中最大scmsend_id }; return ret; } /// /// 构建明细(Scmsend) /// /// /// /// private Scmsend BuildScmsendDataInterfaceDetail(TransferNoteExchangeDto exchangeOrder, TransferNoteDetailExchangeDto exchangeDetailOrder, string dt_w) { var ret = new Scmsend() { scmsend_type = billtype_s, scmsend_dt_w = dt_w, scmsend_nbr = exchangeOrder.Number, scmsend_stat1 = "0", scmsend_part = exchangeDetailOrder.ItemCode, scmsend_delv_date = "", scmsend_orderno = "", scmsend_loc = exchangeDetailOrder.FromLocationErpCode, // scmsend_date = exchangeOrder.ActiveDate.ToString("yyyyMMdd"), scmsend_date = DateTime.Now.ToString("yyyyMMdd"), scmsend_qty = exchangeDetailOrder.Qty, scmsend_wipd_loc = exchangeDetailOrder.ToLocationErpCode, scmsend_userid = "WMS" }; return ret; } /// /// 构建主表(Wmsoutm) /// /// /// private Wmsoutm BuildWmsoutmDataInterface(TransferNoteExchangeDto exchangeOrder, string departmentCode, string dt_w,string tyrpNumber, string number,string location) { var ret = new Wmsoutm() { wmsoutm_mid = Convert.ToDecimal(tyrpNumber), wmsoutm_nbr = number, wmsoutm_type = billtype_w, wmsoutm_dt_w = dt_w, wmsoutm_stat = "Y", wmsoutm_tyrp_dt = "", wmsoutm_user = "WMS", wmsoutm_dept = "450900",//根据Worker从UserDepartment中获取 wmsoutm_date = exchangeOrder.ActiveDate.ToString("yyyyMMdd"), wmsoutm_cust = "", wmsoutm_shm_nbr = "", wmsoutm_cust_loc =location, wmsoutm_stock_stat = "1", wmsoutm_open_part = "", wmsoutm_open_loc = "", wmsoutm_open_hours = 0, wmsoutm_tyrp_k = "", wmsoutm_id = 0,//明细中最大scmsend_id wmsoutm_open_qty = 0, }; return ret; } /// /// 构建明细(Wmsoutd) /// /// /// /// private Wmsoutd BuildWmsoutdDataInterfaceDetail(string tyrpNumber, TransferNoteDetailExchangeDto exchangeDetailOrder,string number) { var ret = new Wmsoutd() { wmsoutd_mid = Convert.ToDecimal(tyrpNumber), wmsoutd_nbr = number, wmsoutd_part = exchangeDetailOrder.ItemCode, wmsoutd_loc = exchangeDetailOrder.FromLocationErpCode, wmsoutd_qty = exchangeDetailOrder.Qty, wmsoutd_bcm_code = "",//有问题 wmsoutd_projt_id = "",//有问题 }; return ret; } }