Browse Source

更新版本

master
zhaoxinyu 5 months ago
parent
commit
1085274abe
  1. 9
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/INVOICE_SERVICE.cs
  2. 4
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAppService.cs
  3. 458
      code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/VmiAsyncBalanceService.cs

9
code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/INVOICE_SERVICE.cs

@ -1611,10 +1611,19 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
var invgourp=dbcontext.Set<INVOICE_MAP_GROUP>().Where(p => p.InvbillNum == p_dto.InvbillNum).ToList(); var invgourp=dbcontext.Set<INVOICE_MAP_GROUP>().Where(p => p.InvbillNum == p_dto.InvbillNum).ToList();
var detial=dbcontext.Set<INVOICE_WAIT_DETAIL>().Where(p => p.InvbillNum == p_dto.InvbillNum).ToList(); var detial=dbcontext.Set<INVOICE_WAIT_DETAIL>().Where(p => p.InvbillNum == p_dto.InvbillNum).ToList();
var notsettle=dbcontext.Set<INVOICE_NOT_SETTLE>().Where(p => p.InvBillNum == p_dto.InvbillNum).ToList(); var notsettle=dbcontext.Set<INVOICE_NOT_SETTLE>().Where(p => p.InvBillNum == p_dto.InvbillNum).ToList();
var detialext = dbcontext.Set<INVOICE_DETAIL_EXT>().Where(p => p.InvbillNum == p_dto.InvbillNum).ToList();
dbcontext.BulkDelete(invList); dbcontext.BulkDelete(invList);
dbcontext.BulkDelete(invgourp); dbcontext.BulkDelete(invgourp);
dbcontext.BulkDelete(detial); dbcontext.BulkDelete(detial);
dbcontext.BulkDelete(notsettle); dbcontext.BulkDelete(notsettle);
if (detialext != null && detialext.Count > 0)
{
dbcontext.BulkDelete(detialext);
}
} }
return new JsonResult(new { Code = 200, Message = "退回成功" }); ; return new JsonResult(new { Code = 200, Message = "退回成功" }); ;

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

