|
|
@ -8,6 +8,7 @@ using Castle.Components.DictionaryAdapter; |
|
|
|
using Irony; |
|
|
|
using Microsoft.AspNetCore.Authorization; |
|
|
|
using Microsoft.AspNetCore.Mvc; |
|
|
|
using Microsoft.Extensions.Logging; |
|
|
|
using Omu.ValueInjecter; |
|
|
|
using Volo.Abp; |
|
|
|
using Volo.Abp.Data; |
|
|
@ -39,10 +40,11 @@ public class UnplannedIssueJobAppService |
|
|
|
private readonly IBalanceAppService _balanceAppService; |
|
|
|
private readonly IExpectOutAppService _expectOutAppService; |
|
|
|
private readonly IUnitOfWorkManager _unitOfWorkManager; |
|
|
|
private readonly ILogger<UnplannedIssueJobAppService> _logger; |
|
|
|
|
|
|
|
public UnplannedIssueJobAppService( |
|
|
|
IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService, |
|
|
|
IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService, IUnitOfWorkManager unitOfWorkManager |
|
|
|
IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService, IUnitOfWorkManager unitOfWorkManager, ILogger<UnplannedIssueJobAppService> logger |
|
|
|
) : base(repository, unplannedIssueJobManager ) |
|
|
|
{ |
|
|
|
_unplannedIssueJobManager = unplannedIssueJobManager; |
|
|
@ -50,6 +52,7 @@ public class UnplannedIssueJobAppService |
|
|
|
_balanceAppService = balanceAppService; |
|
|
|
_expectOutAppService = expectOutAppService; |
|
|
|
_unitOfWorkManager = unitOfWorkManager; |
|
|
|
_logger = logger; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -111,10 +114,11 @@ public class UnplannedIssueJobAppService |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private List<BalanceDTO> DeductInventory(List<BalanceDTO> inventory, decimal quantityToDeduct) |
|
|
|
private async Task<List<BalanceDTO>> DeductInventory(List<BalanceDTO> inventory, decimal quantityToDeduct) |
|
|
|
{ |
|
|
|
List<BalanceDTO> balanceDTOs = new List<BalanceDTO>(); |
|
|
|
decimal totalDeducted = 0; |
|
|
|
|
|
|
|
foreach (var item in inventory) |
|
|
|
{ |
|
|
|
decimal availableToDeduct = Math.Min(item.Qty, quantityToDeduct - totalDeducted); |
|
|
@ -122,10 +126,28 @@ public class UnplannedIssueJobAppService |
|
|
|
totalDeducted += availableToDeduct; |
|
|
|
if (availableToDeduct > 0) |
|
|
|
{ |
|
|
|
var locationDto = await _locationAppService.GetByCodeAsync(item.LocationCode).ConfigureAwait(false); |
|
|
|
BalanceDTO dto = new BalanceDTO(); |
|
|
|
switch (locationDto.Type) |
|
|
|
{ |
|
|
|
case EnumLocationType.RAW: |
|
|
|
dto.InjectFrom(item); |
|
|
|
dto.Qty = availableToDeduct; |
|
|
|
balanceDTOs.Add(dto); |
|
|
|
break; |
|
|
|
case EnumLocationType.FG: |
|
|
|
case EnumLocationType.DimensionalStorehouse: |
|
|
|
case EnumLocationType.CUST: |
|
|
|
case EnumLocationType.KittingWip: |
|
|
|
case EnumLocationType.OUTSIDE: |
|
|
|
case EnumLocationType.SEMI: |
|
|
|
case EnumLocationType.WIP: |
|
|
|
case EnumLocationType.THIRDPARTY: |
|
|
|
|
|
|
|
dto.InjectFrom(item); |
|
|
|
balanceDTOs.Add(dto); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
// 如果已经扣减达到所需数量,退出循环
|
|
|
|
if (totalDeducted >= quantityToDeduct) |
|
|
@ -143,6 +165,7 @@ public class UnplannedIssueJobAppService |
|
|
|
private async Task<List<UnplannedIssueJob>> BuildUnplannedIssueJobAsync(UnplannedIssueRequest requestDto, List<BalanceDTO> useBalancesOut) |
|
|
|
{ |
|
|
|
List<UnplannedIssueJob> jobs = new EditableList<UnplannedIssueJob>(); |
|
|
|
List<string> Errors= new List<string>(); |
|
|
|
|
|
|
|
foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细
|
|
|
|
{ |
|
|
@ -171,10 +194,12 @@ public class UnplannedIssueJobAppService |
|
|
|
decimal qty = 0; |
|
|
|
//实际要用库存
|
|
|
|
List<BalanceDTO> useBalances = new List<BalanceDTO>(); |
|
|
|
var returnlist=DeductInventory(usableList, requestDtoDetail.Qty); |
|
|
|
var returnlist=await DeductInventory(usableList, requestDtoDetail.Qty).ConfigureAwait(false); |
|
|
|
useBalances.AddRange(returnlist); |
|
|
|
useBalancesOut.AddRange(returnlist); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//foreach (var balanceDto in usableList)
|
|
|
|
//{
|
|
|
|
// decimal availableToDeduct = Math.Min(balanceDto.Qty, balanceDto.Qty - qty);
|
|
|
@ -202,7 +227,8 @@ public class UnplannedIssueJobAppService |
|
|
|
//}
|
|
|
|
if (returnlist.Count == 0) |
|
|
|
{ |
|
|
|
throw new UserFriendlyException("库存余额不够!"); |
|
|
|
Errors.Add($"{"非生产领料"+requestDto.Number+"零件号:"+requestDtoDetail.ItemCode + "库存不够" + requestDtoDetail.Qty.ToString()}"); |
|
|
|
|
|
|
|
} |
|
|
|
foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode)) |
|
|
|
{ |
|
|
@ -296,6 +322,13 @@ public class UnplannedIssueJobAppService |
|
|
|
jobs.Add(job); |
|
|
|
} |
|
|
|
} |
|
|
|
if (Errors.Count > 0) |
|
|
|
{ |
|
|
|
foreach (var itm in Errors) |
|
|
|
{ |
|
|
|
_logger.LogError(itm); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return jobs; |
|
|
|
} |
|
|
|