From 315dcbbe5f5a6904fdb8bacfb2ce5557abb3a7d3 Mon Sep 17 00:00:00 2001 From: Zheng Date: Sun, 6 Oct 2024 21:27:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E9=9D=9E=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E9=80=80=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DTOs/UnplannedReceiptRequestDetailDTO.cs | 7 +- .../UnplannedReceiptRequestDetailInput.cs | 6 + .../UnplannedReceiptRequestImportInput.cs | 13 +- .../UnplannedReceiptJobAppService.cs | 157 +++++++++++++++++- ...nnedReceiptRequestForDongyangAppService.cs | 6 +- .../UnplannedReceiptRequestDetail.cs | 6 + 6 files changed, 182 insertions(+), 13 deletions(-) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDetailDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDetailDTO.cs index d75165a6d..777dd9a17 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDetailDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDetailDTO.cs @@ -38,10 +38,15 @@ public class UnplannedReceiptRequestDetailDTO [Display(Name = "扩展属性")] public ExtraPropertyDictionary ExtraProperties { set; get; } - /// /// 说明 /// [Display(Name = "说明")] public string Explain { get; set; } + + /// + /// 储位 + /// + [Display(Name = "储位")] + public string ErpLocationCode { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestDetailInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestDetailInput.cs index 918144209..0838024e7 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestDetailInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestDetailInput.cs @@ -36,4 +36,10 @@ public class UnplannedReceiptRequestDetailInput : SfsStoreDetailWithLotPackingQt /// [Display(Name = "说明")] public string Explain { get; set; } + + /// + /// 储位 + /// + [Display(Name = "储位")] + public string ErpLocationCode { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestImportInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestImportInput.cs index f788faa16..bf86d2508 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestImportInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestImportInput.cs @@ -33,13 +33,6 @@ public class UnplannedReceiptRequestImportInput : SfsStoreImportInputBase [Display(Name = "单位")] public string Uom { get; set; } - /// - /// 调入库位 - /// - [Display(Name = "调入库位")] - [Required(ErrorMessage = "调出库位不能为空")] - public string LocationCode { get; set; } - /// /// 专案 /// @@ -87,4 +80,10 @@ public class UnplannedReceiptRequestImportInput : SfsStoreImportInputBase [Display(Name = "说明")] [Required(ErrorMessage = "说明不能为空")] public string Explain { get; set; } + + /// + /// 储位 + /// + [Display(Name = "储位")] + public string ErpLocationCode { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobAppService.cs index 7ef38657d..71b152d7b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobAppService.cs @@ -1,12 +1,26 @@ +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; 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.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; 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] [Route($"{StoreConsts.RootPath}unplanned-receipt-job")] @@ -16,11 +30,20 @@ public class UnplannedReceiptJobAppService { private readonly IUnplannedReceiptJobManager _unplannedReceiptJobManager; + private readonly ILocationAppService _locationAppService; + private readonly IBalanceAppService _balanceAppService; + private readonly IExpectOutAppService _expectOutAppService; + public UnplannedReceiptJobAppService( - IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager - ) : base(repository, UnplannedReceiptJobManager) + IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager, + ILocationAppService locationAppService, + IBalanceAppService balanceAppService, + IExpectOutAppService expectOutAppService) : base(repository, UnplannedReceiptJobManager) { _unplannedReceiptJobManager = UnplannedReceiptJobManager; + _locationAppService = locationAppService; + _balanceAppService = balanceAppService; + _expectOutAppService = expectOutAppService; } @@ -38,4 +61,134 @@ public class UnplannedReceiptJobAppService await _unplannedReceiptJobManager.CancelAsync(entity).ConfigureAwait(false); } } + + /// + /// 根据储位推荐 + /// + /// + [HttpPost("create-by-recommend")] + public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto) + { + List useBalancesOut = new EditableList(); + 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> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List useBalancesOut) + { + List jobs = new EditableList(); + + 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.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 useBalances = new List(); + 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(); + 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> BuildExpectOutAsync(List balanceDtos) + { + return ObjectMapper.Map, List>(balanceDtos); + } + + /// + /// 给立体库发送 + /// + /// + public async Task SendDimensionalStorehouseAsync() + { + throw new System.NotImplementedException(); + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs index 8c97bc9f6..a6f9205c6 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs @@ -293,11 +293,11 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ var balance = await BalanceAclService.GetByItemLocationAndPackingAsync( string.Empty, importInput.ItemCode, - importInput.LocationCode).ConfigureAwait(false); + importInput.ErpLocationCode).ConfigureAwait(false); if (balance == null) { - validationRresult.Add("库存余额", $"ERP料号{importInput.ItemCode}在库位{importInput.LocationCode}没有库存记录"); + validationRresult.Add("库存余额", $"ERP料号{importInput.ItemCode}在储位{importInput.ErpLocationCode}没有库存记录"); } else { @@ -347,7 +347,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ //await base.CheckImportInputBusinessAsync(importInput, importMethod); _ = await CheckItemBasicAsync(importInput, validationRresult).ConfigureAwait(false); - _ = await CheckLocationAsync(importInput.LocationCode, validationRresult).ConfigureAwait(false); + _ = await CheckLocationAsync(importInput.ErpLocationCode, validationRresult).ConfigureAwait(false); await CheckOnceBusiCodeAsync(importInput, validationRresult).ConfigureAwait(false);//次交易码 // await CheckCaseCodeAsync(importInput, validationRresult).ConfigureAwait(false);//专案代码 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestDetail.cs index b42d5d090..2b45ddbee 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestDetail.cs @@ -44,4 +44,10 @@ public class UnplannedReceiptRequestDetail : SfsStoreDetailWithLotPackingQtyLoca [Display(Name = "说明")] public string Explain { get; set; } + /// + /// 储位 + /// + [Display(Name = "储位")] + public string ErpLocationCode { get; set; } + }