Browse Source

优化同步库存时系统资源占用

master
wanggang 1 year ago
parent
commit
14e76388fb
  1. 2
      code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/log.js
  2. 37
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs
  3. 6
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAsyncBalanceService.cs

2
code/src/Modules/SettleAccount/host/SettleAccount.HttpApi.Host/wwwroot/models/vmi/log.js

@ -30,7 +30,6 @@ export default function () {
title: "通用代码",
type: "object",
properties: {
// logTypes: { type: "array", hidden: true, default: ["Type200", "Type400"] },
filters: {
title: "项目",
type: "array",
@ -135,6 +134,7 @@ export default function () {
sorting: {
hidden: true,
},
useHistory: { type: "boolean", title: "查询历史数据" },
},
},
},

37
code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs

@ -293,6 +293,10 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
[HttpPost]
public async Task<PagedResultDto<VmiLog>> Log(LogRequestDto input)
{
if (input.UseHistory)
{
return await Log2(input).ConfigureAwait(false);
}
//按季度计算查询需要 union 的表名
var start = DateTime.Parse(input.Filters.FirstOrDefault(o => o.Column == "changedTime" && o.Action == EnumFilterAction.BiggerThanOrEqual).Value);
var end = DateTime.Parse(input.Filters.FirstOrDefault(o => o.Column == "changedTime" && o.Action == EnumFilterAction.SmallThan).Value);
@ -348,7 +352,34 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
}
/// <summary>
/// 3.1库存事务导出
/// 3.1 库存事务查询(不分表)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<PagedResultDto<VmiLog>> Log2(LogRequestDto input)
{
var connectionString = this._serviceProvider.GetRequiredService<IConfiguration>().GetConnectionString("SettleAccountService");
var options = new DbContextOptionsBuilder<SettleAccountDbContext>().UseSqlServer(connectionString).Options;
using var db = new SettleAccountDbContext(options);
var query = db.Set<VmiLog>().FromSqlRaw("select * from Set_VmiLog WITH(NOLOCK)");
var filters = input.Filters.ToLambda<VmiLog>();
if (input.Filters.Count > 0)
{
query = query.Where(input.Filters.ToLambda<VmiLog>());
}
if (input.LogTypes.Count > 0)
{
query = query.Where(o => input.LogTypes.Contains(o.LogType));
}
var totalCount = query.Count();
query = string.IsNullOrEmpty(input.Sorting) ? query : DynamicQueryableExtensions.OrderBy(query, input.Sorting);
var entities = await query.PageBy(input.SkipCount, input.MaxResultCount).ToListAsync().ConfigureAwait(false);
return new PagedResultDto<VmiLog>(totalCount, entities);
}
/// <summary>
/// 3.2库存事务导出
/// </summary>
[HttpPost]
public async Task<string> LogExport(RequestDto input)
@ -565,7 +596,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
var batchSize = 10000;
var fetchSize = 0;
var connectionString = serviceProvider.GetRequiredService<IConfiguration>().GetConnectionString("SettleAccountService");
while(true)
while (true)
{
var balanceList = new List<Tuple<VmiBalance, int>>();
var sw = new Stopwatch();
@ -678,7 +709,6 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
}
}
private List<Tuple<T, List<ValidationResult>>> ImportInternal<T>(byte[] data)
{
var list = new List<Tuple<T, List<ValidationResult>>>();
@ -839,6 +869,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
public class LogRequestDto : RequestDto
{
public List<VmiLogType> LogTypes { get; set; } = new List<VmiLogType>();
public bool UseHistory { get; set; }
}
public class VmiBalanceSumDto

6
code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAsyncBalanceService.cs

@ -4,6 +4,7 @@ using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@ -55,6 +56,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
return (DateTime.Now - now).TotalMinutes;
}
[NonAction]
public async Task Invoke(IServiceProvider serviceProvider)
{
@ -71,7 +73,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
private async Task InvokeInternal(IServiceProvider serviceProvider)
{
var batchSize = 10000;
var batchSize = 2500;
var fetchSize = 0;
var connectionString = serviceProvider.GetRequiredService<IConfiguration>().GetConnectionString("SettleAccountService");
for (var i = 0; i < 1000; i++)
@ -149,7 +151,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
//数据库查找
if (balance == null)
{
balance = vmiBalanceRepo.FirstOrDefault(
balance = vmiBalanceRepo.AsNoTracking().FirstOrDefault(
o => o.DeliverBillType == log.DeliverBillType &&
o.CodeType == log.CodeType &&
o.RealPartCode == log.RealPartCode &&

Loading…
Cancel
Save