|
@ -14,6 +14,7 @@ using Win_in.Sfs.Shared.Event; |
|
|
using Win_in.Sfs.Wms.Inventory.Application.Contracts; |
|
|
using Win_in.Sfs.Wms.Inventory.Application.Contracts; |
|
|
using Win_in.Sfs.Wms.Store.Application.Contracts; |
|
|
using Win_in.Sfs.Wms.Store.Application.Contracts; |
|
|
using Win_in.Sfs.Wms.Store.Domain; |
|
|
using Win_in.Sfs.Wms.Store.Domain; |
|
|
|
|
|
using Win_in.Sfs.Wms.Store.Domain.Acl.Balance; |
|
|
|
|
|
|
|
|
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; |
|
|
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; |
|
|
|
|
|
|
|
@ -25,20 +26,21 @@ public class SparePartIssueRequestEventHandler |
|
|
, ILocalEventHandler<SfsCreatedEntityEventData<SparePartIssueRequest>> |
|
|
, ILocalEventHandler<SfsCreatedEntityEventData<SparePartIssueRequest>> |
|
|
, ILocalEventHandler<SfsCreatedEntityEventData<List<SparePartIssueRequest>>> |
|
|
, ILocalEventHandler<SfsCreatedEntityEventData<List<SparePartIssueRequest>>> |
|
|
{ |
|
|
{ |
|
|
private readonly ISparePartIssueJobAppService _sparePartIssueJobAppService; |
|
|
private readonly ISparePartIssueJobAppService _SparePartIssueJobAppService; |
|
|
private readonly IProductionLineAppService _productionLineAppService; |
|
|
private readonly IProductionLineAppService _productionLineAppService; |
|
|
private readonly IProductionLineItemAppService _productionLineItemAppService; |
|
|
private readonly IProductionLineItemAppService _productionLineItemAppService; |
|
|
private readonly ILocationAppService _locationAppService; |
|
|
private readonly ILocationAppService _locationAppService; |
|
|
private readonly IBalanceAppService _balanceAppService; |
|
|
private readonly IBalanceAppService _balanceAppService; |
|
|
|
|
|
protected ISparePartIssueRequestManager SparePartIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<ISparePartIssueRequestManager>(); |
|
|
private IMapper _mapper; |
|
|
private IMapper _mapper; |
|
|
|
|
|
|
|
|
public SparePartIssueRequestEventHandler( |
|
|
public SparePartIssueRequestEventHandler( |
|
|
ISparePartIssueJobAppService sparePartIssueJobAppService, IProductionLineAppService productionLineAppService, |
|
|
ISparePartIssueJobAppService SparePartIssueJobAppService, IProductionLineAppService productionLineAppService, |
|
|
ILocationAppService locationAppService, |
|
|
ILocationAppService locationAppService, |
|
|
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService |
|
|
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService |
|
|
) |
|
|
) |
|
|
{ |
|
|
{ |
|
|
_sparePartIssueJobAppService = sparePartIssueJobAppService; |
|
|
_SparePartIssueJobAppService = SparePartIssueJobAppService; |
|
|
_productionLineAppService = productionLineAppService; |
|
|
_productionLineAppService = productionLineAppService; |
|
|
_locationAppService = locationAppService; |
|
|
_locationAppService = locationAppService; |
|
|
_balanceAppService = balanceAppService; |
|
|
_balanceAppService = balanceAppService; |
|
@ -95,7 +97,7 @@ public class SparePartIssueRequestEventHandler |
|
|
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<SparePartIssueRequest> eventData) |
|
|
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<SparePartIssueRequest> eventData) |
|
|
{ |
|
|
{ |
|
|
_ = eventData.Entity; |
|
|
_ = eventData.Entity; |
|
|
// await _sparePartIssueJobAppService.CompleteBySparePartIssueRequestAsync(entity.Number);
|
|
|
// await _SparePartIssueJobAppService.CompleteBySparePartIssueRequestAsync(entity.Number);
|
|
|
|
|
|
|
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
} |
|
|
} |
|
@ -107,14 +109,14 @@ public class SparePartIssueRequestEventHandler |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 创建注塑任务-按数量
|
|
|
/// 创建注塑任务-按数量
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sparePartIssueRequest"></param>
|
|
|
/// <param name="SparePartIssueRequest"></param>
|
|
|
/// <param name="sparePartIssueRequestDetails"></param>
|
|
|
/// <param name="SparePartIssueRequestDetails"></param>
|
|
|
/// <param name="recommendbalanceDtos"></param>
|
|
|
/// <param name="recommendbalanceDtos"></param>
|
|
|
/// <param name="useBalanceList"></param>
|
|
|
/// <param name="useBalanceList"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
/// <exception cref="UserFriendlyException"></exception>
|
|
|
/// <exception cref="UserFriendlyException"></exception>
|
|
|
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithQtyTypeAsync |
|
|
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithQtyTypeAsync |
|
|
(SparePartIssueRequest sparePartIssueRequest, List<SparePartIssueRequestDetail> sparePartIssueRequestDetails, |
|
|
(SparePartIssueRequest SparePartIssueRequest, List<SparePartIssueRequestDetail> SparePartIssueRequestDetails, |
|
|
List<BalanceDTO> recommendbalanceDtos, |
|
|
List<BalanceDTO> recommendbalanceDtos, |
|
|
List<BalanceDTO> useBalanceList) |
|
|
List<BalanceDTO> useBalanceList) |
|
|
{ |
|
|
{ |
|
@ -122,9 +124,9 @@ public class SparePartIssueRequestEventHandler |
|
|
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
|
|
|
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
|
|
|
var tempDetailDtos = |
|
|
var tempDetailDtos = |
|
|
ObjectMapper.Map<List<SparePartIssueRequestDetail>, List<SparePartIssueRequestDetailDTO>>( |
|
|
ObjectMapper.Map<List<SparePartIssueRequestDetail>, List<SparePartIssueRequestDetailDTO>>( |
|
|
sparePartIssueRequestDetails); |
|
|
SparePartIssueRequestDetails); |
|
|
|
|
|
|
|
|
var sparePartIssueJobDetailInputs = new List<SparePartIssueJobDetailInput>(); |
|
|
var SparePartIssueJobDetailInputs = new List<SparePartIssueJobDetailInput>(); |
|
|
|
|
|
|
|
|
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0) |
|
|
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0) |
|
|
{ |
|
|
{ |
|
@ -138,7 +140,9 @@ public class SparePartIssueRequestEventHandler |
|
|
foreach (var tempDetailDto in tempDetailDtos) |
|
|
foreach (var tempDetailDto in tempDetailDtos) |
|
|
{ |
|
|
{ |
|
|
//未发送的数量
|
|
|
//未发送的数量
|
|
|
tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty; |
|
|
tempDetailDto.Qty = tempDetailDto.Qty > tempDetailDto.IssuedQty ? |
|
|
|
|
|
tempDetailDto.Qty - tempDetailDto.IssuedQty : |
|
|
|
|
|
0; |
|
|
|
|
|
|
|
|
if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
|
|
|
if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
|
|
|
{ |
|
|
{ |
|
@ -150,7 +154,7 @@ public class SparePartIssueRequestEventHandler |
|
|
balanceDto.Qty = tempDetailDto.Qty; |
|
|
balanceDto.Qty = tempDetailDto.Qty; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
sparePartIssueJobDetailInputs.Add( |
|
|
SparePartIssueJobDetailInputs.Add( |
|
|
await BuildSparePartIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto) |
|
|
await BuildSparePartIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto) |
|
|
.ConfigureAwait(false)); |
|
|
.ConfigureAwait(false)); |
|
|
useBalanceList.Add(balanceDto); |
|
|
useBalanceList.Add(balanceDto); |
|
@ -170,12 +174,18 @@ public class SparePartIssueRequestEventHandler |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (sparePartIssueJobDetailInputs.Any()) |
|
|
if (SparePartIssueJobDetailInputs.Any()) |
|
|
{ |
|
|
{ |
|
|
var sparePartIssueJobEditInput = await BuildSparePartIssueJobCreateInputWithQtyTypeAsync(sparePartIssueRequest, |
|
|
var SparePartIssueJobEditInput = await BuildSparePartIssueJobCreateInputWithQtyTypeAsync( |
|
|
sparePartIssueRequestDetails.First()).ConfigureAwait(false); |
|
|
SparePartIssueRequest, |
|
|
sparePartIssueJobEditInput.Details = sparePartIssueJobDetailInputs; |
|
|
SparePartIssueRequestDetails.First()).ConfigureAwait(false); |
|
|
jobs.Add(sparePartIssueJobEditInput); |
|
|
SparePartIssueJobEditInput.Details = SparePartIssueJobDetailInputs; |
|
|
|
|
|
|
|
|
|
|
|
SparePartIssueJobEditInput.Details = SparePartIssueJobEditInput.Details.Where(p => p.RecommendFromQty > 0).ToList(); |
|
|
|
|
|
if (SparePartIssueJobEditInput.Details != null && SparePartIssueJobEditInput.Details.Any()) |
|
|
|
|
|
{ |
|
|
|
|
|
jobs.Add(SparePartIssueJobEditInput); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return jobs; |
|
|
return jobs; |
|
@ -184,19 +194,19 @@ public class SparePartIssueRequestEventHandler |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 构造注塑任务-按数量
|
|
|
/// 构造注塑任务-按数量
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sparePartIssueRequest"></param>
|
|
|
/// <param name="SparePartIssueRequest"></param>
|
|
|
/// <param name="requestDetailInput"></param>
|
|
|
/// <param name="requestDetailInput"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithQtyTypeAsync( |
|
|
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithQtyTypeAsync( |
|
|
SparePartIssueRequest sparePartIssueRequest, SparePartIssueRequestDetail requestDetailInput) |
|
|
SparePartIssueRequest SparePartIssueRequest, SparePartIssueRequestDetail requestDetailInput) |
|
|
{ |
|
|
{ |
|
|
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(sparePartIssueRequest); |
|
|
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(SparePartIssueRequest); |
|
|
job.JobType = EnumJobType.IssueJob; |
|
|
job.JobType = EnumJobType.IssueJob; |
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
job.WorkGroupCode = requestDetailInput.ToLocationGroup; |
|
|
job.WorkGroupCode = requestDetailInput.ToLocationGroup; |
|
|
job.WarehouseCode = requestDetailInput.ToWarehouseCode; |
|
|
job.WarehouseCode = requestDetailInput.ToWarehouseCode; |
|
|
job.Worker = sparePartIssueRequest.Worker; |
|
|
job.Worker = SparePartIssueRequest.Worker; |
|
|
job.SparePartRequestNumber = sparePartIssueRequest.Number; |
|
|
job.SparePartRequestNumber = SparePartIssueRequest.Number; |
|
|
job.EnumIssueSendType = EnumIssueSendType.QtyType; |
|
|
job.EnumIssueSendType = EnumIssueSendType.QtyType; |
|
|
|
|
|
|
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
@ -207,31 +217,31 @@ public class SparePartIssueRequestEventHandler |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 构造注塑任务明细-按数量
|
|
|
/// 构造注塑任务明细-按数量
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sparePartIssueRequestDetail"></param>
|
|
|
/// <param name="SparePartIssueRequestDetail"></param>
|
|
|
/// <param name="balance"></param>
|
|
|
/// <param name="balance"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithQtyTypeAsync( |
|
|
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithQtyTypeAsync( |
|
|
SparePartIssueRequestDetailDTO sparePartIssueRequestDetail, BalanceDTO balance) |
|
|
SparePartIssueRequestDetailDTO SparePartIssueRequestDetail, BalanceDTO balance) |
|
|
{ |
|
|
{ |
|
|
var detail = new SparePartIssueJobDetailInput(); |
|
|
var detail = new SparePartIssueJobDetailInput(); |
|
|
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.PositionCode = sparePartIssueRequestDetail.PositionCode; |
|
|
detail.PositionCode = SparePartIssueRequestDetail.PositionCode; |
|
|
detail.RecommendType = sparePartIssueRequestDetail.RecommendType; |
|
|
detail.RecommendType = SparePartIssueRequestDetail.RecommendType; |
|
|
detail.Uom = balance.Uom; |
|
|
detail.Uom = balance.Uom; |
|
|
detail.ItemCode = balance.ItemCode; |
|
|
detail.ItemCode = balance.ItemCode; |
|
|
detail.ItemDesc2 = balance.ItemDesc2; |
|
|
detail.ItemDesc2 = balance.ItemDesc2; |
|
|
detail.ItemDesc1 = balance.ItemDesc1; |
|
|
detail.ItemDesc1 = balance.ItemDesc1; |
|
|
detail.ItemName = balance.ItemName; |
|
|
detail.ItemName = balance.ItemName; |
|
|
detail.ProdLine = sparePartIssueRequestDetail.ProdLine; |
|
|
detail.ProdLine = SparePartIssueRequestDetail.ProdLine; |
|
|
detail.RequestQty = balance.Qty; |
|
|
detail.RequestQty = balance.Qty; |
|
|
detail.StdPackQty = sparePartIssueRequestDetail.StdPackQty; |
|
|
detail.StdPackQty = SparePartIssueRequestDetail.StdPackQty; |
|
|
detail.Status = balance.Status; |
|
|
detail.Status = balance.Status; |
|
|
|
|
|
|
|
|
detail.RequestLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RequestLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RequestLocationArea = sparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RequestLocationArea = SparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RequestWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RequestWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RequestLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; |
|
|
detail.RequestLocationGroup = SparePartIssueRequestDetail.ToLocationGroup; |
|
|
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode; |
|
|
|
|
|
|
|
|
detail.RecommendFromPackingCode = balance.PackingCode; |
|
|
detail.RecommendFromPackingCode = balance.PackingCode; |
|
|
detail.RecommendFromContainerCode = balance.ContainerCode; |
|
|
detail.RecommendFromContainerCode = balance.ContainerCode; |
|
@ -263,11 +273,11 @@ public class SparePartIssueRequestEventHandler |
|
|
detail.RecommendFromLocationGroup = balance.LocationGroup; |
|
|
detail.RecommendFromLocationGroup = balance.LocationGroup; |
|
|
detail.RecommendFromWarehouseCode = balance.WarehouseCode; |
|
|
detail.RecommendFromWarehouseCode = balance.WarehouseCode; |
|
|
|
|
|
|
|
|
detail.RecommendToLocationCode = sparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RecommendToLocationCode = SparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RecommendToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RecommendToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RecommendToLocationArea = sparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RecommendToLocationArea = SparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RecommendToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RecommendToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RecommendToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; |
|
|
detail.RecommendToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup; |
|
|
|
|
|
|
|
|
detail.TransferLibFromPackingCode = balance.PackingCode; |
|
|
detail.TransferLibFromPackingCode = balance.PackingCode; |
|
|
detail.TransferLibFromContainerCode = balance.ContainerCode; |
|
|
detail.TransferLibFromContainerCode = balance.ContainerCode; |
|
@ -298,11 +308,11 @@ public class SparePartIssueRequestEventHandler |
|
|
detail.TransferLibFromLocationGroup = balance.LocationGroup; |
|
|
detail.TransferLibFromLocationGroup = balance.LocationGroup; |
|
|
detail.TransferLibFromWarehouseCode = balance.WarehouseCode; |
|
|
detail.TransferLibFromWarehouseCode = balance.WarehouseCode; |
|
|
|
|
|
|
|
|
detail.TransferLibToLocationCode = sparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.TransferLibToLocationCode = SparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.TransferLibToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.TransferLibToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.TransferLibToLocationArea = sparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.TransferLibToLocationArea = SparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.TransferLibToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.TransferLibToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.TransferLibToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; |
|
|
detail.TransferLibToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup; |
|
|
|
|
|
|
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
return detail; |
|
|
return detail; |
|
@ -315,28 +325,28 @@ public class SparePartIssueRequestEventHandler |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 创建注塑任务 按箱叫料-按箱
|
|
|
/// 创建注塑任务 按箱叫料-按箱
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sparePartIssueRequest"></param>
|
|
|
/// <param name="SparePartIssueRequest"></param>
|
|
|
/// <param name="sparePartIssueRequestDetailList"></param>
|
|
|
/// <param name="SparePartIssueRequestDetailList"></param>
|
|
|
/// <param name="recommendbalanceDtos"></param>
|
|
|
/// <param name="recommendbalanceDtos"></param>
|
|
|
/// <param name="useBalanceList"></param>
|
|
|
/// <param name="useBalanceList"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
/// <exception cref="UserFriendlyException"></exception>
|
|
|
/// <exception cref="UserFriendlyException"></exception>
|
|
|
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithBoxQtyTypeAsync |
|
|
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithBoxQtyTypeAsync |
|
|
( |
|
|
( |
|
|
SparePartIssueRequest sparePartIssueRequest, |
|
|
SparePartIssueRequest SparePartIssueRequest, |
|
|
List<SparePartIssueRequestDetail> sparePartIssueRequestDetailList, |
|
|
List<SparePartIssueRequestDetail> SparePartIssueRequestDetailList, |
|
|
List<SortBalance> recommendbalanceDtos, |
|
|
List<SortBalance> recommendbalanceDtos, |
|
|
List<BalanceDTO> useBalanceList) |
|
|
List<BalanceDTO> useBalanceList) |
|
|
{ |
|
|
{ |
|
|
var inputJobs = new List<SparePartIssueJobEditInput>(); |
|
|
var inputJobs = new List<SparePartIssueJobEditInput>(); |
|
|
|
|
|
|
|
|
var jobs = await _sparePartIssueJobAppService.GetByRequestNumberAsync(sparePartIssueRequest.Number) |
|
|
var jobs = await _SparePartIssueJobAppService.GetByRequestNumberAsync(SparePartIssueRequest.Number) |
|
|
.ConfigureAwait(false); |
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
foreach (var detail in sparePartIssueRequestDetailList) |
|
|
foreach (var detail in SparePartIssueRequestDetailList) |
|
|
{ |
|
|
{ |
|
|
//当前物品的集合
|
|
|
//当前物品的集合
|
|
|
var inputDetails = sparePartIssueRequestDetailList; |
|
|
var inputDetails = SparePartIssueRequestDetailList; |
|
|
//获取请求下 这个物品和这个库位一个需要多少箱
|
|
|
//获取请求下 这个物品和这个库位一个需要多少箱
|
|
|
var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count); |
|
|
var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count); |
|
|
//获取生产线
|
|
|
//获取生产线
|
|
@ -354,7 +364,8 @@ public class SparePartIssueRequestEventHandler |
|
|
|
|
|
|
|
|
//可用库存
|
|
|
//可用库存
|
|
|
var usableList = recommendbalanceDtos; |
|
|
var usableList = recommendbalanceDtos; |
|
|
usableList = usableList.Where(p => !useBalanceList.Select(p => p.PackingCode).Contains(p.PackingCode)) |
|
|
usableList = usableList.Where(p => |
|
|
|
|
|
!useBalanceList.Select(balanceDto => balanceDto.PackingCode).Contains(p.PackingCode)) |
|
|
.ToList(); |
|
|
.ToList(); |
|
|
if (usableList.Any()) |
|
|
if (usableList.Any()) |
|
|
{ |
|
|
{ |
|
@ -366,12 +377,12 @@ public class SparePartIssueRequestEventHandler |
|
|
useBalanceList.Add(firstUsable); |
|
|
useBalanceList.Add(firstUsable); |
|
|
usableList.Remove(firstUsable); |
|
|
usableList.Remove(firstUsable); |
|
|
|
|
|
|
|
|
var sparePartIssueJobEditInput = |
|
|
var SparePartIssueJobEditInput = |
|
|
await BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(sparePartIssueRequest, |
|
|
await BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(SparePartIssueRequest, |
|
|
detail, firstUsable) |
|
|
detail, firstUsable) |
|
|
.ConfigureAwait(false); |
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
inputJobs.Add(sparePartIssueJobEditInput); |
|
|
inputJobs.Add(SparePartIssueJobEditInput); |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
@ -387,24 +398,24 @@ public class SparePartIssueRequestEventHandler |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 构造注塑任务-按箱
|
|
|
/// 构造注塑任务-按箱
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sparePartIssueRequest"></param>
|
|
|
/// <param name="SparePartIssueRequest"></param>
|
|
|
/// <param name="sparePartIssueRequestDetail"></param>
|
|
|
/// <param name="SparePartIssueRequestDetail"></param>
|
|
|
/// <param name="balanceDtos"></param>
|
|
|
/// <param name="balanceDtos"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync( |
|
|
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync( |
|
|
SparePartIssueRequest sparePartIssueRequest, |
|
|
SparePartIssueRequest SparePartIssueRequest, |
|
|
SparePartIssueRequestDetail sparePartIssueRequestDetail, BalanceDTO balanceDtos) |
|
|
SparePartIssueRequestDetail SparePartIssueRequestDetail, BalanceDTO balanceDtos) |
|
|
{ |
|
|
{ |
|
|
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(sparePartIssueRequest); |
|
|
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(SparePartIssueRequest); |
|
|
job.JobType = EnumJobType.IssueJob; |
|
|
job.JobType = EnumJobType.IssueJob; |
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
job.WorkGroupCode = sparePartIssueRequestDetail.ToLocationGroup; |
|
|
job.WorkGroupCode = SparePartIssueRequestDetail.ToLocationGroup; |
|
|
job.WarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; |
|
|
job.WarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode; |
|
|
job.Worker = sparePartIssueRequest.Worker; |
|
|
job.Worker = SparePartIssueRequest.Worker; |
|
|
job.SparePartRequestNumber = sparePartIssueRequest.Number; |
|
|
job.SparePartRequestNumber = SparePartIssueRequest.Number; |
|
|
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType; |
|
|
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType; |
|
|
|
|
|
|
|
|
job.Details.Add(await BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(sparePartIssueRequestDetail, balanceDtos) |
|
|
job.Details.Add(await BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(SparePartIssueRequestDetail, balanceDtos) |
|
|
.ConfigureAwait(false)); |
|
|
.ConfigureAwait(false)); |
|
|
|
|
|
|
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
@ -415,28 +426,28 @@ public class SparePartIssueRequestEventHandler |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 构造注塑任务明细-按箱
|
|
|
/// 构造注塑任务明细-按箱
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sparePartIssueRequestDetail"></param>
|
|
|
/// <param name="SparePartIssueRequestDetail"></param>
|
|
|
/// <param name="balance"></param>
|
|
|
/// <param name="balance"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithBoxQtyTypeAsync( |
|
|
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithBoxQtyTypeAsync( |
|
|
SparePartIssueRequestDetail sparePartIssueRequestDetail, BalanceDTO balance) |
|
|
SparePartIssueRequestDetail SparePartIssueRequestDetail, BalanceDTO balance) |
|
|
{ |
|
|
{ |
|
|
var detail = new SparePartIssueJobDetailInput(); |
|
|
var detail = new SparePartIssueJobDetailInput(); |
|
|
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RequestLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; |
|
|
detail.RequestLocationGroup = SparePartIssueRequestDetail.ToLocationGroup; |
|
|
detail.RequestLocationArea = sparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RequestLocationArea = SparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RequestLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RequestLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RequestWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RequestWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RequestQty = 1; |
|
|
detail.RequestQty = 1; |
|
|
|
|
|
|
|
|
detail.PositionCode = sparePartIssueRequestDetail.PositionCode; |
|
|
detail.PositionCode = SparePartIssueRequestDetail.PositionCode; |
|
|
detail.RecommendType = sparePartIssueRequestDetail.RecommendType; |
|
|
detail.RecommendType = SparePartIssueRequestDetail.RecommendType; |
|
|
detail.ProdLine = sparePartIssueRequestDetail.ProdLine; |
|
|
detail.ProdLine = SparePartIssueRequestDetail.ProdLine; |
|
|
|
|
|
|
|
|
detail.ItemCode = sparePartIssueRequestDetail.ItemCode; |
|
|
detail.ItemCode = SparePartIssueRequestDetail.ItemCode; |
|
|
detail.ItemName = sparePartIssueRequestDetail.ItemName; |
|
|
detail.ItemName = SparePartIssueRequestDetail.ItemName; |
|
|
detail.ItemDesc1 = sparePartIssueRequestDetail.ItemDesc1; |
|
|
detail.ItemDesc1 = SparePartIssueRequestDetail.ItemDesc1; |
|
|
detail.ItemDesc2 = sparePartIssueRequestDetail.ItemDesc2; |
|
|
detail.ItemDesc2 = SparePartIssueRequestDetail.ItemDesc2; |
|
|
|
|
|
|
|
|
detail.Status = EnumInventoryStatus.OK; |
|
|
detail.Status = EnumInventoryStatus.OK; |
|
|
detail.Uom = balance.Uom; |
|
|
detail.Uom = balance.Uom; |
|
@ -471,11 +482,11 @@ public class SparePartIssueRequestEventHandler |
|
|
detail.RecommendToProduceDate = balance.ProduceDate; |
|
|
detail.RecommendToProduceDate = balance.ProduceDate; |
|
|
detail.RecommendToArriveDate = balance.ArriveDate; |
|
|
detail.RecommendToArriveDate = balance.ArriveDate; |
|
|
|
|
|
|
|
|
detail.RecommendToLocationCode = sparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RecommendToLocationCode = SparePartIssueRequestDetail.ToLocationCode; |
|
|
detail.RecommendToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RecommendToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode; |
|
|
detail.RecommendToLocationArea = sparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RecommendToLocationArea = SparePartIssueRequestDetail.ToLocationArea; |
|
|
detail.RecommendToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RecommendToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode; |
|
|
detail.RecommendToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; |
|
|
detail.RecommendToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup; |
|
|
|
|
|
|
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
await Task.CompletedTask.ConfigureAwait(false); |
|
|
return detail; |
|
|
return detail; |
|
@ -487,26 +498,26 @@ public class SparePartIssueRequestEventHandler |
|
|
|
|
|
|
|
|
//创建任务
|
|
|
//创建任务
|
|
|
private async Task<List<SparePartIssueJobDTO>> CreateAllSparePartIssueJobAsync( |
|
|
private async Task<List<SparePartIssueJobDTO>> CreateAllSparePartIssueJobAsync( |
|
|
SparePartIssueRequest sparePartIssueRequest) |
|
|
SparePartIssueRequest SparePartIssueRequest) |
|
|
{ |
|
|
{ |
|
|
var sparePartIssueJobEditInputs = new List<SparePartIssueJobEditInput>(); |
|
|
var SparePartIssueJobEditInputs = new List<SparePartIssueJobEditInput>(); |
|
|
|
|
|
|
|
|
//已用的库存的集合
|
|
|
//已用的库存的集合
|
|
|
var useBalanceList = new List<BalanceDTO>(); |
|
|
var useBalanceList = new List<BalanceDTO>(); |
|
|
|
|
|
|
|
|
foreach (var groupbyItemCodeAndProdLine in sparePartIssueRequest.Details.GroupBy(p => |
|
|
foreach (var groupbyItemCodeAndProdLine in SparePartIssueRequest.Details.GroupBy(p => |
|
|
new { p.ItemCode })) |
|
|
new { p.ItemCode })) |
|
|
{ |
|
|
{ |
|
|
foreach (var sparePartIssueRequestDetail in groupbyItemCodeAndProdLine) |
|
|
foreach (var SparePartIssueRequestDetail in groupbyItemCodeAndProdLine) |
|
|
{ |
|
|
{ |
|
|
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync( |
|
|
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync( |
|
|
sparePartIssueRequestDetail.ProdLine, |
|
|
SparePartIssueRequestDetail.ProdLine, |
|
|
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false); |
|
|
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
if (productionLineItemDto == null) |
|
|
if (productionLineItemDto == null) |
|
|
{ |
|
|
{ |
|
|
throw new UserFriendlyException( |
|
|
throw new UserFriendlyException( |
|
|
$"未在生产线物品关系表中维护【{sparePartIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】"); |
|
|
$"未在生产线物品关系表中维护【{SparePartIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//原料
|
|
|
//原料
|
|
@ -519,7 +530,7 @@ public class SparePartIssueRequestEventHandler |
|
|
//获取可用库存
|
|
|
//获取可用库存
|
|
|
var input = new RecommendBalanceRequestInput |
|
|
var input = new RecommendBalanceRequestInput |
|
|
{ |
|
|
{ |
|
|
ItemCode = sparePartIssueRequestDetail.ItemCode, |
|
|
ItemCode = SparePartIssueRequestDetail.ItemCode, |
|
|
Qty = decimal.MaxValue, |
|
|
Qty = decimal.MaxValue, |
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
Locations = |
|
|
Locations = |
|
@ -530,14 +541,14 @@ public class SparePartIssueRequestEventHandler |
|
|
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false); |
|
|
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
//因为是按箱叫料 先把值赋值给箱数量上
|
|
|
//因为是按箱叫料 先把值赋值给箱数量上
|
|
|
sparePartIssueRequestDetail.BoxQty = sparePartIssueRequestDetail.Qty; |
|
|
SparePartIssueRequestDetail.BoxQty = SparePartIssueRequestDetail.Qty; |
|
|
|
|
|
|
|
|
if (usableList.Any()) |
|
|
if (usableList.Any()) |
|
|
{ |
|
|
{ |
|
|
//因为是原料所以按箱叫料
|
|
|
//因为是原料所以按箱叫料
|
|
|
sparePartIssueJobEditInputs.AddRange( |
|
|
SparePartIssueJobEditInputs.AddRange( |
|
|
await CreateSparePartIssueJobWithBoxQtyTypeAsync(sparePartIssueRequest, |
|
|
await CreateSparePartIssueJobWithBoxQtyTypeAsync(SparePartIssueRequest, |
|
|
new EditableList<SparePartIssueRequestDetail> { sparePartIssueRequestDetail }, |
|
|
new EditableList<SparePartIssueRequestDetail> { SparePartIssueRequestDetail }, |
|
|
sortByFifoAsync, |
|
|
sortByFifoAsync, |
|
|
useBalanceList).ConfigureAwait(false)); |
|
|
useBalanceList).ConfigureAwait(false)); |
|
|
} |
|
|
} |
|
@ -555,7 +566,7 @@ public class SparePartIssueRequestEventHandler |
|
|
var input = new RecommendBalanceRequestInput |
|
|
var input = new RecommendBalanceRequestInput |
|
|
{ |
|
|
{ |
|
|
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode, |
|
|
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode, |
|
|
Qty = sparePartIssueRequestDetail.Qty, |
|
|
Qty = SparePartIssueRequestDetail.Qty, |
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
Locations = |
|
|
Locations = |
|
|
JsonSerializer.Deserialize<List<string>>(productionLineItemDto |
|
|
JsonSerializer.Deserialize<List<string>>(productionLineItemDto |
|
@ -581,22 +592,23 @@ public class SparePartIssueRequestEventHandler |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
sparePartIssueJobEditInputs.AddRange( |
|
|
SparePartIssueJobEditInputs.AddRange( |
|
|
await CreateSparePartIssueJobWithQtyTypeAsync(sparePartIssueRequest, |
|
|
await CreateSparePartIssueJobWithQtyTypeAsync(SparePartIssueRequest, |
|
|
new List<SparePartIssueRequestDetail> { sparePartIssueRequestDetail }, temp, |
|
|
new List<SparePartIssueRequestDetail> { SparePartIssueRequestDetail }, temp, |
|
|
useBalanceList).ConfigureAwait(false)); |
|
|
useBalanceList).ConfigureAwait(false)); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (sparePartIssueJobEditInputs.Count > 0) //有库存 可以创建任务
|
|
|
if (SparePartIssueJobEditInputs.Count > 0) //有库存 可以创建任务
|
|
|
{ |
|
|
{ |
|
|
//新增任务
|
|
|
//新增任务
|
|
|
var addSparePartIssueJobDtos = await _sparePartIssueJobAppService.CreateManyAsync(sparePartIssueJobEditInputs) |
|
|
var addSparePartIssueJobDtos = await _SparePartIssueJobAppService |
|
|
|
|
|
.CreateManyAsync(SparePartIssueJobEditInputs) |
|
|
.ConfigureAwait(false); |
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
await UpdateSparePartIssueRequestDetailQtyAsync(sparePartIssueRequest, addSparePartIssueJobDtos) |
|
|
await UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest, addSparePartIssueJobDtos) |
|
|
.ConfigureAwait(false); |
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
return addSparePartIssueJobDtos; |
|
|
return addSparePartIssueJobDtos; |
|
@ -608,15 +620,15 @@ public class SparePartIssueRequestEventHandler |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 修改请求的 已发 已收数量
|
|
|
/// 修改请求的 已发 已收数量
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sparePartIssueRequest"></param>
|
|
|
/// <param name="SparePartIssueRequest"></param>
|
|
|
/// <param name="addSparePartIssueJobDtos"></param>
|
|
|
/// <param name="addSparePartIssueJobDtos"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
private async Task UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest sparePartIssueRequest, |
|
|
private async Task UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest SparePartIssueRequest, |
|
|
List<SparePartIssueJobDTO> addSparePartIssueJobDtos) |
|
|
List<SparePartIssueJobDTO> addSparePartIssueJobDtos) |
|
|
{ |
|
|
{ |
|
|
//原有任务
|
|
|
//原有任务
|
|
|
var existSparePartIssueJobDtos = await _sparePartIssueJobAppService |
|
|
var existSparePartIssueJobDtos = await _SparePartIssueJobAppService |
|
|
.GetByRequestNumberAsync(sparePartIssueRequest.Number) |
|
|
.GetByRequestNumberAsync(SparePartIssueRequest.Number) |
|
|
.ConfigureAwait(false); |
|
|
.ConfigureAwait(false); |
|
|
|
|
|
|
|
|
//新增的任务和已有的任务总和
|
|
|
//新增的任务和已有的任务总和
|
|
@ -624,7 +636,7 @@ public class SparePartIssueRequestEventHandler |
|
|
allSparePartIssueJobDtos.AddRange(addSparePartIssueJobDtos); |
|
|
allSparePartIssueJobDtos.AddRange(addSparePartIssueJobDtos); |
|
|
allSparePartIssueJobDtos.AddRange(existSparePartIssueJobDtos); |
|
|
allSparePartIssueJobDtos.AddRange(existSparePartIssueJobDtos); |
|
|
|
|
|
|
|
|
var groupByItemCodeLocationCode = sparePartIssueRequest.Details.GroupBy(p => |
|
|
var groupByItemCodeLocationCode = SparePartIssueRequest.Details.GroupBy(p => |
|
|
new { p.ItemCode, p.ToLocationCode }); |
|
|
new { p.ItemCode, p.ToLocationCode }); |
|
|
foreach (var group in groupByItemCodeLocationCode) |
|
|
foreach (var group in groupByItemCodeLocationCode) |
|
|
{ |
|
|
{ |
|
@ -650,6 +662,8 @@ public class SparePartIssueRequestEventHandler |
|
|
requestDetail.ReceivedQty = allReceivedQty; |
|
|
requestDetail.ReceivedQty = allReceivedQty; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
await SparePartIssueRequestManager.UpdateByEntityAsync(SparePartIssueRequest).ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|