箱库存的优化

This commit is contained in:
tongfei
2023-12-18 13:53:10 +08:00
parent 9afc872c34
commit f247ae1107
6 changed files with 367 additions and 242 deletions

View File

@@ -419,7 +419,7 @@ namespace WMS.Web.Domain.Services
//2.1.遍历:组装明细
generateDtoList.ForEach(x =>
{
{
foreach (var detItem in dtoData.Details)
{
//2.1箱是当前的
@@ -933,7 +933,7 @@ namespace WMS.Web.Domain.Services
x.SerialNumbers.AddRange(current_box_mat_serNums);
});
}
else
else
{
//赋值序列号
addEntity.Details.ForEach(x =>
@@ -1129,6 +1129,11 @@ namespace WMS.Web.Domain.Services
var update_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
var serNubs = dtoDatas.SelectMany(x => x.Details).SelectMany(x => x.SerialNumbers).ToList();
var serialNumbers = await _serialNumbersRepositories.GetEntityList(serNubs);
var out_serNubs = new List<SerialNumbers>();
//2.获取“箱库存集合”
var boxIds = dtoDatas.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
@@ -1158,6 +1163,22 @@ namespace WMS.Web.Domain.Services
}
}
});
//找到:序列号不属于当前箱;找到后对应的箱子进行箱库存变更序列号
foreach (var item in updateEntity.Details)
{
foreach (var itemSerNmb in item.SerialNumbers)
{
var current_item_SerNb = serialNumbers.Where(x => x.SerialNumber == itemSerNmb).FirstOrDefault();
if (current_item_SerNb != null && current_item_SerNb.MaterialId == item.MaterialId && current_item_SerNb.BoxId != updateEntity.BoxId)
{
out_serNubs.Add(current_item_SerNb);
}
}
}
//3.4明细添加新的物料
foreach (var detItem in dto.Details)
{
@@ -1206,6 +1227,19 @@ namespace WMS.Web.Domain.Services
}
}
});
//找到:序列号不属于当前箱;找到后对应的箱子进行箱库存变更序列号
foreach (var item in update_entity.Details)
{
foreach (var itemSerNmb in item.SerialNumbers)
{
var current_item_SerNb = serialNumbers.Where(x => x.SerialNumber == itemSerNmb).FirstOrDefault();
if (current_item_SerNb != null && current_item_SerNb.MaterialId == item.MaterialId && current_item_SerNb.BoxId != update_entity.BoxId)
{
out_serNubs.Add(current_item_SerNb);
}
}
}
//3.4明细添加新的物料
foreach (var detItem in dto.Details)
{
@@ -1243,6 +1277,12 @@ namespace WMS.Web.Domain.Services
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//盘点单-箱库存的变更:第二步骤,为了不是当前扫的所在箱里的序列号;如果是其它箱需要减箱库存
var result = await this.ExeTaskBox(out_serNubs, isTransaction);
if (!result.IsSuccess)
return result;
//5.即时库存:处理
//5.1先合并相同的数据
var invDetGenDtos_in = InventoryDetailsGenerateDto.Where(x => x.InventoryInOutType == (int)InventoryInOutType.In).GroupBy(x => new { x.OrgCode, x.MaterialId, x.StockCode, x.SubStockId }).Select(x => new InventoryDetailsGenerateDto()
@@ -1276,44 +1316,76 @@ namespace WMS.Web.Domain.Services
return Result.ReSuccess();
}
private async Task<Result> ExeTaskBox(List<BoxTaskGenerateDto> sourceBox,List<string> serNubs, bool isTransaction)
/// <summary>
/// 盘点单-箱库存的变更:第二步骤,为了不是当前扫的所在箱里的序列号;如果是其它箱的需要减箱库存
/// </summary>
/// <param name="out_SerialNumbers"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeTaskBox(List<SerialNumbers> out_SerialNumbers, bool isTransaction)
{
//1.先通过序列号找到-序列号信息集合
var serialNumbers = await _serialNumbersRepositories.GetEntityList(serNubs);
//2.找到序列号对应的boxId
var destBoxIds = serialNumbers.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
//3.找到box对应的箱库存
var boxInventorys = await _boxInventoryRepositories.GetList(destBoxIds);
var boxIds = out_SerialNumbers.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
var delete_ids = new List<int>();
var update_entitys = new List<BoxInventory>();
var delete_ids1 = new List<int>();
var update_entitys1 = new List<BoxInventory>();
var InventoryDetailsGenerateDto1 = new List<InventoryDetailsGenerateDto>();
foreach (var item in boxInventorys)
{
var update_entity = item;
////遍历
//foreach (var destBoxId in destBoxIds)
//{
// var sourBox= sourceBox.Where(x => x.BoxId == destBoxId).FirstOrDefault();
// var destBoxInvent= boxInventorys.Where(x => x.BoxId == destBoxId).FirstOrDefault();
// if (sourBox==null && destBoxInvent!=null)
// {
// if(destBoxInvent)
// var updateEntity = boxInvent;
// updateEntity.Details = boxInvent.Details;
// //3.3序列号重新给值:已有的物料
// updateEntity.Details.ForEach(x =>
// {
// foreach (var detItem in dto.Details)
// {
// if (x.MaterialId == detItem.MaterialId)
// {
// x.Qty = x.Qty + detItem.Qty;
// x.SerialNumbers = detItem.SerialNumbers;
// }
// }
// });
// }
//}
return null;
foreach (var itemDet in item.Details)
{
var current_sers_info = out_SerialNumbers.Where(x => x.BoxId == item.BoxId && x.MaterialId == itemDet.MaterialId).ToList();
if (current_sers_info != null && current_sers_info.Count != 0)
{
var uptDet = update_entity.Details.Where(d => d.MaterialId == itemDet.MaterialId).FirstOrDefault();
uptDet.Qty = uptDet.Qty - current_sers_info.Count;
var crrent_sers = current_sers_info.Select(x => x.SerialNumber).ToList();
uptDet.SerialNumbers.RemoveAll(r => crrent_sers.Contains(r));
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = itemDet.MaterialId;
inventoryDet.OrgCode = item.OrgCode;
inventoryDet.StockCode = item.StockCode;
inventoryDet.SubStockId = item.SubStockId;
inventoryDet.Qty = current_sers_info.Count;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//3.2.2即时库存:修改的集合
InventoryDetailsGenerateDto1.Add(inventoryDet);
}
}
//4.1判断要修改的箱库存对象是否所有的物料库存的数量都为0“是”则删除该箱库存,"否"则修改;
var isAllNoInventory = update_entity.Details.All(x => x.Qty == 0);
if (isAllNoInventory)
delete_ids1.Add(update_entity.Id);
else
//4.2添加要更新的箱库存实体
update_entitys1.Add(update_entity);
}
var isSuccess = true;
//4.数据库更新操作:更新和添加
if (update_entitys1.Count != 0)
{
isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys1, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (delete_ids1.Count != 0)
{
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids1, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (InventoryDetailsGenerateDto1.Count != 0)
{
var InventoryDetailsGenerate_result = await _inventoryDetailsService.GenerateInventoryDetails(InventoryDetailsGenerateDto1, isTransaction);
if (!InventoryDetailsGenerate_result.IsSuccess)
return InventoryDetailsGenerate_result;
}
return Result.ReSuccess();
}
/// <summary>
@@ -1355,7 +1427,7 @@ namespace WMS.Web.Domain.Services
{
MaterialId = d.Key.MaterialId,
Qty = d.Sum(t => t.Qty),
SerialNumbers = d.SelectMany(t => t.SerialNumbers).ToList()
SerialNumbers = d.SelectMany(t => t.SerialNumbers).ToList()
}).ToList();
//3.4明细映射用合并过的dto数据
addEntity.Details = _mapper.Map<List<BoxInventoryDetails>>(dtoDets_merge);