收货-优化

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,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);