|
@ -12,6 +12,7 @@ using Microsoft.Extensions.Configuration; |
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
using Microsoft.Extensions.Logging; |
|
|
using Microsoft.Extensions.Logging; |
|
|
using Omu.ValueInjecter; |
|
|
using Omu.ValueInjecter; |
|
|
|
|
|
using Volo.Abp; |
|
|
using Volo.Abp.Application.Services; |
|
|
using Volo.Abp.Application.Services; |
|
|
using Volo.Abp.DependencyInjection; |
|
|
using Volo.Abp.DependencyInjection; |
|
|
using Win.Sfs.SettleAccount.Entities.BQ.Vmi; |
|
|
using Win.Sfs.SettleAccount.Entities.BQ.Vmi; |
|
@ -49,7 +50,8 @@ public class VmiAsyncBalanceService : Controller, IApplicationService, IJobServi |
|
|
[NonAction] |
|
|
[NonAction] |
|
|
public async Task Invoke(IServiceProvider serviceProvider) |
|
|
public async Task Invoke(IServiceProvider serviceProvider) |
|
|
{ |
|
|
{ |
|
|
for (var i = 0; i < 100; i++) |
|
|
var batchSize = 1000; |
|
|
|
|
|
for (var i = 0; i < 1000; i++) |
|
|
{ |
|
|
{ |
|
|
var sw = new Stopwatch(); |
|
|
var sw = new Stopwatch(); |
|
|
sw.Start(); |
|
|
sw.Start(); |
|
@ -68,7 +70,9 @@ public class VmiAsyncBalanceService : Controller, IApplicationService, IJobServi |
|
|
{ |
|
|
{ |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
var messages = context.Set<VmiMessage>().Where(o => !o.isConsumed).OrderBy(o => o.Number).Take(1000).ToList(); |
|
|
var messages = context.Set<VmiMessage>() |
|
|
|
|
|
//.AsNoTracking()
|
|
|
|
|
|
.Where(o => !o.isConsumed).OrderBy(o => o.Number).Take(batchSize).ToList(); |
|
|
var repo = context.Set<VmiBalance>(); |
|
|
var repo = context.Set<VmiBalance>(); |
|
|
foreach (var message in messages) |
|
|
foreach (var message in messages) |
|
|
{ |
|
|
{ |
|
@ -101,17 +105,41 @@ public class VmiAsyncBalanceService : Controller, IApplicationService, IJobServi |
|
|
o.factory == log.factory && |
|
|
o.factory == log.factory && |
|
|
o.Configcode == log.Configcode); |
|
|
o.Configcode == log.Configcode); |
|
|
if (balance == null) |
|
|
if (balance == null) |
|
|
{ |
|
|
{//不存在库存记录
|
|
|
|
|
|
//新建库存记录
|
|
|
balance = new VmiBalance(); |
|
|
balance = new VmiBalance(); |
|
|
|
|
|
if (log.LogType == VmiLogType.Type300) |
|
|
|
|
|
{//反结算入库,重建库存
|
|
|
|
|
|
var logHistory = context.Set<VmiLog>().AsNoTracking().FirstOrDefault( |
|
|
|
|
|
o => o.LogType == VmiLogType.Type100 && |
|
|
|
|
|
o.DeliverBillType == log.DeliverBillType && |
|
|
|
|
|
o.CodeType == log.CodeType && |
|
|
|
|
|
o.DeliverBillType == log.DeliverBillType && |
|
|
|
|
|
o.VinCode == log.VinCode && |
|
|
|
|
|
o.ErpToLoc == log.ErpToLoc && |
|
|
|
|
|
o.OrderNum == log.OrderNum && |
|
|
|
|
|
o.factory == log.factory && |
|
|
|
|
|
o.Configcode == log.Configcode); |
|
|
|
|
|
if (logHistory != null) |
|
|
|
|
|
{ |
|
|
|
|
|
balance.InjectFrom(logHistory); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
balance.InjectFrom(log); |
|
|
balance.InjectFrom(log); |
|
|
await repo.AddAsync(balance).ConfigureAwait(false); |
|
|
} |
|
|
log.InjectFrom(balance); |
|
|
|
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
|
|
|
|
balance.InjectFrom(log); |
|
|
|
|
|
} |
|
|
|
|
|
balance.Qty = log.ChangedQty; |
|
|
|
|
|
await repo.AddAsync(balance).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{//存在库存记录
|
|
|
var logType = log.LogType; |
|
|
var logType = log.LogType; |
|
|
|
|
|
var currentQty = balance.Qty;// + log.ty
|
|
|
var qty = balance.Qty;// + log.ty
|
|
|
|
|
|
if (logType == VmiLogType.Type100) |
|
|
if (logType == VmiLogType.Type100) |
|
|
{ |
|
|
{ |
|
|
//发运入库,负库存字段需要更新
|
|
|
//发运入库,负库存字段需要更新
|
|
@ -129,20 +157,20 @@ public class VmiAsyncBalanceService : Controller, IApplicationService, IJobServi |
|
|
//调整入库,更新库存和其他字段
|
|
|
//调整入库,更新库存和其他字段
|
|
|
balance.InjectFrom(log); |
|
|
balance.InjectFrom(log); |
|
|
} |
|
|
} |
|
|
// 更新库存
|
|
|
if (logType == VmiLogType.Type100 && balance.Qty < decimal.Zero) |
|
|
balance.Qty = qty; |
|
|
|
|
|
if (balance.Qty == decimal.Zero) |
|
|
|
|
|
{ |
|
|
|
|
|
//删除0库存
|
|
|
|
|
|
repo.Remove(balance); |
|
|
|
|
|
} |
|
|
|
|
|
if (logType == VmiLogType.Type100 && balance.Qty < decimal.Zero && log.Qty > 0) |
|
|
|
|
|
{ |
|
|
{ |
|
|
//添加负库存补货记录
|
|
|
//添加负库存补货记录
|
|
|
var log2 = new VmiReplenished(); |
|
|
var log2 = new VmiReplenished(); |
|
|
log2.InjectFrom(log); |
|
|
log2.InjectFrom(log); |
|
|
await context.Set<VmiReplenished>().AddAsync(log2).ConfigureAwait(false); |
|
|
await context.Set<VmiReplenished>().AddAsync(log2).ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
|
|
|
// 更新库存
|
|
|
|
|
|
balance.Qty = currentQty + log.ChangedQty; |
|
|
|
|
|
if (balance.Qty == decimal.Zero) |
|
|
|
|
|
{ |
|
|
|
|
|
//删除0库存
|
|
|
|
|
|
repo.Remove(balance); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
message.isConsumed = true; |
|
|
message.isConsumed = true; |
|
|
} |
|
|
} |
|
@ -153,12 +181,12 @@ public class VmiAsyncBalanceService : Controller, IApplicationService, IJobServi |
|
|
{ |
|
|
{ |
|
|
this._logger.LogError(ex.ToString()); |
|
|
this._logger.LogError(ex.ToString()); |
|
|
transaction.Rollback(); |
|
|
transaction.Rollback(); |
|
|
throw; |
|
|
throw new UserFriendlyException(ex.ToString(), "500"); |
|
|
} |
|
|
} |
|
|
finally |
|
|
finally |
|
|
{ |
|
|
{ |
|
|
sw.Stop(); |
|
|
sw.Stop(); |
|
|
this._logger.LogInformation($"结束,耗时 ${sw.ElapsedMilliseconds / 1000 / 60}分钟"); |
|
|
this._logger.LogInformation($"处理{batchSize}条,耗时 {sw.ElapsedMilliseconds / 1000 / 60}分钟,{sw.ElapsedMilliseconds / 1000}秒"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|