收货-优化

This commit is contained in:
tongfei
2023-12-01 18:18:23 +08:00
parent c501aa2f8c
commit baf9ec4ec4
16 changed files with 350 additions and 160 deletions

View File

@@ -33,5 +33,10 @@ namespace WMS.Web.Domain.Entitys
/// 箱号
/// </summary>
public string BoxBillNo { get; set; }
/// <summary>
/// 明细
/// </summary>
public List<InStockTaskBoxDetails> Details { get; set; } = new List<InStockTaskBoxDetails>();
}
}

View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
using WMS.Web.Core;
namespace WMS.Web.Domain.Entitys
{
/// <summary>
/// erp入库任务单的对应box箱信息表的明细表
/// </summary>
[Serializable]
[Table("t_erp_instock_task_box_details")]
public class InStockTaskBoxDetails : EntityBase
{
/// <summary>
/// ID
/// </summary>
public override int Id { get; set; } = 0;
/// <summary>
/// 上级ID
/// </summary>
public int Fid { get; set; }
/// <summary>
/// 对应金蝶的明细ID
/// </summary>
public int ErpDetailId { get; set; }
/// <summary>
/// 物料ID
/// </summary>
public int MaterialId { get; set; }
/// <summary>
/// 收货数量
/// </summary>
public decimal ReceiveQty { get; set; }
}
}

View File

@@ -57,11 +57,6 @@ namespace WMS.Web.Domain.Entitys
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 箱信息集合
/// </summary>
public List<InStockTaskBox> Boxs { get; set; }
/// <summary>
/// 明细
/// </summary>

View File

@@ -56,16 +56,6 @@ namespace WMS.Web.Domain.IService
/// <returns></returns>
Task<Result<BoxInStockTaskDto>> GetInfoByBox(string boxBillNo);
/// <summary>
/// 修改-入库任务信息
/// </summary>
/// <param name="dto"></param>
/// <param name="staffId"></param>
/// <param name="isReceive"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
Task<Result<InStockTask>> Update(UpdateInStockTaskRequest dto, int staffId, bool? isReceive, bool isTransaction = true, bool isNoPurchaseShelf = false);
/// <summary>
/// 批量修改-入库任务信息
/// </summary>

View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using WMS.Web.Domain.Entitys;
namespace WMS.Web.Domain.Infrastructure
{
/// <summary>
/// 箱与任务单绑定(收货)关系表-仓储接口
/// </summary>
public interface IInStockTaskBoxRepositories
{
/// <summary>
/// 集合:任务单ID
/// </summary>
/// <param name="taskId"></param>
/// <returns></returns>
Task<List<InStockTaskBox>> GetListBy(int taskId);
/// <summary>
/// 实体箱号ID
/// </summary>
/// <param name="boxBillNo"></param>
/// <returns></returns>
Task<InStockTaskBox> GetBy(string boxBillNo);
/// <summary>
/// 批量添加
/// </summary>
/// <param name="entitys"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
Task<bool> AddRange(List<InStockTaskBox> entitys, bool isTransaction = true);
}
}

View File

@@ -29,13 +29,6 @@ namespace WMS.Web.Domain.Infrastructure
/// <returns></returns>
Task<InStockTask> Get(int id);
/// <summary>
/// 实体:根据箱号
/// </summary>
/// <param name="boxBillNo"></param>
/// <returns></returns>
Task<InStockTask> GetBy(string boxBillNo);
/// <summary>
/// 实体:根据来源单号
/// </summary>
@@ -43,13 +36,6 @@ namespace WMS.Web.Domain.Infrastructure
/// <returns></returns>
Task<InStockTask> GetBySource(string sourceBillNo);
/// <summary>
/// 箱号是否绑定了入库任务单实体:待入库和部分入库状态中
/// </summary>
/// <param name="boxBillNo"></param>
/// <returns></returns>
Task<bool> IsExist(string boxBillNo);
/// <summary>
/// 列表
/// </summary>

View File

