From 780a98e20b137399cc274bc2cb333dcc60f2c8df Mon Sep 17 00:00:00 2001 From: lvzb <35200379@qq.com> Date: Wed, 10 Apr 2024 11:14:47 +0800 Subject: [PATCH 01/10] =?UTF-8?q?wms=E6=8E=A5=E5=8F=A3=E4=BC=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=B0=91=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OutgoingFromWmsWorker.cs | 14 ++++++++++++-- .../ExchangeDatas/IExchangeDataAppService.cs | 1 + .../ExchangeDatas/ExchangeDataAppService.cs | 14 ++++++++++++++ .../ExchangeDatas/ExchangeDataManager.cs | 12 ++++++------ 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs index 45d3575ef..123fee399 100644 --- a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs @@ -33,7 +33,7 @@ public class OutgoingFromWmsWorker : AsyncPeriodicBackgroundWorkerBase var outgoingFromWmsManager = workerContext.ServiceProvider.GetRequiredService(); //Do the work - var batchSize = _options.BatchSize; + var batchSize = 10; //List filters = new List(); //filters.Add( new Filter("Status", EnumExchangeDataStatus.Unread.ToString())); //var input = new SfsStoreRequestInputBase @@ -47,7 +47,17 @@ public class OutgoingFromWmsWorker : AsyncPeriodicBackgroundWorkerBase //var exchangeDataList = await exchangeDataAppService.GetAllListByFilterAsync(input).ConfigureAwait(false); var exchangeDataList = await exchangeDataAppService.GetToBeProcessedListAsync(batchSize).ConfigureAwait(false); var outgoingFromWmsList = objectMapper.Map, List>(exchangeDataList); - await outgoingFromWmsManager.CreateManyAsync(outgoingFromWmsList).ConfigureAwait(false); + + try + { + await outgoingFromWmsManager.CreateManyAsync(outgoingFromWmsList).ConfigureAwait(false); + await exchangeDataAppService.UpdateManyAsync(exchangeDataList).ConfigureAwait(false); + } + catch (System.Exception ex) + { + + throw ex; + } } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/ExchangeDatas/IExchangeDataAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/ExchangeDatas/IExchangeDataAppService.cs index 922964398..b0be81c89 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/ExchangeDatas/IExchangeDataAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/ExchangeDatas/IExchangeDataAppService.cs @@ -14,4 +14,5 @@ public interface IExchangeDataAppService Task> GetToBeProcessedListPostAsync(int batchSize); Task> GetToBeProcessedListOnlyReadAsync(int batchSize); Task> UpdateStatusByIdListAsync(List list); + Task> UpdateManyAsync(List dtos); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/ExchangeDatas/ExchangeDataAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/ExchangeDatas/ExchangeDataAppService.cs index 2f3f76b7a..499737da7 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/ExchangeDatas/ExchangeDataAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/ExchangeDatas/ExchangeDataAppService.cs @@ -142,4 +142,18 @@ public class ExchangeDataAppService var dtos = ObjectMapper.Map, List>(resultList); return dtos; } + + [HttpPost("update-many")] + public virtual async Task> UpdateManyAsync(List dtos) + { + var list = ObjectMapper.Map, List>(dtos); + list.ForEach(p => + { + p.Status = EnumExchangeDataStatus.Success; + p.ReadTime = Clock.Now; + p.Reader = "DataExchange.Agent"; + }); + await _repository.UpdateManyAsync(list).ConfigureAwait(false); + return dtos; + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/ExchangeDatas/ExchangeDataManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/ExchangeDatas/ExchangeDataManager.cs index d7bf10578..425a6b09e 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/ExchangeDatas/ExchangeDataManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/ExchangeDatas/ExchangeDataManager.cs @@ -43,14 +43,14 @@ public class ExchangeDataManager : DomainService, IExchangeDataManager .Take(batchSize) .ToListAsync().ConfigureAwait(false); - foreach (var entity in entities) - { + //foreach (var entity in entities) + //{ - entity.Status = EnumExchangeDataStatus.Success; - entity.ReadTime = Clock.Now; - entity.Reader = "DataExchange.Agent"; + // entity.Status = EnumExchangeDataStatus.Success; + // entity.ReadTime = Clock.Now; + // entity.Reader = "DataExchange.Agent"; - } + //} return entities; } From 82fb93cfe5535c24b211100c0cf6a803aa0e77c2 Mon Sep 17 00:00:00 2001 From: lvzb <35200379@qq.com> Date: Wed, 10 Apr 2024 11:15:35 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs index 123fee399..6c156c33b 100644 --- a/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs +++ b/be/DataExchange/src/Win_in.Sfs.Wms.DataExchange.Agent/OutgoingFromWmsWorker.cs @@ -33,7 +33,7 @@ public class OutgoingFromWmsWorker : AsyncPeriodicBackgroundWorkerBase var outgoingFromWmsManager = workerContext.ServiceProvider.GetRequiredService(); //Do the work - var batchSize = 10; + var batchSize = _options.BatchSize; //List filters = new List(); //filters.Add( new Filter("Status", EnumExchangeDataStatus.Unread.ToString())); //var input = new SfsStoreRequestInputBase From bd9941950e0e196a4ffd6e5d858ebcd9f3629a62 Mon Sep 17 00:00:00 2001 From: zhouhongjun <565221961@qq.com> Date: Wed, 10 Apr 2024 15:03:43 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E4=B8=89=E6=96=B9=E5=BA=93=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Enums/Inventory/EnumTransType.cs | 1 + .../DTOs/ThirdLocationJobDetailDTO.cs | 12 +++++++++--- .../Inputs/ThirdLocationJobDetailInput.cs | 14 +++++++++++--- .../DTOs/ThirdLocationRequestDTO.cs | 5 +++++ .../Inputs/ThirdLocationRequestDetailInput.cs | 7 +++++++ .../Inputs/ThirdLocationRequestImportInput.cs | 9 ++++++++- .../ThirdLocationRequestAppService.cs | 14 +++++--------- .../ThirdLocationJobs/ThirdLocationJobDetail.cs | 9 +++++++-- .../ThirdLocationNotes/ThirdLocationNoteDetail.cs | 2 +- .../ThirdLocationRequestDetail.cs | 7 +++++++ ...dLocationJobDbContextModelCreatingExtensions.cs | 3 ++- ...ationRequestDbContextModelCreatingExtensions.cs | 2 ++ .../ThirdLocationRequestAutoMapperProfile.cs | 7 ++++--- .../Requests/ThirdLocationRequestEventHandler.cs | 5 +++-- 14 files changed, 72 insertions(+), 25 deletions(-) diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransType.cs index 567d76ef7..7abb03119 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransType.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Inventory/EnumTransType.cs @@ -97,6 +97,7 @@ public enum EnumTransType [Display(Name = "新版库内转移")] TransferLib = 68, + /// /// 库间调拨 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/DTOs/ThirdLocationJobDetailDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/DTOs/ThirdLocationJobDetailDTO.cs index 509727793..ee8aff47d 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/DTOs/ThirdLocationJobDetailDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/DTOs/ThirdLocationJobDetailDTO.cs @@ -9,10 +9,16 @@ public class ThirdLocationJobDetailDTO : SfsJobRecommendFromDetailDTOBase, IHasT { /// - /// 请求库位 + /// 来源库位 /// - [Display(Name = "请求库位")] - public string RequestLocationCode { get; set; } + [Display(Name = "来源库位")] + public string FromLocationCode { get; set; } + + /// + /// 来源库区 + /// + [Display(Name = "来源库区")] + public string FromLocationArea { get; set; } /// /// 到库位 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/Inputs/ThirdLocationJobDetailInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/Inputs/ThirdLocationJobDetailInput.cs index c41ae9bff..d57e227fd 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/Inputs/ThirdLocationJobDetailInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ThirdLocationJobs/Inputs/ThirdLocationJobDetailInput.cs @@ -9,12 +9,20 @@ public class ThirdLocationJobDetailInput : SfsJobRecommendFromDetailInputBase, I { /// - /// 请求库位 + /// 来源库位 /// - [Display(Name = "请求库位")] + [Display(Name = "来源库位")] [Required(ErrorMessage = "{0}是必填项")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] - public string RequestLocationCode { get; set; } + public string FromLocationCode { get; set; } + + /// + /// 来源库区 + /// + [Display(Name = "来源库位")] + [Required(ErrorMessage = "{0}是必填项")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string FromLocationArea { get; set; } /// /// 到库位 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/DTOs/ThirdLocationRequestDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/DTOs/ThirdLocationRequestDTO.cs index b5b062fae..6d2ed2559 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/DTOs/ThirdLocationRequestDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/DTOs/ThirdLocationRequestDTO.cs @@ -37,4 +37,9 @@ public class ThirdLocationRequestDTO : SfsStoreRequestDTOBase [Display(Name = "目标ERP储位")] public string ToLocationErpCode { get; set; } + + /// + /// 来源库区 + /// + public string FromLocationArea { get; set; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestDetailInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestDetailInput.cs index 913c639c2..b6294d8cd 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestDetailInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestDetailInput.cs @@ -14,6 +14,13 @@ public class ThirdLocationRequestDetailInput : SfsStoreDetailWithQtyInputBase [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] public string ToLocationCode { get; set; } + /// + /// 来源库位 + /// + [Display(Name = "来源库位")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string FromLocationCode { get; set; } + /// /// 来源库区 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestImportInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestImportInput.cs index e4d261306..ab15491c1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestImportInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ThirdLocationRequests/Inputs/ThirdLocationRequestImportInput.cs @@ -31,10 +31,17 @@ public class ThirdLocationRequestImportInput : SfsStoreImportInputBase [Required] public string ToLocationCode { get; set; } + /// + /// 来源库位 + /// + [Display(Name = "来源库位")] + [Required] + public string FromLocationCode { get; set; } + /// /// 来源库区 /// - [Display(Name = "调出库区")] + [Display(Name = "来源库区")] [Required] public string FromLocationArea { get; set; } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ThirdLocationRequests/ThirdLocationRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ThirdLocationRequests/ThirdLocationRequestAppService.cs index 680938428..11983f745 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ThirdLocationRequests/ThirdLocationRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ThirdLocationRequests/ThirdLocationRequestAppService.cs @@ -86,7 +86,7 @@ public class ThirdLocationRequestAppService : SfsStoreRequestAppServiceBase - /// 请求库位 + /// 来源库位 /// - public string RequestLocationCode { get; set; } + public string FromLocationCode { get; set; } + + /// + /// 来源库区 + /// + public string FromLocationArea { get; set; } /// /// 到库位 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ThirdLocationNotes/ThirdLocationNoteDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ThirdLocationNotes/ThirdLocationNoteDetail.cs index c9b6a230e..46a632a09 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ThirdLocationNotes/ThirdLocationNoteDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ThirdLocationNotes/ThirdLocationNoteDetail.cs @@ -7,7 +7,7 @@ public class ThirdLocationNoteDetail : SfsStoreRecommendFromDetailWithFromToEnti { /// - /// 发料时间 + /// 发出时间 /// public DateTime IssueTime { get; set; } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ThirdLocationRequests/ThirdLocationRequestDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ThirdLocationRequests/ThirdLocationRequestDetail.cs index e2f3f79ec..c8e5b798b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ThirdLocationRequests/ThirdLocationRequestDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/ThirdLocationRequests/ThirdLocationRequestDetail.cs @@ -35,10 +35,17 @@ public class ThirdLocationRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasT /// public string ToWarehouseCode { get; set; } + /// + /// 来源库位 + /// + public string FromLocationCode { get; set; } + /// /// 来源库区 /// public string FromLocationArea { get; set; } + + // /// // /// 在途库库位 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ThirdLocationJobs/ThirdLocationJobDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ThirdLocationJobs/ThirdLocationJobDbContextModelCreatingExtensions.cs index 492ecff82..387906be4 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ThirdLocationJobs/ThirdLocationJobDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ThirdLocationJobs/ThirdLocationJobDbContextModelCreatingExtensions.cs @@ -48,7 +48,8 @@ public static class ThirdLocationJobDbContextModelCreatingExtensions b.Property(q => q.ToWarehouseCode).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToLocationArea).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToLocationGroup).HasMaxLength(SfsPropertyConst.CodeLength); - b.Property(q => q.RequestLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.FromLocationCode).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.FromLocationArea).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.WorkStation).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.Operation).HasMaxLength(SfsPropertyConst.CodeLength); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/ThirdLocationRequests/ThirdLocationRequestDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/ThirdLocationRequests/ThirdLocationRequestDbContextModelCreatingExtensions.cs index 8884bf84b..087829cc1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/ThirdLocationRequests/ThirdLocationRequestDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/ThirdLocationRequests/ThirdLocationRequestDbContextModelCreatingExtensions.cs @@ -46,6 +46,8 @@ public static class ThirdLocationRequestDbContextModelCreatingExtensions b.Property(q => q.ToWarehouseCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToLocationArea).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToLocationGroup).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.FromLocationCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.FromLocationArea).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ExpiredTime).IsRequired(); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.WorkStation).HasMaxLength(SfsPropertyConst.CodeLength); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ThirdLocationRequestAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ThirdLocationRequestAutoMapperProfile.cs index 46358c324..b336d5613 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ThirdLocationRequestAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/ThirdLocationRequestAutoMapperProfile.cs @@ -35,7 +35,7 @@ public partial class StoreEventAutoMapperProfile : Profile ; CreateMap() - .ForMember(x => x.RequestLocationCode, y => y.MapFrom(d => d.ToLocationCode)) + .ForMember(x => x.FromLocationCode, y => y.MapFrom(d => d.FromLocationCode)) .Ignore(x => x.RecommendFromLocationArea) .Ignore(x => x.RecommendFromLocationGroup) .Ignore(x => x.HandledFromLocationArea) @@ -99,7 +99,7 @@ public partial class StoreEventAutoMapperProfile : Profile .Ignore(x => x.ToLocationArea) .Ignore(x => x.ToLocationGroup) .Ignore(x => x.HandledFromWarehouseCode) - .Ignore(x => x.RequestLocationCode) + .Ignore(x => x.FromLocationCode) .Ignore(x => x.ToLocationCode) .Ignore(x => x.ProdLine) .Ignore(x => x.WorkStation) @@ -123,12 +123,13 @@ public partial class StoreEventAutoMapperProfile : Profile .Ignore(x => x.PlanBeginTime) .Ignore(x => x.PlannedSplitRule) .Ignore(x => x.DeliveryQty) - .Ignore(x => x.RequestLocationCode) + .Ignore(x => x.FromLocationCode) .Ignore(x => x.ToLocationCode) .Ignore(x => x.ProdLine) .Ignore(x => x.WorkStation) .Ignore(x => x.PositionCode) .Ignore(x => x.RecommendType) + .Ignore(x => x.FromLocationArea) .IgnoreIHasRecommendAndHandledFrom(); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ThirdLocationRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ThirdLocationRequestEventHandler.cs index dece75486..ca4800d8d 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ThirdLocationRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ThirdLocationRequestEventHandler.cs @@ -120,7 +120,7 @@ public class ThirdLocationRequestEventHandler { var jobs = new List(); - var transactionType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false);//库存事务 + var transactionType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.TransferLib, EnumTransSubType.Transfer_Warehouse).ConfigureAwait(false);//库存事务 var toLocationCodes = thirdLocationRequest.Details.Select(p => p.ToLocationCode).Distinct().ToList();//所有发送库位的集合 var toLocations = await _locationAppService.GetByCodesAsync(toLocationCodes).ConfigureAwait(false);//所有库位的集合 @@ -245,7 +245,7 @@ public class ThirdLocationRequestEventHandler //ProductionLineDTO prodLine = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationGroupCode).ConfigureAwait(false); var detail = ObjectMapper.Map(balance); - detail.RequestLocationCode = thirdLocationRequestDetail.ToLocationCode; + detail.FromLocationCode = thirdLocationRequestDetail.FromLocationCode; detail.WorkStation = thirdLocationRequestDetail.WorkStation; detail.ExpiredTime = thirdLocationRequestDetail.ExpiredTime; detail.PositionCode = thirdLocationRequestDetail.PositionCode; @@ -271,6 +271,7 @@ public class ThirdLocationRequestEventHandler detail.ToLocationErpCode = thirdLocationRequestDetail.ToLocationErpCode; detail.ToLocationArea = thirdLocationRequestDetail.ToLocationArea; detail.ToWarehouseCode = thirdLocationRequestDetail.ToWarehouseCode; + detail.FromLocationArea = thirdLocationRequestDetail.FromLocationArea; //detail.ProdLine = prodLine == null ? toLocationGroupCode : prodLine.Code; detail.ProdLine = toLocationGroupCode; From 81a1ade1fc08457b543ebf031f1f242ae19af437 Mon Sep 17 00:00:00 2001 From: lvzb <35200379@qq.com> Date: Wed, 10 Apr 2024 15:04:57 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E4=B8=8A=E6=9E=B6=E6=98=AF=E6=A0=A1=E9=AA=8C=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Locations/ILocationAppService.cs | 3 +- .../IPurchasePriceSheetAppService.cs | 1 + .../Locations/LocationAppService.cs | 8 ++++++ .../PurchasePriceSheetAppService.cs | 12 ++++++++ .../PutawayNotes/PutawayNoteAppService.cs | 13 +++++++-- .../PurchaseOrders/PurchaseOrderAppService.cs | 28 ++++++++++++++++++- 6 files changed, 60 insertions(+), 5 deletions(-) diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/ILocationAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/ILocationAppService.cs index a46e86f0a..fdfb1d4cf 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/ILocationAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Locations/ILocationAppService.cs @@ -31,6 +31,5 @@ public interface ILocationAppService Task> GetListByManyCodes(List codes); Task> GetListByTypesAndErpCodeAsync(List types, string erpCode); Task> GetListByTypesAndErpCodeAsync(List types, string erpCode,string locCode); - - + Task> GetListByErpLocationCodes(List ErpLocationCodes); } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PurchasePrices/IPurchasePriceSheetAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PurchasePrices/IPurchasePriceSheetAppService.cs index 6dd5ec48e..b4939e6cb 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PurchasePrices/IPurchasePriceSheetAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PurchasePrices/IPurchasePriceSheetAppService.cs @@ -5,6 +5,7 @@ namespace Win_in.Sfs.Basedata.Application.Contracts; public interface IPurchasePriceSheetAppService : ISfsBaseDataAppServiceBase { + Task CheckPurPriceAsync(string supplierCode, string itemCode); Task GetByItemCodeAsync(string itemCode,string supplierCode); Task UpsertAsyncByInterface(PurchasePriceSheetEditInput input); } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Locations/LocationAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Locations/LocationAppService.cs index 61e0db700..1ad9ec748 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Locations/LocationAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Locations/LocationAppService.cs @@ -202,7 +202,15 @@ public class LocationAppService return dtos; } + [HttpPost("get-list-by-erplocation-codes")] + public virtual async Task> GetListByErpLocationCodes(List ErpLocationCodes) + { + var entitys = await _repository.GetListAsync(p => ErpLocationCodes.Contains(p.ErpLocationCode)).ConfigureAwait(false); + + var dtos = ObjectMapper.Map, List>(entitys); + return dtos; + } [HttpGet("get-all")] //[Authorize(LocationPermissions.Default)] public virtual async Task> GetAllAsync() diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs index 8f75e08fe..2321d2a0c 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs @@ -41,4 +41,16 @@ public class PurchasePriceSheetAppService : SfsBaseDataAppServiceBase(input); await _repository.UpsertAsyncByInterface(entity).ConfigureAwait(false); } + /// + /// 判断是否有采购价格 + /// + /// + [HttpPost("check-purprice")] + public virtual async Task CheckPurPriceAsync( string supplierCode, string itemCode) + { + bool result = false; + var entitys = await _repository.GetListAsync(p => p.SupplierCode == supplierCode && p.ItemCode == itemCode && p.SupplierCode == supplierCode, true).ConfigureAwait(false); + if (entitys.Count != 0) result = true; + return result; + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs index 96813e3c8..ff411e10a 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs @@ -17,6 +17,7 @@ using Win_in.Sfs.Wms.Store.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Application; using System.Linq; +using Win_in.Sfs.Basedata.Application.Contracts; [Authorize] [Route($"{StoreConsts.RootPath}putaway-note")] @@ -29,18 +30,21 @@ public class PutawayNoteAppService : private readonly IPurchaseReceiptNoteAppService _purchaseReceiptNoteAppService; public readonly IInspectJobAppService _inspectJobAppService; public readonly IPurchaseOrderManager _purchaseOrderManager; + public readonly IPurchasePriceSheetAppService _purchasePriceSheetAppService; public PutawayNoteAppService( IPutawayNoteRepository repository, IPutawayNoteManager putawayNoteManager, IPurchaseReceiptNoteAppService purchaseReceiptNoteAppService, IInspectJobAppService inspectJobAppService, - IPurchaseOrderManager purchaseOrderManager) : base(repository) + IPurchaseOrderManager purchaseOrderManager, + IPurchasePriceSheetAppService purchasePriceSheetAppService ) : base(repository) { _putawayNoteManager = putawayNoteManager; _purchaseReceiptNoteAppService = purchaseReceiptNoteAppService; _inspectJobAppService = inspectJobAppService; _purchaseOrderManager = purchaseOrderManager; + _purchasePriceSheetAppService = purchasePriceSheetAppService; } /// @@ -59,7 +63,12 @@ public class PutawayNoteAppService : var isClosed = await _purchaseOrderManager.CheckIsCloseAsync(input.Number,input.SupplierCode, detail.ItemCode).ConfigureAwait(false); if (isClosed) { - throw new UserFriendlyException($"零件名称【{detail.ItemCode}】的订单明细行以关闭无法执行采购上价!"); + throw new UserFriendlyException($"零件名称【{detail.ItemCode}】的订单明细行以关闭无法执行采购上架!"); + } + var isprice = await _purchasePriceSheetAppService.CheckPurPriceAsync(input.SupplierCode, detail.ItemCode).ConfigureAwait(false); + if (isClosed) + { + throw new UserFriendlyException($"供应商【{input.SupplierCode}】零件名称【{detail.ItemCode}】无采购价格无法执行采购上架!"); } var purchasereDetail = await _purchaseReceiptNoteAppService .GetDetailByItemAndPackingAsync(detail.ItemCode, detail.ToPackingCode).ConfigureAwait(false); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs index a841c2f0f..47cfe36e0 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Orders/PurchaseOrders/PurchaseOrderAppService.cs @@ -28,17 +28,20 @@ public class PurchaseOrderAppService : private readonly IPurchaseOrderManager _purchaseOrderManager; private readonly ISupplierAppService _supplierAppService; private readonly IItemBasicAppService _itemBasicAppService; + private readonly ILocationAppService _locationAppService; public PurchaseOrderAppService( IPurchaseOrderRepository repository, IPurchaseOrderManager purchaseOrderManager, ISupplierAppService supplierAppService, - IItemBasicAppService itemBasicAppService) : base(repository) + IItemBasicAppService itemBasicAppService + , ILocationAppService locationAppService) : base(repository) { _repository = repository; _purchaseOrderManager = purchaseOrderManager; _supplierAppService = supplierAppService; _itemBasicAppService = itemBasicAppService; + _locationAppService = locationAppService; base.CreatePolicyName = PurchaseOrderPermissions.Create; base.UpdatePolicyName = PurchaseOrderPermissions.Update; base.DeletePolicyName = PurchaseOrderPermissions.Delete; @@ -56,6 +59,15 @@ public class PurchaseOrderAppService : { var ImportData = dictionary.Select(p => p.Key); + + #region 校验ERP库位是否存在 + var allTempErpLocationCode = ImportData.Select(p => p.Details.Select(p => p.LocationErpCode).ToList()).ToList(); + var allErpLocationCode = new List(); + allTempErpLocationCode.ForEach(p => { allErpLocationCode.AddRange(p); }); + var erpLocations = await CheckErpLocationCodeAsync(allErpLocationCode).ConfigureAwait(false); + + #endregion + var supplierDtos = new List(); #region 校验供应商 @@ -190,7 +202,21 @@ public class PurchaseOrderAppService : return result; } + private async Task> CheckErpLocationCodeAsync(List erpLocationCodes) + { + erpLocationCodes = erpLocationCodes.Distinct().ToList(); + var result = await _locationAppService.GetListByErpLocationCodes(erpLocationCodes).ConfigureAwait(false); + var resultcode = result.Select(r => r.ErpLocationCode).Distinct(); + foreach (var code in erpLocationCodes) + { + if (resultcode.All(p => p != code)) + { + throw new UserFriendlyException($"ERP储位代码【{code}】不存在"); + } + } + return result; + } #endregion From ad8511a27769143fbf9ebbca497cd01cf3943909 Mon Sep 17 00:00:00 2001 From: "boxu.zheng" Date: Wed, 10 Apr 2024 15:12:24 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=B3=A8=E5=A1=91?= =?UTF-8?q?=E5=8F=91=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IProductionLineItemAppService.cs | 3 + .../ProductionLineItemAppService.cs | 10 + .../Balances/IBalanceAppService.cs | 8 + .../Balances/BalanceAppService.cs | 312 +++++++++++------- .../Balances/BalanceManager.cs | 107 +++++- .../Balances/IBalanceManager.cs | 29 +- .../Enums/Store/EnumIssueType.cs | 4 +- .../Inputs/InjectionJobEditInput.cs | 1 + .../InjectionRequestManager.cs | 2 +- .../Requests/InjectionRequestEventHandler.cs | 170 +++++++++- be/WZC2.sln.DotSettings | 2 + 11 files changed, 501 insertions(+), 147 deletions(-) create mode 100644 be/WZC2.sln.DotSettings diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ProductLineItems/IProductionLineItemAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ProductLineItems/IProductionLineItemAppService.cs index 555544476..e0dfc4b08 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ProductLineItems/IProductionLineItemAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/ProductLineItems/IProductionLineItemAppService.cs @@ -13,4 +13,7 @@ public interface IProductionLineItemAppService { Task> GetByProductLineCodeAsync(string productLineCode); + + Task GetByProductLineCodeAndItemCodeAsync(string productLineCode, + string itemCode); } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ProductionLineItems/ProductionLineItemAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ProductionLineItems/ProductionLineItemAppService.cs index 5f6c35eab..88e1ba22e 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ProductionLineItems/ProductionLineItemAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/ProductionLineItems/ProductionLineItemAppService.cs @@ -17,6 +17,7 @@ public class ProductionLineItemAppService : ProductionLineItemEditInput, ProductionLineItemImportInput>, IProductionLineItemAppService { private new readonly IProductionLineItemRepository _repository; + public ProductionLineItemAppService( IProductionLineItemRepository repository , IDistributedCache cache @@ -53,4 +54,13 @@ public class ProductionLineItemAppService : var entityList = await _repository.GetListAsync(p => p.ProdLineCode == productLineCode).ConfigureAwait(false); return ObjectMapper.Map, List>(entityList); } + + [HttpPost("get-by-product-item")] + public virtual async Task GetByProductLineCodeAndItemCodeAsync(string productLineCode, + string itemCode) + { + var entityList = await _repository + .FindAsync(p => p.ProdLineCode == productLineCode && p.ItemCode == itemCode).ConfigureAwait(false); + return ObjectMapper.Map(entityList); + } } diff --git a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/IBalanceAppService.cs b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/IBalanceAppService.cs index 811bd981f..9be64b26d 100644 --- a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/IBalanceAppService.cs +++ b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/Balances/IBalanceAppService.cs @@ -166,4 +166,12 @@ public interface IBalanceAppService Task> GetListByErpLocationCodeAndItemCodeAsync(string erplocationCode, string itemCode); Task> GetRecommendBalancesByLocationsAsync(RecommendBalanceRequestInput input); Task> GetBalancePagedListByFilterAsync(SfsInventoryRequestInputBase sfsRequestInput, bool includeDetails = false, CancellationToken cancellationToken = default); + + /// + /// 获取可用库存列表 + /// + /// + /// + /// + Task> GetUsableListAsync(RecommendBalanceRequestInput input); } diff --git a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs index dc94a25de..a38fc1c14 100644 --- a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs +++ b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/Balances/BalanceAppService.cs @@ -1,16 +1,14 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Volo.Abp; using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Domain.Repositories; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts; @@ -21,12 +19,11 @@ using Win_in.Sfs.Wms.Inventory.Domain; using Win_in.Sfs.Wms.Inventory.Domain.Acl.ItemBasic; using Win_in.Sfs.Wms.Inventory.Domain.Acl.Location; using Win_in.Sfs.Wms.Inventory.Domain.Shared; -using JsonSerializer = System.Text.Json.JsonSerializer; namespace Win_in.Sfs.Wms.Inventory.Application; /// -/// 库存余额 +/// 库存余额 /// [Authorize] [Route($"{InventoryConsts.RootPath}inventory-balance")] @@ -58,13 +55,55 @@ public class BalanceAppService _locationAclService = locationAclService; _itemBasicAclService = itemBasicAclService; _itemBasicAppService = itemBasicAppService; - _stdCostPriceSheetAppService= stdCostPriceSheetAppService; + _stdCostPriceSheetAppService = stdCostPriceSheetAppService; } #region Update - + + /// + /// 库存余额更新物品基础信息 + /// + [HttpPost("update/item-basic-info")] + public async Task UpdateItemBasicInfoAsync(BalanceUpdateItemBasicInfoDto balanceUpdateItemBasicInfoDto) + { + //停用,可能用其他处理方案 + return; + // 物品编码 + var itemCodes = balanceUpdateItemBasicInfoDto.BalanceUpdateItemBasicInfos?.Select(c => c.ItemCode); + itemCodes = itemCodes?.Where(t => string.IsNullOrWhiteSpace(t) == false); + if (itemCodes == null || itemCodes.Any() == false) + { + return; + } + + // 获取库存余额 + var entitys = await _repository.GetListAsync(p => + itemCodes.Contains(p.ItemCode)).ConfigureAwait(false); + if (entitys.Count <= 0) + { + return; + } + + // 库存余额更新物品基础信息 + var entitysGroup = entitys.GroupBy(t => t.ItemCode); + + foreach (var entity in entitysGroup) + { + var balanceUpdateItemBasicInfo = + balanceUpdateItemBasicInfoDto.BalanceUpdateItemBasicInfos.FirstOrDefault(t => t.ItemCode == entity.Key); + foreach (var item in entity) + { + item.ItemName = balanceUpdateItemBasicInfo.ItemName ?? item.ItemName; + item.ItemDesc1 = balanceUpdateItemBasicInfo.ItemDesc1 ?? item.ItemDesc1; + item.ItemDesc2 = balanceUpdateItemBasicInfo.ItemDesc2 ?? item.ItemDesc2; + } + } + + await _repository.UpdateManyAsync(entitys).ConfigureAwait(false); + } + /// - /// 修改批次 + /// 修改批次 /// /// /// @@ -74,19 +113,22 @@ public class BalanceAppService /// /// [HttpPost("update/batch")] - public virtual async Task UpdateBatchAsync(Guid id, string lot, string supplierBatch, DateTime arriveDate, DateTime produceDate, DateTime expireDate) + public virtual async Task UpdateBatchAsync(Guid id, string lot, string supplierBatch, DateTime arriveDate, + DateTime produceDate, DateTime expireDate) { var entity = await _repository.FindAsync(id).ConfigureAwait(false); Check.NotNull(entity, EntityClassName); var worker = CurrentUser.GetUserName(); var jobNumber = ""; var docNumber = ""; - await _transferLogManager.ChangeBatchAsync(entity, lot, supplierBatch, arriveDate, produceDate, expireDate, worker, jobNumber, docNumber).ConfigureAwait(false); + await _transferLogManager + .ChangeBatchAsync(entity, lot, supplierBatch, arriveDate, produceDate, expireDate, worker, jobNumber, + docNumber).ConfigureAwait(false); await _repository.UpdateAsync(entity).ConfigureAwait(false); } /// - /// 修改序号 + /// 修改序号 /// /// /// @@ -101,7 +143,7 @@ public class BalanceAppService } /// - /// 修改库位 + /// 修改库位 /// /// /// @@ -109,7 +151,8 @@ public class BalanceAppService /// /// [HttpPost("update/location")] - public virtual async Task UpdateLocationAsync(Guid id, string warehouseCode, string locationCode, string containerCode) + public virtual async Task UpdateLocationAsync(Guid id, string warehouseCode, string locationCode, + string containerCode) { var entity = await _repository.FindAsync(id).ConfigureAwait(false); Check.NotNull(entity, EntityClassName); @@ -122,7 +165,7 @@ public class BalanceAppService } /// - /// 修改状态 + /// 修改状态 /// /// /// @@ -140,7 +183,7 @@ public class BalanceAppService } /// - /// 修改过期日期 + /// 修改过期日期 /// /// /// @@ -155,7 +198,7 @@ public class BalanceAppService } /// - /// 修改托盘标签 + /// 修改托盘标签 /// /// /// @@ -170,7 +213,7 @@ public class BalanceAppService } /// - /// 可用 + /// 可用 /// /// /// @@ -184,7 +227,7 @@ public class BalanceAppService } /// - /// 不可用 + /// 不可用 /// /// /// @@ -198,7 +241,7 @@ public class BalanceAppService } /// - /// 设置为不可用 根据 库位 零件 箱码 批次 状态 + /// 设置为不可用 根据 库位 零件 箱码 批次 状态 /// /// /// @@ -227,7 +270,7 @@ public class BalanceAppService } /// - /// 设置为可用 根据 库位 零件 箱码 批次 状态 + /// 设置为可用 根据 库位 零件 箱码 批次 状态 /// /// /// @@ -258,27 +301,30 @@ public class BalanceAppService #endregion Update #region Get + /// - /// 获取库存余额带标准价格得 + /// 获取库存余额带标准价格得 /// /// /// /// /// [HttpPost("get-list")] - public virtual async Task> GetBalancePagedListByFilterAsync(SfsInventoryRequestInputBase sfsRequestInput, bool includeDetails = false, - CancellationToken cancellationToken = default) + public virtual async Task> GetBalancePagedListByFilterAsync( + SfsInventoryRequestInputBase sfsRequestInput, bool includeDetails = false, + CancellationToken cancellationToken = default) { - var result =await base.GetPagedListByFilterAsync(sfsRequestInput, includeDetails, cancellationToken); + var result = await base.GetPagedListByFilterAsync(sfsRequestInput, includeDetails, cancellationToken); foreach (var item in result.Items) { var std = await _stdCostPriceSheetAppService.GetByItemCode(item.ItemCode).ConfigureAwait(false); item.StdCostPrice = std == null ? 0 : std.StdCostPrice; } + return result; } + /// - /// /// /// /// @@ -304,11 +350,11 @@ public class BalanceAppService dto.ItemDesc2 = item.Desc2; dto.Uom = item.BasicUom; } + return dtos; } /// - /// /// /// /// @@ -317,20 +363,23 @@ public class BalanceAppService /// [HttpGet("item-status")] [AllowAnonymous] - public virtual async Task GetByItemLocationAndPackingAsync(string packingCode, string itemCode, string locationCode) + public virtual async Task GetByItemLocationAndPackingAsync(string packingCode, string itemCode, + string locationCode) { var entity = await _repository.FirstOrDefaultAsync(c => - c.PackingCode == packingCode && c.ItemCode == itemCode && c.LocationCode == locationCode).ConfigureAwait(false); + c.PackingCode == packingCode && c.ItemCode == itemCode && c.LocationCode == locationCode) + .ConfigureAwait(false); if (entity == null) { throw new UserFriendlyException($"未找到箱码为 {packingCode},物料代码为 {itemCode},库位代码为 {locationCode} 的库存"); } + var dto = ObjectMapper.Map(entity); return dto; } /// - /// 获取对应的库存 + /// 获取对应的库存 /// /// /// @@ -339,14 +388,17 @@ public class BalanceAppService /// /// [HttpGet("item-loc-packing-status")] - public virtual async Task GetByItemLocationPackingAndStatusAsync(string packingCode, string itemCode, string locationCode, EnumInventoryStatus status) + public virtual async Task GetByItemLocationPackingAndStatusAsync(string packingCode, string itemCode, + string locationCode, EnumInventoryStatus status) { var entity = await _repository.FirstOrDefaultAsync(c => - c.PackingCode == packingCode && c.ItemCode == itemCode && c.LocationCode == locationCode && c.Status == status).ConfigureAwait(false); + c.PackingCode == packingCode && c.ItemCode == itemCode && c.LocationCode == locationCode && + c.Status == status).ConfigureAwait(false); if (entity == null) { throw new UserFriendlyException($"未找到箱码为 {packingCode},物料代码为 {itemCode},库位代码为 {locationCode} 的库存"); } + var dto = ObjectMapper.Map(entity); return dto; } @@ -407,14 +459,16 @@ public class BalanceAppService && p.Status == status).ConfigureAwait(false); if (entity == null) { - throw new UserFriendlyException($"未找到箱码为 {packingCode},物料代码为 {itemCode},库位代码为 {locationCode},状态为为 {status} 的库存"); + throw new UserFriendlyException( + $"未找到箱码为 {packingCode},物料代码为 {itemCode},库位代码为 {locationCode},状态为为 {status} 的库存"); } + var dto = ObjectMapper.Map(entity); return dto; } /// - /// 查找可用物品的库存(此物品库存状态为合格) + /// 查找可用物品的库存(此物品库存状态为合格) /// /// /// @@ -436,35 +490,39 @@ public class BalanceAppService } /// - /// 获取【库存】根据 库位代码 和 物品代码 + /// 获取【库存】根据 库位代码 和 物品代码 /// /// /// /// [HttpGet("list/by-location-and-item")] - public virtual async Task> GetListByLocationCodeAndItemCodeAsync(string locationCode, string itemCode) + public virtual async Task> GetListByLocationCodeAndItemCodeAsync(string locationCode, + string itemCode) { - var entitys = await _repository.GetListAsync(p => p.LocationCode == locationCode && p.ItemCode == itemCode).ConfigureAwait(false); + var entitys = await _repository.GetListAsync(p => p.LocationCode == locationCode && p.ItemCode == itemCode) + .ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(entitys); return dtos; } /// - /// 获取【库存】根据 库位代码 和 物品代码 + /// 获取【库存】根据 库位代码 和 物品代码 /// /// /// /// [HttpGet("list/by-erplocation-and-item")] - public virtual async Task> GetListByErpLocationCodeAndItemCodeAsync(string erplocationCode, string itemCode) + public virtual async Task> GetListByErpLocationCodeAndItemCodeAsync(string erplocationCode, + string itemCode) { - var entitys = await _repository.GetListAsync(p => p.LocationErpCode == erplocationCode && p.ItemCode == itemCode).ConfigureAwait(false); + var entitys = await _repository + .GetListAsync(p => p.LocationErpCode == erplocationCode && p.ItemCode == itemCode).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(entitys); return dtos; } /// - /// 根据发料任务需求,算出推荐的库存 (在获取时 已经添加预占用) + /// 根据发料任务需求,算出推荐的库存 (在获取时 已经去除了预占用) /// /// /// @@ -480,7 +538,9 @@ public class BalanceAppService var statuses = input.Statuses; Logger.LogDebug(traceId + "|Input:" + input); - var balances = await _balanceManager.GetRecommendBalancesAsync(traceId, itemCode, qty, locationTypes, locationAreas, statuses).ConfigureAwait(false); + var balances = await _balanceManager + .GetRecommendBalancesAsync(traceId, itemCode, qty, locationTypes, locationAreas, statuses) + .ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(balances); @@ -488,7 +548,7 @@ public class BalanceAppService } /// - /// 根据发料任务需求的库位,算出推荐的库存 (在获取时 已经添加预占用) + /// 根据发料任务需求的库位,算出推荐的库存 (在获取时 已经去除了预占用) /// /// /// @@ -506,21 +566,26 @@ public class BalanceAppService var locationDto = await _locationAclService.GetByCodeAsync(location).ConfigureAwait(false); if (locationDto != null) { - if(input.LocationAreas==null) + if (input.LocationAreas == null) { input.LocationAreas = new List(); } + input.LocationAreas.Add(locationDto.AreaCode); if (input.LocationTypes == null) { input.LocationTypes = new List(); } + input.LocationTypes.Add(locationDto.Type); } } + Logger.LogDebug(traceId + "|Input:" + input); - var balances = await _balanceManager.GetRecommendBalancesByLocationAsync(traceId, itemCode, qty, locations, statuses, input.IsPackingCode).ConfigureAwait(false); + var balances = await _balanceManager + .GetRecommendBalancesByLocationAsync(traceId, itemCode, qty, locations, statuses, input.IsPackingCode) + .ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(balances); @@ -528,7 +593,24 @@ public class BalanceAppService } /// - /// pda发料执行查询使用 + /// 获取可用库存列表 + /// + /// + /// + /// + [HttpGet("usable-list")] + public virtual async Task> GetUsableListAsync(RecommendBalanceRequestInput input) + { + var inventoryBalances = await _balanceManager + .GetUsableListAsync(input.ItemCode, input.Locations, input.Statuses, true).ConfigureAwait(false); + + var dtos = ObjectMapper.Map, List>(inventoryBalances); + + return dtos; + } + + /// + /// pda发料执行查询使用 /// /// /// @@ -539,7 +621,8 @@ public class BalanceAppService //可以领料 if (input.IsEnablePick != null) { - var locations = await _locationAclService.GetListByEnablePickAsync((bool)input.IsEnablePick).ConfigureAwait(false); + var locations = await _locationAclService.GetListByEnablePickAsync((bool)input.IsEnablePick) + .ConfigureAwait(false); var codes = JsonSerializer.Serialize(locations.Select(c => c.Code)); input.Condition.Filters.Add(new Filter("LocationCode", codes, "In")); } @@ -552,48 +635,51 @@ public class BalanceAppService input.Condition.Filters.Add(new Filter("LocationCode", codes, "In")); } - var dtos = await GetPagedListByFilterAsync(input, false).ConfigureAwait(false); + var dtos = await GetPagedListByFilterAsync(input).ConfigureAwait(false); return dtos; } /// - /// 查询库存余额 根据 状态集合 库位类别集合 物品代码 箱码 托码 批次 库位 + /// 查询库存余额 根据 状态集合 库位类别集合 物品代码 箱码 托码 批次 库位 /// /// /// [HttpPost("get-by-item-location-packing-container-lot-locationtype-status")] - public virtual async Task> GetListByManyParameter(BalanceManyParameterRequestInput balanceManyParameterRequestInput) + public virtual async Task> GetListByManyParameter( + BalanceManyParameterRequestInput balanceManyParameterRequestInput) { - var input = new SfsInventoryRequestInputBase() + var input = new SfsInventoryRequestInputBase { MaxResultCount = 1000, SkipCount = 0, Sorting = string.Empty, - Condition = new Condition() - { - Filters = new List() - } + Condition = new Condition { Filters = new List() } }; if (!string.IsNullOrWhiteSpace(balanceManyParameterRequestInput.ItemCode)) { input.Condition.Filters.Add(new Filter("ItemCode", balanceManyParameterRequestInput.ItemCode)); } + if (!string.IsNullOrWhiteSpace(balanceManyParameterRequestInput.LocationCode)) { input.Condition.Filters.Add(new Filter("LocationCode", balanceManyParameterRequestInput.LocationCode)); } + if (!string.IsNullOrWhiteSpace(balanceManyParameterRequestInput.PackingCode)) { input.Condition.Filters.Add(new Filter("PackingCode", balanceManyParameterRequestInput.PackingCode)); } + if (!string.IsNullOrWhiteSpace(balanceManyParameterRequestInput.ContainerCode)) { input.Condition.Filters.Add(new Filter("ContainerCode", balanceManyParameterRequestInput.ContainerCode)); } + if (!string.IsNullOrWhiteSpace(balanceManyParameterRequestInput.Lot)) { input.Condition.Filters.Add(new Filter("Lot", balanceManyParameterRequestInput.Lot)); } + //筛选库存状态 if (balanceManyParameterRequestInput.InventoryStatuses.Count > 0) { @@ -601,6 +687,7 @@ public class BalanceAppService balanceManyParameterRequestInput.InventoryStatuses); input.Condition.Filters.Add(new Filter("Status", Statuses, "In")); } + //筛选库位类型 if (balanceManyParameterRequestInput.LocationTypes.Count > 0) { @@ -617,91 +704,115 @@ public class BalanceAppService } /// - /// 查询库存余额 根据 物品 库位 库位类型 库存状态 批次 + /// 查询库存余额 根据 物品 库位 库位类型 库存状态 批次 /// /// /// [HttpPost("by-balances-request-many-parameter")] - public async Task> GetListByLocationTypeAndInventoryStatusAsync(BalanceListByIssueInputByInventoryStatusAndLocationType listInput) + public async Task> GetListByLocationTypeAndInventoryStatusAsync( + BalanceListByIssueInputByInventoryStatusAndLocationType listInput) { - var input = new SfsInventoryRequestInputBase() + var input = new SfsInventoryRequestInputBase { MaxResultCount = listInput.pageSize, SkipCount = (listInput.pageIndex - 1) * listInput.pageSize, Sorting = listInput.sortBy, - Condition = new Condition() - { - Filters = new List() - } + Condition = new Condition { Filters = new List() } }; if (!string.IsNullOrWhiteSpace(listInput.itemCode)) { input.Condition.Filters.Add(new Filter("ItemCode", listInput.itemCode)); } + if (!string.IsNullOrWhiteSpace(listInput.locationCode)) { input.Condition.Filters.Add(new Filter("LocationCode", listInput.locationCode)); } + if (!string.IsNullOrWhiteSpace(listInput.lot)) { input.Condition.Filters.Add(new Filter("Lot", listInput.lot)); } + if (!string.IsNullOrWhiteSpace(listInput.packingCode)) { input.Condition.Filters.Add(new Filter("PackingCode", listInput.packingCode)); } + if (!string.IsNullOrWhiteSpace(listInput.containerCode)) { input.Condition.Filters.Add(new Filter("ContainerCode", listInput.containerCode)); } + if (listInput.locationTypes != null && listInput.locationTypes.Any()) { - var locationCodes = (await _locationAclService.GetListByTypesAsync(listInput.locationTypes).ConfigureAwait(false)).Select(t => t.Code).ToList(); + var locationCodes = + (await _locationAclService.GetListByTypesAsync(listInput.locationTypes).ConfigureAwait(false)) + .Select(t => t.Code).ToList(); if (locationCodes.Any()) { input.Condition.Filters.Add(new Filter("LocationCode", JsonSerializer.Serialize(locationCodes), "In")); } } + if (listInput.inventoryStatuses != null && listInput.inventoryStatuses.Any()) { - input.Condition.Filters.Add(new Filter("Status", JsonSerializer.Serialize(listInput.inventoryStatuses), "In")); + input.Condition.Filters.Add(new Filter("Status", JsonSerializer.Serialize(listInput.inventoryStatuses), + "In")); } - var balanceDTOs = await GetPagedListByFilterAsync(input, false).ConfigureAwait(false); + + var balanceDTOs = await GetPagedListByFilterAsync(input).ConfigureAwait(false); return balanceDTOs; } /// - /// 获取 隔离库位 不合格 库存 + /// 获取 隔离库位 不合格 库存 /// /// /// /// /// [HttpPost("by-hold-location-code-and-no-ok")] - public async Task> GetByHoldLocationCodeAndNoOkAsync(SfsInventoryRequestInputBase sfsRequestDTO, bool includeDetails = false, + public async Task> GetByHoldLocationCodeAndNoOkAsync( + SfsInventoryRequestInputBase sfsRequestDTO, bool includeDetails = false, CancellationToken cancellationToken = default) { var locationInfo = await _locationAclService.GetFirstByTypeAsync(EnumLocationType.HOLD).ConfigureAwait(false); - sfsRequestDTO.Condition.Filters.Add(new Sfs.Shared.Domain.Filter() { Action = "==", Column = "LocationCode", Logic = EnumFilterLogic.And.ToString(), Value = locationInfo.Code }); - sfsRequestDTO.Condition.Filters.Add(new Sfs.Shared.Domain.Filter() { Action = "==", Column = "Status", Logic = EnumFilterLogic.And.ToString(), Value = ((int)EnumInventoryStatus.NOK).ToString(), }); + sfsRequestDTO.Condition.Filters.Add(new Filter + { + Action = "==", + Column = "LocationCode", + Logic = EnumFilterLogic.And.ToString(), + Value = locationInfo.Code + }); + sfsRequestDTO.Condition.Filters.Add(new Filter + { + Action = "==", + Column = "Status", + Logic = EnumFilterLogic.And.ToString(), + Value = ((int)EnumInventoryStatus.NOK).ToString() + }); - Expression> expression = sfsRequestDTO.Condition.Filters?.Count > 0 + var expression = sfsRequestDTO.Condition.Filters?.Count > 0 ? sfsRequestDTO.Condition.Filters.ToLambda() : p => true; - return await GetPagedListAsync(expression, sfsRequestDTO.SkipCount, sfsRequestDTO.MaxResultCount, sfsRequestDTO.Sorting, includeDetails, cancellationToken).ConfigureAwait(false); + return await GetPagedListAsync(expression, sfsRequestDTO.SkipCount, sfsRequestDTO.MaxResultCount, + sfsRequestDTO.Sorting, includeDetails, cancellationToken).ConfigureAwait(false); } /// - /// 获取 【实际库存余额】(不包含预计入,抛出预计出) + /// 获取 【实际库存余额】(不包含预计入,抛出预计出) /// /// [HttpPost("get-real-qty-by-packing-and-item-and-location-and-status")] - public async Task GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(string packingCode, string itemCode, string locationCode, EnumInventoryStatus status) + public async Task GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(string packingCode, + string itemCode, string locationCode, EnumInventoryStatus status) { var entity = await _repository.FirstOrDefaultAsync(c => - c.PackingCode == packingCode && c.ItemCode == itemCode && c.LocationCode == locationCode && c.Status == status).ConfigureAwait(false); + c.PackingCode == packingCode && c.ItemCode == itemCode && c.LocationCode == locationCode && + c.Status == status).ConfigureAwait(false); if (entity == null) { throw new UserFriendlyException($"未找到箱码为 {packingCode},物料代码为 {itemCode},库位代码为 {locationCode} 的库存"); @@ -714,7 +825,8 @@ public class BalanceAppService } [HttpGet("list-by-location-status")] - public async Task> GetListByLocationCodeAndStatusAsync(string locationCode, EnumInventoryStatus status) + public async Task> GetListByLocationCodeAndStatusAsync(string locationCode, + EnumInventoryStatus status) { var entities = await _repository.GetListAsync( c => c.LocationCode == locationCode && c.Status == status @@ -728,17 +840,18 @@ public class BalanceAppService #endregion Get #region export + /// - /// 导出数据 + /// 导出数据 /// [HttpPost("export")] public override async Task ExportAsync(SfsInventoryRequestInputBase input) { var expression = input.Condition.Filters?.Count > 0 - ? input.Condition.Filters.ToLambda() - : p => true; + ? input.Condition.Filters.ToLambda() + : p => true; var entities = await _repository.GetPagedListAsync(expression, input.SkipCount, input.MaxResultCount, - input.Sorting, true).ConfigureAwait(false); + input.Sorting, true).ConfigureAwait(false); var list = ObjectMapper.Map, List>(entities); //var hasDetails = typeof(TEntity) is SfsMasterAggregateRootBase detailEntity; @@ -760,47 +873,6 @@ public class BalanceAppService return ExportImportService.Export(list, detailsProptyName: hasDetails ? nameof(EmptyDetail) : null); } - #endregion - - /// - /// 库存余额更新物品基础信息 - /// - [HttpPost("update/item-basic-info")] - public async Task UpdateItemBasicInfoAsync(BalanceUpdateItemBasicInfoDto balanceUpdateItemBasicInfoDto) - { - //停用,可能用其他处理方案 - return; - // 物品编码 - var itemCodes = balanceUpdateItemBasicInfoDto.BalanceUpdateItemBasicInfos?.Select(c => c.ItemCode); - itemCodes = itemCodes?.Where(t => string.IsNullOrWhiteSpace(t) == false); - if (itemCodes == null || itemCodes.Any() == false) - { - return; - } - - // 获取库存余额 - var entitys = await _repository.GetListAsync(p => - itemCodes.Contains(p.ItemCode)).ConfigureAwait(false); - if (entitys.Count <= 0) - { - return; - } - - // 库存余额更新物品基础信息 - var entitysGroup = entitys.GroupBy(t => t.ItemCode); - - foreach (var entity in entitysGroup) - { - var balanceUpdateItemBasicInfo = balanceUpdateItemBasicInfoDto.BalanceUpdateItemBasicInfos.FirstOrDefault(t => t.ItemCode == entity.Key); - foreach (var item in entity) - { - item.ItemName = balanceUpdateItemBasicInfo.ItemName ?? item.ItemName; - item.ItemDesc1 = balanceUpdateItemBasicInfo.ItemDesc1 ?? item.ItemDesc1; - item.ItemDesc2 = balanceUpdateItemBasicInfo.ItemDesc2 ?? item.ItemDesc2; - } - } - - await _repository.UpdateManyAsync(entitys).ConfigureAwait(false); - } + #endregion } diff --git a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs index 9c69813e6..4ecd07b1e 100644 --- a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs +++ b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/BalanceManager.cs @@ -459,15 +459,13 @@ public class BalanceManager : DomainService, IBalanceManager #region GetRecommendList - /// /// 根据库位获取推荐库位 /// /// /// /// - /// - /// + /// /// /// /// @@ -770,6 +768,109 @@ public class BalanceManager : DomainService, IBalanceManager #endregion } + /// + /// 获取可用库存列表 + /// + /// + /// + /// + /// + /// + public virtual async Task> GetUsableListAsync(string itemCode, + List validLocations, + List validStatuses, bool isRemovePackingCode) + { + var recommendBalances = new List();//返回可使用的推荐库存余额 + + var item = await _itemBasicAclService.GetByCodeAsync(itemCode).ConfigureAwait(false); + if (item == null) //物品是否存在 + { + // throw new UserFriendlyException($"未找到代码为 {itemCode} 的物料记录"); + return recommendBalances; + } + + //构造查询条件 + Expression> expression = p => p.ItemCode == itemCode; + expression = expression.And(p => validStatuses.Contains(p.Status)); + expression = expression.And(p => p.IsActive); + + //如果物品的有效期不是无限的, 要过滤掉过期库存 + if (item.ValidityUnit != EnumValidityUnit.Infinite) + { + expression = expression.And(p => p.ExpireDate > DateTime.Now); + } + //排除无箱码库存 + if (isRemovePackingCode) + { + expression = expression.And(p => !string.IsNullOrEmpty(p.PackingCode)); + } + + var allBalances = await + (await _balanceRepository.GetDbSetAsync().ConfigureAwait(false)) + .Where(expression) + .AsNoTracking() + .ToListAsync().ConfigureAwait(false); + + var balanceLocationCodes = allBalances.Select(p => p.LocationCode).Distinct().ToList(); + var locations = await _locationAclService.GetByCodesAsync(balanceLocationCodes).ConfigureAwait(false); + //筛选有效库位类型 + if (validLocations.Any()) + { + locations = locations.Where(p => validLocations.Contains(p.Code)).ToList(); + } + var locationCodes = locations.Where(p => p.EnablePick).Select(p => p.Code).ToList(); + + if (!locationCodes.Any()) + { + return recommendBalances; + } + //获取物品存储关系 + var itemStoreRelationDict = await GetItemStoreRelationDictAsync(itemCode, locationCodes).ConfigureAwait(false); + //过滤掉无用的库位代码 + locationCodes = itemStoreRelationDict.Keys.ToList(); + locations = locations.Where(p => locationCodes.Contains(p.Code)).ToList(); + + var usableBalances = allBalances.Where(p => locationCodes.Contains(p.LocationCode)).ToList(); + + if (!usableBalances.Any()) + { + return recommendBalances; + } + + //读取该itemCode的预占用库存 + var expectOuts = await + (await _expectOutRepository.GetDbSetAsync().ConfigureAwait(false)) + .AsNoTracking() + .Where(p => p.ItemCode == itemCode + && locationCodes.Contains(p.LocationCode) + && validStatuses.Contains(p.Status)) + .ToListAsync().ConfigureAwait(false); + + var containerCodes = usableBalances + .Where(p => !string.IsNullOrEmpty(p.ContainerCode)) + .Select(p => p.ContainerCode) + .ToList(); + + var expectOutContainerCodes = await + (await _expectOutRepository.GetDbSetAsync().ConfigureAwait(false)) + .Where(p => containerCodes.Contains(p.ContainerCode)) + .GroupBy(p => p.ContainerCode) + .Select(d => d.Key) + .ToListAsync().ConfigureAwait(false); + + usableBalances + //扣减已占用库存 + .DecreaseExpectOutQty(expectOuts, locations) + //去除不可拆箱 拆托的且有预占用的库存余额 + .IgnoreExpectOutOfSameContainer(expectOutContainerCodes, itemStoreRelationDict, locations) + //过滤掉不允许拣料的库位 + .FilterLocationEnablePickAsync(locations) + //排序库存余额 最终可用的余额集合 + .SortByFifo(); + + return usableBalances; + } + private decimal GetRecommendQty(Guid traceId, decimal requestQty, decimal remainingQty, Balance usableBalance, LocationDTO location, ItemStoreRelationDTO itemStoreRelation) { var balanceQty = usableBalance.Qty; diff --git a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/IBalanceManager.cs b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/IBalanceManager.cs index 2b6f3d945..9f950b211 100644 --- a/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/IBalanceManager.cs +++ b/be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Domain/Balances/IBalanceManager.cs @@ -9,22 +9,23 @@ namespace Win_in.Sfs.Wms.Inventory.Domain; public interface IBalanceManager : IDomainService { - /// - /// 入库 + /// 入库 /// /// /// Task InboundAsync(Transaction transaction, ItemBasicDTO item, LocationDTO location); + /// - /// 出库 + /// 出库 /// /// /// Task OutboundAsync(Transaction transaction, ItemBasicDTO item, LocationDTO location); Task> GetRecommendBalancesAsync(Guid traceId, string itemCode, decimal requestQty, - List validLocationTypes, List validLocationAreas, List validStatuses); + List validLocationTypes, List validLocationAreas, + List validStatuses); Task> GetListByLocationAsync(string locationCode); @@ -32,6 +33,22 @@ public interface IBalanceManager : IDomainService Task> GetListByItemAndLocationAsync(string itemCode, string locationCode); Task> GetItemCodesOfLocationAsync(string locationCode); Task ModifyAsync(Balance balance); - Task> GetListByLocationTypeAndInventoryStatusAsync(string itemCode, EnumInventoryStatus enumInventoryStatus, List enumLocationTypes); - Task> GetRecommendBalancesByLocationAsync(Guid traceId, string itemCode, decimal requestQty, List validLocations, List validStatuses,bool ispackingcode); + + Task> GetListByLocationTypeAndInventoryStatusAsync(string itemCode, + EnumInventoryStatus enumInventoryStatus, List enumLocationTypes); + + Task> GetRecommendBalancesByLocationAsync(Guid traceId, string itemCode, decimal requestQty, + List validLocations, List validStatuses, bool ispackingcode); + + /// + /// 获取可用库存列表 + /// + /// + /// + /// + /// + /// + Task> GetUsableListAsync(string itemCode, + List validLocations, + List validStatuses, bool isRemovePackingCode); } diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumIssueType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumIssueType.cs index 789606257..42dcf1439 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumIssueType.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumIssueType.cs @@ -12,10 +12,10 @@ public enum EnumIssueType /// /// 按箱 叫料 /// - Box=1, + BoxQty=1, /// /// 按数量 叫料 /// - Num=2, + Qty=2, } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/Inputs/InjectionJobEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/Inputs/InjectionJobEditInput.cs index 16d83428c..e106e1ae3 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/Inputs/InjectionJobEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/Inputs/InjectionJobEditInput.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; namespace Win_in.Sfs.Wms.Store.Application.Contracts; diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs index b0cfd94b5..014b4d81a 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs @@ -42,7 +42,7 @@ public class InjectionRequestManager entity.Submit(); entity.Agree(); entity.RequestStatus = EnumRequestStatus.Partial; - await LocalEventBus.PublishAsync(new SfsHandledEntityEventData(entity), false) + await LocalEventBus.PublishAsync(new SfsHandledEntityEventData(entity),false) .ConfigureAwait(false); await _repository.InsertAsync(entity).ConfigureAwait(false); return entity; diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs index 81a259e7a..d8263b67c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs @@ -76,11 +76,11 @@ public class InjectionRequestEventHandler switch (entity.Type) { - case nameof(EnumIssueType.Box): - + case nameof(EnumIssueType.BoxQty): + injectionJobs =await CreateInjectionJobWithBoxQtyTypeAsync(entity).ConfigureAwait(false); break; - case nameof(EnumIssueType.Num): - injectionJobs = await CreateInjectionJobWithBoxTypeAsync(entity).ConfigureAwait(false); + case nameof(EnumIssueType.Qty): + injectionJobs = await CreateInjectionJobWithQtyTypeAsync(entity).ConfigureAwait(false); break; } @@ -123,14 +123,11 @@ public class InjectionRequestEventHandler /// /// /// - private async Task> CreateInjectionJobWithBoxTypeAsync + private async Task> CreateInjectionJobWithQtyTypeAsync (InjectionRequest injectionRequest) { var jobs = new List(); - var transactionType = await TransactionTypeAclService - .GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false); //库存事务 - var toLocationCodes = injectionRequest.Details.Select(p => p.ToLocationCode).Distinct().ToList(); //所有发送库位的集合 var toLocations = await _locationAppService.GetByCodesAsync(toLocationCodes).ConfigureAwait(false); //所有库位的集合 @@ -143,7 +140,7 @@ public class InjectionRequestEventHandler //创建详情 var jobDetails = - await CreateInjectionJobDetailInputsWithBoxTypeAsync(injectionRequest, injectionRequestDetail, + await CreateInjectionJobDetailInputsWithQtyTypeAsync(injectionRequest, injectionRequestDetail, toLocation.LocationGroupCode).ConfigureAwait(false); if (!jobDetails.Any()) { @@ -155,7 +152,7 @@ public class InjectionRequestEventHandler var job = jobs.FirstOrDefault(p => p.WorkGroupCode == fromLocation?.WorkGroupCode); if (job == null || job.Details.Any(p => p.ToLocationCode != injectionRequestDetail.ToLocationCode)) { - job = await BuildInjectionJobCreateInputWithBoxTypeAsync(injectionRequest, fromLocation).ConfigureAwait(false); + job = await BuildInjectionJobCreateInputWithQtyTypeAsync(injectionRequest, fromLocation).ConfigureAwait(false); jobs.Add(job); } @@ -204,7 +201,7 @@ public class InjectionRequestEventHandler /// /// /// - private async Task BuildInjectionJobCreateInputWithBoxTypeAsync(InjectionRequest injectionRequest, + private async Task BuildInjectionJobCreateInputWithQtyTypeAsync(InjectionRequest injectionRequest, LocationDTO fromLocation) { InjectionJobEditInput job; @@ -235,7 +232,7 @@ public class InjectionRequestEventHandler /// /// /// - private async Task> CreateInjectionJobDetailInputsWithBoxTypeAsync( + private async Task> CreateInjectionJobDetailInputsWithQtyTypeAsync( InjectionRequest injectionRequest, InjectionRequestDetail injectionRequestDetail, string toLocationGroupCode) { @@ -269,7 +266,7 @@ public class InjectionRequestEventHandler foreach (var recommend in recommendList) { //拿走需求量 - var detail = await BuildInjectionJobDetailWithBoxTypeAsync(injectionRequestDetail, recommend, toLocationGroupCode) + var detail = await BuildInjectionJobDetailWithQtyTypeAsync(injectionRequestDetail, recommend, toLocationGroupCode) .ConfigureAwait(false); if (injectionRequest.UseOnTheWayLocation) { @@ -297,7 +294,7 @@ public class InjectionRequestEventHandler /// /// /// - private async Task BuildInjectionJobDetailWithBoxTypeAsync( + private async Task BuildInjectionJobDetailWithQtyTypeAsync( InjectionRequestDetail injectionRequestDetail, BalanceDTO balance, string toLocationGroupCode) { //ProductionLineDTO prodLine = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationGroupCode).ConfigureAwait(false); @@ -340,7 +337,150 @@ public class InjectionRequestEventHandler #region 按箱叫料 - + /// + /// 创建注塑任务 + /// + /// + /// + /// + private async Task> CreateInjectionJobWithBoxQtyTypeAsync + (InjectionRequest injectionRequest) + { + var inputJobs = new List(); + //已用的库存的箱码集合 + var useBalanceList = new List(); + + var groupByItemCodeAndLocationCode = + injectionRequest.Details.GroupBy(p => new { p.ItemCode, p.ToLocationCode }); + + foreach (var locationCodeItemCodeGroup in groupByItemCodeAndLocationCode) + { + var inputDetails = injectionRequest.Details.Where(p => + p.ItemCode == locationCodeItemCodeGroup.Key.ItemCode && + p.ToLocationCode == locationCodeItemCodeGroup.Key.ToLocationCode); + var inputDetailTemplate = inputDetails.First(); + //获取请求下 这个零件和这个库位一个需要多少箱 + var sumBoxQty = inputDetails.Sum(p => p.BoxQty); + //获取生产线 + var productionLineDto = await _productionLineAppService + .GetByLocationCodeAsync(inputDetails.First().ToLocationCode).ConfigureAwait(false); + if (productionLineDto == null) + { + throw new UserFriendlyException($"库位【{inputDetailTemplate.ToLocationCode}】没有对应的【生产线】"); + } + + var productLineCodeAndItemCode = (await _productionLineItemAppService + .GetByProductLineCodeAndItemCodeAsync(productionLineDto.Code, inputDetailTemplate.ItemCode) + .ConfigureAwait(false)); + if (productLineCodeAndItemCode == null) + { + throw new UserFriendlyException( + $"物品代码【{inputDetailTemplate.ItemCode}】在生产线【{productionLineDto.Code}】中没有对应的【生产线物品关系】"); + } + + //获取可用库存 + var input = new RecommendBalanceRequestInput + { + ItemCode = locationCodeItemCodeGroup.Key.ItemCode, + Qty = decimal.MaxValue, + Statuses = new EditableList { EnumInventoryStatus.OK }, + Locations = JsonSerializer.Deserialize>(productLineCodeAndItemCode + .RawLocationCodeListJson) + }; + + //所有可用库存 + var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); + usableList=usableList.Where(p => !useBalanceList.Contains(p.PackingCode)).ToList(); + var firstUsable = usableList.First(); + useBalanceList.Add(firstUsable.PackingCode); + usableList.Remove(firstUsable); + + for (int i = 0; i < sumBoxQty; i++) + { + var injectionJobEditInput = + await BuildInjectionJobCreateInputWithBoxQtyTypeAsync(injectionRequest, inputDetailTemplate, + firstUsable) + .ConfigureAwait(false); + + inputJobs.Add(injectionJobEditInput); + } + } + + return inputJobs; + } + + /// + /// 构造注塑任务 + /// + /// + /// + /// + /// + private async Task BuildInjectionJobCreateInputWithBoxQtyTypeAsync(InjectionRequest injectionRequest, + InjectionRequestDetail injectionRequestDetail,BalanceDTO balanceDtos) + { + InjectionJobEditInput job; + job = ObjectMapper.Map(injectionRequest); + job.JobType = EnumJobType.IssueJob; + job.JobStatus = EnumJobStatus.Open; + job.WorkGroupCode = injectionRequestDetail.ToLocationGroup; + job.WarehouseCode = injectionRequestDetail.ToWarehouseCode; + job.ProdLine = injectionRequestDetail.ProdLine; + job.Worker = injectionRequest.Worker; + job.InjectionRequestNumber = injectionRequest.Number; + + job.Details.Add(await BuildInjectionJobDetailWithBoxQtyTypeAsync(injectionRequestDetail, balanceDtos).ConfigureAwait(false)); + + await Task.CompletedTask.ConfigureAwait(false); + + return job; + } + + /// + /// 构造注塑任务明细 + /// + /// + /// + /// + /// + private async Task BuildInjectionJobDetailWithBoxQtyTypeAsync( + InjectionRequestDetail injectionRequestDetail, BalanceDTO balance) + { + //ProductionLineDTO prodLine = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationGroupCode).ConfigureAwait(false); + + var detail = ObjectMapper.Map(balance); + detail.RequestLocationCode = injectionRequestDetail.ToLocationCode; + detail.WorkStation = injectionRequestDetail.WorkStation; + detail.ExpiredTime = injectionRequestDetail.ExpiredTime; + detail.PositionCode = injectionRequestDetail.PositionCode; + detail.RecommendType = injectionRequestDetail.RecommendType; + + detail.RecommendPackingCode = balance.PackingCode; + detail.RecommendContainerCode = balance.ContainerCode; + detail.RecommendSupplierBatch = balance.SupplierBatch; + detail.RecommendProduceDate = balance.ProduceDate; + detail.RecommendExpireDate = balance.ExpireDate; + detail.RecommendLot = balance.Lot; + detail.RecommendProduceDate = balance.ProduceDate; + detail.RecommendArriveDate = balance.ArriveDate; + detail.RecommendFromLocationArea = balance.LocationArea; + detail.RecommendFromLocationCode = balance.LocationCode; + detail.RecommendFromLocationErpCode = balance.LocationErpCode; + detail.RecommendFromLocationGroup = balance.LocationGroup; + detail.RecommendFromWarehouseCode = balance.WarehouseCode; + detail.RecommendQty = balance.Qty; + detail.Uom = balance.Uom; + + detail.ToLocationCode = injectionRequestDetail.ToLocationCode; + detail.ToLocationErpCode = injectionRequestDetail.ToLocationErpCode; + detail.ToLocationArea = injectionRequestDetail.ToLocationArea; + detail.ToWarehouseCode = injectionRequestDetail.ToWarehouseCode; + + //detail.ProdLine = prodLine == null ? toLocationGroupCode : prodLine.Code; + detail.ProdLine = injectionRequestDetail.ToLocationCode; + await Task.CompletedTask.ConfigureAwait(false); + return detail; + } #endregion diff --git a/be/WZC2.sln.DotSettings b/be/WZC2.sln.DotSettings new file mode 100644 index 000000000..3d8771c93 --- /dev/null +++ b/be/WZC2.sln.DotSettings @@ -0,0 +1,2 @@ + + False \ No newline at end of file From dcd61730f68eb508a1210705e264f38ed522cc6b Mon Sep 17 00:00:00 2001 From: lvzb <35200379@qq.com> Date: Wed, 10 Apr 2024 15:21:56 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PurchasePrices/PurchasePriceSheetAppService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs index 2321d2a0c..faf9e93ba 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PurchasePrices/PurchasePriceSheetAppService.cs @@ -49,8 +49,8 @@ public class PurchasePriceSheetAppService : SfsBaseDataAppServiceBase CheckPurPriceAsync( string supplierCode, string itemCode) { bool result = false; - var entitys = await _repository.GetListAsync(p => p.SupplierCode == supplierCode && p.ItemCode == itemCode && p.SupplierCode == supplierCode, true).ConfigureAwait(false); - if (entitys.Count != 0) result = true; + var entitys = await _repository.GetListAsync(p => p.SupplierCode == supplierCode && p.ItemCode == itemCode).ConfigureAwait(false); + if (entitys.Count == 0) result = true; return result; } } From da7b9438bc850ed85d475bce947a257c1972bd74 Mon Sep 17 00:00:00 2001 From: lvzb <35200379@qq.com> Date: Wed, 10 Apr 2024 15:48:33 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Notes/PutawayNotes/PutawayNoteAppService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs index ff411e10a..951f8ef85 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/PutawayNotes/PutawayNoteAppService.cs @@ -66,7 +66,7 @@ public class PutawayNoteAppService : throw new UserFriendlyException($"零件名称【{detail.ItemCode}】的订单明细行以关闭无法执行采购上架!"); } var isprice = await _purchasePriceSheetAppService.CheckPurPriceAsync(input.SupplierCode, detail.ItemCode).ConfigureAwait(false); - if (isClosed) + if (isprice) { throw new UserFriendlyException($"供应商【{input.SupplierCode}】零件名称【{detail.ItemCode}】无采购价格无法执行采购上架!"); } From d0665180c7990f7aca5c48cde91a7e15f81e19fb Mon Sep 17 00:00:00 2001 From: "boxu.zheng" Date: Thu, 11 Apr 2024 08:46:14 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=B3=A8=E5=A1=91?= =?UTF-8?q?=E5=8F=91=E6=96=99=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Enums/Job/EnumJobStatus.cs | 8 +- .../InjectionJobs/DTOs/InjectionJobDTO.cs | 1 - .../InjectionJobs/IInjectionJobAppService.cs | 3 +- .../InjectionJobs/InjectionJobAppService.cs | 12 +- .../InjectionRequestManager.cs | 2 +- .../Jobs/InjectionJobEventHandler.cs | 175 ++++++++++++++---- .../Requests/InjectionRequestEventHandler.cs | 50 ++--- .../settings/appsettings.Development.json | 4 +- 8 files changed, 183 insertions(+), 72 deletions(-) diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs index a2de366d0..619e84684 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs @@ -45,5 +45,11 @@ public enum EnumJobStatus /// 作废 /// [Display(Name = "作废")] - Cancelled = 9 + Cancelled = 9, + + /// + /// 等待 + /// + [Display(Name = "等待")] + Wait=30, } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/DTOs/InjectionJobDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/DTOs/InjectionJobDTO.cs index bde149b68..3851df4e1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/DTOs/InjectionJobDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/DTOs/InjectionJobDTO.cs @@ -42,5 +42,4 @@ public class InjectionJobDTO : SfsJobDTOBase /// [Display(Name = "使用在途库")] public bool UseOnTheWayLocation { get; set; } - } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/IInjectionJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/IInjectionJobAppService.cs index a238cf57b..a5681c7ac 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/IInjectionJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/InjectionJobs/IInjectionJobAppService.cs @@ -8,7 +8,7 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts; public interface IInjectionJobAppService : ISfsJobAppServiceBase { - Task> CheckJobExistByItemCodeAndLocationCode(string itemCode, string locationCode); + Task> CheckJobExistByItemCodeAndLocationCodeAsync(string itemCode, string locationCode); Task CancelByMaterialRequestAsync(string injectionNumber); @@ -22,5 +22,4 @@ public interface IInjectionJobAppService /// /// Task SaveDetail_SplitPackingAsync(SplitPacking_UpdateJobDetailInput input); - } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs index a8ff9b2bd..9e75a94a8 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs @@ -33,6 +33,16 @@ public class InjectionJobAppService _injectionJobManager = injectionJobManager; } + public override Task> CreateManyAsync(List inputs) + { + return base.CreateManyAsync(inputs); + } + + public override Task CreateAsync(InjectionJobEditInput input) + { + return base.CreateAsync(input); + } + /// /// 根据物品和库位 检查是否存在发料任务 /// @@ -42,7 +52,7 @@ public class InjectionJobAppService /// [Authorize] [HttpGet("check-job-exist")] - public virtual async Task> CheckJobExistByItemCodeAndLocationCode(string itemCode, + public virtual async Task> CheckJobExistByItemCodeAndLocationCodeAsync(string itemCode, string locationCode) { var entities = await _repository.GetListAsync(c => diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs index 014b4d81a..cff1683fa 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/MaterialRequests/InjectionRequests/InjectionRequestManager.cs @@ -34,7 +34,7 @@ public class InjectionRequestManager /// /// public virtual async Task CreateByNumberAsync(InjectionRequest entity) - { + { var number = string.IsNullOrEmpty(entity.Number) ? await GenerateNumberAsync(nameof(InjectionRequest), entity.ActiveDate).ConfigureAwait(false) : entity.Number; diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs index 9499c8fa1..97ced430f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -6,7 +5,9 @@ using Volo.Abp.EventBus; using Volo.Abp.Uow; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Event; +using Win_in.Sfs.Wms.Inventory.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; @@ -16,16 +17,26 @@ namespace Win_in.Sfs.Wms.Store.Event.BusinessJob; public class InjectionJobEventHandler : StoreEventHandlerBase , ILocalEventHandler> + , ILocalEventHandler> + , ILocalEventHandler>> { private const EnumTransType TransType = EnumTransType.Issue; private readonly IInjectionNoteAppService _injectionNoteAppService; + private readonly IBalanceAppService _balanceAppService; + private readonly IExpectOutAppService _expectOutAppService; private readonly ILocationAppService _locationAppService; + private readonly ITransferLibRequestAppService _transferLibRequestAppService; - public InjectionJobEventHandler(IInjectionNoteAppService injectionNoteAppService, ILocationAppService locationAppService) + public InjectionJobEventHandler(IInjectionNoteAppService injectionNoteAppService, + IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService, + ILocationAppService locationAppService, ITransferLibRequestAppService transferLibRequestAppService) { _injectionNoteAppService = injectionNoteAppService; + _balanceAppService = balanceAppService; + _expectOutAppService = expectOutAppService; _locationAppService = locationAppService; + _transferLibRequestAppService = transferLibRequestAppService; } /// @@ -41,8 +52,92 @@ public class InjectionJobEventHandler : await _injectionNoteAppService.CreateAsync(injectionNote).ConfigureAwait(false); } + /// + /// 创建后 + /// + /// + /// + public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) + { + var entity = eventData.Entity; + + await CreateExpectOutAsync(entity).ConfigureAwait(false); + } + + /// + /// 批量创建后 + /// + /// + /// + public virtual async Task HandleEventAsync(SfsCreatedEntityEventData> eventData) + { + var entitys = eventData.Entity; + + foreach (var entity in entitys) + { + await CreateExpectOutAsync(entity).ConfigureAwait(false); + } + } + #region 私有 + /// + /// 创建预计出 + /// + /// + /// + private async Task CreateExpectOutAsync(InjectionJob entity) + { + var expectOutEditInputs = new List(); + foreach (var detail in entity.Details) + { + var balanceDto = await _balanceAppService + .GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(detail.RecommendPackingCode, + detail.ItemCode, detail.RecommendFromLocationCode, EnumInventoryStatus.OK).ConfigureAwait(false); + + var inputoExpectOutEditInput = new ExpectOutEditInput(); + inputoExpectOutEditInput.JobNumber = entity.Number; + inputoExpectOutEditInput.ItemCode = detail.ItemCode; + inputoExpectOutEditInput.Qty = balanceDto.Qty; + inputoExpectOutEditInput.LocationCode = balanceDto.LocationCode; + inputoExpectOutEditInput.ArriveDate = balanceDto.ArriveDate; + inputoExpectOutEditInput.ContainerCode = balanceDto.ContainerCode; + inputoExpectOutEditInput.ExpireDate = balanceDto.ExpireDate; + inputoExpectOutEditInput.ItemDesc1 = balanceDto.ItemDesc1; + inputoExpectOutEditInput.ItemDesc2 = balanceDto.ItemDesc2; + inputoExpectOutEditInput.ItemName = balanceDto.ItemName; + inputoExpectOutEditInput.LocationArea = balanceDto.LocationArea; + inputoExpectOutEditInput.LocationGroup = balanceDto.LocationGroup; + inputoExpectOutEditInput.LocationErpCode = balanceDto.LocationErpCode; + inputoExpectOutEditInput.PackingCode = balanceDto.PackingCode; + inputoExpectOutEditInput.Lot = balanceDto.Lot; + inputoExpectOutEditInput.ProduceDate = balanceDto.ProduceDate; + inputoExpectOutEditInput.Status = balanceDto.Status; + inputoExpectOutEditInput.Uom = balanceDto.Uom; + inputoExpectOutEditInput.SupplierBatch = balanceDto.SupplierBatch; + inputoExpectOutEditInput.WarehouseCode= balanceDto.WarehouseCode; + + expectOutEditInputs.Add(inputoExpectOutEditInput); + } + + await _expectOutAppService.AddManyAsync(expectOutEditInputs).ConfigureAwait(false); + } + + /// + /// 根据是否在 第一层 来创建 是否生成库移任务 + /// + /// + private async Task CreateTransferLib(InjectionJob injectionJob) + { + var input= new TransferLibRequestEditInput(); + //input.CallBusinessType = nameof(type); + input.CallJobNumber = injectionJob.Number; + input.CallRequestNumber = injectionJob.InjectionRequestNumber; + //input.CallServerName= + + //_transferLibRequestAppService.CreateAsync(); + } + /// /// 创建补料记录实体 /// @@ -80,49 +175,49 @@ public class InjectionJobEventHandler : switch (locationType) { case EnumLocationType.WIP: + { + //用开关控制 发料到线边后去除箱码和托码 ??? + if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToWip.IsRemovePackingCode) + .ConfigureAwait(false)) { - //用开关控制 发料到线边后去除箱码和托码 ??? - if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToWip.IsRemovePackingCode) - .ConfigureAwait(false)) - { - injectionNoteDetail.ToPackingCode = ""; - } - - if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToWip.IsRemoveContainerCode) - .ConfigureAwait(false)) - { - injectionNoteDetail.ToContainerCode = ""; - } - - if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToWip.IsRemoveLot).ConfigureAwait(false)) - { - injectionNoteDetail.ToLot = ""; - } - - break; + injectionNoteDetail.ToPackingCode = ""; } + + if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToWip.IsRemoveContainerCode) + .ConfigureAwait(false)) + { + injectionNoteDetail.ToContainerCode = ""; + } + + if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToWip.IsRemoveLot).ConfigureAwait(false)) + { + injectionNoteDetail.ToLot = ""; + } + + break; + } case EnumLocationType.SEMI: + { + //用开关控制 发料到后去除箱码和托码 ??? + if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToSemi.IsRemovePackingCode) + .ConfigureAwait(false)) + { + injectionNoteDetail.ToPackingCode = ""; + } + + if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToSemi.IsRemoveContainerCode) + .ConfigureAwait(false)) + { + injectionNoteDetail.ToContainerCode = ""; + } + + if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToSemi.IsRemoveLot).ConfigureAwait(false)) { - //用开关控制 发料到后去除箱码和托码 ??? - if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToSemi.IsRemovePackingCode) - .ConfigureAwait(false)) - { - injectionNoteDetail.ToPackingCode = ""; - } - - if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToSemi.IsRemoveContainerCode) - .ConfigureAwait(false)) - { - injectionNoteDetail.ToContainerCode = ""; - } - - if (await SettingManager.IsTrueAsync(StoreSettings.Issue.ToSemi.IsRemoveLot).ConfigureAwait(false)) - { - injectionNoteDetail.ToLot = ""; - } - - break; + injectionNoteDetail.ToLot = ""; } + + break; + } } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs index d8263b67c..6d18713cc 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/InjectionRequestEventHandler.cs @@ -27,19 +27,17 @@ public class InjectionRequestEventHandler { private readonly IInjectionJobAppService _injectionJobAppService; private readonly IProductionLineAppService _productionLineAppService; - private readonly IInjectionRequestManager _injectionRequestManager; private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly ILocationAppService _locationAppService; private readonly IBalanceAppService _balanceAppService; public InjectionRequestEventHandler( IInjectionJobAppService injectionJobAppService, IProductionLineAppService productionLineAppService, - IInjectionRequestManager injectionRequestManager, ILocationAppService locationAppService, + ILocationAppService locationAppService, IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService) { _injectionJobAppService = injectionJobAppService; _productionLineAppService = productionLineAppService; - _injectionRequestManager = injectionRequestManager; _locationAppService = locationAppService; _balanceAppService = balanceAppService; _productionLineItemAppService = productionLineItemAppService; @@ -77,13 +75,13 @@ public class InjectionRequestEventHandler switch (entity.Type) { case nameof(EnumIssueType.BoxQty): - injectionJobs =await CreateInjectionJobWithBoxQtyTypeAsync(entity).ConfigureAwait(false); + injectionJobs = await CreateInjectionJobWithBoxQtyTypeAsync(entity).ConfigureAwait(false); break; case nameof(EnumIssueType.Qty): injectionJobs = await CreateInjectionJobWithQtyTypeAsync(entity).ConfigureAwait(false); break; } - + if (injectionJobs.Any()) { await _injectionJobAppService.CreateManyAsync(injectionJobs).ConfigureAwait(false); @@ -152,7 +150,8 @@ public class InjectionRequestEventHandler var job = jobs.FirstOrDefault(p => p.WorkGroupCode == fromLocation?.WorkGroupCode); if (job == null || job.Details.Any(p => p.ToLocationCode != injectionRequestDetail.ToLocationCode)) { - job = await BuildInjectionJobCreateInputWithQtyTypeAsync(injectionRequest, fromLocation).ConfigureAwait(false); + job = await BuildInjectionJobCreateInputWithQtyTypeAsync(injectionRequest, fromLocation) + .ConfigureAwait(false); jobs.Add(job); } @@ -201,7 +200,8 @@ public class InjectionRequestEventHandler /// /// /// - private async Task BuildInjectionJobCreateInputWithQtyTypeAsync(InjectionRequest injectionRequest, + private async Task BuildInjectionJobCreateInputWithQtyTypeAsync( + InjectionRequest injectionRequest, LocationDTO fromLocation) { InjectionJobEditInput job; @@ -266,8 +266,10 @@ public class InjectionRequestEventHandler foreach (var recommend in recommendList) { //拿走需求量 - var detail = await BuildInjectionJobDetailWithQtyTypeAsync(injectionRequestDetail, recommend, toLocationGroupCode) - .ConfigureAwait(false); + var detail = + await BuildInjectionJobDetailWithQtyTypeAsync(injectionRequestDetail, recommend, + toLocationGroupCode) + .ConfigureAwait(false); if (injectionRequest.UseOnTheWayLocation) { //获取在途库 @@ -347,6 +349,7 @@ public class InjectionRequestEventHandler (InjectionRequest injectionRequest) { var inputJobs = new List(); + var inputExpectOutEditInput = new ExpectOutEditInput(); //已用的库存的箱码集合 var useBalanceList = new List(); @@ -369,9 +372,9 @@ public class InjectionRequestEventHandler throw new UserFriendlyException($"库位【{inputDetailTemplate.ToLocationCode}】没有对应的【生产线】"); } - var productLineCodeAndItemCode = (await _productionLineItemAppService + var productLineCodeAndItemCode = await _productionLineItemAppService .GetByProductLineCodeAndItemCodeAsync(productionLineDto.Code, inputDetailTemplate.ItemCode) - .ConfigureAwait(false)); + .ConfigureAwait(false); if (productLineCodeAndItemCode == null) { throw new UserFriendlyException( @@ -387,16 +390,15 @@ public class InjectionRequestEventHandler Locations = JsonSerializer.Deserialize>(productLineCodeAndItemCode .RawLocationCodeListJson) }; - - //所有可用库存 var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); - usableList=usableList.Where(p => !useBalanceList.Contains(p.PackingCode)).ToList(); - var firstUsable = usableList.First(); - useBalanceList.Add(firstUsable.PackingCode); - usableList.Remove(firstUsable); + usableList = usableList.Where(p => !useBalanceList.Contains(p.PackingCode)).ToList(); - for (int i = 0; i < sumBoxQty; i++) + for (var i = 0; i < sumBoxQty; i++) { + var firstUsable = usableList.First(); + useBalanceList.Add(firstUsable.PackingCode); + usableList.Remove(firstUsable); + var injectionJobEditInput = await BuildInjectionJobCreateInputWithBoxQtyTypeAsync(injectionRequest, inputDetailTemplate, firstUsable) @@ -416,8 +418,9 @@ public class InjectionRequestEventHandler /// /// /// - private async Task BuildInjectionJobCreateInputWithBoxQtyTypeAsync(InjectionRequest injectionRequest, - InjectionRequestDetail injectionRequestDetail,BalanceDTO balanceDtos) + private async Task BuildInjectionJobCreateInputWithBoxQtyTypeAsync( + InjectionRequest injectionRequest, + InjectionRequestDetail injectionRequestDetail, BalanceDTO balanceDtos) { InjectionJobEditInput job; job = ObjectMapper.Map(injectionRequest); @@ -429,7 +432,8 @@ public class InjectionRequestEventHandler job.Worker = injectionRequest.Worker; job.InjectionRequestNumber = injectionRequest.Number; - job.Details.Add(await BuildInjectionJobDetailWithBoxQtyTypeAsync(injectionRequestDetail, balanceDtos).ConfigureAwait(false)); + job.Details.Add(await BuildInjectionJobDetailWithBoxQtyTypeAsync(injectionRequestDetail, balanceDtos) + .ConfigureAwait(false)); await Task.CompletedTask.ConfigureAwait(false); @@ -446,8 +450,6 @@ public class InjectionRequestEventHandler private async Task BuildInjectionJobDetailWithBoxQtyTypeAsync( InjectionRequestDetail injectionRequestDetail, BalanceDTO balance) { - //ProductionLineDTO prodLine = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationGroupCode).ConfigureAwait(false); - var detail = ObjectMapper.Map(balance); detail.RequestLocationCode = injectionRequestDetail.ToLocationCode; detail.WorkStation = injectionRequestDetail.WorkStation; @@ -475,8 +477,8 @@ public class InjectionRequestEventHandler detail.ToLocationErpCode = injectionRequestDetail.ToLocationErpCode; detail.ToLocationArea = injectionRequestDetail.ToLocationArea; detail.ToWarehouseCode = injectionRequestDetail.ToWarehouseCode; + detail.ToLocationGroup= injectionRequestDetail.ToLocationGroup; - //detail.ProdLine = prodLine == null ? toLocationGroupCode : prodLine.Code; detail.ProdLine = injectionRequestDetail.ToLocationCode; await Task.CompletedTask.ConfigureAwait(false); return detail; diff --git a/build/src/docker/publish/conf/settings/appsettings.Development.json b/build/src/docker/publish/conf/settings/appsettings.Development.json index d575183e9..a8e489fe5 100644 --- a/build/src/docker/publish/conf/settings/appsettings.Development.json +++ b/build/src/docker/publish/conf/settings/appsettings.Development.json @@ -114,8 +114,8 @@ "BaseUrl": "http://dev.ccwin-in.com:60083/" }, "BaseData": { - //"BaseUrl": "http://localhost:59094/" - "BaseUrl": "http://dev.ccwin-in.com:60084/" + "BaseUrl": "http://localhost:59094/" + //"BaseUrl": "http://dev.ccwin-in.com:60084/" }, "Default": { "BaseUrl": "http://dev.ccwin-in.com:60083/" From ca1ecd16b15eb97dd0958817d384aee169f5da91 Mon Sep 17 00:00:00 2001 From: "boxu.zheng" Date: Thu, 11 Apr 2024 11:53:14 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=B3=A8=E5=A1=91?= =?UTF-8?q?=E5=8F=91=E6=96=99=E5=BA=93=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InjectionJobs/InjectionJobAppService.cs | 9 ++- .../Jobs/InjectionJobEventHandler.cs | 60 ++++++++++++++++--- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs index 9e75a94a8..ca7c0baab 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs @@ -15,6 +15,7 @@ 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; +using Win_in.Sfs.Wms.Store.Notes; namespace Win_in.Sfs.Wms.Store.Application; @@ -22,7 +23,7 @@ namespace Win_in.Sfs.Wms.Store.Application; [Route($"{StoreConsts.RootPath}injection-job")] public class InjectionJobAppService : SfsJobAppServiceBase, - IInjectionJobAppService + IInjectionJobAppService,ITransferLibCallback { private readonly IInjectionJobManager _injectionJobManager; @@ -151,4 +152,10 @@ public class InjectionJobAppService var ret = ObjectMapper.Map(entity); return ret; } + + [HttpPost("Do-Call-Back")] + public Tuple DoTransferLibCallback(string businessType, string requestNum, string jobNum) + { + throw new NotImplementedException(); + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs index 97ced430f..4ea37c26b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs @@ -62,6 +62,8 @@ public class InjectionJobEventHandler : var entity = eventData.Entity; await CreateExpectOutAsync(entity).ConfigureAwait(false); + + await CreateTransferLibAsync(entity).ConfigureAwait(false); } /// @@ -76,6 +78,8 @@ public class InjectionJobEventHandler : foreach (var entity in entitys) { await CreateExpectOutAsync(entity).ConfigureAwait(false); + + await CreateTransferLibAsync(entity).ConfigureAwait(false); } } @@ -127,15 +131,57 @@ public class InjectionJobEventHandler : /// 根据是否在 第一层 来创建 是否生成库移任务 /// /// - private async Task CreateTransferLib(InjectionJob injectionJob) + private async Task CreateTransferLibAsync(InjectionJob injectionJob) { - var input= new TransferLibRequestEditInput(); - //input.CallBusinessType = nameof(type); - input.CallJobNumber = injectionJob.Number; - input.CallRequestNumber = injectionJob.InjectionRequestNumber; - //input.CallServerName= + foreach (var detail in injectionJob.Details) + { + var input = new TransferLibRequestEditInput(); + input.CallBusinessType = nameof(IInjectionJobAppService); + input.CallJobNumber = injectionJob.Number; + input.CallRequestNumber = injectionJob.InjectionRequestNumber; + input.CallServerName = "Win_in.Sfs.Wms.Store.Application.InjectionJobAppService"; + input.Type = "Transfer_Warehouse"; + input.UseOnTheWayLocation = true; + var detailInput = new TransferLibRequestDetailInput(); + detailInput.CallBusinessType = nameof(IInjectionJobAppService); + detailInput.CallRequestNumber = injectionJob.InjectionRequestNumber; + detailInput.CallServerName = "Win_in.Sfs.Wms.Store.Application.InjectionJobAppService"; + detailInput.CallJobNumber = injectionJob.Number; + + detailInput.JobStatus = EnumJobStatus.Open; + detailInput.ItemCode=detail.ItemCode; + detailInput.Qty = detail.RecommendQty; + detailInput.ArriveDate = detailInput.ArriveDate; + detailInput.ExpireDate=detailInput.ExpireDate; + detailInput.ProduceDate = detail.RecommendProduceDate; + + detailInput.ToLocationCode = detail.ToLocationCode; + detailInput.ToWarehouseCode=detail.ToWarehouseCode; + detailInput.ToLocationErpCode=detail.ToLocationErpCode; + detailInput.ToLocationGroup=detail.ToLocationGroup; + detailInput.ToLocationArea= detail.ToLocationArea; - //_transferLibRequestAppService.CreateAsync(); + detailInput.FromLocationCode = detail.RecommendFromLocationCode; + detailInput.FromLocationArea = detail.RecommendFromLocationArea; + detailInput.FromLocationGroup=detail.RecommendFromLocationGroup; + detailInput.FromLocationErpCode= detail.RecommendFromLocationErpCode; + detailInput.FromWarehouseCode= detail.RecommendFromWarehouseCode; + + detailInput.ToLocationCode = "YL1"; + detailInput.ToLocationErpCode = "YL1"; + detailInput.ToLocationGroup = "YL1"; + detailInput.ToLocationArea = "YL1"; + + detailInput.FromLot = detail.RecommendLot; + detailInput.ToLot=detail.RecommendLot; + detailInput.Qty=detail.RecommendQty; + detailInput.StdPackQty = detail.StdPackQty; + detailInput.Uom=detail.Uom; + detailInput.SupplierBatch = detail.RecommendSupplierBatch; + + await _transferLibRequestAppService.CreateAsync(input); + } + } /// From a97e24fa2bc8b6ecafebf40101774d8c4131f7d3 Mon Sep 17 00:00:00 2001 From: "boxu.zheng" Date: Thu, 11 Apr 2024 13:50:51 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=8F=8D=E5=B0=84?= =?UTF-8?q?=E5=BA=93=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InjectionJobs/InjectionJobAppService.cs | 7 +++++++ .../Jobs/TransferLibJobs/TransferLibJobAppService.cs | 12 ++++++++++-- .../Jobs/InjectionJobEventHandler.cs | 7 +------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs index ca7c0baab..966ee52d1 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionJobs/InjectionJobAppService.cs @@ -158,4 +158,11 @@ public class InjectionJobAppService { throw new NotImplementedException(); } + + [HttpPost("test")] + public virtual async Task Test() + { + Console.WriteLine("FuAZCZXVZXVXZVZ"); + await Task.CompletedTask; + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/TransferLibJobs/TransferLibJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/TransferLibJobs/TransferLibJobAppService.cs index 0767c0097..16fc0eacd 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/TransferLibJobs/TransferLibJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/TransferLibJobs/TransferLibJobAppService.cs @@ -3,6 +3,7 @@ using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; @@ -18,10 +19,12 @@ public class TransferLibJobAppService : SfsJobAppServiceBase, ITransferLibJobAppService { + private readonly IServiceProvider _serviceProvider; + public TransferLibJobAppService( - ITransferLibJobRepository repository, ITransferLibJobManager TransferLibJobManager - ) : base(repository, TransferLibJobManager) + ITransferLibJobRepository repository, ITransferLibJobManager TransferLibJobManager, IServiceProvider serviceProvider) : base(repository, TransferLibJobManager) { + _serviceProvider = serviceProvider; } /// @@ -32,6 +35,11 @@ public class TransferLibJobAppService /// public override async Task CompleteAsync(Guid id, TransferLibJobDTO dto) { + var str = "Win_in.Sfs.Wms.Store.Application.InjectionJobAppService"; + var implementation=_serviceProvider.GetService(Type.GetType("Win_in.Sfs.Wms.Store.Application.InjectionJobAppService")); + MethodInfo methodInfo=implementation.GetType().GetMethod("Test"); + methodInfo.Invoke(implementation, null); + string methodPrefix = "TransferLibJobAppService.CompleteAsync - "; if (dto.CallServerName.IsNullOrEmpty()) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs index 4ea37c26b..71bd14211 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/InjectionJobEventHandler.cs @@ -167,11 +167,6 @@ public class InjectionJobEventHandler : detailInput.FromLocationErpCode= detail.RecommendFromLocationErpCode; detailInput.FromWarehouseCode= detail.RecommendFromWarehouseCode; - detailInput.ToLocationCode = "YL1"; - detailInput.ToLocationErpCode = "YL1"; - detailInput.ToLocationGroup = "YL1"; - detailInput.ToLocationArea = "YL1"; - detailInput.FromLot = detail.RecommendLot; detailInput.ToLot=detail.RecommendLot; detailInput.Qty=detail.RecommendQty; @@ -179,7 +174,7 @@ public class InjectionJobEventHandler : detailInput.Uom=detail.Uom; detailInput.SupplierBatch = detail.RecommendSupplierBatch; - await _transferLibRequestAppService.CreateAsync(input); + await _transferLibRequestAppService.CreateAsync(input).ConfigureAwait(false); } }