using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Volo.Abp.Guids; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.Domain; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.EOS; using Win_in.Sfs.Wms.DataExchange.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.WMS.PurchaseOrder; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.EosAgent; public class PlanReader : IReader { private readonly IPlanManager _planManager; private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly ILogger _logger; private readonly IGuidGenerator _guidGenerator; public PlanReader( IPlanManager planManager , IIncomingFromExternalManager incomingFromExternalManager , ILogger logger , IGuidGenerator guidGenerator ) { _planManager = planManager; _incomingFromExternalManager = incomingFromExternalManager; _logger = logger; _guidGenerator = guidGenerator; } public virtual async Task> ReadAsync() { //从EOS读取待处理Plan var toBeProcessedPlans = await _planManager.GetToBeProcessedListAsync().ConfigureAwait(false); if (!toBeProcessedPlans.Any()) { _logger.LogInformation("no plans"); return new List(); } //Plan逐一转换为PurchaseOrder var incomingDataList = BuildIncomingFromExternalFromPlanAsync(toBeProcessedPlans); await _incomingFromExternalManager.CreateBulkAsync(incomingDataList).ConfigureAwait(false); //更新EOS数据状态 await _planManager.UpdateProcessedListAsync(toBeProcessedPlans).ConfigureAwait(false); return incomingDataList; } private List BuildIncomingFromExternalFromPlanAsync(List toBeProcessedPlans) { var incomingDataList = new List(); foreach (var plan in toBeProcessedPlans) { var incomingData = BuildIncomingFromExternal(plan); incomingData.SetEffectiveDate(plan.EosDate); incomingData.SetId(_guidGenerator.Create()); try { var po = BuildPurchaseOrderExchangeDto(plan); incomingData.DestinationDataContent = JsonSerializer.Serialize(po); } catch (Exception ex) { incomingData.SetError(EnumExchangeDataErrorCode.Exception, ex.Message, ex.ToString()); } incomingDataList.Add(incomingData); } return incomingDataList; } private IncomingFromExternal BuildIncomingFromExternal(Plan plan) { var incomingData = new IncomingFromExternal() { DataType = EnumIncomingDataType.PurchaseOrder.ToString(), DataAction = plan.PlanBillState switch { 0 => EnumExchangeDataAction.Add, 1 => EnumExchangeDataAction.Delete, _ => throw new ArgumentOutOfRangeException() }, SourceSystem = EnumSystemType.SCP.ToString(), SourceDataId = plan.Id.ToString(), SourceDataGroupCode = plan.PlanBillNo, SourceDataDetailCode = plan.ERP, SourceDataContent = JsonSerializer.Serialize(plan), WriteTime = DateTime.Now, Writer = nameof(EosIncomingBackgroundWorker), DestinationSystem = EnumSystemType.WMS.ToString(), }; return incomingData; } private static PurchaseOrderExchangeDto BuildPurchaseOrderExchangeDto(Plan plan) { var po = new PurchaseOrderExchangeDto() { Number = plan.PlanBillNo, SupplierCode = plan.SupplierCode, OrderDate = plan.ReleaseDate, DueDate = plan.PlanArriveDate, ContactName = plan.PlanUserCode, OrderStatus = plan.PlanBillState == 0 ? EnumOrderStatus.Open : EnumOrderStatus.Close, ActiveDate = plan.EosDate, Worker = plan.PlanUserCode, // PoType = "2", // IsConsignment = false, // Version = "", // TaxRate = 0, // WarehouseCode = "", // Remark = plan.PlanMemo, }; var poDetail = new PurchaseOrderDetailExchangeDto() { LocationErpCode = plan.Loc, Uom = plan.Unit, Qty = plan.Qty, ItemCode = plan.ERP, ProjectCode = plan.XmCode, LineStatus = plan.PlanBillState == 0 ? EnumOrderStatus.Open : EnumOrderStatus.Close, Remark = plan.PlanMemo, Lot="", // PoLine = "", // SupplierPackUom = plan.Unit, // SupplierPackQty = plan.Qty, // StdPackUom = plan.Unit, // StdPackQty = plan.Qty, // ConvertRate = 1, // IsConsignment = false, }; po.Detail = poDetail; return po; } }