diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs index e629da700..6db7b8d01 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeEditInput.cs @@ -13,6 +13,7 @@ public class PositionCodeEditInput : SfsBaseDataCreateOrUpdateInputBase /// 物料号 /// [Display(Name = "物料号")] + [Required(ErrorMessage = "{0}是必填项")] public string PartCode { get; set; } /// /// 物料名称 @@ -33,6 +34,7 @@ public class PositionCodeEditInput : SfsBaseDataCreateOrUpdateInputBase /// 库位 /// [Display(Name = "库位")] + [Required(ErrorMessage = "{0}是必填项")] public string LocationCode { get; set; } /// /// 库位名称 @@ -48,6 +50,7 @@ public class PositionCodeEditInput : SfsBaseDataCreateOrUpdateInputBase /// 类型 /// [Display(Name = "类型")] + [Required(ErrorMessage = "{0}是必填项")] public EnumRecommendType Type { get; set; } #endregion diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs index 53432b077..825994c1d 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/PositionCode/Inputs/PositionCodeImportInput.cs @@ -8,10 +8,10 @@ namespace Win_in.Sfs.Basedata.Application.Contracts; public class PositionCodeImportInput : SfsBaseDataImportInputBase { /// - /// 代码 + /// 位置码 /// [Key] - [Display(Name = "代码")] + [Display(Name = "位置码")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] [Required(ErrorMessage = "{0}是必填项")] public string Code { get; set; } @@ -20,6 +20,7 @@ public class PositionCodeImportInput : SfsBaseDataImportInputBase /// [Display(Name = "物料号")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + [Required(ErrorMessage = "{0}是必填项")] public string PartCode { get; set; } /// /// 物料名称 @@ -44,6 +45,7 @@ public class PositionCodeImportInput : SfsBaseDataImportInputBase /// [Display(Name = "库位")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + [Required(ErrorMessage = "{0}是必填项")] public string LocationCode { get; set; } /// /// 库位名称 @@ -54,8 +56,7 @@ public class PositionCodeImportInput : SfsBaseDataImportInputBase /// /// 标包数量 /// - [Display(Name = "标包数量")] - [Required(ErrorMessage = "{0}是必填项")] + [Display(Name = "标包数量")] public decimal StdPackQty { get; set; } /// /// 类型 diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs index 29bd0b204..043d22231 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/PositionCode/PositionCodeAppService.cs @@ -1,12 +1,17 @@ +using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; +using DocumentFormat.OpenXml.Vml.Office; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Volo.Abp; using Volo.Abp.Caching; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; +using Volo.Abp.ObjectMapping; using Volo.Abp.Uow; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Domain; @@ -23,18 +28,27 @@ public class PositionCodeAppService , IPositionCodeAppService { private readonly IPositionCodeManager _manager; - private new readonly IPositionCodeRepository _repository; + + private new readonly IPositionCodeRepository _repository; + - public PositionCodeAppService(IPositionCodeRepository repository, IDistributedCache cache, IPositionCodeManager manager) : base(repository, cache) + public PositionCodeAppService(IPositionCodeRepository repository, + IDistributedCache cache, IPositionCodeManager manager) : base(repository, cache) { base.CreatePolicyName = CategoryPermissions.Create; base.UpdatePolicyName = CategoryPermissions.Update; base.DeletePolicyName = CategoryPermissions.Delete; _manager = manager; _repository = repository; + } - + /// + /// 用来重写 新增实体 + /// + /// + /// + /// [HttpPost("")] [UnitOfWork] public override async Task CreateAsync(PositionCodeEditInput input) @@ -53,33 +67,82 @@ 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") + { + throw new UserFriendlyException($"{input.PartCode} 物料号类型必须为原料"); + } input.PartName = itemBasic.Name; input.PartDesc = itemBasic.Desc1; input.BasicUom = itemBasic.BasicUom; + input.StdPackQty = itemBasic.StdPackQty; var location = await LocationAppService.GetByCodeAsync(input.LocationCode).ConfigureAwait(false); Check.NotNull(location, "库位代码", $"库位 {input.LocationCode} 不存在"); + //如果类型选择为原料,库位的类型必须为原料库位 + if (input.Type == EnumRecommendType.W && location.Type != EnumLocationType.RAW) + { + throw new UserFriendlyException($"{input.LocationCode} 库位的类型必须为原料库位"); + } input.LocationName = location.Name; - if(input.Code.Contains('W')) + if(input.Type== EnumRecommendType.None) { - input.Type = EnumRecommendType.W; + throw new UserFriendlyException($"{input.Type} 位置码类型不正确"); + } + + return await base.CreateAsync(input).ConfigureAwait(false); + } + + /// + /// 用来重写 更新实体 + /// + /// + /// + /// + /// + [HttpPut] + [Route("{id}")] + public override async Task UpdateAsync(Guid id, PositionCodeEditInput input) + { + var entity = await _repository.GetAsync(id).ConfigureAwait(false); + if (entity == null) + { + throw new UserFriendlyException($"{id} 未找到位置码信息"); } - else if (input.Code.Contains('Q')) + var itemEntity = await _repository.FirstOrDefaultAsync(p => p.PartCode == input.PartCode && p.Code!=input.Code).ConfigureAwait(false); + if (itemEntity != null) { - input.Type = EnumRecommendType.Q; + throw new UserFriendlyException($"{input.PartCode} 物品已存在"); } - else if(input.Code.Contains('K')) + + + var itemBasic = await ItemBasicAppService.GetByCodeAsync(input.PartCode).ConfigureAwait(false); + Check.NotNull(itemBasic, "物品代码", $"物品 {input.PartCode} 不存在"); + //如果类型选择为原料,校验物料号类型必须为原料,器具、KItting 的不用加校验 + if (input.Type == EnumRecommendType.W && itemBasic.Type != "10C02") { - input.Type = EnumRecommendType.K; + throw new UserFriendlyException($"{input.PartCode} 物料号类型必须为原料"); } - else + entity.PartName = itemBasic.Name; + entity.PartDesc = itemBasic.Desc1; + entity.BasicUom = itemBasic.BasicUom; + entity.StdPackQty = itemBasic.StdPackQty; + + var location = await LocationAppService.GetByCodeAsync(input.LocationCode).ConfigureAwait(false); + Check.NotNull(location, "库位代码", $"库位 {input.LocationCode} 不存在"); + //如果类型选择为原料,库位的类型必须为原料库位 + if (input.Type == EnumRecommendType.W && location.Type!= EnumLocationType.RAW) { - input.Type = EnumRecommendType.None; + throw new UserFriendlyException($"{input.LocationCode} 库位的类型必须为原料库位"); } + entity.LocationName = location.Name; - - return await base.CreateAsync(input).ConfigureAwait(false); + await _repository.UpdateAsync(entity).ConfigureAwait(false); + var dto = ObjectMapper.Map(entity); + + return dto; + } /// @@ -94,11 +157,48 @@ public class PositionCodeAppService foreach (var positionCode in addList) { + var itemBasic = await ItemBasicAppService.GetByCodeAsync(positionCode.PartCode).ConfigureAwait(false); + positionCode.PartName = itemBasic.Name; + positionCode.PartDesc = itemBasic.Desc1; + positionCode.BasicUom = itemBasic.BasicUom; + positionCode.StdPackQty = itemBasic.StdPackQty; positionCode.Code = positionCode.Type + positionCode.Code; positionCode.CreatorId= CurrentUser.Id; + var location = await LocationAppService.GetByCodeAsync(positionCode.LocationCode).ConfigureAwait(false); + positionCode.LocationName = location.Name; } return dictionary; } + private async Task CheckPositionCodeInputAsync(PositionCodeImportInput input, List validationRresult) + { + var itemEntity = await _repository.FirstOrDefaultAsync(p => p.PartCode == input.PartCode && p.Code != input.Code).ConfigureAwait(false); + if (itemEntity != null) + { + validationRresult.Add(new ValidationResult($"物品代码{input.PartCode}已存在", new string[] { "物品代码" })); + } + var itemBasic = await ItemBasicAppService.GetByCodeAsync(input.PartCode).ConfigureAwait(false); + //如果类型选择为原料,校验物料号类型必须为原料,器具、KItting 的不用加校验 + if (input.Type == EnumRecommendType.W && 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) + { + validationRresult.Add(new ValidationResult($"库位代码{input.LocationCode} 库位的类型必须为原料库位", new string[] { "库位类型" })); + } + } + + protected override async Task ValidateImportModelAsync(PositionCodeImportInput importInput, List validationRresult) + { + await base.ValidateImportModelAsync(importInput, validationRresult).ConfigureAwait(false); + await CheckPositionCodeInputAsync(importInput, validationRresult).ConfigureAwait(false); + await base.CheckItemBasicItemCodeAsync(importInput.PartCode, validationRresult).ConfigureAwait(false); + await base.CheckRawLocationAsync(importInput.LocationCode, validationRresult).ConfigureAwait(false); + + } + } 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 ea81e7e09..4b64c050b 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 @@ -13,20 +13,20 @@ public enum EnumRecommendType None = 0, /// - /// 位置码 + /// 原料 /// - [Display(Name = "位置码")] + [Display(Name = "原料")] W = 1, /// - /// 器具码 + /// 器具 /// - [Display(Name = "器具码")] + [Display(Name = "器具")] Q = 2, /// - /// Kitting箱码 + /// kitting区 /// - [Display(Name = "Kitting箱码")] + [Display(Name = "Kitting区")] K = 3 } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobEditInput.cs index 3fc12e68e..759bd3f2b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/Inputs/ProductRecycleJobEditInput.cs @@ -10,6 +10,13 @@ public class ProductRecycleJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCr { #region Create + /// + /// 车间 + /// + [Display(Name = "车间")] + [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] + public string Workshop { get; set; } + /// /// 上游任务编号 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAutoMapperProfile.cs index 87069a2b4..a58f3029c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAutoMapperProfile.cs @@ -13,7 +13,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile .ReverseMap(); CreateMap() - ; + ; CreateMap(); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs index fa3bcbfa7..b008dcd02 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAppService.cs @@ -21,6 +21,7 @@ using Volo.Abp.Data; using Volo.Abp.Domain.Entities; using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Wms.Inventory.Application.Contracts; +using Win_in.Sfs.Wms.Inventory.Domain; /// /// 产品退拆申请 @@ -102,15 +103,16 @@ public class ProductRecycleRequestAppService : foreach (var detail in productRecycleRequest.Details) { - var balance = await _balanceAppService.GetByItemLocationAndPackingAsync( - string.Empty, - detail.ItemCode, - detail.LocationCode).ConfigureAwait(false); + //var balance = await _balanceAppService.GetByItemLocationAndPackingAsync( + // string.Empty, + // detail.ItemCode, + // detail.LocationCode).ConfigureAwait(false); - if (balance != null) - { - detail.Status = balance.Status; - } + //if (balance != null) + //{ + // detail.Status = balance.Status; + //} + detail.Status = EnumInventoryStatus.OK; var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode) .ConfigureAwait(false); @@ -188,15 +190,15 @@ public class ProductRecycleRequestAppService : detail.RawLocationGroup = rawLocation.LocationGroupCode; } - var balance = await BalanceAclService.GetByItemLocationAndPackingAsync( - string.Empty, - detail.ItemCode, - detail.LocationCode).ConfigureAwait(false); + //var balance = await BalanceAclService.GetByItemLocationAndPackingAsync( + // string.Empty, + // detail.ItemCode, + // detail.LocationCode).ConfigureAwait(false); - if (balance != null) - { - detail.Status = balance.Status; - } + //if (balance != null) + //{ + // detail.Status = balance.Status; + //} } #endregion diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAutoMapperProfile.cs index 5f5d91fbe..fc94e67c3 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ProductRecycleRequests/ProductRecycleRequestAutoMapperProfile.cs @@ -1,5 +1,6 @@ using AutoMapper; using Volo.Abp.AutoMapper; +using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; @@ -25,8 +26,11 @@ public partial class StoreApplicationAutoMapperProfile : Profile CreateMap(); + CreateMap() + .ReverseMap(); + - CreateMap(); + CreateMap() .IgnoreAuditedObjectProperties() @@ -56,5 +60,13 @@ public partial class StoreApplicationAutoMapperProfile : Profile .Ignore(x => x.Number) .Ignore(x => x.Id) .Ignore(x => x.Remark); + + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationAutoMapperProfile.cs index 465605d0d..64fa4bdb4 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/StoreApplicationAutoMapperProfile.cs @@ -92,6 +92,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile IssueJobAutoMapperProfile(); JisDeliverJobAutoMapperProfile(); ProductReceiveJobAutoMapperProfile(); + ProductRecycleJobAutoMapperProfile(); PurchaseReceiptJobAutoMapperProfile(); PurchaseReturnJobAutoMapperProfile(); PutawayJobAutoMapperProfile(); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductRecycleRequestEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductRecycleRequestEventHandler.cs index 2e0b3a9f8..d2c3ca821 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductRecycleRequestEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductRecycleRequestEventHandler.cs @@ -12,6 +12,9 @@ using Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.Stores; using Application.Contracts; +using Volo.Abp.ObjectMapping; +using Win_in.Sfs.Wms.Inventory.Application.Contracts; +using static Win_in.Sfs.Wms.Store.Domain.Shared.StoreSettings; public class ProductRecycleRequestEventHandler : StoreEventHandlerBase @@ -19,21 +22,32 @@ public class ProductRecycleRequestEventHandler , ILocalEventHandler> , ILocalEventHandler>> { + private readonly IProductRecycleJobAppService _productRecycleJobAppService; private readonly IProductRecycleNoteAppService _productRecycleNoteApp; private readonly IBackFlushNoteAppService _backFlushNoteApp; private readonly IBomAppService _bomApp; private readonly IProductRecycleRequestManager _productRecycleRequestManager; + private readonly IBalanceAppService _balanceAppService; + private readonly ILocationAppService _locationAppService; public ProductRecycleRequestEventHandler( IProductRecycleNoteAppService productRecycleNoteApp, + IBalanceAppService balanceAppService, + ILocationAppService locationAppService, IBackFlushNoteAppService backFlushNoteApp, - IBomAppService bomApp, IProductRecycleRequestManager - productRecycleRequestManager) + IBomAppService bomApp, + IProductRecycleRequestManager productRecycleRequestManager, + IProductRecycleJobAppService productRecycleJobAppService + ) { _productRecycleNoteApp = productRecycleNoteApp; _backFlushNoteApp = backFlushNoteApp; _bomApp = bomApp; _productRecycleRequestManager = productRecycleRequestManager; + _balanceAppService = balanceAppService; + _locationAppService = locationAppService; + _productRecycleJobAppService = productRecycleJobAppService; + } /// @@ -60,6 +74,8 @@ public class ProductRecycleRequestEventHandler var entitys = eventData.Entity; foreach (var entity in entitys) { + entity.AutoAgree = true; + entity.DirectCreateNote = false; if (entity.AutoSubmit) { await _productRecycleRequestManager.SubmitAsync(entity).ConfigureAwait(false); @@ -77,15 +93,125 @@ public class ProductRecycleRequestEventHandler var productRecycle = await BuildProductRecycleNoteAsync(entity).ConfigureAwait(false); await _productRecycleNoteApp.CreateAsync(productRecycle).ConfigureAwait(false); - - // var backFlushs = await BuildFlushNotesAsync(entity); - // - // await _backFlushNoteApp.CreateManyAsync(backFlushs); + + } + else + { + var productRecycleJobs = await BuildProductRecycleJobsAsync(entity).ConfigureAwait(false); + await _productRecycleJobAppService.CreateManyAsync(productRecycleJobs).ConfigureAwait(false); } } #region 私有 + private async Task> BuildProductRecycleJobsAsync(ProductRecycleRequest request) + { + var jobs = new List(); + + var transactionType = await TransactionTypeAclService.GetByTransTypeAsync(EnumTransType.ProductRecycle, EnumTransSubType.None).ConfigureAwait(false);//库存事务 + + var job = ObjectMapper.Map(request); + + //job.Details = new List(); + + foreach (var detail in request.Details) + { + + //创建详情 + var jobDetails = await BuildProductRecycleInputsAsync(request, detail, transactionType).ConfigureAwait(false); + if (!jobDetails.Any()) + { + continue; + } + + var fromLocationCode = jobDetails[0].LocationCode; + var fromLocation = await _locationAppService.GetByCodeAsync(fromLocationCode).ConfigureAwait(false); + job = BuildProductRecycleJobCreateInput(request, fromLocation); + job.Details.Clear(); + jobs.Add(job); + job.Details.AddRange(jobDetails); + + } + + return jobs; + } + + private ProductRecycleJobEditInput BuildProductRecycleJobCreateInput(ProductRecycleRequest productRecycleRequest, LocationDTO fromLocation) + { + ProductRecycleJobEditInput job; + job = ObjectMapper.Map(productRecycleRequest); + job.JobType = EnumJobType.ProductionReturnJob; + job.JobStatus = EnumJobStatus.Open; + job.WorkGroupCode = fromLocation.WorkGroupCode; + job.WarehouseCode = fromLocation.WarehouseCode; + job.Worker = productRecycleRequest.Worker; + job.Workshop= fromLocation.AreaCode; + if (job.Worker==null) + { + job.Worker = "admin"; + } + //job.MaterialRequestNumber = productRecycleRequest.Number; + return job; + } + + private async Task> BuildProductRecycleInputsAsync(ProductRecycleRequest productRecycleRequest, + ProductRecycleRequestDetail productRecycleRequestDetail, TransactionTypeDTO transactionType) + { + var jobDetails = new List(); + //var input = new RecommendBalanceRequestInput() + //{ + // ItemCode = productRecycleRequestDetail.ItemCode, + // Qty = productRecycleRequestDetail.Qty, + // LocationTypes = transactionType.OutLocationTypes, + // LocationAreas = new List { productRecycleRequestDetail.LocationArea }, + // Statuses = transactionType.OutInventoryStatuses, + //}; + //获取推荐库存 + var recommendList = await _balanceAppService.GetListByItemCodeAsync(productRecycleRequestDetail.ItemCode).ConfigureAwait(false); + //没有推荐库存时 跳过此明细 不生成任务 + if (recommendList.Count != 0) + { + foreach (var recommend in recommendList) + { + if(recommend.LocationCode== productRecycleRequestDetail.LocationCode) + { + var detail = await BuildProductRecycleJobDetailAsync(productRecycleRequestDetail, recommend).ConfigureAwait(false); + + jobDetails.Add(detail); + } + + + } + } + return jobDetails; + } + + private async Task BuildProductRecycleJobDetailAsync(ProductRecycleRequestDetail productRecycleRequestDetail, BalanceDTO balance) + { + + var detail = ObjectMapper.Map(productRecycleRequestDetail); + + detail.RecommendToLocationErpCode = balance.LocationErpCode; + detail.RecommendToLocationCode = balance.LocationCode; + 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.RecommendQty = balance.Qty; + detail.Uom = balance.Uom; + + + await Task.CompletedTask.ConfigureAwait(false); + return detail; + + } + + + private async Task BuildProductRecycleNoteAsync(ProductRecycleRequest request) { var createInput = ObjectMapper.Map(request);