diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index 4c0bfac7..f4e09a8f 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -1830,6 +1830,46 @@ 保存入库单-请求对象 + + + 改箱-使用 + + + + + 原箱ID + + + + + 目标箱ID + + + + + 明细 + + + + + 箱库存明细 + + + + + 物料ID + + + + + 数量 + + + + + 序列号 + + 箱库存 @@ -1870,6 +1910,31 @@ 物料库存数量 + + + 移箱-上架和下架 + + + + + 箱ID + + + + + 仓库code + + + + + 仓位 + + + + + 是否是上架:true是上架,false是下架 + + 箱库存-查询请求对象 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 2b450c57..20b39acb 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -1424,6 +1424,20 @@ + + + 列表-根据箱ids + + + + + + + 实体 + + + + 批量添加 @@ -2369,6 +2383,11 @@ 入库相关-映射 + + + 即时库存映射对象 + + 集合映射 @@ -2851,6 +2870,14 @@ 即时库存-服务 + + + 改箱-箱库存的变更 + + + + + 出库服务 diff --git a/src/WMS.Web.Core/Dto/Inventory/BoxInventoryChangeGenerateDto.cs b/src/WMS.Web.Core/Dto/Inventory/BoxInventoryChangeGenerateDto.cs new file mode 100644 index 00000000..ff8b0472 --- /dev/null +++ b/src/WMS.Web.Core/Dto/Inventory/BoxInventoryChangeGenerateDto.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Core.Dto.Inventory +{ + /// + /// 改箱-使用 + /// + public class BoxInventoryChangeGenerateDto + { + /// + /// 原箱ID + /// + public int BoxId { get; set; } + + /// + /// 目标箱ID + /// + public int TargetBoxId { get; set; } + + ///// + ///// 仓库编码:目标仓库 + ///// + //public string StockCode { get; set; } + + ///// + ///// 仓位:目标仓位 + ///// + //public int SubStockId { get; set; } + + ///// + ///// 出入库类型:有个枚举的 + ///// + //public int InventoryInOutType { get; set; } + + /// + /// 明细 + /// + public List Details { get; set; } = new List(); + + } + + /// + /// 箱库存明细 + /// + public class BoxInventoryDetailsChangeGenerateDto + { + /// + /// 物料ID + /// + public int MaterialId { get; set; } + + /// + /// 数量 + /// + public decimal Qty { get; set; } + + /// + /// 序列号 + /// + public List SerialNumbers { get; set; } = new List(); + } +} diff --git a/src/WMS.Web.Core/Dto/Inventory/BoxInventoryMoveGenerateDto.cs b/src/WMS.Web.Core/Dto/Inventory/BoxInventoryMoveGenerateDto.cs new file mode 100644 index 00000000..28e32d3c --- /dev/null +++ b/src/WMS.Web.Core/Dto/Inventory/BoxInventoryMoveGenerateDto.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Core.Dto.Inventory +{ + /// + /// 移箱-上架和下架 + /// + public class BoxInventoryMoveGenerateDto + { + /// + /// 箱ID + /// + public int BoxId { get; set; } + + /// + /// 仓库code + /// + public string StockCode { get; set; } + + /// + /// 仓位 + /// + public int SubStockId { get; set; } + + /// + /// 是否是上架:true是上架,false是下架 + /// + public bool IsOn { get; set; } + } +} diff --git a/src/WMS.Web.Domain/Infrastructure/IBoxInventoryRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IBoxInventoryRepositories.cs index c1b42267..1b18e306 100644 --- a/src/WMS.Web.Domain/Infrastructure/IBoxInventoryRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IBoxInventoryRepositories.cs @@ -26,6 +26,20 @@ namespace WMS.Web.Domain.Infrastructure /// /// Task> GetListDetailsBy(string boxBillNo); + + /// + /// 列表-根据箱ids + /// + /// + /// + Task> GetList(List ids); + + /// + /// 实体 + /// + /// + /// + Task Get(int id); /// /// 批量添加 /// diff --git a/src/WMS.Web.Domain/Mappers/InventoryMapper.cs b/src/WMS.Web.Domain/Mappers/InventoryMapper.cs new file mode 100644 index 00000000..6b11d148 --- /dev/null +++ b/src/WMS.Web.Domain/Mappers/InventoryMapper.cs @@ -0,0 +1,25 @@ +using AutoMapper; +using System; +using System.Collections.Generic; +using System.Text; +using WMS.Web.Core.Dto.Inventory; +using WMS.Web.Domain.Entitys; + +namespace WMS.Web.Domain.Mappers +{ + /// + /// 即时库存映射对象 + /// + public class InventoryMapper:Profile + { + public InventoryMapper() + { + //改箱映射 + CreateMap(); + + //移箱映射 + CreateMap(); + CreateMap(); + } + } +} diff --git a/src/WMS.Web.Domain/Services/InventoryService.cs b/src/WMS.Web.Domain/Services/InventoryService.cs index c0379cf8..18011a36 100644 --- a/src/WMS.Web.Domain/Services/InventoryService.cs +++ b/src/WMS.Web.Domain/Services/InventoryService.cs @@ -1,22 +1,191 @@ using AutoMapper; using System; using System.Collections.Generic; +using System.Linq; using System.Text; +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 { /// /// 即时库存-服务 /// - public class InventoryService: IInventoryService + public class InventoryService : IInventoryService { private readonly IMapper _mapper; - public InventoryService(IMapper mapper) + private readonly IBoxRepositories _boxRepositories; + private readonly ISerialNumbersRepositories _serialNumbersRepositories; + private readonly IBoxInventoryRepositories _boxInventoryRepositories; + public InventoryService(IMapper mapper, IBoxRepositories boxRepositories, + ISerialNumbersRepositories serialNumbersRepositories, + IBoxInventoryRepositories boxInventoryRepositories) { _mapper = mapper; + _boxRepositories = boxRepositories; + _serialNumbersRepositories = serialNumbersRepositories; + _boxInventoryRepositories = boxInventoryRepositories; } + /// + /// 改箱-箱库存的变更 + /// + /// + /// + /// + public async Task GenerateChangeBox(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 boxIds = dtoDatas.GroupBy(x => x.BoxId).Select(x => x.Key).ToList(); + var targetBoxIds = dtoDatas.GroupBy(x => x.TargetBoxId).Select(x => x.Key).ToList(); + + //2.原来箱库存集合 + var sourceBoxInventorys = await _boxInventoryRepositories.GetList(boxIds); + + //2.1目标箱库存集合 + var targetBoxInventorys = await _boxInventoryRepositories.GetList(targetBoxIds); + + + foreach (var dto in dtoDatas) + { + #region 原箱库存-库存处理 + //2.1找到要改变的源箱数据:备注(原箱号库存一定是存在的) + var sour = sourceBoxInventorys.Where(x => x.BoxId == dto.BoxId).FirstOrDefault(); + if (sour == null) + return Result.ReFailure(ResultCodes.BoxInventoryNoDataError); + + var sour_update_entity = new BoxInventory(); + sour_update_entity.Details = new List(); + foreach (var dtoItem in dto.Details) + { + //找到原来的箱库存对应要改变的物料:这个一定是存在的,不存在就有问题 + var sour_ChangeDetail = sour.Details.Where(x => x.MaterialId == dtoItem.MaterialId).FirstOrDefault(); + if(sour_ChangeDetail==null) + return Result.ReFailure(ResultCodes.BoxInventoryNoDataError); + //箱物料的库存数量不足;小于要拿出来的数量 + if(sour_ChangeDetail.Qty(); + s_update_entity_det.Qty = sour_ChangeDetail.Qty - dtoItem.Qty; + + //先把现有的序列号复制过来 + s_update_entity_det.SerialNumbers = sour_ChangeDetail.SerialNumbers; + //再移除要改箱的序列号;最后就是原箱库存的新序列号 + s_update_entity_det.SerialNumbers.RemoveAll(x => dtoItem.SerialNumbers.Contains(x)); + + sour_update_entity.Details.Add(s_update_entity_det); + + } + update_entitys.Add(sour_update_entity); + #endregion + + #region 目标箱库存-库存处理 + //2.2找到要改变的目标箱数据:备注(目标箱库存可能不存在库存,就要新增) + var tagBox = targetBoxInventorys.Where(x => x.BoxId == dto.TargetBoxId).FirstOrDefault(); + if (tagBox == null) + { + var newTagBox = new BoxInventory(); + newTagBox.BoxId = dto.TargetBoxId; + newTagBox.Details =_mapper.Map>(dto.Details); + add_entitys.Add(newTagBox); + } + else + { + var tag_update_entity = new BoxInventory(); + tag_update_entity.Details = new List(); + //2.2.1遍历改变的明细 + foreach (var item in dto.Details) + { + //2.2.2找到目标箱对应要改变的物料 + var tagChangeDetail = tagBox.Details.Where(x => x.MaterialId == item.MaterialId).FirstOrDefault(); + if (tagChangeDetail != null) + { + var update_entity_det = new BoxInventoryDetails(); + update_entity_det.SerialNumbers = new List(); + update_entity_det.Qty = tagChangeDetail.Qty + item.Qty; + update_entity_det.SerialNumbers.AddRange(tagChangeDetail.SerialNumbers); + update_entity_det.SerialNumbers.AddRange(item.SerialNumbers); + tag_update_entity.Details.Add(update_entity_det); + }//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); + } + } + update_entitys.Add(tag_update_entity); + + } + #endregion + } + + //4.数据库更新操作:更新和添加 + var isSuccess= await _boxInventoryRepositories.AddRange(add_entitys, isTransaction); + if(!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); + + isSuccess = await _boxInventoryRepositories.UpdateRange(update_entitys, isTransaction); + if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); + + return Result.ReSuccess(); + } + + public async Task GenerateMoveBox(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(); + + //2.获取“箱库存集合”和“箱基本信息集合” + var boxIds = dtoDatas.GroupBy(x => x.BoxId).Select(x => x.Key).ToList(); + var boxInventorys = await _boxInventoryRepositories.GetList(boxIds); + var boxs= await _boxRepositories.GetEntityList(boxIds); + + //3.遍历:dto + foreach (var dto in dtoDatas) + { + //上架 + if (dto.IsOn) + { + //3.1上架的时候:箱一定是不存在于箱库存当中的, + var ishave = boxInventorys.Where(x => x.BoxId == dto.BoxId).Any(); + if (ishave) + return Result.ReFailure(ResultCodes.BoxInventoryHaveInventoryError); + var box = boxs.Where(x => x.Id == dto.BoxId).FirstOrDefault(); + //var serialNumbers= _serialNumbersRepositories.ge + if (box==null) + return Result.ReFailure(ResultCodes.BoxNoData); + + var addEntity = _mapper.Map(dto); + addEntity.Details = new List(); + + + }//下架 + else + { + + } + } + + return Result.ReSuccess(); + } } } diff --git a/src/WMS.Web.Domain/Values/ResultCodes.cs b/src/WMS.Web.Domain/Values/ResultCodes.cs index 0e4dea8e..4485a2f3 100644 --- a/src/WMS.Web.Domain/Values/ResultCodes.cs +++ b/src/WMS.Web.Domain/Values/ResultCodes.cs @@ -45,6 +45,11 @@ namespace WMS.Web.Domain.Values public static ValueTuple ErpMaterialError = (80007, "获取Erp相关物料数据失败,请稍候再试!"); public static ValueTuple BoxHaveError = (80008, "该箱信息已被记录,请重新选择箱号!"); public static ValueTuple AdjustError = (80009, "与金蝶校准发生错误,请稍候再试!"); + public static ValueTuple InventoryNoSourceError = (800010, "来源数据不存在,请稍候再试!"); + public static ValueTuple BoxInventoryNoDataError = (800011, "箱库存数据不存在,请稍候再试!"); + public static ValueTuple BoxInventoryNoInventoryError = (800012, "箱库存物料数量不足,请核对后再试!"); + public static ValueTuple BoxInventoryHaveInventoryError = (800013, "该箱库存已经存在,请核对后再试!"); + } } diff --git a/src/WMS.Web.Repositories/BoxInventoryRepositories.cs b/src/WMS.Web.Repositories/BoxInventoryRepositories.cs index 1edceaa3..7ccb0ba6 100644 --- a/src/WMS.Web.Repositories/BoxInventoryRepositories.cs +++ b/src/WMS.Web.Repositories/BoxInventoryRepositories.cs @@ -128,6 +128,26 @@ namespace WMS.Web.Repositories return list; } + /// + /// 列表-根据箱ids + /// + /// + /// + public async Task> GetList(List ids) + { + return await _context.BoxInventory.Include(x => x.Details).Where(x => ids.Contains(x.Id)).ToListAsync(); + } + + /// + /// 实体-根据箱id + /// + /// + /// + public async Task Get(int id) + { + return await _context.BoxInventory.Include(x => x.Details).Where(x => x.Id==id).FirstOrDefaultAsync(); + } + /// /// 批量添加 ///