Files
WMS-Api/src/WMS.Web.Domain/Services/BoxInventoryService.cs
tongfei 92c999865a tt
2024-01-19 14:28:01 +08:00

1969 lines
97 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using WMS.Web.Core.Dto.Inventory;
using WMS.Web.Core.Internal.Results;
using WMS.Web.Domain.Entitys;
using WMS.Web.Domain.Infrastructure;
using WMS.Web.Domain.IService;
using WMS.Web.Domain.Values;
namespace WMS.Web.Domain.Services
{
/// <summary>
/// 即时库存-服务
/// </summary>
public class BoxInventoryService : IBoxInventoryService
{
private readonly IMapper _mapper;
private readonly IBoxRepositories _boxRepositories;
private readonly IInventoryDetailsService _inventoryDetailsService;
private readonly IInventoryInOutDetailsService _inventoryInOutDetailsService;
private readonly ISerialNumbersRepositories _serialNumbersRepositories;
private readonly IBoxInventoryRepositories _boxInventoryRepositories;
private readonly ILogger<BoxInventoryService> _logger;
public BoxInventoryService(IMapper mapper, IBoxRepositories boxRepositories, ILogger<BoxInventoryService> logger,
IInventoryDetailsService inventoryDetailsService,
IInventoryInOutDetailsService inventoryInOutDetailsService,
ISerialNumbersRepositories serialNumbersRepositories,
IBoxInventoryRepositories boxInventoryRepositories)
{
_mapper = mapper;
_logger = logger;
_boxRepositories = boxRepositories;
_inventoryDetailsService = inventoryDetailsService;
_serialNumbersRepositories = serialNumbersRepositories;
_boxInventoryRepositories = boxInventoryRepositories;
_inventoryInOutDetailsService = inventoryInOutDetailsService;
}
/// <summary>
/// 改箱-箱库存的变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> GenerateChangeBox(List<ChangeBoxRecord> dtoDatas, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
//2.原来箱库存集合
var boxIds = dtoDatas.Where(x => x.SrcBoxId != 0).GroupBy(x => x.SrcBoxId).Select(x => x.Key).ToList();
var sourceBoxInventorys = await _boxInventoryRepositories.GetList(boxIds);
//2.1目标箱库存集合
var targetBoxIds = dtoDatas.GroupBy(x => x.DestBoxId).Select(x => x.Key).ToList();
var targetBoxInventorys = await _boxInventoryRepositories.GetList(targetBoxIds);
//2.2组合要生成的dto
var generateDtos = dtoDatas.GroupBy(x => new { x.SrcBoxId, x.DestBoxId, x.DestStockCode, x.DestSubStockId, x.DestBoxOrgCode }).Select(x => new BoxInventoryChangeGenerateDto()
{
BoxId = x.Key.SrcBoxId,
TargetBoxId = x.Key.DestBoxId,
StockCode = x.Key.DestStockCode,
SubStockId = x.Key.DestSubStockId,
TargetBoxOrgCode = x.Key.DestBoxOrgCode
}).ToList();
//3.遍历:组装明细
generateDtos.ForEach(x =>
{
foreach (var item in dtoDatas)
{
//3.1原箱和目标箱是当前的
if (item.SrcBoxId == x.BoxId && item.DestBoxId == x.TargetBoxId)
{
//3.2组装明细
var det = new BoxInventoryDetailsChangeGenerateDto();
det.MaterialId = item.MaterialId;
det.Qty = item.Qty;
det.SerialNumbers = item.SerialNumbers;
x.Details.Add(det);
}
}
});
//4.开始处理
var result = await this.ExeChangeBox(generateDtos, sourceBoxInventorys, targetBoxInventorys, isTransaction);
if (!result.IsSuccess)
return result;
//5.物料收发明细dtos
var InventoryInOutDetailsGenerateDtoList = new List<InventoryInOutDetailsGenerateDto>();
//5.1遍历
foreach (var item in dtoDatas)
{
//5.2组装:原箱物料收发明细;有箱库存就需要创建物料收发明细;
var sour = sourceBoxInventorys.Where(x => x.BoxId == item.SrcBoxId).FirstOrDefault();
if (sour != null)
{
var inventoryInOutDet = _inventoryInOutDetailsService.GenerateDto(
item.SrcBoxId, item.MaterialId,
sour.OrgCode, sour.StockCode,
sour.SubStockId, OrderType.ChangeBox,
item.BillNo, item.Qty, InventoryInOutType.Out);
InventoryInOutDetailsGenerateDtoList.Add(inventoryInOutDet);
}
//5.3组装:目标箱物料收发明细;有箱库存就需要创建物料收发明细;
var tagBox = targetBoxInventorys.Where(x => x.BoxId == item.DestBoxId).FirstOrDefault();
if (tagBox != null)
{
var inventoryInOutDet = _inventoryInOutDetailsService.GenerateDto(
item.DestBoxId, item.MaterialId,
item.DestBoxOrgCode, item.DestStockCode,
item.DestSubStockId, OrderType.ChangeBox,
item.BillNo, item.Qty, InventoryInOutType.In);
InventoryInOutDetailsGenerateDtoList.Add(inventoryInOutDet);
}
}
//5.提交物料收发明细:新增
if (InventoryInOutDetailsGenerateDtoList.Count != 0)
{
var inout_result = await _inventoryInOutDetailsService.GenerateInOrOutDetails(InventoryInOutDetailsGenerateDtoList, isTransaction);
if (!inout_result.IsSuccess)
return inout_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 移箱-箱库存的变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> GenerateMoveBox(List<MoveBoxRecord> dtoDatas, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
//物料收发明细dtos
var InventoryInOutDetailsGenerateDtoList = new List<InventoryInOutDetailsGenerateDto>();
//2.箱库存集合
var boxIds = dtoDatas.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
//2.2组合要生成的dto
var generateDtoList = new List<BoxInventoryMoveGenerateDto>();
foreach (var item in dtoDatas)
{
//2.2.1箱库存dto-组装
var generateDto = new BoxInventoryMoveGenerateDto();
generateDto.BoxId = item.BoxId;
generateDto.OrgCode = item.OrgCode;
generateDto.StockCode = item.StockCode;
generateDto.SubStockId = item.Type == MoveBoxType.Up ? item.DestSubStockId : item.SrcSubStockId;
generateDto.InventoryInOutType = item.Type == MoveBoxType.Down ? (int)InventoryInOutType.Out : (int)InventoryInOutType.In;
//2.2.2箱库存dto-组装明细
foreach (var detItem in item.Details)
{
var genDetDto = new BoxInventoryMoveDetailsGenerateDto();
genDetDto.MaterialId = detItem.MaterialId;
genDetDto.Qty = detItem.Qty;
genDetDto.SerialNumbers = detItem.SerialNumbers;
generateDto.Details.Add(genDetDto);
}
generateDtoList.Add(generateDto);
//2.2.2物料收发明dto-组装
var SubStockId = item.Type == MoveBoxType.Up ? item.DestSubStockId : item.SrcSubStockId;
InventoryInOutType InOutType = item.Type == MoveBoxType.Down ? InventoryInOutType.Out : InventoryInOutType.In;
var ishave = boxInventorys.Where(x => x.BoxId == item.BoxId).Any();
//上架-箱是不存在库存的情况下,生成物料收发明细
//或者
//下架-箱库存是存在的情况下,生成物料收发明细
if ((!ishave && item.Type == MoveBoxType.Up) || (ishave && item.Type == MoveBoxType.Down))
{
foreach (var boxDet in item.Details)
{
var inventoryInOutDet = _inventoryInOutDetailsService.GenerateDto(
item.BoxId, boxDet.MaterialId,
item.OrgCode, item.StockCode,
SubStockId, OrderType.MoveBox,
item.BillNo, boxDet.Qty, InOutType);
InventoryInOutDetailsGenerateDtoList.Add(inventoryInOutDet);
}
}
}
//4.开始处理
var result = await this.ExeMoveBox(generateDtoList, boxInventorys, isTransaction);
if (!result.IsSuccess)
return result;
//5.提交物料收发明细:新增
if (InventoryInOutDetailsGenerateDtoList.Count != 0)
{
var inout_result = await _inventoryInOutDetailsService.GenerateInOrOutDetails(InventoryInOutDetailsGenerateDtoList, isTransaction);
if (!inout_result.IsSuccess)
return inout_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 入库回退上下架-箱库存的变更
/// </summary>
/// <param name="dtoData"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> GenerateBackBox(BackRecord dtoData, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoData == null)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
//物料收发明细dtos
var InventoryInOutDetailsGenerateDtoList = new List<InventoryInOutDetailsGenerateDto>();
//2.1组织:头部
var generateDtoList = dtoData.Details.GroupBy(x => new { x.BoxId })
.Select(x => new BoxInventoryBackGenerateDto()
{
BoxId = x.Key.BoxId,
OrgCode = dtoData.OrgCode,
StockCode = dtoData.StockCode,
SubStockId = dtoData.SubStockId,
//InventoryInOutMethod = (int)dtoData.Method,
InventoryInOutType = dtoData.Type == BackRecordType.OutstockOn ? (int)InventoryInOutType.In : (int)InventoryInOutType.Out
}).ToList();
//3.遍历:组装明细
generateDtoList.ForEach(x =>
{
foreach (var detItem in dtoData.Details)
{
//3.1箱是当前的
if (detItem.BoxId == x.BoxId)
{
//3.2组装明细
var det = new BoxInventoryBackDetailsGenerateDto();
det.MaterialId = detItem.MaterialId;
det.Qty = detItem.Qty;
det.SerialNumbers = detItem.SerialNumbers;
x.Details.Add(det);
}
}
});
//4.提交处理
var result = await this.ExeBackBox(generateDtoList, isTransaction);
if (!result.IsSuccess)
return result;
//5.组装物料收发明细dto
foreach (var item in dtoData.Details)
{
var inventoryInOutDet = _inventoryInOutDetailsService.GenerateDto(
item.BoxId, item.MaterialId,
dtoData.OrgCode, dtoData.StockCode,
dtoData.SubStockId, OrderType.Back,
dtoData.BillNo, item.Qty, (dtoData.Type == BackRecordType.InstockOff ? InventoryInOutType.Out : InventoryInOutType.In));
InventoryInOutDetailsGenerateDtoList.Add(inventoryInOutDet);
}
//5.提交物料收发明细:新增
if (InventoryInOutDetailsGenerateDtoList.Count != 0)
{
var inout_result = await _inventoryInOutDetailsService.GenerateInOrOutDetails(InventoryInOutDetailsGenerateDtoList, isTransaction);
if (!inout_result.IsSuccess)
return inout_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 盘点单-箱库存的变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> GenerateTakeBox(List<TakeStock> dtoDatas, List<SerialNumbersBoxInventoryDto> serNubBoxDto, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
//物料收发明细dtos
var InventoryInOutDetailsGenerateDtoList = new List<InventoryInOutDetailsGenerateDto>();
var dtoDetails_in = dtoDatas.Where(x => x.ResultType == TakeStockType.Profit).SelectMany(x => x.Details).ToList();
//2.组装:入库数据
var generateDtoList_in = dtoDetails_in.GroupBy(x => new { x.BoxId, x.OrgCode, x.StockCode, x.SubStockId }).Select(x => new BoxInventoryTakeGenerateDto()
{
BoxId = x.Key.BoxId,
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.In
}).ToList();
//2.1.遍历:组装明细
generateDtoList_in.ForEach(x =>
{
foreach (var detItem in dtoDetails_in)
{
//3.1箱是当前的
if (detItem.BoxId == x.BoxId)
{
//3.2组装明细
var det = new BoxInventoryTakeDetailsGenerateDto();
det.MaterialId = detItem.MaterialId;
det.Qty = detItem.FinalQty;
det.SerialNumbers = detItem.SerialNumbers;
x.Details.Add(det);
}
}
});
//3.组装:出库数据
var dtoDetails_out = dtoDatas.Where(x => x.ResultType == TakeStockType.Loss).SelectMany(x => x.Details).ToList();
var generateDtoList_out = dtoDetails_out.GroupBy(x => new { x.BoxId, x.OrgCode, x.StockCode, x.SubStockId }).Select(x => new BoxInventoryTakeGenerateDto()
{
BoxId = x.Key.BoxId,
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.Out
}).ToList();
//3.1遍历:组装明细
generateDtoList_out.ForEach(x =>
{
foreach (var detItem in dtoDetails_out)
{
//3.1箱是当前的
if (detItem.BoxId == x.BoxId)
{
//3.2组装明细
var det = new BoxInventoryTakeDetailsGenerateDto();
det.MaterialId = detItem.MaterialId;
det.Qty = detItem.FinalQty;
det.SerialNumbers = detItem.SerialNumbers;
x.Details.Add(det);
}
}
});
//整合一起
var generateDtoList = new List<BoxInventoryTakeGenerateDto>();
generateDtoList.AddRange(generateDtoList_in);
generateDtoList.AddRange(generateDtoList_out);
//提交处理
var result = await this.ExeTakeBox(generateDtoList, serNubBoxDto, isTransaction);
if (!result.IsSuccess)
return result;
//5.组装物料收发明细
foreach (var item in dtoDatas.SelectMany(x => x.Details).ToList())
{
var entity = dtoDatas.Where(x => x.Id == item.Fid).FirstOrDefault();
if (entity != null)
{
var inventoryInOutDet = _inventoryInOutDetailsService.GenerateDto(
item.BoxId, item.MaterialId,
item.OrgCode, item.StockCode,
item.SubStockId, OrderType.Take,
entity.BillNo, item.FinalQty, (entity.ResultType == TakeStockType.Loss ? InventoryInOutType.Out : InventoryInOutType.In));
InventoryInOutDetailsGenerateDtoList.Add(inventoryInOutDet);
}
}
//5.提交物料收发明细:新增
if (InventoryInOutDetailsGenerateDtoList.Count != 0)
{
var inout_result = await _inventoryInOutDetailsService.GenerateInOrOutDetails(InventoryInOutDetailsGenerateDtoList, isTransaction);
if (!inout_result.IsSuccess)
return inout_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 入库单-箱库存的变更
/// </summary>
/// <param name="dtoData"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> GenerateInStockBox(InStock dtoData, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoData == null)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
//物料收发明细dtos
var InventoryInOutDetailsGenerateDtoList = new List<InventoryInOutDetailsGenerateDto>();
//2.组装-按箱和按产品入库
var generateDtoList = dtoData.Details.GroupBy(x => new { x.BoxId })
.Select(x => new BoxInventoryGenerateDto()
{
BoxId = x.Key.BoxId,
OrgCode = dtoData.OrgCode,
StockCode = dtoData.StockCode,
SubStockId = dtoData.SubStockId,
InventoryInOutMethod = (int)dtoData.Method,
InventoryInOutType = (int)InventoryInOutType.In
}).ToList();
//2.1.遍历:组装明细
generateDtoList.ForEach(x =>
{
foreach (var detItem in dtoData.Details)
{
//2.1箱是当前的
if (detItem.BoxId == x.BoxId)
{
//2.2组装明细
var det = new BoxInventoryGenerateDetailsDto();
det.MaterialId = detItem.MaterialId;
det.Qty = detItem.Qty;
det.SerialNumbers = detItem.SerialNumbers;
x.Details.Add(det);
}
}
});
//提交处理
var result = await this.ExeInStockBox(generateDtoList, isTransaction);
if (!result.IsSuccess)
return result;
//5.组装物料收发明细dto
foreach (var item in dtoData.Details)
{
var inventoryInOutDet = _inventoryInOutDetailsService.GenerateDto(
item.BoxId, item.MaterialId,
dtoData.OrgCode, dtoData.StockCode,
dtoData.SubStockId, InStockTypeConvert(dtoData.Type),
item.SourceBillNo, item.Qty, InventoryInOutType.In);
InventoryInOutDetailsGenerateDtoList.Add(inventoryInOutDet);
}
//5.提交物料收发明细:新增
if (InventoryInOutDetailsGenerateDtoList.Count != 0)
{
var inout_result = await _inventoryInOutDetailsService.GenerateInOrOutDetails(InventoryInOutDetailsGenerateDtoList, isTransaction);
if (!inout_result.IsSuccess)
return inout_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 出库单-箱库存变更
/// </summary>
/// <param name="dtoData"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> GenerateOutStockBox(OutStock dtoData, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoData == null)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
//物料收发明细dtos
var InventoryInOutDetailsGenerateDtoList = new List<InventoryInOutDetailsGenerateDto>();
//找出所有的箱库存
var boxIds = dtoData.Details.SelectMany(x => x.BoxsDetails).GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
//判断箱库存是否存在
foreach (var bid in boxIds)
{
var isHaveBoxInvetory = boxInventorys.Where(x => x.BoxId == bid).Any();
if (!isHaveBoxInvetory)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
}
//2.组装
var generateDtoList = dtoData.Details.SelectMany(x => x.BoxsDetails).GroupBy(x => new { x.BoxId })
.Select(x => new BoxInventoryGenerateDto()
{
BoxId = x.Key.BoxId,
InventoryInOutMethod = (int)dtoData.Method,
InventoryInOutType = (int)InventoryInOutType.Out
}).ToList();
//3.组装明细
generateDtoList.ForEach(x =>
{
//从箱库存找到:组织、仓库、仓位、进行赋值;
var current_box_invetory = boxInventorys.Where(t => t.BoxId == x.BoxId).FirstOrDefault();
if (current_box_invetory != null && current_box_invetory.BoxId == x.BoxId)
{
x.OrgCode = current_box_invetory.OrgCode;
x.StockCode = current_box_invetory.StockCode;
x.SubStockId = current_box_invetory.SubStockId;
}
////3.1先通过中间层的明细的箱明细找到中间层明细的IDS
//var current_materialDetails_ids = dtoData.Details.SelectMany(t => t.BoxsDetails).Where(t => t.BoxId == x.BoxId).GroupBy(t => t.DetailId).Select(t => t.Key).ToList();
////3.2再通过找到的IDS获取中间层的明细
//var current_materialDetails = dtoData.Details.Where(t => current_materialDetails_ids.Contains(t.Id)).ToList();
////3.3遍历-组装箱库存要的dto明细
//if (current_materialDetails != null && current_materialDetails.Count != 0)
foreach (var detItem in dtoData.Details.SelectMany(x => x.BoxsDetails).ToList())
{
if (x.BoxId == detItem.BoxId)
{
var current_det = dtoData.Details.Where(x => x.Id == detItem.DetailId).FirstOrDefault();
//2.2组装明细
var det = new BoxInventoryGenerateDetailsDto();
det.MaterialId = current_det == null ? 0 : current_det.MaterialId;
det.Qty = detItem.Qty;
det.SerialNumbers = detItem.SerialNumbers;
x.Details.Add(det);
}
}
});
//提交处理
var result = await this.ExeOutStockBox(generateDtoList, boxInventorys, isTransaction);
if (!result.IsSuccess)
return result;
//5.组装物料收发明细dto
//3.1明细的IDS
var current_materialDetails_ids = dtoData.Details.SelectMany(t => t.BoxsDetails).GroupBy(t => t.DetailId).Select(t => t.Key).ToList();
//3.2再通过找到的IDS获取中间层的明细
var current_materialDetails = dtoData.Details.Where(t => current_materialDetails_ids.Contains(t.Id)).ToList();
foreach (var item in dtoData.Details.SelectMany(x => x.BoxsDetails).ToList())
{
//找到当前box对应的物料明细
var currentDet = current_materialDetails.Where(x => x.Id == item.DetailId).FirstOrDefault();
var inventoryInOutDet = _inventoryInOutDetailsService.GenerateDto(
item.BoxId, currentDet.MaterialId,
dtoData.OrgCode, dtoData.StockCode,
item.SubStockId, OutStockTypeConvert(dtoData.Type),
dtoData.BillNo, item.Qty, InventoryInOutType.Out);
InventoryInOutDetailsGenerateDtoList.Add(inventoryInOutDet);
}
//5.提交物料收发明细:新增
if (InventoryInOutDetailsGenerateDtoList.Count != 0)
{
var inout_result = await _inventoryInOutDetailsService.GenerateInOrOutDetails(InventoryInOutDetailsGenerateDtoList, isTransaction);
if (!inout_result.IsSuccess)
return inout_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 改箱-箱库存的变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="sourceBoxInventorys"></param>
/// <param name="targetBoxInventorys"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeChangeBox(List<BoxInventoryChangeGenerateDto> dtoDatas, List<BoxInventory> sourceBoxInventorys, List<BoxInventory> targetBoxInventorys, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
var delete_ids = new List<int>();
var update_entitys = new List<BoxInventory>();
var add_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
foreach (var dto in dtoDatas)
{
#region -
//2.1找到要改变的源箱数据://备注(原箱号不一定存在于库存的情况和存在库存的情况)存在:直接变更库存值,不存在不做操作
var sour = sourceBoxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (sour != null)
{
//2.2箱库存
var sour_update_entity = sour;
sour_update_entity.Details = sour.Details;
foreach (var dtoItem in dto.Details)
{
//2.2.1箱库存:找到原来的箱库存对应要改变的物料:这个一定是存在的,不存在就有问题
var sour_ChangeDetail = sour_update_entity.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault();
if (sour_ChangeDetail == null)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
//2.2.1箱库存:箱物料的库存数量不足;小于要拿出来的数量
if (sour_ChangeDetail.Qty < dtoItem.Qty)
return Result.ReFailure(ResultCodes.BoxInventoryNoInventoryError);
//2.2.1箱库存:减库存
sour_ChangeDetail.Qty = sour_ChangeDetail.Qty - dtoItem.Qty;
//2.2.1箱库存:再移除要改箱的序列号;最后就是原箱库存的新序列号
sour_ChangeDetail.SerialNumbers.RemoveAll(x => dtoItem.SerialNumbers.Contains(x));
//2.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = dtoItem.MaterialId;
inventoryDet.OrgCode = sour_update_entity.OrgCode;
inventoryDet.StockCode = sour_update_entity.StockCode;
inventoryDet.SubStockId = sour_update_entity.SubStockId;
inventoryDet.Qty = dtoItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//2.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
//4.1判断要修改的箱库存对象是否所有的物料库存的数量都为0“是”则删除该箱库存,"否"则修改;
var isAllNoInventory = sour_update_entity.Details.All(x => x.Qty == 0);
if (isAllNoInventory)
delete_ids.Add(sour_update_entity.Id);
else
//4.2添加要更新的箱库存实体
update_entitys.Add(sour_update_entity);
}
#endregion
#region -
//2.2找到要改变的目标箱数据:备注(目标箱号不一定存在于库存的情况和存在库存的情况)存在:直接变更库存值,不存在不做操作
var tagBox = targetBoxInventorys.Where(x => x.BoxId == dto.TargetBoxId).FirstOrDefault();
if (tagBox != null)
{
var subStockId = tagBox.SubStockId;
var stockCode = tagBox.StockCode;
var orgCode = tagBox.OrgCode;
var tag_update_entity = tagBox;
//2.2.1这里为了重新上架,改变仓库和仓位的需求
if (!string.IsNullOrEmpty(dto.StockCode) && dto.SubStockId.HasValue)
{
//2.2.3.在变更目标箱的-仓库-仓位-组织
tag_update_entity.StockCode = dto.StockCode;
tag_update_entity.SubStockId = dto.SubStockId.Value;
tag_update_entity.OrgCode = dto.TargetBoxOrgCode;
}
tag_update_entity.Details = tagBox.Details;
//2.2.2仓位和原来的目标箱的仓位不一致的情况下-》》把目标箱原来仓位的物料进行-即时库存的变更-(减库存)
if (subStockId != tag_update_entity.SubStockId)
{
foreach (var item in tag_update_entity.Details)
{
//2.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = item.MaterialId;
inventoryDet.OrgCode = orgCode;
inventoryDet.StockCode = stockCode;
inventoryDet.SubStockId = subStockId;
inventoryDet.Qty = item.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//2.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
//2.2.2组装即时库存dto
var inventoryDet_i = new InventoryDetailsGenerateDto();
inventoryDet_i.MaterialId = item.MaterialId;
inventoryDet_i.OrgCode = tag_update_entity.OrgCode;
inventoryDet_i.StockCode = tag_update_entity.StockCode;
inventoryDet_i.SubStockId = tag_update_entity.SubStockId;
inventoryDet_i.Qty = item.Qty;
inventoryDet_i.InventoryInOutType = (int)InventoryInOutType.In;
//2.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet_i);
}
}
//2.2.1遍历改变的明细
foreach (var item in dto.Details)
{
//2.2.2找到目标箱对应要改变的物料
var tagChangeDetail = tag_update_entity.Details.Where(x => x.MaterialId == item.MaterialId).FirstOrDefault();
if (tagChangeDetail != null)
{
tagChangeDetail.Qty = tagChangeDetail.Qty + item.Qty;
tagChangeDetail.SerialNumbers.AddRange(item.SerialNumbers);
}//2.3.没有对应的箱物料,就新增明细
else
{
var newTagChangeDetail = new BoxInventoryDetails();
newTagChangeDetail.MaterialId = item.MaterialId;
newTagChangeDetail.Qty = item.Qty;
newTagChangeDetail.SerialNumbers = item.SerialNumbers;
tag_update_entity.Details.Add(newTagChangeDetail);
}
//2.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = item.MaterialId;
inventoryDet.OrgCode = tag_update_entity.OrgCode;
inventoryDet.StockCode = tag_update_entity.StockCode;
inventoryDet.SubStockId = tag_update_entity.SubStockId;
inventoryDet.Qty = item.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.In;
//2.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
//2.4箱库存:要修改的集合
update_entitys.Add(tag_update_entity);
}
#endregion
}
var isSuccess = true;
//4.数据库更新操作:更新和添加
if (add_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (update_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (delete_ids.Count != 0)
{
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//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()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.In,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos_out = InventoryDetailsGenerateDto.Where(x => x.InventoryInOutType == (int)InventoryInOutType.Out).GroupBy(x => new { x.OrgCode, x.MaterialId, x.StockCode, x.SubStockId }).Select(x => new InventoryDetailsGenerateDto()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.Out,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos = new List<InventoryDetailsGenerateDto>();
invDetGenDtos.AddRange(invDetGenDtos_in);
invDetGenDtos.AddRange(invDetGenDtos_out);
if (invDetGenDtos.Count != 0)
{
var InventoryDetailsGenerate_result = await _inventoryDetailsService.GenerateInventoryDetails(invDetGenDtos, isTransaction);
if (!InventoryDetailsGenerate_result.IsSuccess)
return InventoryDetailsGenerate_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 移箱-箱库存的变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="boxInventorys"></param>
/// <param name="boxs"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeMoveBox(List<BoxInventoryMoveGenerateDto> dtoDatas, List<BoxInventory> boxInventorys,bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
var delete_entitys = new List<BoxInventory>();
var add_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
//3.遍历dto
foreach (var dto in dtoDatas)
{
//上架
if (dto.InventoryInOutType == (int)InventoryInOutType.In)
{
//3.1上架的时候:箱一定是不存在于箱库存当中的,有则返回提示“已有箱库存,不需要再扫上架”
var ishave = boxInventorys.Where(x => x.BoxId == dto.BoxId).Any();
if (ishave)
return Result.ReFailure(ResultCodes.BoxInventoryHaveInventoryError);
//3.2组装要新增的箱库存信息:箱和明细
var addEntity = _mapper.Map<BoxInventory>(dto);
addEntity.Details = _mapper.Map<List<BoxInventoryDetails>>(dto.Details);
//3.4箱库存:要新增的集合
add_entitys.Add(addEntity);
//4.1即时库存:组装入库
foreach (var item in dto.Details)
{
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = item.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId;
inventoryDet.Qty = item.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.In;
//3.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
}
//下架
else
{
//3.1下架的时候:箱一定是存在于箱库存当中的,没有则返回提示“箱不存在于库存,请扫其它箱”
var ishave = boxInventorys.Where(x => x.BoxId == dto.BoxId).Any();
if (!ishave)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
//3.2整箱移货下架-直接删除当前箱子所在的库存
var box_inventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
delete_entitys.Add(box_inventory);
//4.1即时库存:组装出库
foreach (var item in box_inventory.Details)
{
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = item.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId;
inventoryDet.Qty = item.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//3.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
}
}
var isSuccess = true;
//4.数据库操作处理
if (add_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (delete_entitys.Count != 0)
{
var delete_ids = delete_entitys.Select(x => x.Id).ToList();
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//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()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.In,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos_out = InventoryDetailsGenerateDto.Where(x => x.InventoryInOutType == (int)InventoryInOutType.Out).GroupBy(x => new { x.OrgCode, x.MaterialId, x.StockCode, x.SubStockId }).Select(x => new InventoryDetailsGenerateDto()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.Out,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos = new List<InventoryDetailsGenerateDto>();
invDetGenDtos.AddRange(invDetGenDtos_in);
invDetGenDtos.AddRange(invDetGenDtos_out);
if (invDetGenDtos.Count != 0)
{
var InventoryDetailsGenerate_result = await _inventoryDetailsService.GenerateInventoryDetails(invDetGenDtos, isTransaction);
if (!InventoryDetailsGenerate_result.IsSuccess)
return InventoryDetailsGenerate_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 入库回退上下架-箱库存的变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeBackBox(List<BoxInventoryBackGenerateDto> dtoDatas, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
var delete_ids = new List<int>();
var update_entitys = new List<BoxInventory>();
var add_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
//2.获取“箱库存集合”
var boxIds = dtoDatas.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
//box的序列号
var serialNumbers = await _serialNumbersRepositories.GetEntityListByBoxIds(dtoDatas.GroupBy(x => x.BoxId).Select(x => x.Key).ToList());
//3.遍历dto
foreach (var dto in dtoDatas)
{
//上架
if (dto.InventoryInOutType == (int)InventoryInOutType.In)
{
_logger.LogInformation("出入库回退:上架->序列号:" + JsonConvert.SerializeObject(dto.Details.SelectMany(x => x.SerialNumbers).ToList()));
//3.1上架的时候:箱库存可能存在,也可能不存在的两种情况
var boxInventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInventory == null)
{
//3.2组装要新增的箱库存信息:箱和明细和序列号
var addEntity = _mapper.Map<BoxInventory>(dto);
addEntity.Details = _mapper.Map<List<BoxInventoryDetails>>(dto.Details);
#region
/////按箱的-弃用了
//if (dto.InventoryInOutMethod == (int)InventoryInOutMethod.Box)
//{
// //当前箱的序列号
// var current_box_serNums = serialNumbers.Where(t => t.BoxId == dto.BoxId).ToList();
// //赋值序列号
// addEntity.Details.ForEach(x =>
// {
// var current_box_mat_serNums = current_box_serNums.Where(m => m.MaterialId == x.MaterialId).Select(t => t.SerialNumber).ToList();
// x.SerialNumbers.AddRange(current_box_mat_serNums);
// });
//}
//赋值序列号
addEntity.Details.ForEach(x =>
{
var current_box_mat_serNums = dto.Details.Where(m => m.MaterialId == x.MaterialId).FirstOrDefault();
if (current_box_mat_serNums != null && current_box_mat_serNums.MaterialId == x.MaterialId)
x.SerialNumbers.AddRange(current_box_mat_serNums.SerialNumbers);
});
#endregion
add_entitys.Add(addEntity);
}
else
{
_logger.LogInformation("出入库回退:上架->序列号:" + JsonConvert.SerializeObject(dto.Details.SelectMany(x => x.SerialNumbers).ToList()));
var update_entity = boxInventory;
update_entity.OrgCode = dto.OrgCode;
update_entity.StockCode = dto.StockCode;
update_entity.SubStockId = dto.SubStockId;
update_entity.Details = boxInventory.Details;
//3.3遍历dto明细
foreach (var dtoItem in dto.Details)
{
//找到原来的箱库存对应要改变的物料:这个一定是存在的,不存在就有问题
var updateDetail = update_entity.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault();
if (updateDetail == null)
{
var det = _mapper.Map<BoxInventoryDetails>(dtoItem);
update_entity.Details.Add(det);
}
else
{
updateDetail.Qty = updateDetail.Qty + dtoItem.Qty;
}
}
#region
/////按箱的-弃用了
//if (dto.InventoryInOutMethod == (int)InventoryInOutMethod.Box)
//{
// //当前箱的序列号
// var current_box_serNums = serialNumbers.Where(t => t.BoxId == dto.BoxId).ToList();
// //赋值序列号
// update_entity.Details.ForEach(x =>
// {
// var current_box_mat_serNums = current_box_serNums.Where(m => m.MaterialId == x.MaterialId).Select(t => t.SerialNumber).ToList();
// x.SerialNumbers.AddRange(current_box_mat_serNums);
// });
//}
//赋值序列号
update_entity.Details.ForEach(x =>
{
var current_box_mat_serNums = dto.Details.Where(m => m.MaterialId == x.MaterialId).FirstOrDefault();
if (current_box_mat_serNums != null && current_box_mat_serNums.MaterialId == x.MaterialId)
{
foreach (var serialitem in current_box_mat_serNums.SerialNumbers)
{
var isHaveSerial= x.SerialNumbers.Where(sn => sn == serialitem).Any();
if (!isHaveSerial)
x.SerialNumbers.Add(serialitem);
}
// x.SerialNumbers.AddRange(current_box_mat_serNums.SerialNumbers);
}
});
#endregion
update_entitys.Add(update_entity);
}
//4.1即时库存:组装入库
foreach (var item in dto.Details)
{
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = item.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId;
inventoryDet.Qty = item.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.In;
//3.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
}
//下架
else
{
//3.1下架的时候:箱一定是存在于箱库存当中的,没有则返回提示“箱不存在于库存,请扫其它箱”
var boxInventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInventory == null)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
//3.2创建更新对象
var update_entity = boxInventory;
update_entity.Details = boxInventory.Details;
//3.3遍历dto明细
foreach (var dtoItem in dto.Details)
{
//找到原来的箱库存对应要改变的物料:这个一定是存在的,不存在就有问题
var updateDetail = update_entity.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault();
if (updateDetail == null)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
//箱物料的库存数量不足;小于要拿出来的数量
if (updateDetail.Qty < dtoItem.Qty)
return Result.ReFailure(ResultCodes.BoxInventoryNoInventoryError);
updateDetail.Qty = updateDetail.Qty - dtoItem.Qty;
//再移除要改箱的序列号;最后就是原箱库存的新序列号
updateDetail.SerialNumbers.RemoveAll(x => dtoItem.SerialNumbers.Contains(x));
//4.1即时库存:组装出库
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = dtoItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId;
inventoryDet.Qty = dtoItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//3.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
//4.1判断要修改的箱库存对象是否所有的物料库存的数量都为0“是”则删除该箱库存,"否"则修改;
var isAllNoInventory = update_entity.Details.All(x => x.Qty == 0);
if (isAllNoInventory)
delete_ids.Add(update_entity.Id);
else
//4.2添加要更新的箱库存实体
update_entitys.Add(update_entity);
}
}
var isSuccess = true;
//4.数据库更新操作:更新和添加
if (add_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (update_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (delete_ids.Count != 0)
{
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//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()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.In,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos_out = InventoryDetailsGenerateDto.Where(x => x.InventoryInOutType == (int)InventoryInOutType.Out).GroupBy(x => new { x.OrgCode, x.MaterialId, x.StockCode, x.SubStockId }).Select(x => new InventoryDetailsGenerateDto()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.Out,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos = new List<InventoryDetailsGenerateDto>();
invDetGenDtos.AddRange(invDetGenDtos_in);
invDetGenDtos.AddRange(invDetGenDtos_out);
if (invDetGenDtos.Count != 0)
{
var InventoryDetailsGenerate_result = await _inventoryDetailsService.GenerateInventoryDetails(invDetGenDtos, isTransaction);
if (!InventoryDetailsGenerate_result.IsSuccess)
return InventoryDetailsGenerate_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 盘点单-箱库存的变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeTakeBox(List<BoxInventoryTakeGenerateDto> dtoDatas, List<SerialNumbersBoxInventoryDto> serNubBoxDto, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
var delete_ids = new List<int>();
var update_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
//2.获取“箱库存集合”
var boxIds = dtoDatas.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
//3.遍历dto
foreach (var dto in dtoDatas)
{
//入库
if (dto.InventoryInOutType == (int)InventoryInOutType.In)
{
//3.1入库的时候:盘点-箱一定是存在于库存
var boxInvent = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInvent == null)
return Result.ReFailure(ResultCodes.BoxInventoryHaveInventoryError);
//3.2组装要新增的箱库存信息:箱和明细和序列号
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;
}
}
});
//3.4明细添加新的物料
foreach (var detItem in dto.Details)
{
var IsHave_upEnDet = updateEntity.Details.Where(x => x.MaterialId == detItem.MaterialId).Any();
if (!IsHave_upEnDet)
{
var newDet = _mapper.Map<BoxInventoryDetails>(detItem);
updateEntity.Details.Add(newDet);
}
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = detItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId;
inventoryDet.Qty = detItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.In;
//3.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
//3.5要处理的修改集合
update_entitys.Add(updateEntity);
}
//出库
else
{
//3.1出库的时候:盘点-箱库存是存在
var boxInventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInventory == null)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
//3.2创建更新对象
var update_entity = boxInventory;
update_entity.Details = boxInventory.Details;
//3.3序列号重新给值:已有的物料
update_entity.Details.ForEach(x =>
{
foreach (var detItem in dto.Details)
{
if (x.MaterialId == detItem.MaterialId)
{
x.Qty = x.Qty - detItem.Qty;
x.SerialNumbers = detItem.SerialNumbers;
}
}
});
//3.4明细添加新的物料
foreach (var detItem in dto.Details)
{
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = detItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId;
inventoryDet.Qty = detItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//3.2.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
//4.1判断要修改的箱库存对象是否所有的物料库存的数量都为0“是”则删除该箱库存,"否"则修改;
var isAllNoInventory = update_entity.Details.All(x => x.Qty == 0);
if (isAllNoInventory)
delete_ids.Add(update_entity.Id);
else
//4.2添加要更新的箱库存实体
update_entitys.Add(update_entity);
}
}
var isSuccess = true;
//4.数据库更新操作:更新和添加
if (update_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (delete_ids.Count != 0)
{
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//盘点单-箱库存的变更:第二步骤,为了不是当前扫的所在箱里的序列号;如果是其它箱需要减箱库存
var result = await this.ExeTaskBox(serNubBoxDto, 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()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.In,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos_out = InventoryDetailsGenerateDto.Where(x => x.InventoryInOutType == (int)InventoryInOutType.Out).GroupBy(x => new { x.OrgCode, x.MaterialId, x.StockCode, x.SubStockId }).Select(x => new InventoryDetailsGenerateDto()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.Out,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos = new List<InventoryDetailsGenerateDto>();
invDetGenDtos.AddRange(invDetGenDtos_in);
invDetGenDtos.AddRange(invDetGenDtos_out);
if (invDetGenDtos.Count != 0)
{
var InventoryDetailsGenerate_result = await _inventoryDetailsService.GenerateInventoryDetails(invDetGenDtos, isTransaction);
if (!InventoryDetailsGenerate_result.IsSuccess)
return InventoryDetailsGenerate_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 盘点单-箱库存的变更:第二步骤,为了不是当前扫的所在箱里的序列号;如果是其它箱的需要减箱库存
/// </summary>
/// <param name="out_SerialNumbers"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeTaskBox(List<SerialNumbersBoxInventoryDto> out_SerialNumbers, bool isTransaction)
{
var boxIds = out_SerialNumbers.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
var delete_ids1 = new List<int>();
var update_entitys1 = new List<BoxInventory>();
var InventoryDetailsGenerateDto1 = new List<InventoryDetailsGenerateDto>();
foreach (var item in boxInventorys)
{
item.Details.ForEach(x =>
{
var current_sers_info = out_SerialNumbers.Where(o => o.BoxId == item.BoxId && o.MaterialId == x.MaterialId).ToList();
if (current_sers_info != null && current_sers_info.Count != 0)
{
x.Qty=x.Qty- current_sers_info.Count;
var crrent_sers = current_sers_info.Select(t => t.SerialNumber).ToList();
x.SerialNumbers.RemoveAll(r => crrent_sers.Contains(r));
//3.2.2组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = x.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 = item.Details.All(x => x.Qty == 0);
if (isAllNoInventory)
delete_ids1.Add(item.Id);
else
//4.2添加要更新的箱库存实体
update_entitys1.Add(item);
}
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>
/// 入库单-箱库存变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeInStockBox(List<BoxInventoryGenerateDto> dtoDatas, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
var update_entitys = new List<BoxInventory>();
var add_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
//1.1通过箱IDS获取箱库存
var boxIds = dtoDatas.Select(x => x.BoxId).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
//2.遍历dto
foreach (var dto in dtoDatas)
{
//按箱上架入库
if (dto.InventoryInOutMethod == (int)InventoryInOutMethod.Box)
{
//3.1上架的时候:箱一定是不存在于箱库存当中的,有则返回提示“已有箱库存,不需要再扫上架”
var isHave = boxInventorys.Where(x => x.BoxId == dto.BoxId).Any();
if (isHave)
return Result.ReFailure(ResultCodes.BoxInventoryHaveInventoryError);
//3.2组装要新增的箱库存信息:箱和明细和序列号
var addEntity = _mapper.Map<BoxInventory>(dto);
//3.3要合并下相同的物料
var dtoDets_merge = dto.Details.GroupBy(d => new { d.MaterialId }).Select(d => new BoxInventoryGenerateDetailsDto
{
MaterialId = d.Key.MaterialId,
Qty = d.Sum(t => t.Qty),
SerialNumbers = d.SelectMany(t => t.SerialNumbers).ToList()
}).ToList();
//3.4明细映射用合并过的dto数据
addEntity.Details = _mapper.Map<List<BoxInventoryDetails>>(dtoDets_merge);
add_entitys.Add(addEntity);
//4.组装即时库存
foreach (var detItem in dto.Details)
{
//4.1组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = detItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId ?? 0;
inventoryDet.Qty = detItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.In;
//4.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
}
//按产品上架入库
else
{
//按产品上架:箱只能是一个;箱可能存在库存(修改),也可能不存在库存(新增)
var boxInventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInventory == null)
{
//3.2组装要新增的箱库存信息:箱和明细和序列号
var addEntity = _mapper.Map<BoxInventory>(dto);
//3.3要合并下相同的物料
var dtoDets_merge = dto.Details.GroupBy(d => new { d.MaterialId }).Select(d => new BoxInventoryGenerateDetailsDto
{
MaterialId = d.Key.MaterialId,
Qty = d.Sum(t => t.Qty),
SerialNumbers = d.SelectMany(t => t.SerialNumbers).ToList()
}).ToList();
//3.4明细映射用合并过的dto数据
addEntity.Details = _mapper.Map<List<BoxInventoryDetails>>(dtoDets_merge);
add_entitys.Add(addEntity);
//3.3.遍历dto明细组装即时库存数据
foreach (var dtoItem in dto.Details)
{
//4.1组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = dtoItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId ?? 0;
inventoryDet.Qty = dtoItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.In;
//4.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
}
else
{
//3.3创建更新对象
var update_entity = boxInventory;
update_entity.Details = boxInventory.Details;
foreach (var dtoItem in dto.Details)
{
//明细对应的物料:存在就修改,不存在即新增
var update_entity_det = new BoxInventoryDetails();
var updateDetail = update_entity.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault();
if (updateDetail == null)
{
update_entity_det.Qty = dtoItem.Qty;
update_entity_det.MaterialId = dtoItem.MaterialId;
update_entity_det.SerialNumbers = dtoItem.SerialNumbers;
update_entity.Details.Add(update_entity_det);
}
else
{
updateDetail.Qty = updateDetail.Qty + dtoItem.Qty;
updateDetail.SerialNumbers.AddRange(dtoItem.SerialNumbers);
}
//4.1组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = dtoItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId ?? 0;
inventoryDet.Qty = dtoItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.In;
//4.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
update_entitys.Add(update_entity);
}
}
}
var isSuccess = true;
//4.数据库更新操作:更新和添加
if (add_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (update_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//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()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.In,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos_out = InventoryDetailsGenerateDto.Where(x => x.InventoryInOutType == (int)InventoryInOutType.Out).GroupBy(x => new { x.OrgCode, x.MaterialId, x.StockCode, x.SubStockId }).Select(x => new InventoryDetailsGenerateDto()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.Out,
Qty = x.Sum(t => t.Qty)
}).ToList();
var invDetGenDtos = new List<InventoryDetailsGenerateDto>();
invDetGenDtos.AddRange(invDetGenDtos_in);
invDetGenDtos.AddRange(invDetGenDtos_out);
_logger.LogInformation($"入库对应即时库存:{JsonConvert.SerializeObject(invDetGenDtos)} 操作时间:{DateTime.Now.ToString()}");
if (invDetGenDtos.Count != 0)
{
var InventoryDetailsGenerate_result = await _inventoryDetailsService.GenerateInventoryDetails(invDetGenDtos, isTransaction);
if (!InventoryDetailsGenerate_result.IsSuccess)
return InventoryDetailsGenerate_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 出库单-箱库存变更
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="boxInventorys"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
private async Task<Result> ExeOutStockBox(List<BoxInventoryGenerateDto> dtoDatas, List<BoxInventory> boxInventorys, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
var delete_ids = new List<int>();
var update_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
//2.遍历
foreach (var dto in dtoDatas)
{
//3.1出库的时候:箱一定是存在于箱库存当中的,没有则返回提示“箱库存数据不存在,请稍候再试!”
// 获取箱库存
var boxInventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInventory == null)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
//按箱:出库
if (dto.InventoryInOutMethod == (int)InventoryInOutMethod.Box)
{
//直接添加要删除的箱
delete_ids.Add(boxInventory.Id);
//4.组装即时库存
foreach (var detItem in dto.Details)
{
//4.1组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = detItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId ?? 0;
inventoryDet.Qty = detItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//4.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
}
//按产品:出库
else
{
//3.3创建更新对象
var update_entity = boxInventory;
update_entity.Details = boxInventory.Details;
//3.2.遍历dto明细
foreach (var dtoItem in dto.Details)
{
//3.3.找到当前明细物料:没有则返回失败;提示:“该箱物料库存不存在”
var update_entityDetail = update_entity.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault();
if (update_entityDetail == null)
return Result.ReFailure(ResultCodes.BoxInventoryMaterialNoDataError);
//3.4判断库存数量是否不足
if (update_entityDetail.Qty < dtoItem.Qty)
return Result.ReFailure(ResultCodes.BoxInventoryNoInventoryError);
//3.5物料库存数量变更:减库存
update_entityDetail.Qty = update_entityDetail.Qty - dtoItem.Qty;
//3.6移除要出库的序列号
update_entityDetail.SerialNumbers.RemoveAll(x => dtoItem.SerialNumbers.Contains(x));
//4.1组装即时库存dto
var inventoryDet = new InventoryDetailsGenerateDto();
inventoryDet.MaterialId = dtoItem.MaterialId;
inventoryDet.OrgCode = dto.OrgCode;
inventoryDet.StockCode = dto.StockCode;
inventoryDet.SubStockId = dto.SubStockId ?? 0;
inventoryDet.Qty = dtoItem.Qty;
inventoryDet.InventoryInOutType = (int)InventoryInOutType.Out;
//4.2即时库存:修改箱库存的集合
InventoryDetailsGenerateDto.Add(inventoryDet);
}
//4.1判断要修改的箱库存对象是否所有的物料库存的数量都为0“是”则删除该箱库存,"否"则修改;
var isAllNoInventory = update_entity.Details.All(x => x.Qty == 0);
if (isAllNoInventory)
delete_ids.Add(update_entity.Id);
else
//4.2添加要更新的箱库存实体
update_entitys.Add(update_entity);
}
}
//4.数据库更新操作:更新和删除
var isSuccess = true;
if (delete_ids.Count != 0)
{
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (update_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//5.即时库存:变更处理
var invDetGenDtos = InventoryDetailsGenerateDto.Where(x => x.InventoryInOutType == (int)InventoryInOutType.Out).GroupBy(x => new { x.OrgCode, x.MaterialId, x.StockCode, x.SubStockId }).Select(x => new InventoryDetailsGenerateDto()
{
OrgCode = x.Key.OrgCode,
StockCode = x.Key.StockCode,
MaterialId = x.Key.MaterialId,
SubStockId = x.Key.SubStockId,
InventoryInOutType = (int)InventoryInOutType.Out,
Qty = x.Sum(t => t.Qty)
}).ToList();
if (invDetGenDtos.Count != 0)
{
var inventoryDetails_result = await _inventoryDetailsService.GenerateInventoryDetails(invDetGenDtos, isTransaction);
if (!inventoryDetails_result.IsSuccess)
return inventoryDetails_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 出库类型转换为单据类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private OrderType OutStockTypeConvert(OutStockType type)
{
switch (type)
{
case OutStockType.Sal:
return OrderType.Sal_Out;
case OutStockType.Assembled:
return OrderType.Assembled_Out;
case OutStockType.Miscellaneous:
return OrderType.Miscellaneous_Out;
case OutStockType.Stkdirecttransfers:
return OrderType.Stkdirecttransfers_Out;
case OutStockType.StktransferInst:
return OrderType.StktransferInst_Out;
default:
return OrderType.StktransferInst_Out;
}
}
/// <summary>
/// 入库类型转换为单据类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private OrderType InStockTypeConvert(InstockType type)
{
switch (type)
{
case InstockType.Purchase:
return OrderType.Purchase_In;
case InstockType.Assembled:
return OrderType.Assembled_In;
case InstockType.Miscellaneous:
return OrderType.Miscellaneous_In;
case InstockType.Stkdirecttransfers:
return OrderType.Stkdirecttransfers_In;
case InstockType.StktransferInst:
return OrderType.StktransferInst_In;
default:
return OrderType.StktransferInst_In;
}
}
/// <summary>
/// 处理箱库存变更:出入库
/// </summary>
/// <param name="dtoDatas"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> HandlBoxInventory(List<BoxInventoryGenerateDto> dtoDatas, bool isTransaction)
{
//1.判断来源数据是否存在
if (dtoDatas == null || dtoDatas.Count == 0)
return Result.ReFailure(ResultCodes.InventoryNoSourceError);
var delete_ids = new List<int>();
var update_entitys = new List<BoxInventory>();
var add_entitys = new List<BoxInventory>();
var InventoryDetailsGenerateDto = new List<InventoryDetailsGenerateDto>();
//1.1通过箱IDS获取箱库存
var boxIds = dtoDatas.Select(x => x.BoxId).ToList();
var boxInventorys = await _boxInventoryRepositories.GetList(boxIds);
//2.遍历dto
foreach (var dto in dtoDatas)
{
//出库
if (dto.InventoryInOutType == (int)InventoryInOutType.Out)
{
//生成出库对象:删除和修改
var outStockInventoryResult = this.GenerateOutStockBox(dto, boxInventorys, delete_ids, update_entitys);
if (!outStockInventoryResult.IsSuccess)
return outStockInventoryResult;
}
//入库
else
{
//生成入库对象:新增和修改
var inStockInventoryResult = this.GenerateInStockBox(dto, boxInventorys, add_entitys, update_entitys);
if (!inStockInventoryResult.IsSuccess)
return inStockInventoryResult;
}
//组装:即时库存明细处理对象
var invDtos = this.GenerateInventoryDetails(dto);
InventoryDetailsGenerateDto.AddRange(invDtos);
}
//4.数据库更新操作:更新和删除和添加
var isSuccess = true;
if (delete_ids.Count != 0)
{
isSuccess = await _boxInventoryRepositories.DeleteRange(delete_ids, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (add_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
if (update_entitys.Count != 0)
{
isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys, isTransaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
}
//5.即时库存:变更处理
if (InventoryDetailsGenerateDto.Count != 0)
{
var inventoryDetails_result = await _inventoryDetailsService.GenerateInventoryDetails(InventoryDetailsGenerateDto, isTransaction);
if (!inventoryDetails_result.IsSuccess)
return inventoryDetails_result;
}
return Result.ReSuccess();
}
/// <summary>
/// 生成出库对象:删除和修改
/// </summary>
/// <param name="dto"></param>
/// <param name="boxInventorys"></param>
/// <param name="delete_ids"></param>
/// <param name="update_entitys"></param>
/// <returns></returns>
private Result GenerateOutStockBox(BoxInventoryGenerateDto dto, List<BoxInventory> boxInventorys, List<int> delete_ids, List<BoxInventory> update_entitys)
{
//3.1出库的时候:箱一定是存在于箱库存当中的,没有则返回提示“箱库存数据不存在,请稍候再试!”
// 获取箱库存
var boxInventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInventory == null)
return Result.ReFailure(ResultCodes.BoxInventoryNoDataError);
//按箱:出库
if (dto.InventoryInOutMethod == (int)InventoryInOutMethod.Box)
{
//直接添加要删除的箱
delete_ids.Add(boxInventory.Id);
}
//按产品:出库
else
{
//3.3创建更新对象
var update_entity = boxInventory;
update_entity.Details = boxInventory.Details;
//3.2.遍历dto明细
foreach (var dtoItem in dto.Details)
{
//3.3.找到当前明细物料:没有则返回失败;提示:“该箱物料库存不存在”
var update_entityDetail = update_entity.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault();
if (update_entityDetail == null)
return Result.ReFailure(ResultCodes.BoxInventoryMaterialNoDataError);
//3.4判断库存数量是否不足
if (update_entityDetail.Qty < dtoItem.Qty)
return Result.ReFailure(ResultCodes.BoxInventoryNoInventoryError);
//3.5物料库存数量变更:减库存
update_entityDetail.Qty = update_entityDetail.Qty - dtoItem.Qty;
//3.6移除要出库的序列号
update_entityDetail.SerialNumbers.RemoveAll(x => dtoItem.SerialNumbers.Contains(x));
}
//4.1判断要修改的箱库存对象是否所有的物料库存的数量都为0“是”则删除该箱库存,"否"则修改;
var isAllNoInventory = update_entity.Details.All(x => x.Qty == 0);
if (isAllNoInventory)
delete_ids.Add(update_entity.Id);
else
//4.2添加要更新的箱库存实体
update_entitys.Add(update_entity);
}
return Result.ReSuccess();
}
/// <summary>
/// 生成入库对象:新增和修改
/// </summary>
/// <param name="dto"></param>
/// <param name="boxInventorys"></param>
/// <param name="add_entitys"></param>
/// <param name="update_entitys"></param>
/// <returns></returns>
private Result GenerateInStockBox(BoxInventoryGenerateDto dto, List<BoxInventory> boxInventorys, List<BoxInventory> add_entitys, List<BoxInventory> update_entitys)
{
//按箱上架入库
if (dto.InventoryInOutMethod == (int)InventoryInOutMethod.Box)
{
//3.1上架的时候:箱一定是不存在于箱库存当中的,有则返回提示“已有箱库存,不需要再扫上架”
var isHave = boxInventorys.Where(x => x.BoxId == dto.BoxId).Any();
if (isHave)
return Result.ReFailure(ResultCodes.BoxInventoryHaveInventoryError);
//3.2组装要新增的箱库存信息:箱和明细和序列号
var addEntity = _mapper.Map<BoxInventory>(dto);
addEntity.Details = _mapper.Map<List<BoxInventoryDetails>>(dto.Details);
add_entitys.Add(addEntity);
}
//按产品上架入库
else
{
//按产品上架:箱只能是一个;箱可能存在库存(修改),也可能不存在库存(新增)
var boxInventory = boxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault();
if (boxInventory == null)
{
//3.2组装要新增的箱库存信息:箱和明细和序列号
var addEntity = _mapper.Map<BoxInventory>(dto);
addEntity.Details = _mapper.Map<List<BoxInventoryDetails>>(dto.Details);
add_entitys.Add(addEntity);
}
else
{
//3.3创建更新对象
var update_entity = boxInventory;
update_entity.Details = boxInventory.Details;
foreach (var dtoItem in dto.Details)
{
//明细对应的物料:存在就修改,不存在即新增
var update_entity_det = new BoxInventoryDetails();
var updateDetail = update_entity.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault();
if (updateDetail == null)
{
update_entity_det.Qty = dtoItem.Qty;
update_entity_det.MaterialId = dtoItem.MaterialId;
update_entity_det.SerialNumbers = dtoItem.SerialNumbers;
update_entity.Details.Add(update_entity_det);
}
else
{
updateDetail.Qty = updateDetail.Qty + dtoItem.Qty;
updateDetail.SerialNumbers.AddRange(dtoItem.SerialNumbers);
}
}
update_entitys.Add(update_entity);
}
}
return Result.ReSuccess();
}
/// <summary>
/// 生成即时库存对象:新增和修改
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
private List<InventoryDetailsGenerateDto> GenerateInventoryDetails(BoxInventoryGenerateDto dto)
{
var invDtos = new List<InventoryDetailsGenerateDto>();
foreach (var dtoDet in dto.Details)
{
var invDto = new InventoryDetailsGenerateDto();
invDto.OrgCode = dto.OrgCode;
invDto.InventoryInOutType = dto.InventoryInOutType;
invDto.StockCode = dto.StockCode;
invDto.SubStockId = dto.SubStockId ?? 0;
invDto.MaterialId = dtoDet.MaterialId;
invDto.Qty = dtoDet.Qty;
invDtos.Add(invDto);
}
return invDtos;
}
}
}