You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
7.8 KiB
188 lines
7.8 KiB
using System;
|
|
using System.Text.Json;
|
|
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;
|
|
using Win_in.Sfs.Wms.DataExchange.Iac.QadAgent.PostServices;
|
|
using Win_in.Sfs.Wms.DataExchange.Wms;
|
|
|
|
namespace Win_in.Sfs.Wms.DataExchange.Iac.QadAgent.Outgoing;
|
|
|
|
public class OutgoingFromWmsWorker : AsyncPeriodicBackgroundWorkerBase
|
|
{
|
|
|
|
private readonly OutgoingOptions _options;
|
|
private readonly IPostService _postService;
|
|
|
|
public OutgoingFromWmsWorker(
|
|
AbpAsyncTimer timer,
|
|
IOptions<DataExchangeOptions> options,
|
|
IServiceScopeFactory serviceScopeFactory,
|
|
IPostService postService
|
|
) : base(timer, serviceScopeFactory)
|
|
{
|
|
_options = options.Value.OutgoingOptions;
|
|
_postService = postService;
|
|
Timer.Period = options.Value.OutgoingOptions.PeriodSeconds * 1000; //default 5 minutes
|
|
}
|
|
|
|
[UnitOfWork]
|
|
protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)
|
|
{
|
|
Logger.LogInformation("Starting: Handling Outgoing Exchange data...");
|
|
if (!_options.Active)
|
|
{
|
|
Logger.LogInformation("Outgoing Exchange is not active!");
|
|
return;
|
|
}
|
|
|
|
//Resolve dependencies
|
|
|
|
var outgoingDataManager = workerContext
|
|
.ServiceProvider
|
|
.GetRequiredService<IOutgoingFromWmsManager>();
|
|
|
|
//Do the work
|
|
var batchSize = _options.BatchSize;
|
|
var retryTimes = _options.RetryTimes;
|
|
var outgoingDataList = await outgoingDataManager.GetToBeProcessedListAsync(batchSize, retryTimes).ConfigureAwait(false);
|
|
Logger.LogInformation($"{outgoingDataList.Count} Outgoing Exchange records were Found");
|
|
|
|
foreach (var outgoingData in outgoingDataList)
|
|
{
|
|
|
|
try
|
|
{
|
|
//定时主动推送数据到外部系统
|
|
await PostToOtherSystemAsync(outgoingData).ConfigureAwait(false);
|
|
//归档并删除
|
|
await outgoingDataManager.FileAndDeleteAsync(outgoingData).ConfigureAwait(false);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.LogException(e);
|
|
e = e.GetBaseException();
|
|
outgoingData.SetError(EnumExchangeDataErrorCode.Exception, e.Message);
|
|
await outgoingDataManager.UpdateAsync(outgoingData).ConfigureAwait(false);
|
|
}
|
|
}
|
|
|
|
Logger.LogInformation("Completed: Handling Outgoing Exchange data...");
|
|
}
|
|
|
|
protected virtual async Task PostToOtherSystemAsync(OutgoingFromWms outgoingOuterData)
|
|
{
|
|
if (Enum.TryParse(outgoingOuterData.DataType, true, out EnumOutgoingDataType dataType))
|
|
{
|
|
var baseUrl = _options.BaseUrl;
|
|
var apiUrl = GetApiUrl(dataType, _options);
|
|
var dataContent = outgoingOuterData.DataContent;
|
|
if (!TryDeserialize(dataType, dataContent))
|
|
{
|
|
outgoingOuterData.SetError(EnumExchangeDataErrorCode.WrongDataFormat, dataType.ToString());
|
|
}
|
|
|
|
if (GetApiEnabled(dataType, _options))
|
|
{
|
|
var username = _options.Username;
|
|
var password = _options.Password;
|
|
await _postService.PostAsync(baseUrl, apiUrl, dataContent, username, password).ConfigureAwait(false);
|
|
}
|
|
outgoingOuterData.SetSuccess();
|
|
|
|
}
|
|
else
|
|
{
|
|
outgoingOuterData.SetError(EnumExchangeDataErrorCode.UnknownDataType, "UnknownDataType");
|
|
}
|
|
}
|
|
|
|
private static bool TryDeserialize(EnumOutgoingDataType dataType, string dataContent)
|
|
{
|
|
try
|
|
{
|
|
switch (dataType)
|
|
{
|
|
case EnumOutgoingDataType.PurchaseReceipt:
|
|
var tryReceipt = JsonSerializer.Deserialize<Receipt>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.PurchaseReturn:
|
|
var tryReturn = JsonSerializer.Deserialize<Return>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.Transfer:
|
|
var tryTransfer = JsonSerializer.Deserialize<Transfer>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.BackFlush:
|
|
var tryBackFlush = JsonSerializer.Deserialize<Backflush>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.Rework:
|
|
var tryRework = JsonSerializer.Deserialize<Rework>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.PreShipper:
|
|
var tryPreShipper = JsonSerializer.Deserialize<PreShipper>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.Count:
|
|
var tryCount = JsonSerializer.Deserialize<Count>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.UnplannedReceipt:
|
|
var tryUnplannedReceipt = JsonSerializer.Deserialize<UnplannedReceipt>(dataContent);
|
|
break;
|
|
case EnumOutgoingDataType.UnplannedDeliver:
|
|
var tryUnplannedDeliver = JsonSerializer.Deserialize<UnplannedDeliver>(dataContent);
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException(nameof(dataType), dataType, null);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private static string GetApiUrl(EnumOutgoingDataType dataType, OutgoingOptions options)
|
|
{
|
|
var apiUrl = dataType switch
|
|
{
|
|
EnumOutgoingDataType.PurchaseReceipt => options.Apis.Receipt.Url,//采购收货
|
|
EnumOutgoingDataType.PurchaseReturn => options.Apis.Return.Url,//采购退货
|
|
EnumOutgoingDataType.Transfer => options.Apis.Transfer.Url,//库存转移
|
|
EnumOutgoingDataType.BackFlush => options.Apis.BackFlush.Url, //生产回冲
|
|
EnumOutgoingDataType.Rework => options.Apis.Rework.Url, //返修
|
|
EnumOutgoingDataType.PreShipper => options.Apis.PreShipper.Url, //预发运
|
|
EnumOutgoingDataType.UnplannedReceipt => options.Apis.UnplannedReceipt.Url, //计划外入库
|
|
EnumOutgoingDataType.UnplannedDeliver => options.Apis.UnplannedDeliver.Url, //计划外出库
|
|
EnumOutgoingDataType.Count => options.Apis.Count.Url, //盘点
|
|
_ => throw new ArgumentOutOfRangeException(nameof(dataType), dataType, null)
|
|
};
|
|
|
|
return apiUrl;
|
|
}
|
|
|
|
private static bool GetApiEnabled(EnumOutgoingDataType dataType, OutgoingOptions options)
|
|
{
|
|
var apiEnabled = dataType switch
|
|
{
|
|
EnumOutgoingDataType.PurchaseReceipt => options.Apis.Receipt.Enabled,//采购收货
|
|
EnumOutgoingDataType.PurchaseReturn => options.Apis.Return.Enabled,//采购退货
|
|
EnumOutgoingDataType.Transfer => options.Apis.Transfer.Enabled,//库存转移
|
|
EnumOutgoingDataType.BackFlush => options.Apis.BackFlush.Enabled, //生产回冲
|
|
EnumOutgoingDataType.Rework => options.Apis.Rework.Enabled, //返修
|
|
EnumOutgoingDataType.PreShipper => options.Apis.PreShipper.Enabled, //预发运
|
|
EnumOutgoingDataType.UnplannedReceipt => options.Apis.UnplannedReceipt.Enabled, //计划外入库
|
|
EnumOutgoingDataType.UnplannedDeliver => options.Apis.UnplannedDeliver.Enabled, //计划外出库
|
|
EnumOutgoingDataType.Count => options.Apis.Count.Enabled, //盘点
|
|
_ => throw new ArgumentOutOfRangeException(nameof(dataType), dataType, null)
|
|
};
|
|
|
|
return apiEnabled;
|
|
}
|
|
}
|
|
|