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();
+ }
+
///
/// 批量添加
///