|
@ -1,12 +1,26 @@ |
|
|
|
|
|
using System.Collections.Generic; |
|
|
using System.Threading.Tasks; |
|
|
using System.Threading.Tasks; |
|
|
using Microsoft.AspNetCore.Authorization; |
|
|
using Microsoft.AspNetCore.Authorization; |
|
|
using Microsoft.AspNetCore.Mvc; |
|
|
using Microsoft.AspNetCore.Mvc; |
|
|
|
|
|
using Volo.Abp.Domain.Entities; |
|
|
|
|
|
using Volo.Abp.ObjectMapping; |
|
|
|
|
|
using Win_in.Sfs.Shared.Domain.Shared; |
|
|
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.Shared; |
|
|
using Win_in.Sfs.Wms.Store.Domain.Shared; |
|
|
|
|
|
|
|
|
namespace Win_in.Sfs.Wms.Store.Application; |
|
|
namespace Win_in.Sfs.Wms.Store.Application; |
|
|
|
|
|
|
|
|
|
|
|
using System.Linq; |
|
|
|
|
|
using System.Text.Json; |
|
|
|
|
|
|
|
|
|
|
|
using Castle.Components.DictionaryAdapter; |
|
|
|
|
|
|
|
|
|
|
|
using Irony; |
|
|
|
|
|
|
|
|
|
|
|
using Win_in.Sfs.Basedata.Application.Contracts; |
|
|
|
|
|
using Win_in.Sfs.Wms.Inventory.Application.Contracts; |
|
|
|
|
|
|
|
|
[Authorize] |
|
|
[Authorize] |
|
|
[Route($"{StoreConsts.RootPath}unplanned-receipt-job")] |
|
|
[Route($"{StoreConsts.RootPath}unplanned-receipt-job")] |
|
|
|
|
|
|
|
@ -16,11 +30,20 @@ public class UnplannedReceiptJobAppService |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
private readonly IUnplannedReceiptJobManager _unplannedReceiptJobManager; |
|
|
private readonly IUnplannedReceiptJobManager _unplannedReceiptJobManager; |
|
|
|
|
|
private readonly ILocationAppService _locationAppService; |
|
|
|
|
|
private readonly IBalanceAppService _balanceAppService; |
|
|
|
|
|
private readonly IExpectOutAppService _expectOutAppService; |
|
|
|
|
|
|
|
|
public UnplannedReceiptJobAppService( |
|
|
public UnplannedReceiptJobAppService( |
|
|
IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager |
|
|
IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager, |
|
|
) : base(repository, UnplannedReceiptJobManager) |
|
|
ILocationAppService locationAppService, |
|
|
|
|
|
IBalanceAppService balanceAppService, |
|
|
|
|
|
IExpectOutAppService expectOutAppService) : base(repository, UnplannedReceiptJobManager) |
|
|
{ |
|
|
{ |
|
|
_unplannedReceiptJobManager = UnplannedReceiptJobManager; |
|
|
_unplannedReceiptJobManager = UnplannedReceiptJobManager; |
|
|
|
|
|
_locationAppService = locationAppService; |
|
|
|
|
|
_balanceAppService = balanceAppService; |
|
|
|
|
|
_expectOutAppService = expectOutAppService; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -38,4 +61,134 @@ public class UnplannedReceiptJobAppService |
|
|
await _unplannedReceiptJobManager.CancelAsync(entity).ConfigureAwait(false); |
|
|
await _unplannedReceiptJobManager.CancelAsync(entity).ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 根据储位推荐
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpPost("create-by-recommend")] |
|
|
|
|
|
public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto) |
|
|
|
|
|
{ |
|
|
|
|
|
List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>(); |
|
|
|
|
|
var jobs=await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false); |
|
|
|
|
|
await _repository.InsertManyAsync(jobs).ConfigureAwait(false); |
|
|
|
|
|
var outEditInputs=await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false); |
|
|
|
|
|
await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private async Task<List<UnplannedReceiptJob>> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List<BalanceDTO> useBalancesOut) |
|
|
|
|
|
{ |
|
|
|
|
|
List<UnplannedReceiptJob> jobs = new EditableList<UnplannedReceiptJob>(); |
|
|
|
|
|
|
|
|
|
|
|
foreach (var requestDtoDetail in requestDto.Details) |
|
|
|
|
|
{ |
|
|
|
|
|
var locationCodes=await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.ErpLocationCode)).ConfigureAwait(false); |
|
|
|
|
|
var input = new RecommendBalanceRequestInput |
|
|
|
|
|
{ |
|
|
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
|
|
|
Qty = requestDtoDetail.Qty, |
|
|
|
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
|
|
|
Locations = locationCodes.Select(p=>p.Code).ToList(), |
|
|
|
|
|
IsPackingCode = false |
|
|
|
|
|
}; |
|
|
|
|
|
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); |
|
|
|
|
|
usableList = usableList |
|
|
|
|
|
.OrderBy(p => p.Lot) |
|
|
|
|
|
.ThenBy(p => p.PutInTime) |
|
|
|
|
|
.ThenBy(p => p.Qty) //2023-9-14 苑静雯 从小数开始发料
|
|
|
|
|
|
.ThenBy(p => p.LocationCode) |
|
|
|
|
|
.ThenBy(p => p.PackingCode) |
|
|
|
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
decimal qty = 0; |
|
|
|
|
|
//实际要用库存
|
|
|
|
|
|
List<BalanceDTO> useBalances = new List<BalanceDTO>(); |
|
|
|
|
|
foreach (var balanceDto in usableList) |
|
|
|
|
|
{ |
|
|
|
|
|
if (qty >= requestDtoDetail.Qty) |
|
|
|
|
|
{ |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (qty + balanceDto.Qty > requestDtoDetail.Qty) |
|
|
|
|
|
{ |
|
|
|
|
|
qty += requestDtoDetail.Qty - balanceDto.Qty; |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
qty += balanceDto.Qty; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
useBalances.Add(balanceDto); |
|
|
|
|
|
useBalancesOut.Add(balanceDto); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
foreach (var balanceDtoGroup in useBalances.GroupBy(p=>p.LocationCode)) |
|
|
|
|
|
{ |
|
|
|
|
|
var locationDto=await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false); |
|
|
|
|
|
var job = new UnplannedReceiptJob(); |
|
|
|
|
|
|
|
|
|
|
|
job.UnplannedReceiptRequestNumber = requestDto.Number; |
|
|
|
|
|
job.JobType = EnumJobType.UnplannedReceiptJob; |
|
|
|
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
|
|
|
job.IsAutoComplete = false; |
|
|
|
|
|
job.OANumber = requestDto.OANumber; |
|
|
|
|
|
job.Details = new List<UnplannedReceiptJobDetail>(); |
|
|
|
|
|
job.WarehouseCode = balanceDtoGroup.First().WarehouseCode; |
|
|
|
|
|
|
|
|
|
|
|
foreach (var balanceDto in balanceDtoGroup) |
|
|
|
|
|
{ |
|
|
|
|
|
var jobDetail = new UnplannedReceiptJobDetail(); |
|
|
|
|
|
jobDetail.CaseCode = requestDtoDetail.CaseCode; |
|
|
|
|
|
jobDetail.Explain = requestDtoDetail.Explain; |
|
|
|
|
|
jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode; |
|
|
|
|
|
jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode; |
|
|
|
|
|
jobDetail.ReasonCode = requestDtoDetail.ReasonCode; |
|
|
|
|
|
jobDetail.ItemCode = requestDtoDetail.ItemCode; |
|
|
|
|
|
jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1; |
|
|
|
|
|
jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2; |
|
|
|
|
|
jobDetail.ItemName = requestDtoDetail.ItemName; |
|
|
|
|
|
jobDetail.RecommendArriveDate = balanceDto.ArriveDate; |
|
|
|
|
|
jobDetail.RecommendContainerCode = string.Empty; |
|
|
|
|
|
jobDetail.RecommendExpireDate = balanceDto.ExpireDate; |
|
|
|
|
|
jobDetail.RecommendLot = balanceDto.Lot; |
|
|
|
|
|
jobDetail.RecommendPackingCode = balanceDto.PackingCode; |
|
|
|
|
|
jobDetail.RecommendProduceDate = balanceDto.ProduceDate; |
|
|
|
|
|
jobDetail.RecommendQty = balanceDto.Qty; |
|
|
|
|
|
jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; |
|
|
|
|
|
jobDetail.RecommendToLocationArea = balanceDto.LocationArea; |
|
|
|
|
|
jobDetail.RecommendToLocationCode = balanceDto.LocationCode; |
|
|
|
|
|
jobDetail.RecommendToLocationErpCode = balanceDto.LocationErpCode; |
|
|
|
|
|
jobDetail.RecommendToLocationGroup = balanceDto.LocationGroup; |
|
|
|
|
|
jobDetail.RecommendToWarehouseCode = balanceDto.WarehouseCode; |
|
|
|
|
|
|
|
|
|
|
|
job.Details.Add(jobDetail); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (locationDto.Type==EnumLocationType.DimensionalStorehouse)//如果是立库的
|
|
|
|
|
|
{ |
|
|
|
|
|
await SendDimensionalStorehouseAsync().ConfigureAwait(false); |
|
|
|
|
|
job.JobStatus = EnumJobStatus.Wait; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
jobs.Add(job); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return jobs; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private async Task<List<ExpectOutEditInput>> BuildExpectOutAsync(List<BalanceDTO> balanceDtos) |
|
|
|
|
|
{ |
|
|
|
|
|
return ObjectMapper.Map<List<BalanceDTO>, List<ExpectOutEditInput>>(balanceDtos); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 给立体库发送
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public async Task SendDimensionalStorehouseAsync() |
|
|
|
|
|
{ |
|
|
|
|
|
throw new System.NotImplementedException(); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|