@ -1271,6 +1271,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
/// <returns></returns> /// <returns></returns>
private async Task<string> CheckBusinessJISLocation<T>(List<T> p_list, EnumBusinessType enumBusinessType) where T : JisSeBase, new() private async Task<string> CheckBusinessJISLocation<T>(List<T> p_list, EnumBusinessType enumBusinessType) where T : JisSeBase, new()
{ {
if (p_list.Count == 0) if (p_list.Count == 0)
{ {
return "符合条件记录为0,请检查记录中EDI生产码、发运类型等 是否录入正确" ; return "符合条件记录为0,请检查记录中EDI生产码、发运类型等 是否录入正确" ;
@ -1286,6 +1287,9 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
p.Value == "MaiDanJianBBAC顺义" p.Value == "MaiDanJianBBAC顺义"
).ToList(); ).ToList();
break; break;
case EnumBusinessType.JisHBPO: case EnumBusinessType.JisHBPO:
locList = locList.Where(p => locList = locList.Where(p =>
p.Value == "JisHBPO" p.Value == "JisHBPO"

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

@ -79,235 +79,235 @@ namespace Win.Sfs.SettleAccount.Entities.BQ
} }
} }
private async Task InvokeInternal(IServiceProvider serviceProvider) //private async Task InvokeInternal(IServiceProvider serviceProvider)
{ //{
var batchSize = 10000; // var batchSize = 10000;
var fetchSize = 0; // var fetchSize = 0;
var connectionString = serviceProvider.GetRequiredService<IConfiguration>().GetConnectionString("SettleAccountService"); // var connectionString = serviceProvider.GetRequiredService<IConfiguration>().GetConnectionString("SettleAccountService");
Dictionary<string, VmiBalance> balanceCachedList = null; // Dictionary<string, VmiBalance> balanceCachedList = null;
for (var i = 0; i < 1000; i++) // for (var i = 0; i < 1000; i++)
{ // {
//1:新建 2:更新 // //1:新建 2:更新
var balanceList = new List<Tuple<VmiBalance, int>>(); // var balanceList = new List<Tuple<VmiBalance, int>>();
var vmiReplenishedList = new List<VmiReplenished>(); // var vmiReplenishedList = new List<VmiReplenished>();
var sw = new Stopwatch(); // var sw = new Stopwatch();
sw.Start(); // sw.Start();
using var connection = new Microsoft.Data.SqlClient.SqlConnection(connectionString); // using var connection = new Microsoft.Data.SqlClient.SqlConnection(connectionString);
connection.Open(); // connection.Open();
using var transaction = connection.BeginTransaction(); // using var transaction = connection.BeginTransaction();
try // try
{ // {
var command = connection.CreateCommand(); // var command = connection.CreateCommand();
command.Transaction = transaction; // command.Transaction = transaction;
var options = new DbContextOptionsBuilder<SettleAccountDbContext>().UseSqlServer(connection).Options; // var options = new DbContextOptionsBuilder<SettleAccountDbContext>().UseSqlServer(connection).Options;
using var context = new SettleAccountDbContext(options); // using var context = new SettleAccountDbContext(options);
context.Database.UseTransaction(transaction); // context.Database.UseTransaction(transaction);
var vmiMessageRepo = context.Set<VmiMessage>(); // var vmiMessageRepo = context.Set<VmiMessage>();
var vmiLogRepo = context.Set<VmiLog>(); // var vmiLogRepo = context.Set<VmiLog>();
var vmiBalanceRepo = context.Set<VmiBalance>(); // var vmiBalanceRepo = context.Set<VmiBalance>();
//读取可消费消息列表 // //读取可消费消息列表
var messages = vmiMessageRepo.AsNoTracking().Where(o => !o.isConsumed).OrderBy(o => o.Number).Take(batchSize).ToList(); // var messages = vmiMessageRepo.AsNoTracking().Where(o => !o.isConsumed).OrderBy(o => o.Number).Take(batchSize).ToList();
//没有可消费消息则返回 // //没有可消费消息则返回
if (!messages.Any()) // if (!messages.Any())
{ // {
transaction.Commit(); // transaction.Commit();
break; // break;
} // }
//缓存余额表 // //缓存余额表
var sw2 = new Stopwatch(); // var sw2 = new Stopwatch();
sw2.Start(); // sw2.Start();
Func<VmiBalance, string> keySelector = o => $"{o.DeliverBillType}.{o.CodeType}.{o.RealPartCode}.{o.VinCode}.{o.ErpToLoc}.{o.OrderNum}.{o.factory}.{o.Configcode}"; // Func<VmiBalance, string> keySelector = o => $"{o.DeliverBillType}.{o.CodeType}.{o.RealPartCode}.{o.VinCode}.{o.ErpToLoc}.{o.OrderNum}.{o.factory}.{o.Configcode}";
//if (balanceCachedList == null) // //if (balanceCachedList == null)
//{ // //{
balanceCachedList = vmiBalanceRepo.AsNoTracking().ToDictionary(keySelector); // balanceCachedList = vmiBalanceRepo.AsNoTracking().ToDictionary(keySelector);
//} // //}
sw2.Stop(); // sw2.Stop();
this._logger.LogInformation($"缓存结束:{balanceCachedList.Count}条,耗时 {sw2.ElapsedMilliseconds / 1000} 秒,{sw2.ElapsedMilliseconds} 豪秒"); // this._logger.LogInformation($"缓存结束:{balanceCachedList.Count}条,耗时 {sw2.ElapsedMilliseconds / 1000} 秒,{sw2.ElapsedMilliseconds} 豪秒");
//设置数量为实际返回数量 // //设置数量为实际返回数量
fetchSize = messages.Count; // fetchSize = messages.Count;
//反序列化获取库存事务 // //反序列化获取库存事务
var list = messages.Select(o => // var list = messages.Select(o =>
{ // {
var log = JsonSerializer.Deserialize<VmiLog>(o.Message); // var log = JsonSerializer.Deserialize<VmiLog>(o.Message);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(o.Message); // var jsonElement = JsonSerializer.Deserialize<JsonElement>(o.Message);
var property = jsonElement.GetProperty("Id"); // var property = jsonElement.GetProperty("Id");
Console.WriteLine(jsonElement); // Console.WriteLine(jsonElement);
var id = Guid.Parse(property.GetString()); // var id = Guid.Parse(property.GetString());
log.SetId(id); // log.SetId(id);
return new LogToBalance { VmiMessage = o, Log = log, Table = $"Set_VmiLog_{log.ChangedTime.Year}_{(log.ChangedTime.Month - 1) / 3 + 1}" }; // return new LogToBalance { VmiMessage = o, Log = log, Table = $"Set_VmiLog_{log.ChangedTime.Year}_{(log.ChangedTime.Month - 1) / 3 + 1}" };
}); // });
//获取分表名称 // //获取分表名称
var tables = list.Select(o => o.Table).Distinct().ToList(); // var tables = list.Select(o => o.Table).Distinct().ToList();
//创建分表 // //创建分表
foreach (var table in tables) // foreach (var table in tables)
{ // {
command.CommandText = $"select OBJECT_ID('{table}', 'U')"; // command.CommandText = $"select OBJECT_ID('{table}', 'U')";
var result = command.ExecuteScalar().ToString(); // var result = command.ExecuteScalar().ToString();
if (result == string.Empty) // if (result == string.Empty)
{ // {
command.CommandText = $"select * into {table} from Set_VmiLog where 1=0;"; // command.CommandText = $"select * into {table} from Set_VmiLog where 1=0;";
command.ExecuteNonQuery(); // command.ExecuteNonQuery();
command.CommandText = $"alter table {table} add constraint PK_{table} primary key (Id);"; // command.CommandText = $"alter table {table} add constraint PK_{table} primary key (Id);";
command.ExecuteNonQuery(); // command.ExecuteNonQuery();
} // }
} // }
foreach (var item in list) // foreach (var item in list)
{ // {
var message = item.VmiMessage; // var message = item.VmiMessage;
message.isConsumed = true; // message.isConsumed = true;
var log = item.Log; // var log = item.Log;
//本地查找 // //本地查找
var balance = balanceList.Select(o => o.Item1).FirstOrDefault( // var balance = balanceList.Select(o => o.Item1).FirstOrDefault(
o => // o =>
o.DeliverBillType == log.DeliverBillType && // o.DeliverBillType == log.DeliverBillType &&
o.CodeType == log.CodeType && // o.CodeType == log.CodeType &&
o.RealPartCode == log.RealPartCode && // o.RealPartCode == log.RealPartCode &&
o.VinCode == log.VinCode && // o.VinCode == log.VinCode &&
o.ErpToLoc == log.ErpToLoc&& // o.ErpToLoc == log.ErpToLoc&&
o.OrderNum == log.OrderNum && // o.OrderNum == log.OrderNum &&
o.factory == log.factory && // o.factory == log.factory &&
o.Configcode == log.Configcode // o.Configcode == log.Configcode
); // );
//数据库查找 // //数据库查找
if (balance == null) // if (balance == null)
{ // {
balance = balanceCachedList.GetValueOrDefault($"{log.DeliverBillType}.{log.CodeType}.{log.RealPartCode}.{log.VinCode}.{log.ErpToLoc}.{log.OrderNum}.{log.factory}.{log.Configcode}"); // balance = balanceCachedList.GetValueOrDefault($"{log.DeliverBillType}.{log.CodeType}.{log.RealPartCode}.{log.VinCode}.{log.ErpToLoc}.{log.OrderNum}.{log.factory}.{log.Configcode}");
//if (balance == null) // //if (balance == null)
//{ // //{
// balance = vmiBalanceRepo.AsNoTracking().FirstOrDefault( // // balance = vmiBalanceRepo.AsNoTracking().FirstOrDefault(
// // balanceCachedList.Find( // // // balanceCachedList.Find(
// o => o.DeliverBillType == log.DeliverBillType && // // o => o.DeliverBillType == log.DeliverBillType &&
// o.CodeType == log.CodeType && // // o.CodeType == log.CodeType &&
// o.RealPartCode == log.RealPartCode && // // o.RealPartCode == log.RealPartCode &&
// o.VinCode == log.VinCode && // // o.VinCode == log.VinCode &&
// o.ErpToLoc == log.ErpToLoc && // // o.ErpToLoc == log.ErpToLoc &&
// o.OrderNum == log.OrderNum && // // o.OrderNum == log.OrderNum &&
// 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();
balanceList.Add(new Tuple<VmiBalance, int>(balance, 1)); // balanceList.Add(new Tuple<VmiBalance, int>(balance, 1));
if (log.LogType == VmiLogType.Type300) // if (log.LogType == VmiLogType.Type300)
{//反结算入库,重建库存 // {//反结算入库,重建库存
var logHistory = vmiLogRepo.AsNoTracking().FirstOrDefault( // var logHistory = vmiLogRepo.AsNoTracking().FirstOrDefault(
o => o.LogType == VmiLogType.Type100 && // o => o.LogType == VmiLogType.Type100 &&
o.DeliverBillType == log.DeliverBillType && // o.DeliverBillType == log.DeliverBillType &&
o.CodeType == log.CodeType && // o.CodeType == log.CodeType &&
o.RealPartCode == log.RealPartCode && // o.RealPartCode == log.RealPartCode &&
o.VinCode == log.VinCode && // o.VinCode == log.VinCode &&
o.ErpToLoc == log.ErpToLoc && // o.ErpToLoc == log.ErpToLoc &&
o.OrderNum == log.OrderNum && // o.OrderNum == log.OrderNum &&
o.factory == log.factory && // o.factory == log.factory &&
o.Configcode == log.Configcode); // o.Configcode == log.Configcode);
if (logHistory != null) // if (logHistory != null)
{ // {
balance.InjectFrom(logHistory); // balance.InjectFrom(logHistory);
} // }
else // else
{ // {
balance.InjectFrom(log); // balance.InjectFrom(log);
} // }
} // }
else // else
{ // {
balance.InjectFrom(log); // balance.InjectFrom(log);
} // }
balance.Qty = log.ChangedQty; // balance.Qty = log.ChangedQty;
} // }
else // else
{//存在库存记录 // {//存在库存记录
if (!balanceList.Any(o => o.Item1.Id == balance.Id)) // if (!balanceList.Any(o => o.Item1.Id == balance.Id))
{ // {
balanceList.Add(new Tuple<VmiBalance, int>(balance, 2)); // balanceList.Add(new Tuple<VmiBalance, int>(balance, 2));
} // }
var logType = log.LogType; // var logType = log.LogType;
var currentQty = balance.Qty;// + log.ty // var currentQty = balance.Qty;// + log.ty
if (logType == VmiLogType.Type100) // if (logType == VmiLogType.Type100)
{ // {
//发运入库,负库存字段需要更新 // //发运入库,负库存字段需要更新
if (balance.Qty < decimal.Zero) // if (balance.Qty < decimal.Zero)
{ // {
balance.InjectFrom(log); // balance.InjectFrom(log);
} // }
} // }
else if (logType == VmiLogType.Type300) // else if (logType == VmiLogType.Type300)
{ // {
//反结入库,只更新库存 // //反结入库,只更新库存
} // }
else if (logType == VmiLogType.Type500) // else if (logType == VmiLogType.Type500)
{ // {
//调整入库,更新库存和其他字段 // //调整入库,更新库存和其他字段
balance.InjectFrom(log); // balance.InjectFrom(log);
} // }
if (logType == VmiLogType.Type100 && balance.Qty < decimal.Zero) // if (logType == VmiLogType.Type100 && balance.Qty < decimal.Zero)
{ // {
//添加负库存补货记录 // //添加负库存补货记录
var log2 = new VmiReplenished(); // var log2 = new VmiReplenished();
log2.InjectFrom(log); // log2.InjectFrom(log);
vmiReplenishedList.Add(log2); // vmiReplenishedList.Add(log2);
} // }
// 更新库存 // // 更新库存
balance.Qty = currentQty + log.ChangedQty; // balance.Qty = currentQty + log.ChangedQty;
} // }
} // }
//更新事务分表 // //更新事务分表
foreach (var item in tables) // foreach (var item in tables)
{ // {
var logs = list.Where(o => o.Table == item).Select(o => o.Log).ToList(); // var logs = list.Where(o => o.Table == item).Select(o => o.Log).ToList();
await context.BulkCopyAsync(new LinqToDB.Data.BulkCopyOptions { TableName = item }, logs).ConfigureAwait(false); // await context.BulkCopyAsync(new LinqToDB.Data.BulkCopyOptions { TableName = item }, logs).ConfigureAwait(false);
} // }
//批量插入负库存补货记录 // //批量插入负库存补货记录
await context.BulkInsertAsync(vmiReplenishedList).ConfigureAwait(false); // await context.BulkInsertAsync(vmiReplenishedList).ConfigureAwait(false);
//批量插入库存余额 // //批量插入库存余额
var addList = balanceList.Where(o => o.Item2 == 1 && o.Item1.Qty != decimal.Zero).Select(o => o.Item1).ToList(); // var addList = balanceList.Where(o => o.Item2 == 1 && o.Item1.Qty != decimal.Zero).Select(o => o.Item1).ToList();
await context.BulkInsertAsync(addList).ConfigureAwait(false); // await context.BulkInsertAsync(addList).ConfigureAwait(false);
//批量更新库存余额 // //批量更新库存余额
var editList = balanceList.Where(o => o.Item2 == 2 && o.Item1.Qty != decimal.Zero).Select(o => o.Item1).ToList(); // var editList = balanceList.Where(o => o.Item2 == 2 && o.Item1.Qty != decimal.Zero).Select(o => o.Item1).ToList();
await context.BulkUpdateAsync(editList).ConfigureAwait(false); // await context.BulkUpdateAsync(editList).ConfigureAwait(false);
//批量删除库存余额 // //批量删除库存余额
var removeList = balanceList.Where(o => o.Item2 == 2 && o.Item1.Qty == decimal.Zero).Select(o => o.Item1).ToList(); // var removeList = balanceList.Where(o => o.Item2 == 2 && o.Item1.Qty == decimal.Zero).Select(o => o.Item1).ToList();
await context.BulkDeleteAsync(removeList).ConfigureAwait(false); // await context.BulkDeleteAsync(removeList).ConfigureAwait(false);
//批量删除消息 // //批量删除消息
await context.BulkDeleteAsync(messages).ConfigureAwait(false); // await context.BulkDeleteAsync(messages).ConfigureAwait(false);
transaction.Commit(); // transaction.Commit();
////更新余额缓存 // ////更新余额缓存
//var sw3 = new Stopwatch(); // //var sw3 = new Stopwatch();
//sw3.Start(); // //sw3.Start();
//addList.ForEach(o => balanceCachedList.Add(keySelector(o), o)); // //addList.ForEach(o => balanceCachedList.Add(keySelector(o), o));
//removeList.ForEach(o => balanceCachedList.Remove(keySelector(o))); // //removeList.ForEach(o => balanceCachedList.Remove(keySelector(o)));
//sw3.Stop(); // //sw3.Stop();
//this._logger.LogInformation($"更新缓存:{balanceList.Count}条,耗时 {sw3.ElapsedMilliseconds / 1000} 秒,{sw3.ElapsedMilliseconds} 豪秒"); // //this._logger.LogInformation($"更新缓存:{balanceList.Count}条,耗时 {sw3.ElapsedMilliseconds / 1000} 秒,{sw3.ElapsedMilliseconds} 豪秒");
} // }
catch (Exception ex) // catch (Exception ex)
{ // {
this._logger.LogError(ex.ToString()); // this._logger.LogError(ex.ToString());
throw new UserFriendlyException(ex.ToString(), "500"); // throw new UserFriendlyException(ex.ToString(), "500");
} // }
finally // finally
{ // {
sw.Stop(); // sw.Stop();
this._logger.LogInformation($"处理{fetchSize}条,耗时 {sw.ElapsedMilliseconds / 1000 / 60}分钟,{sw.ElapsedMilliseconds / 1000}秒"); // this._logger.LogInformation($"处理{fetchSize}条,耗时 {sw.ElapsedMilliseconds / 1000 / 60}分钟,{sw.ElapsedMilliseconds / 1000}秒");
} // }
try // try
{ // {
using var scope = serviceProvider.CreateScope(); // using var scope = serviceProvider.CreateScope();
using var connection2 = new SqlConnection(connectionString); // using var connection2 = new SqlConnection(connectionString);
connection2.Open(); // connection2.Open();
var command = connection2.CreateCommand(); // var command = connection2.CreateCommand();
command.CommandText = "SELECT count(*) FROM Set_VmiMessage WITH(NOLOCK)"; // command.CommandText = "SELECT count(*) FROM Set_VmiMessage WITH(NOLOCK)";
var count = Convert.ToInt64(command.ExecuteScalar().ToString()); // var count = Convert.ToInt64(command.ExecuteScalar().ToString());
scope.ServiceProvider.GetService<IHubContext<PageHub>>().Clients.All.ServerToClient("VmiBalance", count.ToString(), ""); // scope.ServiceProvider.GetService<IHubContext<PageHub>>().Clients.All.ServerToClient("VmiBalance", count.ToString(), "");
} // }
catch (Exception) // catch (Exception)
{ // {
throw; // throw;
} // }
} // }
} //}
} }
public class LogToBalance public class LogToBalance

Loading…
Cancel
Save