|
@ -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箱码=2的(找到1-2记录,取顶级箱码字段) |
|
|
|
|
|
4-4 |
|
|
|
|
|
3-4 查询to箱码=3的(找到2-3记录,取顶级箱码字段) |
|
|
|
|
|
5-5 |
|
|
|
|
|
3-5 查询to箱码=3的(找到2-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) |
|
|