|
@ -2,9 +2,11 @@ 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; |
|
|
using Volo.Abp.Domain.Entities; |
|
|
using Volo.Abp.Domain.Entities; |
|
|
using Volo.Abp.ObjectMapping; |
|
|
using Volo.Abp.ObjectMapping; |
|
|
using Win_in.Sfs.Shared.Domain.Shared; |
|
|
using Win_in.Sfs.Shared.Domain.Shared; |
|
|
|
|
|
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; |
|
|
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; |
|
@ -63,116 +65,60 @@ public class UnplannedReceiptJobAppService |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// 根据储位推荐
|
|
|
/// 根据储位任意退料
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
/// <returns></returns>
|
|
|
[HttpPost("create-by-recommend")] |
|
|
[HttpPost("create-by-free")] |
|
|
public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto) |
|
|
public async Task CreateByFreeAsync(UnplannedReceiptRequestDTO requestDto) |
|
|
{ |
|
|
{ |
|
|
List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>(); |
|
|
var jobs=await BuildUnplannedIssueJobAsync(requestDto).ConfigureAwait(false); |
|
|
var jobs=await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false); |
|
|
|
|
|
await _repository.InsertManyAsync(jobs).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) |
|
|
private async Task<List<UnplannedReceiptJob>> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto) |
|
|
{ |
|
|
{ |
|
|
List<UnplannedReceiptJob> jobs = new EditableList<UnplannedReceiptJob>(); |
|
|
List<UnplannedReceiptJob> jobs = new EditableList<UnplannedReceiptJob>(); |
|
|
|
|
|
|
|
|
foreach (var requestDtoDetail in requestDto.Details) |
|
|
foreach (var requestDtoDetail in requestDto.Details) |
|
|
{ |
|
|
{ |
|
|
var locationCodes=await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.ErpLocationCode)).ConfigureAwait(false); |
|
|
var locationDtos = await _locationAppService.GetListByErpLocationCodes(new List<string>{ requestDtoDetail.ErpLocationCode }).ConfigureAwait(false); |
|
|
var input = new RecommendBalanceRequestInput |
|
|
var job = new UnplannedReceiptJob(); |
|
|
{ |
|
|
|
|
|
ItemCode = requestDtoDetail.ItemCode, |
|
|
job.UnplannedReceiptRequestNumber = requestDto.Number; |
|
|
Qty = requestDtoDetail.Qty, |
|
|
job.JobType = EnumJobType.UnplannedReceiptJob; |
|
|
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, |
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
Locations = locationCodes.Select(p=>p.Code).ToList(), |
|
|
job.IsAutoComplete = false; |
|
|
IsPackingCode = false |
|
|
job.OANumber = requestDto.OANumber; |
|
|
}; |
|
|
job.Details = new List<UnplannedReceiptJobDetail>(); |
|
|
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); |
|
|
job.WarehouseCode = requestDtoDetail.WarehouseCode; |
|
|
usableList = usableList |
|
|
switch (locationDtos.First().Type) |
|
|
.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) |
|
|
case EnumLocationType.RAW: |
|
|
{ |
|
|
job.UnplannedReceiptType = EnumUnplannedReceiptType.Raw; |
|
|
|
|
|
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: |
|
|
|
|
|
job.UnplannedReceiptType = EnumUnplannedReceiptType.Wip; |
|
|
break; |
|
|
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 jobDetail = new UnplannedReceiptJobDetail(); |
|
|
{ |
|
|
jobDetail.CaseCode = requestDtoDetail.CaseCode; |
|
|
var locationDto=await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false); |
|
|
jobDetail.Explain = requestDtoDetail.Explain; |
|
|
var job = new UnplannedReceiptJob(); |
|
|
jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode; |
|
|
|
|
|
jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode; |
|
|
job.UnplannedReceiptRequestNumber = requestDto.Number; |
|
|
jobDetail.ReasonCode = requestDtoDetail.ReasonCode; |
|
|
job.JobType = EnumJobType.UnplannedReceiptJob; |
|
|
jobDetail.ItemCode = requestDtoDetail.ItemCode; |
|
|
job.JobStatus = EnumJobStatus.Open; |
|
|
jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1; |
|
|
job.IsAutoComplete = false; |
|
|
jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2; |
|
|
job.OANumber = requestDto.OANumber; |
|
|
jobDetail.ItemName = requestDtoDetail.ItemName; |
|
|
job.Details = new List<UnplannedReceiptJobDetail>(); |
|
|
job.Details.Add(jobDetail); |
|
|
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; |
|
|
return jobs; |
|
|