Browse Source

修改执行超时bug

dev_DY_CC
刘云峰 10 months ago
parent
commit
b53e5f7552
  1. 38
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain.Shared/Commons/CommonHelper.cs
  2. 123
      be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/SplitPackings/SplitPackingRecManager.cs

38
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain.Shared/Commons/CommonHelper.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -36,5 +37,42 @@ public sealed class CommonHelper
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
} }
} }
}
/// <summary>
/// Expression动态拼接+泛型缓存
/// </summary>
/// <typeparam name="TIn"></typeparam>
/// <typeparam name="TOut"></typeparam>
public class ExpressionGenericMapper<TIn, TOut>//Mapper`2
{
private static Func<TIn, TOut> _FUNC = null;
static ExpressionGenericMapper()
{
ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
List<MemberBinding> memberBindingList = new List<MemberBinding>();
foreach (var item in typeof(TOut).GetProperties())
{
MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
MemberBinding memberBinding = Expression.Bind(item, property);
memberBindingList.Add(memberBinding);
}
foreach (var item in typeof(TOut).GetFields())
{
MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));
MemberBinding memberBinding = Expression.Bind(item, property);
memberBindingList.Add(memberBinding);
}
MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[]
{
parameterExpression
});
_FUNC = lambda.Compile();//拼装是一次性的
}
public static TOut Trans(TIn t)
{
return _FUNC(t);
}
} }

123
be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/SplitPackings/SplitPackingRecManager.cs

