diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 3c4fd84f..42162956 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -2231,6 +2231,14 @@ + + + 入库单-箱库存的变更 + + + + + 改箱 移箱服务 @@ -3344,6 +3352,14 @@ + + + 入库单-箱库存变更 + + + + + 处理箱库存变更:出入库 diff --git a/src/WMS.Web.Domain/IService/IBoxInventoryService.cs b/src/WMS.Web.Domain/IService/IBoxInventoryService.cs index 2c514451..6b55b467 100644 --- a/src/WMS.Web.Domain/IService/IBoxInventoryService.cs +++ b/src/WMS.Web.Domain/IService/IBoxInventoryService.cs @@ -53,6 +53,22 @@ namespace WMS.Web.Domain.IService /// Task GenerateTakeBox(List dtoDatas, bool isTransaction); + /// + /// 入库单-箱库存的变更 + /// + /// + /// + /// + Task GenerateInStockBox(List dtoDatas, bool isTransaction); + + /// + /// 出库单-箱库存的变更 + /// + /// + /// + /// + Task GenerateOutStockBox(List dtoDatas, bool isTransaction); + } } diff --git a/src/WMS.Web.Domain/Services/BoxInventoryService.cs b/src/WMS.Web.Domain/Services/BoxInventoryService.cs index 4d9e7e24..7c764006 100644 --- a/src/WMS.Web.Domain/Services/BoxInventoryService.cs +++ b/src/WMS.Web.Domain/Services/BoxInventoryService.cs @@ -811,10 +811,7 @@ namespace WMS.Web.Domain.Services if (dtoDatas == null || dtoDatas.Count == 0) return Result.ReFailure(ResultCodes.InventoryNoSourceError); - var update_entitys = new List(); - var add_entitys = new List(); - var InventoryDetailsGenerateDto = new List(); - + #region 按箱 //2.组装-按箱入库 var dtoDatas_details_Method_box = dtoDatas.Where(x => x.Method == InventoryInOutMethod.Box).SelectMany(x => x.Details).ToList(); var generateDtoList_Metod_Box = dtoDatas_details_Method_box.GroupBy(x => new { x.BoxId, x.OrgCode, x.StockCode, x.SubStockId }) @@ -845,7 +842,9 @@ namespace WMS.Web.Domain.Services } } }); + #endregion + #region 按产品 //3.组装-按产品入库 var dtoDatas_details_Method_Product = dtoDatas.Where(x => x.Method == InventoryInOutMethod.Box).SelectMany(x => x.Details).ToList(); var generateDtoList_Metod_Product = dtoDatas_details_Method_Product.GroupBy(x => new { x.BoxId, x.OrgCode, x.StockCode, x.SubStockId }) @@ -876,15 +875,352 @@ namespace WMS.Web.Domain.Services } } }); + #endregion //整合一起 var generateDtoList = new List(); generateDtoList.AddRange(generateDtoList_Metod_Box); generateDtoList.AddRange(generateDtoList_Metod_Product); //提交处理 - return null; + return await this.GenerateInStockBox(generateDtoList,isTransaction); } + /// + /// 入库单-箱库存变更 + /// + /// + /// + /// + private async Task GenerateInStockBox(List dtoDatas, bool isTransaction) + { + //1.判断来源数据是否存在 + if (dtoDatas == null || dtoDatas.Count == 0) + return Result.ReFailure(ResultCodes.InventoryNoSourceError); + + var update_entitys = new List(); + var add_entitys = new List(); + var InventoryDetailsGenerateDto = new List(); + + //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(dto); + addEntity.Details = _mapper.Map>(dto.Details); + 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(dto); + addEntity.Details = _mapper.Map>(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); + } + + //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.即时库存:处理 + if (InventoryDetailsGenerateDto.Count != 0) + { + var InventoryDetailsGenerate_result = await _inventoryDetailsService.GenerateInventoryDetails(InventoryDetailsGenerateDto, isTransaction); + if (!InventoryDetailsGenerate_result.IsSuccess) + return InventoryDetailsGenerate_result; + } + return Result.ReSuccess(); + } + + /// + /// 出库单-箱库存变更 + /// + /// + /// + /// + public async Task GenerateOutStockBox(List dtoDatas, bool isTransaction) + { + //1.判断来源数据是否存在 + if (dtoDatas == null || dtoDatas.Count == 0) + return Result.ReFailure(ResultCodes.InventoryNoSourceError); + + #region 按箱 + //2.组装-按箱入库 + var dtoDatas_details_Method_box = dtoDatas.Where(x => x.Method == InventoryInOutMethod.Box).SelectMany(x => x.Details).ToList(); + var generateDtoList_Metod_Box = dtoDatas_details_Method_box.GroupBy(x => new { x.BoxId, x.OrgCode, x.StockCode, x.SubStockId }) + .Select(x => new BoxInventoryGenerateDto() + { + BoxId = x.Key.BoxId, + OrgCode = x.Key.OrgCode, + StockCode = x.Key.StockCode, + SubStockId = x.Key.SubStockId, + InventoryInOutMethod = (int)InventoryInOutMethod.Box, + InventoryInOutType = (int)InventoryInOutType.In + }).ToList(); + + //2.1.遍历:组装明细 + generateDtoList_Metod_Box.ForEach(x => + { + foreach (var detItem in dtoDatas_details_Method_box) + { + //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); + } + } + }); + #endregion + + #region 按产品 + //3.组装-按产品入库 + var dtoDatas_details_Method_Product = dtoDatas.Where(x => x.Method == InventoryInOutMethod.Box).SelectMany(x => x.Details).ToList(); + var generateDtoList_Metod_Product = dtoDatas_details_Method_Product.GroupBy(x => new { x.BoxId, x.OrgCode, x.StockCode, x.SubStockId }) + .Select(x => new BoxInventoryGenerateDto() + { + BoxId = x.Key.BoxId, + OrgCode = x.Key.OrgCode, + StockCode = x.Key.StockCode, + SubStockId = x.Key.SubStockId, + InventoryInOutMethod = (int)InventoryInOutMethod.Product, + InventoryInOutType = (int)InventoryInOutType.In + }).ToList(); + + //3.1.遍历:组装明细 + generateDtoList_Metod_Product.ForEach(x => + { + foreach (var detItem in dtoDatas_details_Method_Product) + { + //3.1箱是当前的 + if (detItem.BoxId == x.BoxId) + { + //3.2组装明细 + var det = new BoxInventoryGenerateDetailsDto(); + det.MaterialId = detItem.MaterialId; + det.Qty = detItem.Qty; + det.SerialNumbers = detItem.SerialNumbers; + x.Details.Add(det); + } + } + }); + #endregion + + //整合一起 + var generateDtoList = new List(); + generateDtoList.AddRange(generateDtoList_Metod_Box); + generateDtoList.AddRange(generateDtoList_Metod_Product); + + //提交处理 + return await this.GenerateOutStockBox(generateDtoList, isTransaction); + } + + /// + /// 出库单-箱库存变更 + /// + /// + /// + /// + private async Task GenerateOutStockBox(List dtoDatas, bool isTransaction) + { + //1.判断来源数据是否存在 + if (dtoDatas == null || dtoDatas.Count == 0) + return Result.ReFailure(ResultCodes.InventoryNoSourceError); + + var delete_ids = new List(); + var update_entitys = new List(); + var InventoryDetailsGenerateDto = new List(); + + //1.1通过箱IDS获取箱库存 + var boxIds = dtoDatas.Select(x => x.BoxId).ToList(); + var boxInventorys = await _boxInventoryRepositories.GetList(boxIds); + + //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.即时库存:变更处理 + if (InventoryDetailsGenerateDto.Count != 0) + { + var inventoryDetails_result = await _inventoryDetailsService.GenerateInventoryDetails(InventoryDetailsGenerateDto, isTransaction); + if (!inventoryDetails_result.IsSuccess) + return inventoryDetails_result; + } + + return Result.ReSuccess(); + } + + + + + + /// /// 处理箱库存变更:出入库