using System; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; using Volo.Abp.Threading; using Volo.Abp.Uow; using Win_in.Sfs.Wms.DataExchange.Domain; using Win_in.Sfs.Wms.DataExchange.Domain.Shared; namespace Win_in.Sfs.Wms.DataExchange.Agent; public class IncomingToWmsWorker : AsyncPeriodicBackgroundWorkerBase { private readonly IOptions _options; public IncomingToWmsWorker( AbpAsyncTimer timer, IOptions options, IServiceScopeFactory serviceScopeFactory ) : base(timer, serviceScopeFactory) { _options = options; Timer.Period = options.Value.IncomingOptions.PeriodSeconds * 1000; //default 5 minutes } [UnitOfWork] protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) { Logger.LogInformation("Starting: Handling Incoming Exchange data..."); if (!_options.Value.IncomingOptions.Active) { Logger.LogInformation("Incoming Exchange is not active!"); return; } await HandleIncomingDataAsync(workerContext).ConfigureAwait(false); Logger.LogInformation("Completed: Handling Incoming Exchange data..."); } private async Task HandleIncomingDataAsync(PeriodicBackgroundWorkerContext workerContext) { //Resolve dependencies var incomingToWmsManager = workerContext.ServiceProvider.GetRequiredService(); //Do the work var incomingToWmsList = await incomingToWmsManager.GetToBeProcessedListAsync().ConfigureAwait(false); foreach (var incomingToWms in incomingToWmsList) { try { await AddOrUpdateWmsAsync(workerContext, incomingToWms).ConfigureAwait(false); } catch (Exception e) { e = e.GetBaseException(); incomingToWms.SetError(EnumExchangeDataErrorCode.Exception, e.Message); } //归档并删除 await incomingToWmsManager.ArchiveAsync(incomingToWms).ConfigureAwait(false); } } [UnitOfWork] public async Task AddOrUpdateWmsAsync(PeriodicBackgroundWorkerContext workerContext, IncomingToWms incomingToWms) { if (!Enum.TryParse(incomingToWms.DataType, true, out EnumIncomingDataType dataType)) { incomingToWms.SetError(EnumExchangeDataErrorCode.UnknownDataType, "无法识别的数据类型"); return; } //TODO 完成全部接口 switch (dataType) { case EnumIncomingDataType.Department: await incomingToWms.HandleDepartmentsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.User: await incomingToWms.HandleUsersAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.Item: await incomingToWms.HandleItemsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.Location: await incomingToWms.HandleErpLocationsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.Bom: await incomingToWms.HandleBomsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.Dict: await incomingToWms.HandleDictsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.Supplier: await incomingToWms.HandleSuppliersAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.SupplierItem: await incomingToWms.HandleSupplierItemsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.ItemPack: await incomingToWms.HandleItemPacksAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.Customer: await incomingToWms.HandleCustomersAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.CustomerItem: await incomingToWms.HandleCustomerItemsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.InterfaceCalendar: await incomingToWms.HandleInterfaceCalendarsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.PurchaseOrder: await incomingToWms.HandlePurchaseOrdersAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.SaleOrder: await incomingToWms.HandleSaleOrdersAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.SupplierAsn: await incomingToWms.HandleAsnsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.ProductReceipt: await incomingToWms.HandleProductReceiptsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.MaterialRequest: await incomingToWms.HandleMaterialRequestsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.Scrap: await incomingToWms.HandleScrapsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.IssueConfirm: await incomingToWms.HandleIssueNoteConfirmAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.PurchaseLabel: await incomingToWms.HandleInventoryLabelsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.BackFlush: await incomingToWms.HandleBackFlushsAsync(workerContext).ConfigureAwait(false); break; case EnumIncomingDataType.None: default: throw new ArgumentOutOfRangeException(); } incomingToWms.SetSuccess(); } }