@ -25,9 +25,9 @@ public class SplitPackingRecManager : DomainService, ISplitPackingRecManager
public async Task<bool> BatchInsertAsync(List<SplitPackingRec> input) public async Task<bool> BatchInsertAsync(List<SplitPackingRec> input)
{ {
#region 校验
foreach (SplitPackingRec item in input) foreach (SplitPackingRec item in input)
{ {
#region 校验
if (item.OprType == OprTypeEnum.SplitBox || item.OprType == OprTypeEnum.MergeBox) //拆箱或合箱 if (item.OprType == OprTypeEnum.SplitBox || item.OprType == OprTypeEnum.MergeBox) //拆箱或合箱
{ {
if (item.FromPackingCode == item.ToPackingCode) if (item.FromPackingCode == item.ToPackingCode)
@ -42,18 +42,26 @@ public class SplitPackingRecManager : DomainService, ISplitPackingRecManager
throw new UserFriendlyException("操作类型不是拆箱或合箱状态,源箱码和目标箱码必须相同!"); throw new UserFriendlyException("操作类型不是拆箱或合箱状态,源箱码和目标箱码必须相同!");
} }
} }
#endregion
} }
#endregion
//缓存数据
var query = await _repository.GetQueryableAsync().ConfigureAwait(false); var query = await _repository.GetQueryableAsync().ConfigureAwait(false);
var fromPackCodeLst = input.Select(itm => itm.FromPackingCode).ToList();
var toPackCodeLst = input.Select(itm => itm.ToPackingCode).ToList();
var historyLst = await query.Where(itm => fromPackCodeLst.Contains(itm.ToPackingCode) && (itm.OprType == OprTypeEnum.SplitBox || itm.OprType == OprTypeEnum.MergeBox)).ToListAsync().ConfigureAwait(false); //取顶级箱码时用到
var hisLst2 = await query.Where(itm => fromPackCodeLst.Contains(itm.FromPackingCode)).ToListAsync().ConfigureAwait(false);
Dictionary<string, SplitPackingRec> hisLst3 = await query.Where(itm => toPackCodeLst.Contains(itm.FromPackingCode) && itm.OprType == OprTypeEnum.Other).ToDictionaryAsync(itm => itm.FromPackingCode, it2 => it2).ConfigureAwait(false);
//遍历、批量插入
List<SplitPackingRec> operLst = new List<SplitPackingRec>();
foreach (SplitPackingRec item in input) foreach (SplitPackingRec item in input)
{ {
if (item.OprType == OprTypeEnum.SplitBox || item.OprType == OprTypeEnum.MergeBox) if (item.OprType == OprTypeEnum.SplitBox || item.OprType == OprTypeEnum.MergeBox)
{ {
//设置顶级箱码 //设置顶级箱码
item.FromTopPackingCode = CalcuTopPackingCode(query, item.FromPackingCode); item.FromTopPackingCode = CalcuTopPackingCode(input, historyLst, item);
item.ToTopPackingCode = CalcuTopPackingCode(query, item.FromPackingCode); //ToPackingCode item.ToTopPackingCode = CalcuTopPackingCode(input, historyLst, item);
if (item.FromTopPackingCode.IsNullOrEmpty()) if (item.FromTopPackingCode.IsNullOrEmpty())
{ {
item.FromTopPackingCode = item.FromPackingCode; item.FromTopPackingCode = item.FromPackingCode;
@ -63,14 +71,12 @@ public class SplitPackingRecManager : DomainService, ISplitPackingRecManager
item.ToTopPackingCode = item.FromTopPackingCode; item.ToTopPackingCode = item.FromTopPackingCode;
} }
//设置六个单据号 //设置六个单据号
SetBillNumber(query, item); SetBillNumber(hisLst2, item);
//拆箱时,如果目标箱不存在,插入目标箱(两个箱码相同) //拆箱时,如果目标箱不存在,插入目标箱(两个箱码相同)
string toPackCode = item.ToPackingCode; if (hisLst3.ContainsKey(item.ToPackingCode) == false)
var toHis = await query.Where(itm => itm.FromPackingCode == toPackCode && itm.ToPackingCode == toPackCode).OrderBy(itm => itm.CreationTime).FirstOrDefaultAsync().ConfigureAwait(false);
if (toHis == null)
{ {
//SplitPackingRec newObj = CommonHelper.CloneObj(item);
SplitPackingRec newObj = CommonHelper.CloneObj(item); SplitPackingRec newObj = ExpressionGenericMapper<SplitPackingRec, SplitPackingRec>.Trans(item);
newObj.SetId(GuidGenerator.Create()); newObj.SetId(GuidGenerator.Create());
newObj.OprType = OprTypeEnum.Other; newObj.OprType = OprTypeEnum.Other;
newObj.FromPackingCode = newObj.ToPackingCode; //克隆赋值 newObj.FromPackingCode = newObj.ToPackingCode; //克隆赋值
@ -79,11 +85,20 @@ public class SplitPackingRecManager : DomainService, ISplitPackingRecManager
newObj.FromUom = newObj.ToUom; newObj.FromUom = newObj.ToUom;
newObj.FromQty = newObj.ToQty; newObj.FromQty = newObj.ToQty;
newObj.FromLot = newObj.ToLot; newObj.FromLot = newObj.ToLot;
var res = await _repository.InsertAsync(newObj, false).ConfigureAwait(false); //var res = await _repository.InsertAsync(newObj, false).ConfigureAwait(false);
operLst.Add(newObj);
} }
SplitPackingRec newEntity = CommonHelper.CloneObj(item); //var toHis = await query.Where(itm => itm.FromPackingCode == toPackCode && itm.ToPackingCode == toPackCode).OrderBy(itm => itm.CreationTime).FirstOrDefaultAsync().ConfigureAwait(false);
//if (toHis == null)
//{
//}
//SplitPackingRec newEntity = CommonHelper.CloneObj(item);
SplitPackingRec newEntity = ExpressionGenericMapper<SplitPackingRec, SplitPackingRec>.Trans(item);
newEntity.SetId(GuidGenerator.Create()); newEntity.SetId(GuidGenerator.Create());
var ret = await _repository.InsertAsync(newEntity, false).ConfigureAwait(false); // var ret = await _repository.InsertAsync(newEntity, false).ConfigureAwait(false);
operLst.Add(newEntity);
} }
else else
{ {
@ -95,11 +110,14 @@ public class SplitPackingRecManager : DomainService, ISplitPackingRecManager
{ {
item.ToTopPackingCode = item.FromPackingCode;// ToPackingCode; item.ToTopPackingCode = item.FromPackingCode;// ToPackingCode;
} }
SplitPackingRec newEntity = CommonHelper.CloneObj(item); //SplitPackingRec newEntity = CommonHelper.CloneObj(item);
SplitPackingRec newEntity = ExpressionGenericMapper<SplitPackingRec, SplitPackingRec>.Trans(item);
newEntity.SetId(GuidGenerator.Create()); newEntity.SetId(GuidGenerator.Create());
var ret = await _repository.InsertAsync(newEntity, false).ConfigureAwait(false); //var ret = await _repository.InsertAsync(newEntity, false).ConfigureAwait(false);
operLst.Add(newEntity);
} }
} //foreach } //foreach
await _repository.InsertManyAsync(operLst).ConfigureAwait(false);
return true; return true;
} }
@ -203,48 +221,71 @@ public class SplitPackingRecManager : DomainService, ISplitPackingRecManager
} }
/// <summary> /// <summary>
/// 取顶级箱码 /// 取顶级箱码
/// </summary> /// </summary>
/// <param name="historyQuery">箱码历史</param> /// <param name="memoryInput">本次操作要插入的拆箱记录列表,位于内存中</param>
/// <param name="packingCode">箱码,from to时都传入from</param> /// <param name="historyLst">数据库中的历史数据:拆箱或合箱、to箱码=内存中的from箱码</param>
/// <param name="curRecord">内存中当前记录</param>
/// <returns></returns> /// <returns></returns>
private static string CalcuTopPackingCode(IQueryable<SplitPackingRec> historyQuery, string packingCode) private static string CalcuTopPackingCode(List<SplitPackingRec> memoryInput, List<SplitPackingRec> historyLst, SplitPackingRec curRecord)
{ {
var qry = historyQuery.Where(itm => itm.OprType == OprTypeEnum.SplitBox || itm.OprType == OprTypeEnum.MergeBox); //根据当前记录在内存列表中递归取得最上级拆箱记录:1-2 2-3 3-4 根据3-4能取到1-2
string ret = null; SplitPackingRec priorMemoryRecord = curRecord;
SplitPackingRec? firstObj = null;
string toCode = packingCode;
while (1 == 1) while (1 == 1)
{ {
firstObj = qry.FirstOrDefault(itm => itm.ToPackingCode == toCode); var obj = memoryInput.FirstOrDefault(itm => itm.ToPackingCode == priorMemoryRecord.FromPackingCode);
if (firstObj == null) if (obj != null)
{ {
ret = toCode; priorMemoryRecord = obj;
break;
} }
else else
{ {
toCode = firstObj.FromPackingCode; break;
} }
} }
return ret; /*
//var historyRec = historyQuery.Where(itm => itm.FromPackingCode == packingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault(); from箱码在数据库中取上级拆箱记录
//if (historyRec != null)
//{ 1-1
// return historyRec.FromTopPackingCode; 2-2
//} 1-2 to箱码=1=from箱码
//else 3-3
2-3 to箱码=21-2
4-4
3-4 to箱码=32-3
5-5
3-5 to箱码=32-3
*/
var hisObj = historyLst.FirstOrDefault(itm => itm.ToPackingCode == priorMemoryRecord.FromPackingCode);
if (hisObj != null)
{
return hisObj.FromTopPackingCode;
}
else
{
return priorMemoryRecord.FromPackingCode;
}
//var qry = historyLst.Where(itm => itm.OprType == OprTypeEnum.SplitBox || itm.OprType == OprTypeEnum.MergeBox);
//string ret = null;
//SplitPackingRec? firstObj = null;
//string toCode = priorRecord.FromPackingCode;
//while (1 == 1)
//{ //{
// historyRec = historyQuery.Where(itm => itm.ToPackingCode == packingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault(); // firstObj = qry.FirstOrDefault(itm => itm.ToPackingCode == toCode);
// if (historyRec != null) // if (firstObj == null)
// {
// ret = toCode;
// break;
// }
// else
// { // {
// return historyRec.ToTopPackingCode; // toCode = firstObj.FromPackingCode;
// } // }
//} //}
//return null; //return ret;
} }
private static void SetBillNumber(IQueryable<SplitPackingRec> historyQuery, SplitPackingRec obj) private static void SetBillNumber(List<SplitPackingRec> historyQuery, SplitPackingRec obj)
{ {
var historyRec = historyQuery.Where(itm => itm.FromPackingCode == obj.FromPackingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault(); var historyRec = historyQuery.Where(itm => itm.FromPackingCode == obj.FromPackingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault();
if (historyRec != null) if (historyRec != null)

Loading…
Cancel
Save