From 01393f494e3e287769d2d8b712b3f953c0679136 Mon Sep 17 00:00:00 2001 From: "boxu.zheng" Date: Tue, 30 Apr 2024 08:57:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20kitting=E5=8F=AB=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Incoming/InjectionMoldingRequestReader.cs | 2 +- .../PositionCodes/PositionCodeAppService.cs | 12 +- .../Balances/BalanceAppService.cs | 3 +- .../Balances/BalanceManager.cs | 1 + .../Enums/Basedata/EnumLocationType.cs | 5 + .../Enums/Basedata/EnumProductionLineType.cs | 7 +- .../Enums/Store/EnumRecommendType.cs | 6 +- .../IAssembleIssueNoteAppService.cs | 7 +- .../ICoatingIssueNoteAppService.cs | 7 +- .../IKittingIssueNoteAppService.cs | 7 +- .../DTOs/InjectionIssueRequestDetailDTO.cs | 70 ++- .../DTOs/KittingIssueRequestDetailDTO.cs | 70 ++- .../AssembleIssueJobAppService.cs | 2 +- .../CoatingIssueJobAppService.cs | 2 +- .../InjectionIssueJobAppService.cs | 11 +- .../KittingIssueJobAppService.cs | 46 +- .../AssembleIssueNoteAppService.cs | 47 -- .../CoatingIssueNoteAppService.cs | 46 +- .../KittingIssueNoteAppService.cs | 46 -- .../KittingIssueRequestAppService.cs | 25 +- .../AssembleIssueJobs/AssembleIssueJob.cs | 8 +- .../CoatingIssueJobs/CoatingIssueJob.cs | 7 +- .../KittingIssueJobs/KittingIssueJob.cs | 7 +- .../AssembleIssueNotes/AssembleIssueNote.cs | 7 +- .../CoatingIssueNotes/CoatingIssueNote.cs | 7 +- .../KittingIssueNotes/KittingIssueNote.cs | 8 +- .../InjectionIssueRequestDetail.cs | 1 - .../KittingIssueRequest.cs | 9 +- ...ssueJobDbContextModelCreatingExtensions.cs | 1 - ...ssueJobDbContextModelCreatingExtensions.cs | 1 - ...ssueJobDbContextModelCreatingExtensions.cs | 1 - ...sueNoteDbContextModelCreatingExtensions.cs | 1 - ...sueNoteDbContextModelCreatingExtensions.cs | 1 - ...sueNoteDbContextModelCreatingExtensions.cs | 1 - .../Jobs/KittingIssueJobEventHandler.cs | 119 ++-- .../KittingIssueRequestEventHandler.cs | 559 +++++++++++------- 36 files changed, 628 insertions(+), 532 deletions(-) diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs index 2a4bf2295..efbb754bb 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs @@ -137,7 +137,7 @@ public class InjectionMoldingRequestReader : IReader ToLocationCode = inject.AreaID.ToString(), PositionCode=inject.CargoID, Qty = 1, - RecommendType = EnumRecommendType.W, + RecommendType = EnumRecommendType.RAW, IssuedQty = 0, ReceivedQty = 0, Status = EnumStatus.Open, diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAppService.cs index 5431a0142..c70f4caf8 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCodes/PositionCodeAppService.cs @@ -68,7 +68,7 @@ public class PositionCodeAppService var itemBasic = await ItemBasicAppService.GetByCodeAsync(input.PartCode).ConfigureAwait(false); Check.NotNull(itemBasic, "物品代码", $"物品 {input.PartCode} 不存在"); //如果类型选择为原料,校验物料号类型必须为原料,器具、KItting 的不用加校验 - if (input.Type == EnumRecommendType.W && itemBasic.CanBuy != true) + if (input.Type == EnumRecommendType.RAW && itemBasic.CanBuy != true) { throw new UserFriendlyException($"{input.PartCode} 物料号类型必须为采购件"); } @@ -80,7 +80,7 @@ public class PositionCodeAppService var location = await LocationAppService.GetByCodeAsync(input.LocationCode).ConfigureAwait(false); Check.NotNull(location, "库位代码", $"库位 {input.LocationCode} 不存在"); //如果类型选择为原料,库位的类型必须为原料库位 - if (input.Type == EnumRecommendType.W && location.Type != EnumLocationType.RAW) + if (input.Type == EnumRecommendType.RAW && location.Type != EnumLocationType.RAW) { throw new UserFriendlyException($"{input.LocationCode} 库位的类型必须为原料库位"); } @@ -120,7 +120,7 @@ public class PositionCodeAppService var itemBasic = await ItemBasicAppService.GetByCodeAsync(input.PartCode).ConfigureAwait(false); Check.NotNull(itemBasic, "物品代码", $"物品 {input.PartCode} 不存在"); //如果类型选择为原料,校验物料号类型必须为原料,器具、KItting 的不用加校验 - if (input.Type == EnumRecommendType.W && itemBasic.Type != "10C02") + if (input.Type == EnumRecommendType.RAW && itemBasic.Type != "10C02") { throw new UserFriendlyException($"{input.PartCode} 物料号类型必须为原料"); } @@ -132,7 +132,7 @@ public class PositionCodeAppService var location = await LocationAppService.GetByCodeAsync(input.LocationCode).ConfigureAwait(false); Check.NotNull(location, "库位代码", $"库位 {input.LocationCode} 不存在"); //如果类型选择为原料,库位的类型必须为原料库位 - if (input.Type == EnumRecommendType.W && location.Type!= EnumLocationType.RAW) + if (input.Type == EnumRecommendType.RAW && location.Type!= EnumLocationType.RAW) { throw new UserFriendlyException($"{input.LocationCode} 库位的类型必须为原料库位"); } @@ -180,13 +180,13 @@ public class PositionCodeAppService } var itemBasic = await ItemBasicAppService.GetByCodeAsync(input.PartCode).ConfigureAwait(false); //如果类型选择为原料,校验物料号类型必须为原料,器具、KItting 的不用加校验 - if (input.Type == EnumRecommendType.W && itemBasic.Type != "10C02") + if (input.Type == EnumRecommendType.RAW && itemBasic.Type != "10C02") { validationRresult.Add(new ValidationResult($"物品代码{input.PartCode} 物料号类型必须为原料", new string[] { "物料号类型" })); } var location = await LocationAppService.GetByCodeAsync(input.LocationCode).ConfigureAwait(false); //如果类型选择为原料,库位的类型必须为原料库位 - if (input.Type==EnumRecommendType.W && location.Type != EnumLocationType.RAW) + if (input.Type==EnumRecommendType.RAW && location.Type != EnumLocationType.RAW) { validationRresult.Add(new ValidationResult($"库位代码{input.LocationCode} 库位的类型必须为原料库位", new string[] { "库位类型" })); } 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 3a8a08cfe..fcbccf703 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 @@ -604,8 +604,9 @@ public class BalanceAppService [HttpGet("usable-list")] public virtual async Task> GetUsableListAsync(RecommendBalanceRequestInput input) { + var inventoryBalances = await _balanceManager - .GetUsableListAsync(input.ItemCode, input.Locations, input.Statuses, true).ConfigureAwait(false); + .GetUsableListAsync(input.ItemCode, input.Locations, input.Statuses, input.IsPackingCode).ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(inventoryBalances); 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 4ecd07b1e..8891a9be3 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 @@ -867,6 +867,7 @@ public class BalanceManager : DomainService, IBalanceManager .FilterLocationEnablePickAsync(locations) //排序库存余额 最终可用的余额集合 .SortByFifo(); + usableBalances = usableBalances.Where(p => p.Qty != 0).ToList(); return usableBalances; } diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumLocationType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumLocationType.cs index 4bb67435f..7e147f8c7 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumLocationType.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumLocationType.cs @@ -83,4 +83,9 @@ public enum EnumLocationType /// Kitting线边 /// [Display(Name = "Kitting线边")] KittingWip = 15, + + /// + /// 立体库 + /// + [Display(Name = "立体库")] DimensionalStorehouse = 16, } diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumProductionLineType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumProductionLineType.cs index 55fbcf988..4c9ebc563 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumProductionLineType.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Basedata/EnumProductionLineType.cs @@ -19,5 +19,10 @@ public enum EnumProductionLineType /// /// 装配 /// - [Display(Name = "装配")] Assemble = 3 + [Display(Name = "装配")] Assemble = 3, + + /// + /// Kitting + /// + [Display(Name = "Kitting")] Kitting = 4 } diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumRecommendType.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumRecommendType.cs index 08e1bc6a2..5ff6d6616 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumRecommendType.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/EnumRecommendType.cs @@ -16,17 +16,17 @@ public enum EnumRecommendType /// 原料 /// [Display(Name = "原料")] - W = 1, + RAW = 1, /// /// 半成品 /// [Display(Name = "半成品")] - B = 2, + SEMI = 2, /// /// kitting区 /// [Display(Name = "Kitting区")] - K = 3 + KITTING = 3 } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/IAssembleIssueNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/IAssembleIssueNoteAppService.cs index 83f8e6bbc..9e08af906 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/IAssembleIssueNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/AssembleIssueNotes/IAssembleIssueNoteAppService.cs @@ -12,10 +12,5 @@ public interface IAssembleIssueNoteAppService : ISfsStoreMasterReadOnlyAppServic Task ConfirmAsync(Guid id); - Task ConfirmAsync(string number); - - Task> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, - string requestType, bool includeDetails = false, CancellationToken cancellationToken = default); - - Task> GetListUnConfirmedByTypeAsync(string requestType); + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs index 79fbe99cc..20bb6f3c5 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs @@ -13,10 +13,5 @@ public interface ICoatingIssueNoteAppService : ISfsStoreMasterReadOnlyAppService Task ConfirmAsync(Guid id); - Task ConfirmAsync(string number); - - Task> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, - string requestType, bool includeDetails = false, CancellationToken cancellationToken = default); - - Task> GetListUnConfirmedByTypeAsync(string requestType); + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs index 105094c18..db775120e 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs @@ -12,10 +12,5 @@ public interface IKittingIssueNoteAppService : ISfsStoreMasterReadOnlyAppService Task ConfirmAsync(Guid id); - Task ConfirmAsync(string number); - - Task> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, - string requestType, bool includeDetails = false, CancellationToken cancellationToken = default); - - Task> GetListUnConfirmedByTypeAsync(string requestType); + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/InjectionIssueRequests/DTOs/InjectionIssueRequestDetailDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/InjectionIssueRequests/DTOs/InjectionIssueRequestDetailDTO.cs index 13c1f6bc0..5a3c8a39f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/InjectionIssueRequests/DTOs/InjectionIssueRequestDetailDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/InjectionIssueRequests/DTOs/InjectionIssueRequestDetailDTO.cs @@ -8,47 +8,91 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts; public class InjectionIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase { + #region 目标库位信息 + + /// + /// 目标库位 + /// + [Display(Name = "目标库位")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ToLocationCode { get; set; } + + /// + /// 目标库区 + /// + [Display(Name = "目标库区")] + public string ToLocationArea { get; set; } + + /// + /// 目标库位组 + /// + [Display(Name = "目标库位组")] + public string ToLocationGroup { get; set; } + + /// + /// 目标ERP储位 + /// + [Display(Name = "目标ERP储位")] + public string ToLocationErpCode { get; set; } + /// - /// 已发数量 + /// 目标仓库 + /// + [Display(Name = "目标仓库")] + public string ToWarehouseCode { get; set; } + + #endregion + + /// + /// 生产线 + /// + public string ProdLine { get; set; } + + /// + /// 已发数量 /// - [Display(Name = "已发数量")] public decimal IssuedQty { get; set; } /// - /// 已收数量 + /// 已收数量 /// - [Display(Name = "已收数量")] public decimal ReceivedQty { get; set; } /// - /// 明细状态 + /// 明细状态 /// - [Display(Name = "明细状态")] public EnumStatus Status { get; set; } /// - /// 请求未发 + /// 请求未发 还未发送的数量 /// - [Display(Name = "请求未发")] [NotMapped] public decimal ToBeIssuedQty => Qty - IssuedQty; /// - /// 已发未收 + /// 已发未收 /// - [Display(Name = "已发未收")] [NotMapped] public decimal ToBeReceivedQty => IssuedQty - ReceivedQty; /// - /// 请求未收 + /// 请求未收 /// - [Display(Name = "请求未收")] [NotMapped] public decimal NotFinishQty => Qty - ReceivedQty; /// - /// 需求箱数量 + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } + + /// + /// 需求箱数量 /// [Display(Name = "需求箱数量")] public decimal BoxQty { get; set; } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/KittingIssueRequests/DTOs/KittingIssueRequestDetailDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/KittingIssueRequests/DTOs/KittingIssueRequestDetailDTO.cs index 6981f306d..61f0df54f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/KittingIssueRequests/DTOs/KittingIssueRequestDetailDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/KittingIssueRequests/DTOs/KittingIssueRequestDetailDTO.cs @@ -8,47 +8,91 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts; public class KittingIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase { + #region 目标库位信息 + + /// + /// 目标库位 + /// + [Display(Name = "目标库位")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string ToLocationCode { get; set; } + + /// + /// 目标库区 + /// + [Display(Name = "目标库区")] + public string ToLocationArea { get; set; } + + /// + /// 目标库位组 + /// + [Display(Name = "目标库位组")] + public string ToLocationGroup { get; set; } + + /// + /// 目标ERP储位 + /// + [Display(Name = "目标ERP储位")] + public string ToLocationErpCode { get; set; } + /// - /// 已发数量 + /// 目标仓库 + /// + [Display(Name = "目标仓库")] + public string ToWarehouseCode { get; set; } + + #endregion + + /// + /// 生产线 + /// + public string ProdLine { get; set; } + + /// + /// 已发数量 /// - [Display(Name = "已发数量")] public decimal IssuedQty { get; set; } /// - /// 已收数量 + /// 已收数量 /// - [Display(Name = "已收数量")] public decimal ReceivedQty { get; set; } /// - /// 明细状态 + /// 明细状态 /// - [Display(Name = "明细状态")] public EnumStatus Status { get; set; } /// - /// 请求未发 + /// 请求未发 还未发送的数量 /// - [Display(Name = "请求未发")] [NotMapped] public decimal ToBeIssuedQty => Qty - IssuedQty; /// - /// 已发未收 + /// 已发未收 /// - [Display(Name = "已发未收")] [NotMapped] public decimal ToBeReceivedQty => IssuedQty - ReceivedQty; /// - /// 请求未收 + /// 请求未收 /// - [Display(Name = "请求未收")] [NotMapped] public decimal NotFinishQty => Qty - ReceivedQty; /// - /// 需求箱数量 + /// 位置码 + /// + public string PositionCode { get; set; } + + /// + /// 推荐类型 + /// + public EnumRecommendType RecommendType { get; set; } + + /// + /// 需求箱数量 /// [Display(Name = "需求箱数量")] public decimal BoxQty { get; set; } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs index 5d025c921..b28529921 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs @@ -72,7 +72,7 @@ public class AssembleIssueJobAppService var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode) .ConfigureAwait(false); - if (loctionDto.RowCode != 1) + if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1) { input.JobStatus = EnumJobStatus.Wait; diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs index a07a74d69..3416299a8 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs @@ -73,7 +73,7 @@ public class CoatingIssueJobAppService var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode) .ConfigureAwait(false); - if (loctionDto.RowCode != 1) + if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1) { input.JobStatus = EnumJobStatus.Wait; diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs index 416005a4a..9e6acbc3c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs @@ -74,8 +74,8 @@ public class InjectionIssueJobAppService var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode) .ConfigureAwait(false); - - if (loctionDto.RowCode != 1) + + if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1) { input.JobStatus = EnumJobStatus.Wait; @@ -184,11 +184,4 @@ public class InjectionIssueJobAppService return; } - - [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/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs index fe92ae472..f9e10b952 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Castle.Components.DictionaryAdapter; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using SQLitePCL; using Volo.Abp; using Volo.Abp.Application.Dtos; using Win_in.Sfs.Basedata.Application.Contracts; @@ -71,8 +72,8 @@ public class KittingIssueJobAppService var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode) .ConfigureAwait(false); - - if (loctionDto.RowCode != 1) + + if (loctionDto.Type==EnumLocationType.RAW&&loctionDto.RowCode != 1) { input.JobStatus = EnumJobStatus.Wait; @@ -106,10 +107,10 @@ public class KittingIssueJobAppService } } - [HttpPost("cancel-by-request/{requestNumber}")] - public virtual async Task CancelByMaterialRequestAsync(string requestNumber) + [HttpPost("cancel-by-request/{injectionNumber}")] + public virtual async Task CancelByMaterialRequestAsync(string injectionNumber) { - var entities = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber) + var entities = await _repository.GetListAsync(p => p.KittingRequestNumber == injectionNumber) .ConfigureAwait(false); foreach (var entity in entities) { @@ -120,13 +121,13 @@ public class KittingIssueJobAppService [HttpPost("invalid")] public override async Task CancelAsync(Guid id) { - var kittingIssueJob = await _repository.GetAsync(id).ConfigureAwait(false); - if (kittingIssueJob == null) + var injectionJob = await _repository.GetAsync(id).ConfigureAwait(false); + if (injectionJob == null) { throw new UserFriendlyException($"未找到ID为 {id} 的任务"); } - await _kittingIssueJobManager.CancelAsync(kittingIssueJob).ConfigureAwait(false); + await _kittingIssueJobManager.CancelAsync(injectionJob).ConfigureAwait(false); } [HttpPost("by-request-number/{requestNumber}")] @@ -140,27 +141,27 @@ public class KittingIssueJobAppService [HttpPost("Do-Call-Back")] public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto) { - var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false); + var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false); - var transferLibJobDto= await _transferLibJobAppService.GetByNumberAsync(dto.Number).ConfigureAwait(false); + var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync(dto.Number).ConfigureAwait(false); - var transferLibNoteDetail= dto.Details.First(); + var transferLibNoteDetail = dto.Details.First(); var jobDetail = job.Details.First(); job.JobStatus = EnumJobStatus.Open; jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; - jobDetail.TransferLibFromContainerCode=transferLibNoteDetail.HandledFromContainerCode; - jobDetail.TransferLibFromExpireDate=transferLibNoteDetail.HandledFromExpireDate; - jobDetail.TransferLibFromLocationArea=transferLibNoteDetail.HandledFromLocationArea; - jobDetail.TransferLibFromLocationCode=transferLibNoteDetail.HandledFromLocationCode; + jobDetail.TransferLibFromContainerCode = transferLibNoteDetail.HandledFromContainerCode; + jobDetail.TransferLibFromExpireDate = transferLibNoteDetail.HandledFromExpireDate; + jobDetail.TransferLibFromLocationArea = transferLibNoteDetail.HandledFromLocationArea; + jobDetail.TransferLibFromLocationCode = transferLibNoteDetail.HandledFromLocationCode; jobDetail.TransferLibFromLocationErpCode = transferLibNoteDetail.HandledFromLocationErpCode; - jobDetail.TransferLibFromLocationGroup=transferLibNoteDetail.HandledFromLocationGroup; - jobDetail.TransferLibFromLot=transferLibNoteDetail.HandledFromLot; + jobDetail.TransferLibFromLocationGroup = transferLibNoteDetail.HandledFromLocationGroup; + jobDetail.TransferLibFromLot = transferLibNoteDetail.HandledFromLot; jobDetail.TransferLibFromPackingCode = transferLibNoteDetail.HandledFromPackingCode; jobDetail.TransferLibFromProduceDate = transferLibNoteDetail.HandledFromProduceDate; - jobDetail.TransferLibFromQty=transferLibNoteDetail.HandledFromQty; - jobDetail.TransferLibFromSupplierBatch=transferLibNoteDetail.HandledFromSupplierBatch; + jobDetail.TransferLibFromQty = transferLibNoteDetail.HandledFromQty; + jobDetail.TransferLibFromSupplierBatch = transferLibNoteDetail.HandledFromSupplierBatch; jobDetail.TransferLibFromWarehouseCode = transferLibNoteDetail.HandledFromWarehouseCode; jobDetail.TransferLibToArriveDate = transferLibNoteDetail.HandledToArriveDate; @@ -181,11 +182,4 @@ public class KittingIssueJobAppService return; } - - [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/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteAppService.cs index cfa6a3cc2..36ce2a342 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteAppService.cs @@ -58,51 +58,4 @@ public class AssembleIssueNoteAppService : await LocalEventBus.PublishAsync(new SfsConfirmedEntityEventData(assembleNote), false).ConfigureAwait(false); return ObjectMapper.Map(assembleNote); } - - [HttpPost("confirm-by-number/{number}")] - public virtual async Task ConfirmAsync(string number) - { - var entity = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false); - Check.NotNull(entity, nameof(AssembleIssueNote)); - var result = await _assembleNoteManager.ConfirmAsync(entity.Id).ConfigureAwait(false); - var dto = ObjectMapper.Map(result); - return dto; - } - /// - /// 根据叫料请求类型获取发料记录 - /// - /// - /// - /// 叫料请求类型: - /// 人工拉动:Issue_Manual; - /// 线边拉动:Issue_WIP; - /// - /// - /// - /// - [HttpPost("by-type/{requestType}")] - public virtual async Task> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, - string requestType, bool includeDetails = false, CancellationToken cancellationToken = default) - { - Expression> expression = p => p.RequestType == requestType; - if (requestInput.Condition.Filters?.Count > 0) - { - expression = expression.And(requestInput.Condition.Filters.ToLambda()); - } - - return await GetPagedListAsync(expression, requestInput.SkipCount, requestInput.MaxResultCount, - requestInput.Sorting, includeDetails, cancellationToken).ConfigureAwait(false); - } - - [HttpGet("list/un-confirmed/{requestType}")] - public virtual async Task> GetListUnConfirmedByTypeAsync(string requestType) - { - var entities = await _repository.GetListAsync(c => !c.Confirmed && c.RequestType == requestType) - .ConfigureAwait(false); - - var dtos = ObjectMapper.Map, List>(entities); - - return dtos; - } - } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs index 8480c6c88..9259126d2 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs @@ -60,50 +60,6 @@ public class CoatingIssueNoteAppService : return ObjectMapper.Map(coatingIssueNote); } - [HttpPost("confirm-by-number/{number}")] - public virtual async Task ConfirmAsync(string number) - { - var entity = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false); - Check.NotNull(entity, nameof(CoatingIssueNote)); - var result = await _coatingIssueNoteManager.ConfirmAsync(entity.Id).ConfigureAwait(false); - var dto = ObjectMapper.Map(result); - return dto; - } - /// - /// 根据叫料请求类型获取发料记录 - /// - /// - /// - /// 叫料请求类型: - /// 人工拉动:Issue_Manual; - /// 线边拉动:Issue_WIP; - /// - /// - /// - /// - [HttpPost("by-type/{requestType}")] - public virtual async Task> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, - string requestType, bool includeDetails = false, CancellationToken cancellationToken = default) - { - Expression> expression = p => p.RequestType == requestType; - if (requestInput.Condition.Filters?.Count > 0) - { - expression = expression.And(requestInput.Condition.Filters.ToLambda()); - } - - return await GetPagedListAsync(expression, requestInput.SkipCount, requestInput.MaxResultCount, - requestInput.Sorting, includeDetails, cancellationToken).ConfigureAwait(false); - } - - [HttpGet("list/un-confirmed/{requestType}")] - public virtual async Task> GetListUnConfirmedByTypeAsync(string requestType) - { - var entities = await _repository.GetListAsync(c => !c.Confirmed && c.RequestType == requestType) - .ConfigureAwait(false); - - var dtos = ObjectMapper.Map, List>(entities); - - return dtos; - } + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteAppService.cs index ccbc71b2b..d5b2ce396 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteAppService.cs @@ -59,50 +59,4 @@ public class KittingIssueNoteAppService : return ObjectMapper.Map(kittingIssueNote); } - [HttpPost("confirm-by-number/{number}")] - public virtual async Task ConfirmAsync(string number) - { - var entity = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false); - Check.NotNull(entity, nameof(KittingIssueNote)); - var result = await _kittingIssueNoteManager.ConfirmAsync(entity.Id).ConfigureAwait(false); - var dto = ObjectMapper.Map(result); - return dto; - } - /// - /// 根据叫料请求类型获取发料记录 - /// - /// - /// - /// 叫料请求类型: - /// 人工拉动:Issue_Manual; - /// 线边拉动:Issue_WIP; - /// - /// - /// - /// - [HttpPost("by-type/{requestType}")] - public virtual async Task> GetListByTypeAsync(SfsStoreRequestInputBase requestInput, - string requestType, bool includeDetails = false, CancellationToken cancellationToken = default) - { - Expression> expression = p => p.RequestType == requestType; - if (requestInput.Condition.Filters?.Count > 0) - { - expression = expression.And(requestInput.Condition.Filters.ToLambda()); - } - - return await GetPagedListAsync(expression, requestInput.SkipCount, requestInput.MaxResultCount, - requestInput.Sorting, includeDetails, cancellationToken).ConfigureAwait(false); - } - - [HttpGet("list/un-confirmed/{requestType}")] - public virtual async Task> GetListUnConfirmedByTypeAsync(string requestType) - { - var entities = await _repository.GetListAsync(c => !c.Confirmed && c.RequestType == requestType) - .ConfigureAwait(false); - - var dtos = ObjectMapper.Map, List>(entities); - - return dtos; - } - } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs index 59d2d93f1..90309de96 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs @@ -55,8 +55,7 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase HandleAsync(Guid id) { - await Task.CompletedTask.ConfigureAwait(false); - return null; + return await base.HandleAsync(id).ConfigureAwait(false); } [HttpPost("")] @@ -70,18 +69,21 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase { + /// - /// 叫料请求类型 + /// 叫料类型 /// - [IgnoreUpdate] - public string RequestType { get; set; } + [Display(Name = "叫料类型")] + public EnumIssueRequestType IssueRequestType { get; set; } /// /// 生产线 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs index 9acd01250..53715b721 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; @@ -14,10 +15,10 @@ namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; public class CoatingIssueJob : SfsJobAggregateRootBase { /// - /// 叫料请求类型 + /// 叫料类型 /// - [IgnoreUpdate] - public string RequestType { get; set; } + [Display(Name = "叫料类型")] + public EnumIssueRequestType IssueRequestType { get; set; } /// /// 生产线 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJob.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJob.cs index 74707b71a..1aeb27752 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJob.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJob.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; namespace Win_in.Sfs.Wms.Store.Domain; @@ -13,10 +14,10 @@ namespace Win_in.Sfs.Wms.Store.Domain; public class KittingIssueJob : SfsJobAggregateRootBase { /// - /// 叫料请求类型 + /// 叫料类型 /// - [IgnoreUpdate] - public string RequestType { get; set; } + [Display(Name = "叫料类型")] + public EnumIssueRequestType IssueRequestType { get; set; } /// /// 生产线 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNote.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNote.cs index 533852b2d..60310d53e 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNote.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNote.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Volo.Abp; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; namespace Win_in.Sfs.Wms.Store.Domain; @@ -27,10 +28,10 @@ public class AssembleIssueNote : SfsStoreAggregateRootBase - /// 叫料请求类型 + /// 叫料类型 /// - [IgnoreUpdate] - public string RequestType { get; set; } + [Display(Name = "叫料类型")] + public EnumIssueRequestType IssueRequestType { get; set; } /// /// 使用在途库 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs index 360c84095..5c3280457 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Volo.Abp; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; @@ -28,10 +29,10 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase - /// 叫料请求类型 + /// 叫料类型 /// - [IgnoreUpdate] - public string RequestType { get; set; } + [Display(Name = "叫料类型")] + public EnumIssueRequestType IssueRequestType { get; set; } /// /// 使用在途库 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/KittingIssueNotes/KittingIssueNote.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/KittingIssueNotes/KittingIssueNote.cs index 46394a025..a33831684 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/KittingIssueNotes/KittingIssueNote.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/KittingIssueNotes/KittingIssueNote.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Volo.Abp; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; namespace Win_in.Sfs.Wms.Store.Domain; @@ -25,12 +26,11 @@ public class KittingIssueNote : SfsStoreAggregateRootBase - /// 叫料请求类型 + /// 叫料类型 /// - [IgnoreUpdate] - public string RequestType { get; set; } + [Display(Name = "叫料类型")] + public EnumIssueRequestType IssueRequestType { get; set; } /// /// 使用在途库 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/InjectionIssueRequestDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/InjectionIssueRequestDetail.cs index 9dc2a536f..7d74e93ef 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/InjectionIssueRequestDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/InjectionIssueRequestDetail.cs @@ -45,7 +45,6 @@ public class InjectionIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHas #endregion - /// /// 生产线 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/KittingIssueRequest.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/KittingIssueRequest.cs index dcd094002..1bc480097 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/KittingIssueRequest.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/KittingIssueRequest.cs @@ -21,9 +21,8 @@ public class KittingIssueRequest : SfsStoreRequestAggregateRootBase public bool UseOnTheWayLocation { get; set; } - /// - /// 明细列表 - /// - [IgnoreUpdate] - public override List Details { get; set; } = new List(); + ///// + ///// 明细列表 + ///// + //public List Details { get; set; } = new List(); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobDbContextModelCreatingExtensions.cs index b5fd375b9..5af1510ff 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobDbContextModelCreatingExtensions.cs @@ -21,7 +21,6 @@ public static class AssembleIssueJobDbContextModelCreatingExtensions //Configure Job base properties b.ConfigureJob(); //Properties - b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.AssembleRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.JobType).HasConversion(); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs index f9abf7d85..304324f4f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs @@ -22,7 +22,6 @@ public static class CoatingIssueJobDbContextModelCreatingExtensions //Configure Job base properties b.ConfigureJob(); //Properties - b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.MaterialRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.JobType).HasConversion(); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobDbContextModelCreatingExtensions.cs index e2ca203f8..11f32d8f2 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobDbContextModelCreatingExtensions.cs @@ -21,7 +21,6 @@ public static class KittingIssueJobDbContextModelCreatingExtensions //Configure Job base properties b.ConfigureJob(); //Properties - b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.KittingRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.JobType).HasConversion(); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteDbContextModelCreatingExtensions.cs index 3ddeacd5c..9e45c0817 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/AssembleIssueNotes/AssembleIssueNoteDbContextModelCreatingExtensions.cs @@ -20,7 +20,6 @@ public static class AssembleIssueNoteDbContextModelCreatingExtensions //Properties b.Property(q => q.RequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); - b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.Remark).HasMaxLength(SfsPropertyConst.RemarkLength); //Relations diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs index 01678828a..361a3ed2e 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs @@ -21,7 +21,6 @@ public static class CoatingIssueNoteDbContextModelCreatingExtensions //Properties b.Property(q => q.RequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); - b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.Remark).HasMaxLength(SfsPropertyConst.RemarkLength); //Relations diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteDbContextModelCreatingExtensions.cs index 0623b75f4..28f43109a 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/KittingIssueNotes/KittingIssueNoteDbContextModelCreatingExtensions.cs @@ -20,7 +20,6 @@ public static class KittingIssueNoteDbContextModelCreatingExtensions //Properties b.Property(q => q.RequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); - b.Property(q => q.RequestType).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.Remark).HasMaxLength(SfsPropertyConst.RemarkLength); //Relations diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/KittingIssueJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/KittingIssueJobEventHandler.cs index 598fc89f2..8519a4a1c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/KittingIssueJobEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/KittingIssueJobEventHandler.cs @@ -125,63 +125,68 @@ public class KittingIssueJobEventHandler : /// private async Task CreateTransferLibAsync(KittingIssueJob kittingIssueJob) { - if (!await IsMinRowAsync(kittingIssueJob).ConfigureAwait(false)) + foreach (var detail in kittingIssueJob.Details) { - foreach (var detail in kittingIssueJob.Details) + var locationDto = await _locationAppService.GetByCodeAsync(detail.RecommendFromLocationCode) + .ConfigureAwait(false); + if (locationDto.Type == EnumLocationType.RAW) { - var input = new TransferLibRequestEditInput(); - input.CallBusinessType = nameof(IKittingIssueJobAppService); - input.CallJobNumber = kittingIssueJob.Number; - input.CallRequestNumber = kittingIssueJob.KittingRequestNumber; - input.CallServerName = "Win_in.Sfs.Wms.Store.Application.KittingIssueJobAppService"; - input.Type = "Transfer_Warehouse"; - input.UseOnTheWayLocation = true; - - var detailInput = new TransferLibRequestDetailInput(); - detailInput.CallBusinessType = nameof(IKittingIssueJobAppService); - detailInput.CallRequestNumber = kittingIssueJob.KittingRequestNumber; - detailInput.CallServerName = "Win_in.Sfs.Wms.Store.Application.KittingIssueJobAppService"; - detailInput.CallJobNumber = kittingIssueJob.Number; - - detailInput.JobStatus = EnumJobStatus.Open; - detailInput.ItemCode = detail.ItemCode; - detailInput.StdPackQty = detail.StdPackQty; - detailInput.Uom = detail.Uom; - detailInput.Status = detail.Status; - - detailInput.RecommendFromQty = detail.RecommendFromQty; - detailInput.RecommendFromLot = detail.RecommendFromLot; - detailInput.RecommendFromPackingCode = detailInput.RecommendFromPackingCode; - detailInput.RecommendToLot = detail.RecommendToLot; - - detailInput.RecommendFromArriveDate = detail.RecommendFromArriveDate; - detailInput.RecommendFromExpireDate = detail.RecommendFromExpireDate; - detailInput.RecommendFromProduceDate = detail.RecommendFromProduceDate; - detailInput.RecommendFromSupplierBatch = detail.RecommendFromSupplierBatch; - - detailInput.RecommendFromLocationCode = detail.RecommendFromLocationCode; - detailInput.RecommendFromLocationGroup = detail.RecommendFromLocationGroup; - detailInput.RecommendFromLocationArea = detail.RecommendFromLocationArea; - detailInput.RecommendFromLocationErpCode = detail.RecommendFromLocationErpCode; - detailInput.RecommendFromWarehouseCode = detail.RecommendFromWarehouseCode; - - detailInput.RecommendToQty = detail.RecommendToQty; - detailInput.RecommendToLot = detail.RecommendToLot; - detailInput.RecommendToPackingCode = detailInput.RecommendToPackingCode; - detailInput.RecommendToLot = detail.RecommendToLot; - - detailInput.RecommendToArriveDate = detail.RecommendToArriveDate; - detailInput.RecommendToExpireDate = detail.RecommendToExpireDate; - detailInput.RecommendToProduceDate = detail.RecommendToProduceDate; - detailInput.RecommendToSupplierBatch = detail.RecommendToSupplierBatch; - - detailInput.RecommendToLocationCode = detail.RecommendToLocationCode; - detailInput.RecommendToLocationGroup = detail.RecommendToLocationGroup; - detailInput.RecommendToLocationArea = detail.RecommendToLocationArea; - detailInput.RecommendToLocationErpCode = detail.RecommendToLocationErpCode; - detailInput.RecommendToWarehouseCode = detail.RecommendToWarehouseCode; - - await _transferLibRequestAppService.CreateAsync(input).ConfigureAwait(false); + if (!await IsMinRowAsync(kittingIssueJob).ConfigureAwait(false)) + { + var input = new TransferLibRequestEditInput(); + input.CallBusinessType = nameof(IKittingIssueJobAppService); + input.CallJobNumber = kittingIssueJob.Number; + input.CallRequestNumber = kittingIssueJob.KittingRequestNumber; + input.CallServerName = "Win_in.Sfs.Wms.Store.Application.KittingIssueJobAppService"; + input.Type = "Transfer_Warehouse"; + input.UseOnTheWayLocation = true; + + var detailInput = new TransferLibRequestDetailInput(); + detailInput.CallBusinessType = nameof(IKittingIssueJobAppService); + detailInput.CallRequestNumber = kittingIssueJob.KittingRequestNumber; + detailInput.CallServerName = "Win_in.Sfs.Wms.Store.Application.KittingIssueJobAppService"; + detailInput.CallJobNumber = kittingIssueJob.Number; + + detailInput.JobStatus = EnumJobStatus.Open; + detailInput.ItemCode = detail.ItemCode; + detailInput.StdPackQty = detail.StdPackQty; + detailInput.Uom = detail.Uom; + detailInput.Status = detail.Status; + + detailInput.RecommendFromQty = detail.RecommendFromQty; + detailInput.RecommendFromLot = detail.RecommendFromLot; + detailInput.RecommendFromPackingCode = detailInput.RecommendFromPackingCode; + detailInput.RecommendToLot = detail.RecommendToLot; + + detailInput.RecommendFromArriveDate = detail.RecommendFromArriveDate; + detailInput.RecommendFromExpireDate = detail.RecommendFromExpireDate; + detailInput.RecommendFromProduceDate = detail.RecommendFromProduceDate; + detailInput.RecommendFromSupplierBatch = detail.RecommendFromSupplierBatch; + + detailInput.RecommendFromLocationCode = detail.RecommendFromLocationCode; + detailInput.RecommendFromLocationGroup = detail.RecommendFromLocationGroup; + detailInput.RecommendFromLocationArea = detail.RecommendFromLocationArea; + detailInput.RecommendFromLocationErpCode = detail.RecommendFromLocationErpCode; + detailInput.RecommendFromWarehouseCode = detail.RecommendFromWarehouseCode; + + detailInput.RecommendToQty = detail.RecommendToQty; + detailInput.RecommendToLot = detail.RecommendToLot; + detailInput.RecommendToPackingCode = detailInput.RecommendToPackingCode; + detailInput.RecommendToLot = detail.RecommendToLot; + + detailInput.RecommendToArriveDate = detail.RecommendToArriveDate; + detailInput.RecommendToExpireDate = detail.RecommendToExpireDate; + detailInput.RecommendToProduceDate = detail.RecommendToProduceDate; + detailInput.RecommendToSupplierBatch = detail.RecommendToSupplierBatch; + + detailInput.RecommendToLocationCode = detail.RecommendToLocationCode; + detailInput.RecommendToLocationGroup = detail.RecommendToLocationGroup; + detailInput.RecommendToLocationArea = detail.RecommendToLocationArea; + detailInput.RecommendToLocationErpCode = detail.RecommendToLocationErpCode; + detailInput.RecommendToWarehouseCode = detail.RecommendToWarehouseCode; + + await _transferLibRequestAppService.CreateAsync(input).ConfigureAwait(false); + } } } } @@ -210,9 +215,9 @@ public class KittingIssueJobEventHandler : { var detail = kittingIssueJob.Details.FirstOrDefault(); - var loctionDto = await _locationAppService.GetByCodeAsync(detail.RecommendFromLocationCode) + var locationDto = await _locationAppService.GetByCodeAsync(detail.RecommendFromLocationCode) .ConfigureAwait(false); - if (loctionDto.RowCode == 1) + if (locationDto.Type==EnumLocationType.RAW&& locationDto.RowCode == 1) { return true; } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/KittingIssueRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/KittingIssueRequestEventHandler.cs index 34efc97f3..b411ea27e 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/KittingIssueRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/KittingIssueRequestEventHandler.cs @@ -1,19 +1,17 @@ using System.Collections.Generic; using System.Linq; -using System.Text; using System.Text.Json; using System.Threading.Tasks; +using AutoMapper.Internal; using Castle.Components.DictionaryAdapter; using Volo.Abp; using Volo.Abp.EventBus; 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; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; @@ -30,17 +28,21 @@ public class KittingIssueRequestEventHandler private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly ILocationAppService _locationAppService; private readonly IBalanceAppService _balanceAppService; + //private readonly IKittingIssueRequestManager _kittingIssueRequestManager; public KittingIssueRequestEventHandler( IKittingIssueJobAppService kittingIssueJobAppService, IProductionLineAppService productionLineAppService, ILocationAppService locationAppService, - IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService) + IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService + //, IKittingIssueRequestManager kittingIssueRequestManager + ) { _kittingIssueJobAppService = kittingIssueJobAppService; _productionLineAppService = productionLineAppService; _locationAppService = locationAppService; _balanceAppService = balanceAppService; _productionLineItemAppService = productionLineItemAppService; + //_kittingIssueRequestManager = kittingIssueRequestManager; } /// @@ -49,7 +51,9 @@ public class KittingIssueRequestEventHandler /// Event data public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) { - await Task.CompletedTask.ConfigureAwait(false); + var entity = eventData.Entity; + + await CreateAllKittingIssueJobAsync(entity).ConfigureAwait(false); } /// @@ -58,6 +62,8 @@ public class KittingIssueRequestEventHandler /// Event data public virtual async Task HandleEventAsync(SfsCreatedEntityEventData> eventData) { + var entity = eventData.Entity; + await Task.CompletedTask.ConfigureAwait(false); } @@ -70,22 +76,7 @@ public class KittingIssueRequestEventHandler { var entity = eventData.Entity; - List kittingIssueJobs = new EditableList(); - - //switch (entity.Type) - //{ - // case nameof(EnumIssueType.BoxQty): - // kittingIssueJobs = await CreateKittingIssueJobWithBoxQtyTypeAsync(entity).ConfigureAwait(false); - // break; - // case nameof(EnumIssueType.Qty): - // kittingIssueJobs = await CreateKittingIssueJobWithQtyTypeAsync(entity).ConfigureAwait(false); - // break; - //} - - if (kittingIssueJobs.Any()) - { - await _kittingIssueJobAppService.CreateManyAsync(kittingIssueJobs).ConfigureAwait(false); - } + await CreateAllKittingIssueJobAsync(entity).ConfigureAwait(false); } /// @@ -116,106 +107,98 @@ public class KittingIssueRequestEventHandler #region 按数量叫料 /// - /// 创建注塑任务 + /// 创建注塑任务-按数量 /// /// + /// + /// + /// /// /// private async Task> CreateKittingIssueJobWithQtyTypeAsync - (KittingIssueRequest kittingIssueRequest) + (KittingIssueRequest kittingIssueRequest, List kittingIssueRequestDetails, + List recommendbalanceDtos, + List useBalanceList) { var jobs = new List(); + //用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉 + var tempDetailDtos = + ObjectMapper.Map, List>( + kittingIssueRequestDetails); - var toLocationCodes = kittingIssueRequest.Details.Select(p => p.ToLocationCode).Distinct().ToList(); //所有发送库位的集合 - var toLocations = await _locationAppService.GetByCodesAsync(toLocationCodes).ConfigureAwait(false); //所有库位的集合 + var kittingIssueJobDetailInputs = new List(); - var kittingIssueRequestDetails = kittingIssueRequest.Details.Where(p => p.ToBeIssuedQty > 0); //所有还没发送物品的集合 - foreach (var kittingIssueRequestDetail in kittingIssueRequestDetails) //如果有还有剩余未叫料的数量 则创建新的任务 + if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0) { - var toLocation = - toLocations.FirstOrDefault(p => p.Code == kittingIssueRequestDetail.ToLocationCode); //判断目标库位是否存在 - Check.NotNull(toLocation, "库位代码", $"库位 {kittingIssueRequestDetail.ToLocationCode} 不存在"); - - //创建详情 - var jobDetails = - await CreateKittingIssueJobDetailInputsWithQtyTypeAsync(kittingIssueRequest, kittingIssueRequestDetail, - toLocation.LocationGroupCode).ConfigureAwait(false); - if (!jobDetails.Any()) + var queue = new Queue(recommendbalanceDtos); + while (queue.TryDequeue(out var balanceDto)) { - continue; - } - - var fromLocationCode = jobDetails[0].RecommendFromLocationCode; - var fromLocation = await _locationAppService.GetByCodeAsync(fromLocationCode).ConfigureAwait(false); - var job = jobs.FirstOrDefault(p => p.WorkGroupCode == fromLocation?.WorkGroupCode); - if (job == null || job.Details.Any(p => p.RecommendToLocationCode != kittingIssueRequestDetail.ToLocationCode)) - { - job = await BuildKittingIssueJobCreateInputWithQtyTypeAsync(kittingIssueRequest, fromLocation) - .ConfigureAwait(false); - jobs.Add(job); - } + var next = false; - job.Details.AddRange(jobDetails); - if (kittingIssueRequestDetail.ToBeIssuedQty < 0) - { - kittingIssueRequestDetail.Status = EnumStatus.Close; - } - } + var temp = tempDetailDtos.ToList(); - jobs = jobs.Where(p => p.Details.Any()).ToList(); + foreach (var tempDetailDto in tempDetailDtos) + { + //未发送的数量 + tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty; + + if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额 + { + tempDetailDto.Qty -= balanceDto.Qty; + } + else if (tempDetailDto.Qty <= balanceDto.Qty) + { + temp.Remove(tempDetailDto); + balanceDto.Qty = tempDetailDto.Qty; + } + + kittingIssueJobDetailInputs.Add( + await BuildKittingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto) + .ConfigureAwait(false)); + useBalanceList.Add(balanceDto); + + if (balanceDto.Qty <= 0) + { + next = true; + break; + } + } - var openRequestDetails = - kittingIssueRequest.Details.Where(p => p.Status != EnumStatus.Close).ToList(); + tempDetailDtos = temp; - if (!openRequestDetails.Any()) - { - return jobs; + if (next) + { + } + } } - - var enableMultipleCreateKittingIssueJob = await SettingManager - .IsTrueAsync(StoreSettings.MaterialRequest.EnableMultipleCreateIssueJob).ConfigureAwait(false); - if (enableMultipleCreateKittingIssueJob) + if (kittingIssueJobDetailInputs.Any()) { - //kittingIssueRequest.Partial(); - } - else - { - var sb = new StringBuilder(); - foreach (var openRequestDetail in openRequestDetails) - { - sb.AppendLine( - $"{openRequestDetail.ItemCode}请求数量 {openRequestDetail.Qty},可用库存数量 {openRequestDetail.IssuedQty}"); - } - - throw new UserFriendlyException($"{sb} 可用库存数量不足, 无法生成发料任务"); + var kittingIssueJobEditInput = new KittingIssueJobEditInput(); + kittingIssueJobEditInput = await BuildKittingIssueJobCreateInputWithQtyTypeAsync(kittingIssueRequest, + kittingIssueRequestDetails.First()).ConfigureAwait(false); + kittingIssueJobEditInput.Details = kittingIssueJobDetailInputs; + jobs.Add(kittingIssueJobEditInput); } return jobs; } /// - /// 构造注塑任务 + /// 构造注塑任务-按数量 /// /// - /// + /// /// private async Task BuildKittingIssueJobCreateInputWithQtyTypeAsync( - KittingIssueRequest kittingIssueRequest, - LocationDTO fromLocation) + KittingIssueRequest kittingIssueRequest, KittingIssueRequestDetail requestDetailInput) { - KittingIssueJobEditInput job; - job = ObjectMapper.Map(kittingIssueRequest); + var job = ObjectMapper.Map(kittingIssueRequest); job.JobType = EnumJobType.IssueJob; job.JobStatus = EnumJobStatus.Open; - job.WorkGroupCode = fromLocation.WorkGroupCode; - job.WarehouseCode = fromLocation.WarehouseCode; + job.WorkGroupCode = requestDetailInput.ToLocationGroup; + job.WarehouseCode = requestDetailInput.ToWarehouseCode; job.Worker = kittingIssueRequest.Worker; - if (string.IsNullOrEmpty(job.Worker)) - { - job.Worker = "admin"; - } - job.KittingRequestNumber = kittingIssueRequest.Number; await Task.CompletedTask.ConfigureAwait(false); @@ -223,87 +206,35 @@ public class KittingIssueRequestEventHandler return job; } - /// - /// 创建注塑任务明细 - /// - /// - /// - /// - /// - /// - private async Task> CreateKittingIssueJobDetailInputsWithQtyTypeAsync( - KittingIssueRequest kittingIssueRequest, - KittingIssueRequestDetail kittingIssueRequestDetail, string toLocationGroupCode) - { - var jobDetails = new List(); - - //获取推荐库存 - var productionLineDto = await _productionLineAppService - .GetByLocationCodeAsync(kittingIssueRequestDetail.ToLocationCode).ConfigureAwait(false); - var productionLineItemDtos = await _productionLineItemAppService - .GetByProductLineCodeAsync(productionLineDto.Code).ConfigureAwait(false); - if (productionLineItemDtos == null) - { - throw new UserFriendlyException($"物品代码【{kittingIssueRequestDetail.ItemCode}】没有对应的【生产线物品关系】"); - } - - var productionLineItemDto = - productionLineItemDtos.FirstOrDefault(p => p.ItemCode == kittingIssueRequestDetail.ItemCode); - var input = new RecommendBalanceRequestInput - { - ItemCode = kittingIssueRequestDetail.ItemCode, - Qty = kittingIssueRequestDetail.ToBeIssuedQty, - //LocationTypes = transactionType.OutLocationTypes, productionLineItemDto.RawLocationCodeListJson - Statuses = new EditableList { EnumInventoryStatus.OK }, - Locations = JsonSerializer.Deserialize>(productionLineItemDto.RawLocationCodeListJson) - }; - - var recommendList = await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false); - //没有推荐库存时 跳过此明细 不生成任务 - if (recommendList.Count != 0) - { - foreach (var recommend in recommendList) - { - //拿走需求量 - var detail = - await BuildKittingIssueJobDetailWithQtyTypeAsync(kittingIssueRequestDetail, recommend, - toLocationGroupCode) - .ConfigureAwait(false); - if (kittingIssueRequest.UseOnTheWayLocation) - { - //获取在途库 - var locationDto = await _locationAppService.GetFirstByTypeAsync(EnumLocationType.TRANSPORT) - .ConfigureAwait(false); - - detail.OnTheWayLocationCode = locationDto.Code; - } - - jobDetails.Add(detail); - kittingIssueRequestDetail.IssuedQty += recommend.Qty; - - //await _kittingIssueRequestManager.UpdateDetailsAsync(kittingIssueRequest).ConfigureAwait(false); - } - } - - return jobDetails; - } /// - /// 构造注塑任务明细 + /// 构造注塑任务明细-按数量 /// /// /// - /// /// private async Task BuildKittingIssueJobDetailWithQtyTypeAsync( - KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balance, string toLocationGroupCode) + KittingIssueRequestDetailDTO kittingIssueRequestDetail, BalanceDTO balance) { - //ProductionLineDTO prodLine = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationGroupCode).ConfigureAwait(false); - - var detail = ObjectMapper.Map(balance); + var detail = new KittingIssueJobDetailInput(); detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.PositionCode = kittingIssueRequestDetail.PositionCode; detail.RecommendType = kittingIssueRequestDetail.RecommendType; + detail.Uom = balance.Uom; + detail.ItemCode= balance.ItemCode; + detail.ItemDesc2= balance.ItemDesc2; + detail.ItemDesc1= balance.ItemDesc1; + detail.ItemName= balance.ItemName; + detail.ProdLine= kittingIssueRequestDetail.ProdLine; + detail.RequestQty = balance.Qty; + detail.StdPackQty = kittingIssueRequestDetail.StdPackQty; + detail.Status = balance.Status; + + detail.RequestLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; + detail.RequestLocationArea = kittingIssueRequestDetail.ToLocationArea; + detail.RequestWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; + detail.RequestLocationGroup = kittingIssueRequestDetail.ToLocationGroup; + detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.RecommendFromPackingCode = balance.PackingCode; detail.RecommendFromContainerCode = balance.ContainerCode; @@ -313,21 +244,69 @@ public class KittingIssueRequestEventHandler detail.RecommendFromLot = balance.Lot; detail.RecommendFromProduceDate = balance.ProduceDate; detail.RecommendFromArriveDate = balance.ArriveDate; + detail.RecommendFromQty = balance.Qty; + detail.RecommendFromContainerCode= balance.ContainerCode; + detail.RecommendFromPackingCode= balance.PackingCode; + + detail.RecommendToPackingCode = balance.PackingCode; + detail.RecommendToContainerCode = balance.ContainerCode; + detail.RecommendToSupplierBatch = balance.SupplierBatch; + detail.RecommendToProduceDate = balance.ProduceDate; + detail.RecommendToExpireDate = balance.ExpireDate; + detail.RecommendToLot = balance.Lot; + detail.RecommendToProduceDate = balance.ProduceDate; + detail.RecommendToArriveDate = balance.ArriveDate; + detail.RecommendToQty = balance.Qty; + detail.RecommendToContainerCode = balance.ContainerCode; + detail.RecommendToPackingCode = balance.PackingCode; + detail.RecommendFromLocationArea = balance.LocationArea; detail.RecommendFromLocationCode = balance.LocationCode; detail.RecommendFromLocationErpCode = balance.LocationErpCode; detail.RecommendFromLocationGroup = balance.LocationGroup; detail.RecommendFromWarehouseCode = balance.WarehouseCode; - detail.RecommendFromQty = balance.Qty; - detail.Uom = balance.Uom; detail.RecommendToLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.RecommendToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationArea = kittingIssueRequestDetail.ToLocationArea; detail.RecommendToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; + detail.RecommendToLocationGroup = kittingIssueRequestDetail.ToLocationGroup; + + detail.TransferLibFromPackingCode = balance.PackingCode; + detail.TransferLibFromContainerCode = balance.ContainerCode; + detail.TransferLibFromSupplierBatch = balance.SupplierBatch; + detail.TransferLibFromProduceDate = balance.ProduceDate; + detail.TransferLibFromExpireDate = balance.ExpireDate; + detail.TransferLibFromLot = balance.Lot; + detail.TransferLibFromProduceDate = balance.ProduceDate; + detail.TransferLibFromArriveDate = balance.ArriveDate; + detail.TransferLibFromQty = balance.Qty; + detail.TransferLibFromContainerCode= balance.ContainerCode; + detail.TransferLibFromPackingCode = balance.PackingCode; + + detail.TransferLibToPackingCode = balance.PackingCode; + detail.TransferLibToContainerCode = balance.ContainerCode; + detail.TransferLibToSupplierBatch = balance.SupplierBatch; + detail.TransferLibToProduceDate = balance.ProduceDate; + detail.TransferLibToExpireDate = balance.ExpireDate; + detail.TransferLibToLot = balance.Lot; + detail.TransferLibToProduceDate = balance.ProduceDate; + detail.TransferLibToArriveDate = balance.ArriveDate; + detail.TransferLibToQty = balance.Qty; + detail.TransferLibToPackingCode = balance.PackingCode; + + detail.TransferLibFromLocationArea = balance.LocationArea; + detail.TransferLibFromLocationCode = balance.LocationCode; + detail.TransferLibFromLocationErpCode = balance.LocationErpCode; + detail.TransferLibFromLocationGroup = balance.LocationGroup; + detail.TransferLibFromWarehouseCode = balance.WarehouseCode; + + detail.TransferLibToLocationCode = kittingIssueRequestDetail.ToLocationCode; + detail.TransferLibToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; + detail.TransferLibToLocationArea = kittingIssueRequestDetail.ToLocationArea; + detail.TransferLibToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; + detail.TransferLibToLocationGroup = kittingIssueRequestDetail.ToLocationGroup; - //detail.ProdLine = prodLine == null ? toLocationGroupCode : prodLine.Code; - detail.ProdLine = toLocationGroupCode; await Task.CompletedTask.ConfigureAwait(false); return detail; } @@ -337,72 +316,71 @@ public class KittingIssueRequestEventHandler #region 按箱叫料 /// - /// 创建注塑任务 + /// 创建注塑任务 按箱叫料-按箱 /// /// + /// + /// + /// /// /// private async Task> CreateKittingIssueJobWithBoxQtyTypeAsync - (KittingIssueRequest kittingIssueRequest) + ( + KittingIssueRequest kittingIssueRequest, + List kittingIssueRequestDetailList, + List recommendbalanceDtos, + List useBalanceList) { var inputJobs = new List(); - var inputExpectOutEditInput = new ExpectOutEditInput(); - //已用的库存的箱码集合 - var useBalanceList = new List(); - - var groupByItemCodeAndLocationCode = - kittingIssueRequest.Details.GroupBy(p => new { p.ItemCode, p.ToLocationCode }); + + //已用的库存的集合 + useBalanceList = useBalanceList; - foreach (var locationCodeItemCodeGroup in groupByItemCodeAndLocationCode) + foreach (var detail in kittingIssueRequestDetailList) { - var inputDetails = kittingIssueRequest.Details.Where(p => - p.ItemCode == locationCodeItemCodeGroup.Key.ItemCode && - p.ToLocationCode == locationCodeItemCodeGroup.Key.ToLocationCode); - var inputDetailTemplate = inputDetails.First(); + //当前零件的集合 + var inputDetails = kittingIssueRequestDetailList; //获取请求下 这个零件和这个库位一个需要多少箱 - var sumBoxQty = inputDetails.Sum(p => p.BoxQty); + var sumBoxQty = inputDetails.Sum(p => p.BoxQty-p.IssuedQty); //获取生产线 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) + .GetByProductLineCodeAndItemCodeAsync(productionLineDto.Code, detail.ItemCode) .ConfigureAwait(false); if (productLineCodeAndItemCode == null) { throw new UserFriendlyException( - $"物品代码【{inputDetailTemplate.ItemCode}】在生产线【{productionLineDto.Code}】中没有对应的【生产线物品关系】"); + $"物品代码【{detail.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 usableList = recommendbalanceDtos; + usableList = usableList.Where(p => !useBalanceList.Select(p => p.PackingCode).Contains(p.PackingCode)) + .ToList(); if (usableList.Any()) { for (var i = 0; i < sumBoxQty; i++) { - var firstUsable = usableList.First(); - useBalanceList.Add(firstUsable.PackingCode); - usableList.Remove(firstUsable); - - var kittingIssueJobEditInput = - await BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(kittingIssueRequest, inputDetailTemplate, - firstUsable) - .ConfigureAwait(false); - - inputJobs.Add(kittingIssueJobEditInput); + if (usableList.Any()) + { + var firstUsable = usableList.First(); + useBalanceList.Add(firstUsable); + usableList.Remove(firstUsable); + + var kittingIssueJobEditInput = + await BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(kittingIssueRequest, + detail, firstUsable) + .ConfigureAwait(false); + + inputJobs.Add(kittingIssueJobEditInput); + } + else + { + break; + } } } } @@ -411,7 +389,7 @@ public class KittingIssueRequestEventHandler } /// - /// 构造注塑任务 + /// 构造注塑任务-按箱 /// /// /// @@ -438,7 +416,7 @@ public class KittingIssueRequestEventHandler } /// - /// 构造注塑任务明细 + /// 构造注塑任务明细-按箱 /// /// /// @@ -453,6 +431,7 @@ public class KittingIssueRequestEventHandler detail.RequestLocationArea = kittingIssueRequestDetail.ToLocationArea; detail.RequestLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; detail.RequestWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; + detail.RequestQty = 1; detail.PositionCode = kittingIssueRequestDetail.PositionCode; detail.RecommendType = kittingIssueRequestDetail.RecommendType; @@ -509,4 +488,172 @@ public class KittingIssueRequestEventHandler #endregion #endregion + + //创建任务 + private async Task> CreateAllKittingIssueJobAsync( + KittingIssueRequest kittingIssueRequest) + { + var kittingIssueJobEditInputs = new List(); + + //已用的库存的集合 + var useBalanceList = new List(); + + foreach (var groupbyItemCodeAndProdLine in kittingIssueRequest.Details.GroupBy(p => + new { p.ItemCode })) + { + foreach (var kittingIssueRequestDetail in groupbyItemCodeAndProdLine) + { + var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync( + kittingIssueRequestDetail.ProdLine, + groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false); + + if (productionLineItemDto == null) + { + throw new UserFriendlyException( + $"未在生产线【{kittingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请查看【生产线物品关系】"); + } + + //原料 + if (!string.IsNullOrEmpty(productionLineItemDto.RawLocationCodeListJson)) //因为一个零件 要不是原料 要不是半成品 + { + var usableLocationCode = + JsonSerializer.Deserialize>(productionLineItemDto.RawLocationCodeListJson); + if (!usableLocationCode.Any()) + { + break; + } + + //获取可用库存 + var input = new RecommendBalanceRequestInput + { + ItemCode = kittingIssueRequestDetail.ItemCode, + Qty = decimal.MaxValue, + Statuses = new EditableList { EnumInventoryStatus.OK }, + Locations = + JsonSerializer.Deserialize>(productionLineItemDto.RawLocationCodeListJson), + IsPackingCode = true + }; + var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); + + //因为是按箱叫料 先把值赋值给箱数量上 + kittingIssueRequestDetail.BoxQty = kittingIssueRequestDetail.Qty; + + if (usableList.Any()) + { + //因为是原料所以按箱叫料 + kittingIssueJobEditInputs.AddRange( + await CreateKittingIssueJobWithBoxQtyTypeAsync(kittingIssueRequest, + new EditableList { kittingIssueRequestDetail }, usableList, + useBalanceList).ConfigureAwait(false)); + } + } + + //半成品 + if (!string.IsNullOrEmpty(productionLineItemDto.ProductLocationCodeListJson)) //因为一个零件 要不是原料 要不是半成品 + { + var usableLocationCode = + JsonSerializer.Deserialize>(productionLineItemDto.ProductLocationCodeListJson); + if (!usableLocationCode.Any()) + { + break; + } + + //获取可用库存 + var input = new RecommendBalanceRequestInput + { + ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode, + Qty = kittingIssueRequestDetail.Qty, + Statuses = new EditableList { EnumInventoryStatus.OK }, + Locations = + JsonSerializer.Deserialize>(productionLineItemDto.ProductLocationCodeListJson), + IsPackingCode = false + }; + var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false); + var temp = usableList.ToList(); + + foreach (var balanceDto in usableList) //计算已经用过的库存 + { + var useBalanceDto = useBalanceList.Where(p => + p.ItemCode == balanceDto.ItemCode && p.LocationCode == balanceDto.LocationCode && + p.Lot == balanceDto.Lot && p.Status == balanceDto.Status && + p.PackingCode == balanceDto.PackingCode); + if (useBalanceDto.Any()) //如果不为NULL,就是用过了的库存 需要减去使用量 + { + balanceDto.Qty -= useBalanceDto.Sum(p => p.Qty); + if (balanceDto.Qty <= 0) + { + temp.Remove(balanceDto); + } + } + } + + usableList = temp; + + kittingIssueJobEditInputs.AddRange( + await CreateKittingIssueJobWithQtyTypeAsync(kittingIssueRequest, + new List { kittingIssueRequestDetail }, temp, + useBalanceList).ConfigureAwait(false)); + } + } + } + + if (kittingIssueJobEditInputs.Count > 0)//有库存 可以创建任务 + { + //新增任务 + var addKittingIssueJobDtos= await _kittingIssueJobAppService.CreateManyAsync(kittingIssueJobEditInputs).ConfigureAwait(false); + + await UpdateKittingIssueRequestDetailQtyAsync(kittingIssueRequest, addKittingIssueJobDtos).ConfigureAwait(false); + + return addKittingIssueJobDtos; + } + + return new List(); + } + + /// + /// 修改请求的 已发 已收数量 + /// + /// + /// + /// + private async Task UpdateKittingIssueRequestDetailQtyAsync(KittingIssueRequest kittingIssueRequest, List addKittingIssueJobDtos) + { + //原有任务 + var existKittingIssueJobDtos = await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number) + .ConfigureAwait(false); + + //新增的任务和已有的任务总和 + var allKittingIssueJobDtos = new List(); + allKittingIssueJobDtos.AddRange(addKittingIssueJobDtos); + allKittingIssueJobDtos.AddRange(existKittingIssueJobDtos); + + var groupByItemCodeLocationCode = kittingIssueRequest.Details.GroupBy(p => + new { p.ItemCode, p.ToLocationCode }); + foreach (var group in groupByItemCodeLocationCode) + { + foreach (var requestDetail in group) + { + //所有已发数量 + decimal allIssuedQty = 0; + + //所有已发数量 + decimal allReceivedQty = 0; + + foreach (var allKittingIssueJobDto in allKittingIssueJobDtos) + { + var jobDetailDtos = allKittingIssueJobDto.Details.Where(p => + p.ItemCode == group.Key.ItemCode && p.RequestLocationCode == group.Key.ToLocationCode); + //所有已发数量 + allIssuedQty += jobDetailDtos.Sum(p => p.RequestQty); + //所有已发数量 + allReceivedQty += jobDetailDtos.Sum(p => p.HandledToQty); + } + + requestDetail.IssuedQty += allIssuedQty; + requestDetail.ReceivedQty += allReceivedQty; + } + } + + //await _kittingIssueRequestManager.UpdateAsync(kittingIssueRequest).ConfigureAwait(false); + } }