diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 04709493..29e8aa38 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -2244,6 +2244,14 @@ + + + 出库单-箱库存的变更 + + + + + 改箱 移箱服务 @@ -3365,6 +3373,22 @@ + + + 出库单-箱库存变更 + + + + + + + + 出库单-箱库存变更 + + + + + 处理箱库存变更:出入库 diff --git a/src/WMS.Web.Domain/IService/IBoxInventoryService.cs b/src/WMS.Web.Domain/IService/IBoxInventoryService.cs index 6b55b467..838dd8b2 100644 --- a/src/WMS.Web.Domain/IService/IBoxInventoryService.cs +++ b/src/WMS.Web.Domain/IService/IBoxInventoryService.cs @@ -64,10 +64,10 @@ namespace WMS.Web.Domain.IService /// /// 出库单-箱库存的变更 /// - /// + /// /// /// - Task GenerateOutStockBox(List dtoDatas, bool isTransaction); + Task GenerateOutStockBox(OutStock dtoData, bool isTransaction); } diff --git a/src/WMS.Web.Domain/Services/BoxInventoryService.cs b/src/WMS.Web.Domain/Services/BoxInventoryService.cs index 7c764006..3d6f8209 100644 --- a/src/WMS.Web.Domain/Services/BoxInventoryService.cs +++ b/src/WMS.Web.Domain/Services/BoxInventoryService.cs @@ -806,217 +806,6 @@ namespace WMS.Web.Domain.Services /// /// public async Task GenerateInStockBox(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.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) @@ -1092,6 +881,180 @@ namespace WMS.Web.Domain.Services var generateDtoList = new List(); generateDtoList.AddRange(generateDtoList_Metod_Box); generateDtoList.AddRange(generateDtoList_Metod_Product); + //提交处理 + 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(OutStock dtoData, bool isTransaction) + { + //1.判断来源数据是否存在 + if (dtoData == null) + return Result.ReFailure(ResultCodes.InventoryNoSourceError); + + //2.组装 + var generateDtoList = dtoData.Details.SelectMany(x => x.BoxsDetails).GroupBy(x => new { x.BoxId, x.SubStockId }) + .Select(x => new BoxInventoryGenerateDto() + { + BoxId = x.Key.BoxId, + OrgCode = dtoData.OrgCode, + StockCode = dtoData.StockCode, + SubStockId = x.Key.SubStockId, + InventoryInOutMethod = (int)dtoData.Method, + InventoryInOutType = (int)InventoryInOutType.Out + + }).ToList(); + //3.组装明细 + generateDtoList.ForEach(x => + { + //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 current_materialDetails) + { + //2.2组装明细 + var det = new BoxInventoryGenerateDetailsDto(); + det.MaterialId = detItem.MaterialId; + det.Qty = detItem.Qty; + det.SerialNumbers = detItem.SerialNumbers; + x.Details.Add(det); + } + } + }); //提交处理 return await this.GenerateOutStockBox(generateDtoList, isTransaction); @@ -1103,7 +1066,7 @@ namespace WMS.Web.Domain.Services /// /// /// - private async Task GenerateOutStockBox(List dtoDatas, bool isTransaction) + private async Task GenerateOutStockBox(List dtoDatas, bool isTransaction) { //1.判断来源数据是否存在 if (dtoDatas == null || dtoDatas.Count == 0) @@ -1189,7 +1152,7 @@ namespace WMS.Web.Domain.Services else //4.2添加要更新的箱库存实体 update_entitys.Add(update_entity); - } + } }