@@ -18,12 +18,11 @@ namespace WMS.Web.Domain.Mappers
public InStockMapper()
{
CreateMap<UpdateInStockTaskRequest, InStockTask>()
.ForMember(x => x.Boxs, opt => opt.Ignore())
.ForMember(x => x.Details, opt => opt.Ignore());
CreateMap<UpdateInStockTaskDetailsRequest, InStockTaskDetails>();
CreateMap<UpdateInStockTaskBoxRequest, InStockTaskBox>();
CreateMap<UpdateInStockTaskDetailsRequest, InStockTaskBoxDetails>();
CreateMap<UpdateInStockTaskBoxRequest, InStockTaskBox>()
.ForMember(x => x.Details, opt => opt.Ignore());
CreateMap<InStockTask, InStockTask>()
.ForMember(x => x.Boxs, opt => opt.Ignore())
.ForMember(x => x.Details, opt => opt.Ignore());
CreateMap<InStockTaskDetails, InStockTaskDetails>();
CreateMap<InStockTaskBox, InStockTaskBox>();

View File

@@ -33,6 +33,7 @@ namespace WMS.Web.Domain.Services
private readonly ILoginService _loginService;
private readonly ISerialNumberService _serialNumberService;
private readonly ISerialNumbersRepositories _serialNumbersRepositories;
private readonly IInStockTaskBoxRepositories _inStockTaskBoxRepositories;
private readonly IChangeMoveBoxService _changeMoveBoxService;
private readonly IBoxRepositories _boxRepositories;
private readonly IBoxInventoryService _boxInventoryService;
@@ -41,7 +42,7 @@ namespace WMS.Web.Domain.Services
private readonly IInStockTaskRepositories _inStockTaskRepositories;
private readonly IErpBasicDataExtendService _erpBasicDataExtendService;
public InStockService(IMapper mapper, ISerialNumbersRepositories serialNumbersRepositories, IErpService erpService, IBoxInventoryService boxInventoryService, ISerialNumberService serialNumberService, ILoginService loginService, IBoxRepositories boxRepositories,
IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, IChangeMoveBoxService changeMoveBoxService,
IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, IChangeMoveBoxService changeMoveBoxService, IInStockTaskBoxRepositories inStockTaskBoxRepositories,
IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories)
{
_mapper = mapper;
@@ -53,6 +54,7 @@ namespace WMS.Web.Domain.Services
_changeMoveBoxService = changeMoveBoxService;
_basicsRepositories = basicsRepositories;
_inStockRepositories = inStockRepositories;
_inStockTaskBoxRepositories = inStockTaskBoxRepositories;
_inStockTaskRepositories = inStockTaskRepositories;
_erpBasicDataExtendService = erpBasicDataExtendService;
_serialNumbersRepositories = serialNumbersRepositories;
@@ -79,7 +81,7 @@ namespace WMS.Web.Domain.Services
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
bool isRollback = false;
bool isTransaction = false;
var result = await this.Update(dto, loginInfo.UserInfo.StaffId, true, isTransaction);
var result = await this.Receive(dto, loginInfo.UserInfo.StaffId, isTransaction);
if (!result.IsSuccess) isRollback = true;
//提交事务
@@ -147,10 +149,13 @@ namespace WMS.Web.Domain.Services
materials = materials_result.Data.ToList();
//1.先判断:箱号已经绑定了入库任务单中;备注:业务说法就是箱是否收货了
var tast = await _inStockTaskRepositories.GetBy(boxBillNo);
if (tast == null)
var tast_box= await _inStockTaskBoxRepositories.GetBy(boxBillNo);
if (tast_box == null)
return Result<BoxInStockTaskDto>.ReFailure(ResultCodes.Box_NoBind_Task_Data);
//1.2找到任务单
var tast = await _inStockTaskRepositories.Get(tast_box.TaskId);
//2.找到箱对应的物料信息
var box = await _boxRepositories.GetByNo(boxBillNo);
if (box == null)
@@ -166,25 +171,29 @@ namespace WMS.Web.Domain.Services
result.SourceBillNo = tast.SourceBillNo;
result.TaskId = tast.Id;
result.BoxId = box.Id;
foreach (var item in tast.Details)
//获取:当前箱的与收货绑定的信息
foreach (var item in tast_box.Details)
{
//这里找箱的物料条件
var current_box_Det = box.Details.Where(x => x.MaterialId == item.MaterialId).FirstOrDefault();
var current_task_det = tast.Details.Where(x => x.ErpDetailId == item.ErpDetailId).FirstOrDefault();
if (current_task_det != null)
{
//3.2映射返回明细对象
var box_task_detail = new BoxDetailsInStockTaskDto();
box_task_detail.SupplierId = current_task_det.SupplierId;
box_task_detail.OrgId = current_task_det.OrgId;
box_task_detail.ReceiveQty = current_task_det.ReceiveQty;
box_task_detail.AccruedQty = current_task_det.AccruedQty;
box_task_detail.ErpDetailId = item.ErpDetailId;
box_task_detail.MaterialId = item.MaterialId;
box_task_detail.BoxMaterialQty = item.ReceiveQty;
box_task_detail.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, item.MaterialId);
box_task_detail.MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, item.MaterialId);
box_task_detail.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, item.MaterialId);
result.Details.Add(box_task_detail);
}
//3.2映射返回明细对象
var box_task_detail = new BoxDetailsInStockTaskDto();
box_task_detail.SupplierId = item.SupplierId;
box_task_detail.OrgId = item.OrgId;
box_task_detail.ReceiveQty = item.ReceiveQty;
box_task_detail.AccruedQty = item.AccruedQty;
box_task_detail.ErpDetailId= item.ErpDetailId;
box_task_detail.MaterialId = item.MaterialId;
box_task_detail.BoxMaterialQty = current_box_Det==null?0:current_box_Det.Qty;
box_task_detail.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, item.MaterialId);
box_task_detail.MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, item.MaterialId);
box_task_detail.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, item.MaterialId);
result.Details.Add(box_task_detail);
}
return Result<BoxInStockTaskDto>.ReSuccess(result);
}
@@ -343,7 +352,7 @@ namespace WMS.Web.Domain.Services
{
//通过序列号,获取序列号对应的箱
var cureent_serialNumbs = await _serialNumbersRepositories.GetEntityList(dto.Boxs.SelectMany(x => x.Details).SelectMany(x => x.SerialNumbers).ToList());
var current_boxIds= cureent_serialNumbs.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var current_boxIds = cureent_serialNumbs.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
//要改箱的数据集合
var ganenrateChangeBoxs = new List<SaveChangeBoxRecordRequest>();
@@ -401,38 +410,50 @@ namespace WMS.Web.Domain.Services
/// <param name="isReceive"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result<InStockTask>> Update(UpdateInStockTaskRequest dto, int staffId, bool? isReceive, bool isTransaction = true, bool isNoPurchaseShelf = false)
public async Task<Result<InStockTask>> Receive(UpdateInStockTaskRequest dto, int staffId, bool isTransaction)
{
//1.修改任务单的数据
var entity = await _inStockTaskRepositories.Get(dto.Id);
if (entity == null)
return Result<InStockTask>.ReFailure(ResultCodes.DateWriteError);
entity = _mapper.Map(dto, entity);
////子集单独映射:这个弃用这个不好的地方就是前端必须拿到全部的boxs集合一起给到后端处理
//entity.Boxs = _mapper.ToMapList(dto.Boxs, entity.Boxs);
//子集单独映射box子集单独组装获取这个好处就是前端就只传新增的box过来
entity.Receive(staffId);
//子集单独映射
entity.Details.ForEach(x =>
{
//当前明细收货的明细可以通过erp明细ID获取唯一一个;并变更收货数量
var current_dto_det = dto.Details.Where(x => x.ErpDetailId == x.ErpDetailId).FirstOrDefault();
if (current_dto_det != null)
x.ReceiveQty = x.ReceiveQty + current_dto_det.ReceiveQty;
});
//2.修改箱和任务单的绑定关系,先判断箱没有被收货过
var taskBoxList= await _inStockTaskBoxRepositories.GetListBy(entity.Id);
var dto_boxIds= dto.Boxs.GroupBy(x => x.BoxId).Select(x => x.Key).ToList();
var isHaveBox= taskBoxList.Where(x => dto_boxIds.Contains(x.BoxId)).Any();
if (isHaveBox)
return Result<InStockTask>.ReFailure(ResultCodes.InStockTaskBoxIsHaveData);
//3.组装绑定关系表,要添加的集合
var boxEntitys= await _boxRepositories.GetEntityList(dto_boxIds);
var taskBoxAdd = new List<InStockTaskBox>();
foreach (var item in dto.Boxs)
{
var box = _mapper.Map<InStockTaskBox>(item);
entity.Boxs.Add(box);
var taskBox = _mapper.Map<InStockTaskBox>(item);
var current_dto_box_dets= boxEntitys.Where(x => x.Id == item.BoxId).Select(x=>x.Details).ToList();
taskBox.Details = _mapper.Map<List<InStockTaskBoxDetails>>(current_dto_box_dets);
taskBoxAdd.Add(taskBox);
}
//子集单独映射
entity.Details = _mapper.ToMapList(dto.Details, entity.Details);
if (isNoPurchaseShelf)
entity.NoPurchaseShelf(staffId);
else
{
if (isReceive.HasValue && isReceive.Value)
entity.Receive(staffId);
else
entity.Shelf(staffId);
}
var result = await _inStockTaskRepositories.Update(entity, isTransaction);
if (result != null)
return Result<InStockTask>.ReSuccess(entity);
else
var isSuccess= await _inStockTaskBoxRepositories.AddRange(taskBoxAdd);
if(!isSuccess)
return Result<InStockTask>.ReFailure(ResultCodes.DateWriteError);
//数据库操作
var result = await _inStockTaskRepositories.Update(entity, isTransaction);
if (result == null)
return Result<InStockTask>.ReFailure(ResultCodes.DateWriteError);
return Result<InStockTask>.ReSuccess(entity);
}
/// <summary>
@@ -489,22 +510,23 @@ namespace WMS.Web.Domain.Services
//3.比对false为比对失败;
bool isRight = boxDetails.All(x => task_details.Any(t => t.MaterialId == x.MaterialId && t.AccruedQty >= x.Qty)) && boxDetails.Count <= task_details.Count;
if (!isRight)
if (!isRight)
{
var qtyIsError= boxDetails.All(x => task_details.Any(t => t.MaterialId == x.MaterialId && t.AccruedQty < x.Qty));
var qtyIsError = boxDetails.All(x => task_details.Any(t => t.MaterialId == x.MaterialId && t.AccruedQty < x.Qty));
if (boxDetails.Count> task_details.Count && qtyIsError)
if (boxDetails.Count > task_details.Count && qtyIsError)
return Result<ContrastMaterialsResponse>.ReFailure(ResultCodes.ContrastError);
else if(qtyIsError)
else if (qtyIsError)
return Result<ContrastMaterialsResponse>.ReFailure(ResultCodes.Contrast_Qty_Error);
else
return Result<ContrastMaterialsResponse>.ReFailure(ResultCodes.Contrast_Count_Error);
}
//4.是否任务单存在绑定箱号判断:存在的话,就不能收货或者非采购上架
bool isHave = task.Boxs.Where(x => dto.BoxBillNos.Contains(x.BoxBillNo)).Any();
var taskBoxList= await _inStockTaskBoxRepositories.GetListBy(task.Id);
bool isHave = taskBoxList.Where(x => dto.BoxBillNos.Contains(x.BoxBillNo)).Any();
if (isHave)
return Result<ContrastMaterialsResponse>.ReFailure(ResultCodes.BoxHaveError);

View File

@@ -36,6 +36,7 @@ namespace WMS.Web.Domain.Values
public static ValueTuple<int, string> BoxIsTrueShelf = (80000, "该箱已上架,请选择其它箱进行上架!");
public static ValueTuple<int, string> BoxNoData = (80000, "箱信息不存在");
public static ValueTuple<int, string> InStockTaskBoxIsHaveData = (80000, "该箱已收货");
public static ValueTuple<int, string> BoxMateriaNoData = (800010, "箱对应物料信息不存在");
public static ValueTuple<int, string> MateriaNoData = (800011, "物料信息不存在");
public static ValueTuple<int, string> BoxInventorySerialNumbersNoData = (800012, "序列号不存在于箱库存数据中");