From dcc7b54cfbad671c8a80a5e544f42516eca4d356 Mon Sep 17 00:00:00 2001 From: lvzb <35200379@qq.com> Date: Mon, 1 Apr 2024 08:59:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=80=E6=8B=86=E4=B8=9A=E5=8A=A1=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Enums/Job/EnumJobStatus.cs | 6 + .../DTOs/ProductRecycleJobDTO.cs | 9 +- .../DTOs/ProductRecycleJobDetailDTO.cs | 3 + .../ProductRecycleJobMaterialDetailDto.cs | 44 ++++++ .../IProductRecycleJobAppService.cs | 3 +- .../Inputs/ProductRecycleJobEditInput.cs | 6 +- .../DTOs/ProductRecycleNoteDTO.cs | 7 +- .../DTOs/ProductRecycleNoteDetailExtendDto.cs | 1 + .../Inputs/ProductRecycleNoteEditInput.cs | 1 - .../IProductRecycleRequestAppService.cs | 3 +- .../ProductRecycleJobAppService.cs | 36 ++++- .../ProductRecycleJobAutoMapperProfile.cs | 11 +- .../ProductRecycleNoteAppService.cs | 31 ++--- .../ProductRecycleRequestAppService.cs | 31 +++-- .../ProductRecycleRequestAutoMapperProfile.cs | 1 + .../IProductRecycleJobManager.cs | 2 + .../ProductRecycleJobs/ProductRecycleJob.cs | 9 ++ .../ProductRecycleJobDetail.cs | 15 ++ .../ProductRecycleJobManager.cs | 27 ++++ .../ProductRecycleJobMaterialDetail.cs | 45 ++++++ .../ProductRecycleNotes/ProductRecycleNote.cs | 5 + ...ycleJobDbContextModelCreatingExtensions.cs | 5 +- .../ProductRecycleJobAutoMapperProfile.cs | 52 +++++++ .../ProductRecycleJobEventHandler.cs | 80 +++++++++++ .../Jobs/ProductRecycleJobEventHandler.cs | 129 ++++++++++++++++++ .../Jobs/ProductionRecycleJobEventHandler.cs | 75 ---------- .../Note/ProductReceiptNoteEventHandler.cs | 11 +- .../ProductRecycleRequestEventHandler.cs | 22 +-- .../StoreEventAutoMapperProfile.cs | 1 + .../ProductRecycleNoteEventHandler.cs | 8 +- 30 files changed, 545 insertions(+), 134 deletions(-) create mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobMaterialDetailDto.cs create mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobMaterialDetail.cs create mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ProductRecycleJobAutoMapperProfile.cs create mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/ProductRecycleJobEventHandler.cs create mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductRecycleJobEventHandler.cs delete mode 100644 be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionRecycleJobEventHandler.cs diff --git a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs index 55467616b..a2de366d0 100644 --- a/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs +++ b/be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Job/EnumJobStatus.cs @@ -29,6 +29,12 @@ public enum EnumJobStatus [Display(Name = "完成")] Done = 3, + /// + /// 部分完成 + /// + [Display(Name = "部分完成")] + Partial = 4, + /// /// 关闭 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDTO.cs index 12e3f745f..d1eaffa3c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDTO.cs @@ -1,12 +1,17 @@ using System.ComponentModel.DataAnnotations; using Win_in.Sfs.Shared.Domain; +using Win_in.Sfs.Shared.Domain.Entities; namespace Win_in.Sfs.Wms.Store.Application.Contracts; [Display(Name = "客户退拆任务")] public class ProductRecycleJobDTO : SfsJobDTOBase -{ - +{ + /// + /// 客户退拆申请单号 + /// + [Display(Name = "客户退拆申请单号")] + public string RequestNumber { get; set; } /// /// 车间 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDetailDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDetailDTO.cs index 32f7be931..796767d08 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDetailDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobDetailDTO.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Data; @@ -87,4 +88,6 @@ public class ProductRecycleJobDetailDTO : SfsJobRecommendToDetailDTOBase /// public string WarehouseCode { get; set; } + + public List MaterialDetails { get; set; } = new List(); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobMaterialDetailDto.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobMaterialDetailDto.cs new file mode 100644 index 000000000..0e40333fd --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/DTOs/ProductRecycleJobMaterialDetailDto.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; + +namespace Win_in.Sfs.Wms.Store.Application.Contracts; +public class ProductRecycleJobMaterialDetailDto : EntityDto +{ + /// + /// 零件代码 + /// + public string ItemCode { get; set; } + + /// + /// 数量 + /// + public decimal Qty { get; set; } + /// + /// 库位代码 + /// + public string LocationCode { get; set; } + + /// + /// 库区 + /// + public string LocationArea { get; set; } + + /// + /// 库位组 + /// + public string LocationGroup { get; set; } + + /// + /// ERP库位代码 + /// + public string LocationErpCode { get; set; } + + /// + /// 仓库代码 + /// + public string WarehouseCode { get; set; } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/IProductRecycleJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/IProductRecycleJobAppService.cs index c68fa097a..3af319f51 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/IProductRecycleJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/ProductRecycleJobs/IProductRecycleJobAppService.cs @@ -1,3 +1,4 @@ +using System; using System.Threading.Tasks; namespace Win_in.Sfs.Wms.Store.Application.Contracts; @@ -6,5 +7,5 @@ public interface IProductRecycleJobAppService : ISfsJobAppServiceBase { - + } 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 759bd3f2b..2eb10ae1c 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 @@ -9,7 +9,11 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts; public class ProductRecycleJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput { #region Create - + /// + /// 申请单号 + /// + [Display(Name = "申请单号")] + public string RequestNumber { get; set; } /// /// 车间 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDTO.cs index 25fdd5741..87290ae8d 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDTO.cs @@ -11,9 +11,14 @@ using System.Collections.Generic; /// public class ProductRecycleNoteDTO : SfsStoreDTOBase, IHasNumber { - [Display(Name = "成品回收申请单号")] + [Display(Name = "客户退拆申请单号")] public string RequestNumber { get; set; } + /// + /// 客户退拆任务单号 + /// + [Display(Name = "客户退拆任务单号")] + public string JobNumber { get; set; } /// /// 回收时间 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs index 2d249d85e..dccc68a82 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/DTOs/ProductRecycleNoteDetailExtendDto.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; namespace Win_in.Sfs.Wms.Store.Notes.ProductRecycleNotes.DTOs; +[Display(Name = "客户退拆明细")] public class ProductRecycleNoteDetailExtendDto { diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/Inputs/ProductRecycleNoteEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/Inputs/ProductRecycleNoteEditInput.cs index 2e37699de..3ae270b21 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/Inputs/ProductRecycleNoteEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/ProductRecycleNotes/Inputs/ProductRecycleNoteEditInput.cs @@ -39,7 +39,6 @@ public class ProductRecycleNoteEditInput : SfsStoreCreateOrUpdateInputBase /// [Display(Name = "申请单号")] public string RequestNumber { get; set; } - /// /// 任务单号 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductRecycleRequests/IProductRecycleRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductRecycleRequests/IProductRecycleRequestAppService.cs index db13f4970..f10e2620c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductRecycleRequests/IProductRecycleRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/ProductRecycleRequests/IProductRecycleRequestAppService.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Win_in.Sfs.Shared.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts; @@ -6,5 +7,5 @@ public interface IProductRecycleRequestAppService : ISfsStoreRequestMasterAppServiceBase , ISfsCheckStatusAppService { - + Task UpdateStatusByNumberAsync(string number); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAppService.cs index a7842a0b5..241b1b062 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/ProductRecycleJobs/ProductRecycleJobAppService.cs @@ -1,6 +1,10 @@ +using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Uow; +using Volo.Abp; +using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; @@ -16,13 +20,39 @@ public class ProductRecycleJobAppService { private readonly IProductRecycleJobManager _productRecycleJobManager; + private readonly IProductRecycleRequestAppService _productRecycleRequestAppService; public ProductRecycleJobAppService( - IProductRecycleJobRepository repository, IProductRecycleJobManager productRecycleJobManager) + IProductRecycleJobRepository repository, IProductRecycleJobManager productRecycleJobManager, + IProductRecycleRequestAppService productRecycleRequestAppService) : base(repository, productRecycleJobManager) { _productRecycleJobManager = productRecycleJobManager; + _productRecycleRequestAppService = productRecycleRequestAppService; } + /// + /// 完成任务 + /// + /// + /// + /// + [HttpPost("handle/{id}")] + [UnitOfWork] + public override async Task CompleteAsync(Guid id, ProductRecycleJobDTO dto) + { + var handleEntity = ObjectMapper.Map(dto); + var job = await _repository.GetAsync(id).ConfigureAwait(false); + if (job.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None or EnumJobStatus.Done)//需要考虑下 多次提交的问题 所以不判断 进行中 + { + throw new UserFriendlyException($"任务状态错误:编号为【{job.Number}】的任务已经【{job.JobStatus.GetDisplayName()}】"); + } - - + var handleResult = await _productRecycleJobManager.CompleteAsync(handleEntity, job, CurrentUser).ConfigureAwait(false); + //判断申请是否执行完成 + if(job.JobStatus== EnumJobStatus.Done) + { + await _productRecycleRequestAppService.UpdateStatusByNumberAsync(job.RequestNumber).ConfigureAwait(false); + } + var handleDto = ObjectMapper.Map(handleResult); + return handleDto; + } } 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 7d0d297b9..151cb791e 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 @@ -2,6 +2,7 @@ using AutoMapper; using Volo.Abp.AutoMapper; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; +using Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs; namespace Win_in.Sfs.Wms.Store.Application; @@ -12,9 +13,12 @@ public partial class StoreApplicationAutoMapperProfile : Profile CreateMap() .ReverseMap(); - CreateMap() - .ReverseMap(); + CreateMap() + .AfterMap((x, y) => y.ExecutedQty += x.Qty)//已完成数量进行累计 + .ReverseMap(); + CreateMap() + .ReverseMap(); CreateMap(); CreateMap() @@ -26,6 +30,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile CreateMap() ; - + CreateMap() + ; } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs index 3801b40c8..f0bf40fd4 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/ProductRecycleNotes/ProductRecycleNoteAppService.cs @@ -107,29 +107,28 @@ public class ProductRecycleNoteAppService : var items = pagedResult.Items.ToList(); - await SetNoteAndBackFlushDetailsAsync(pagedResult.Items.ToList()).ConfigureAwait(false); + //await SetNoteAndBackFlushDetailsAsync(pagedResult.Items.ToList()).ConfigureAwait(false); - var exports = BuildProductRecycleNoteAndBackFlushDetailExport(items); + // var exports = BuildProductRecycleNoteAndBackFlushDetailExport(items); List exportlist=new List(); - foreach (var itm in exports) + foreach (var itm in items) { - exportlist.Add(new ProductRecycleNoteDetailExtendDto() + foreach (var m_item in itm.MaterialDetails) { + exportlist.Add(new ProductRecycleNoteDetailExtendDto() + { - ItemCode = itm.ItemCode, - LocCode = itm.LocationCode, - Reason = string.Empty, - Qty = itm.Qty, - Type = "客户退拆" - - + ItemCode = m_item.ItemCode, + LocCode = m_item.LocationCode, + Reason = String.Join(',', itm.Details.Where(p=>!string.IsNullOrEmpty(p.ReasonCode)).SelectMany(r=>r.ReasonCode)), + Qty = m_item.Qty, + Type = "客户退拆" - }); + }); + } } - - - return ExportImportService.Export(exports); + return ExportImportService.Export(exportlist); } catch (Exception ex) { @@ -222,7 +221,7 @@ public class ProductRecycleNoteAppService : dto.LocationCode = nabfDetail.LocationCode; dto.WorkHour = nabfDetail.WorkHour; dto.RawItemCode = nabfDetail.RawItemCode; - dto.RawQty = nabfDetail.Qty; + dto.RawQty = nabfDetail.RawQty; dto.RawLocationCode = nabfDetail.RawLocationCode; result.Add(dto); 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 b008dcd02..471b7068a 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 @@ -19,6 +19,7 @@ namespace Win_in.Sfs.Wms.Store.Application; using System.ComponentModel.DataAnnotations; using Volo.Abp.Data; using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Wms.Inventory.Application.Contracts; using Win_in.Sfs.Wms.Inventory.Domain; @@ -88,6 +89,13 @@ public class ProductRecycleRequestAppService : await Task.CompletedTask.ConfigureAwait(false); throw new NotImplementedException(); } + [HttpPost("update-status")] + public virtual async Task UpdateStatusByNumberAsync(string number) + { + var item=await _productRecycleRequestManager.GetByNumberAsync(number).ConfigureAwait(false); + item.RequestStatus = EnumRequestStatus.Completed; + await _productRecycleRequestManager.UpdateAsync(item).ConfigureAwait(false); + } #region 东阳 @@ -97,22 +105,21 @@ public class ProductRecycleRequestAppService : foreach (var productRecycleRequest in addList) { - await SetRequestAutoPropertiesAsync(productRecycleRequest) - .ConfigureAwait(false); + await SetRequestAutoPropertiesAsync(productRecycleRequest).ConfigureAwait(false); productRecycleRequest.Worker = CurrentUser.GetUserName(); foreach (var detail in productRecycleRequest.Details) { - //var balance = await _balanceAppService.GetByItemLocationAndPackingAsync( - // string.Empty, - // detail.ItemCode, - // detail.LocationCode).ConfigureAwait(false); - - //if (balance != null) - //{ - // detail.Status = balance.Status; - //} - detail.Status = EnumInventoryStatus.OK; + var balance = await _balanceAppService.GetByItemLocationAndPackingAsync( + string.Empty, + detail.ItemCode, + detail.LocationCode).ConfigureAwait(false); + + if (balance != null) + { + detail.Status = balance.Status; + } + // detail.Status = EnumInventoryStatus.OK; var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode) .ConfigureAwait(false); 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 fc94e67c3..b400d4a9a 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 @@ -62,6 +62,7 @@ public partial class StoreApplicationAutoMapperProfile : Profile .Ignore(x => x.Remark); CreateMap() + .ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.Number)) .ReverseMap(); CreateMap() diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/IProductRecycleJobManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/IProductRecycleJobManager.cs index 1efc5bb08..77a990577 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/IProductRecycleJobManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/IProductRecycleJobManager.cs @@ -1,10 +1,12 @@ using System; using System.Linq.Expressions; using System.Threading.Tasks; +using Volo.Abp.Users; namespace Win_in.Sfs.Wms.Store.Domain; public interface IProductRecycleJobManager : IJobManager { + Task CompleteAsync(ProductRecycleJob entityinput, ProductRecycleJob entity, ICurrentUser user); Task GetAsync(Expression> expression); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJob.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJob.cs index 99c3ebc7c..029ce70ef 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJob.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJob.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Threading.Tasks; using Win_in.Sfs.Shared.Domain.Entities; +using Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs; namespace Win_in.Sfs.Wms.Store.Domain; @@ -12,6 +14,11 @@ namespace Win_in.Sfs.Wms.Store.Domain; [Display(Name = "产品退拆任务")] public class ProductRecycleJob : SfsJobAggregateRootBase { + /// + /// 退拆请求单号 + /// + [IgnoreUpdate] + public string RequestNumber { get; set; } /// /// 车间 /// @@ -30,6 +37,8 @@ public class ProductRecycleJob : SfsJobAggregateRootBase Details { get; set; } = new List(); + + /// /// 设置任务明细的实际库位和实际数量 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobDetail.cs index b8d8827f6..2d8321d0b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobDetail.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobDetail.cs @@ -2,6 +2,8 @@ using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; using Volo.Abp.Data; using Win_in.Sfs.Shared.Domain.Shared; +using System.Collections.Generic; +using Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs; namespace Win_in.Sfs.Wms.Store.Domain; @@ -71,6 +73,13 @@ public class ProductRecycleJobDetail : SfsJobRecommendToDetailEntityBase [Column(TypeName = "decimal(18,6)")] public decimal Qty { get; set; } + /// + /// 已完成数量 + /// + [Display(Name = "数量")] + [Column(TypeName = "decimal(18,6)")] + public decimal ExecutedQty { get; set; } + /// /// 扩展属性 /// @@ -85,4 +94,10 @@ public class ProductRecycleJobDetail : SfsJobRecommendToDetailEntityBase /// 仓库代码 /// public string WarehouseCode { get; set; } + + /// + /// 子零件明细列表 + /// + [NotMapped] + public List MaterialDetails { get; set; } = new List(); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobManager.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobManager.cs index f27a29a7c..3e1e1cfb5 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobManager.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobManager.cs @@ -57,5 +57,32 @@ public class ProductRecycleJobManager : SfsJobManagerBase CompleteAsync(ProductRecycleJob entityinput, ProductRecycleJob entity, ICurrentUser user) + { + await entity.CompleteAsync(user.Id, user.Name, Clock.Now).ConfigureAwait(false); + //判断是否部分完成 + bool isDone = true; + foreach (var item in entity.Details) + { + var detail= entityinput.Details.FirstOrDefault(r=> r.ItemCode==item.ItemCode); + if (detail != null) + { + item.ExecutedQty += detail.Qty; + } + } + var ExecutedItem = entity.Details.Where(r => r.ExecutedQty != r.Qty).ToList(); + if (ExecutedItem.Count > 0) isDone = false; + if (!isDone) + { + entity.JobStatus=EnumJobStatus.Partial; + } + await PublishCompletedAsync(entityinput).ConfigureAwait(false); + + entity.Remark = entityinput.Remark;//返给前台记录用于下载记录excle + + return await Repository.UpdateAsync(entity).ConfigureAwait(false); + } + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobMaterialDetail.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobMaterialDetail.cs new file mode 100644 index 000000000..308cb7ba2 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/ProductRecycleJobs/ProductRecycleJobMaterialDetail.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs; +public class ProductRecycleJobMaterialDetail +{ + + /// + /// 零件代码 + /// + public string ItemCode { get; set; } + + /// + /// 数量 + /// + public decimal Qty { get; set; } + /// + /// 库位代码 + /// + public string LocationCode { get; set; } + + /// + /// 库区 + /// + public string LocationArea { get; set; } + + /// + /// 库位组 + /// + public string LocationGroup { get; set; } + + /// + /// ERP库位代码 + /// + public string LocationErpCode { get; set; } + + /// + /// 仓库代码 + /// + public string WarehouseCode { get; set; } + +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ProductRecycleNotes/ProductRecycleNote.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ProductRecycleNotes/ProductRecycleNote.cs index 9552ec325..ba500154b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ProductRecycleNotes/ProductRecycleNote.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/ProductRecycleNotes/ProductRecycleNote.cs @@ -15,6 +15,11 @@ public class ProductRecycleNote : SfsStoreAggregateRootBase [IgnoreUpdate] public string RequestNumber { get; set; } + /// + /// 退拆任务单号 + /// + [IgnoreUpdate] + public string JobNumber { get; set; } /// /// 回收时间 diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobDbContextModelCreatingExtensions.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobDbContextModelCreatingExtensions.cs index de07c7b69..a6d678b4f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobDbContextModelCreatingExtensions.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/ProductRecycleJobs/ProductRecycleJobDbContextModelCreatingExtensions.cs @@ -1,5 +1,6 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.Modeling; +using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.EntityFrameworkCore; using Win_in.Sfs.Wms.Store.Domain; @@ -22,7 +23,9 @@ public static class ProductRecycleJobDbContextModelCreatingExtensions b.ConfigureJob(); //Properties b.Property(q => q.Workshop).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); - b.Property(q => q.Shift).HasMaxLength(SfsPropertyConst.CodeLength); + b.Property(q => q.Shift).HasMaxLength(SfsPropertyConst.CodeLength); + + b.Property(q => q.ExtraProperties).HasPrecision(18, 6); //Relations b.HasMany(q => q.Details).WithOne().HasForeignKey(d => d.MasterID).IsRequired(); //Indexes diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ProductRecycleJobAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ProductRecycleJobAutoMapperProfile.cs new file mode 100644 index 000000000..4a02f6459 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/ProductRecycleJobAutoMapperProfile.cs @@ -0,0 +1,52 @@ +using System; +using AutoMapper; +using Volo.Abp.AutoMapper; +using Win_in.Sfs.Shared.Application; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Wms.Inventory.Application.Contracts; +using Win_in.Sfs.Wms.Store.Application.Contracts; +using Win_in.Sfs.Wms.Store.Domain; + +namespace Win_in.Sfs.Wms.Store.Event; +public partial class StoreEventAutoMapperProfile : Profile +{ + private void ProductRecycleJobAutoMapperProfile() + { + CreateMap() + .ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number)) + .ForMember(x => x.RecycleTime, y => y.MapFrom(d => d.CompleteTime)) + .ForMember(x => x.ActiveDate, y => y.MapFrom(d => DateTime.Now)) + .Ignore(x => x.MaterialDetails) + ; + + CreateMap() + .Ignore(x => x.StdPackQty) + .Ignore(x => x.ContainerCode) + .Ignore(x => x.PackingCode) + .Ignore(x => x.SupplierBatch) + .Ignore(x => x.ArriveDate) + .Ignore(x => x.ProduceDate) + .Ignore(x => x.ExpireDate) + .Ignore(x => x.Lot) + .Ignore(x => x.ReasonCode) + .AfterMap((x, y) => y.Lot = string.Empty) + .AfterMap((x, y) => y.PackingCode = string.Empty) + ; + CreateMap() + .MapExpectInOutTo() + .Ignore(x => x.SerialNumber) + .Ignore(x => x.Worker) + .Ignore(x => x.ExtraProperties) + ; + CreateMap() + .MapExpectInOutTo() + .ForMember(x => x.LocationCode, y => y.MapFrom(d => d.RecommendToLocationCode)) + .ForMember(x => x.LocationArea, y => y.MapFrom(d => d.RecommendToLocationArea)) + .ForMember(x => x.LocationGroup, y => y.MapFrom(d => d.RecommendToLocationGroup)) + .ForMember(x => x.LocationErpCode, y => y.MapFrom(d => d.RecommendToLocationErpCode)) + .ForMember(x => x.WarehouseCode, y => y.MapFrom(d => d.RecommendToWarehouseCode)) + .Ignore(x => x.SerialNumber) + .Ignore(x => x.Worker) + .Ignore(x => x.ExtraProperties); + } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/ProductRecycleJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/ProductRecycleJobEventHandler.cs new file mode 100644 index 000000000..52e28261e --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/ExpectInOuts/ProductRecycleJobEventHandler.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.EventBus; +using Volo.Abp.Uow; +using Win_in.Sfs.Shared.Event; +using Win_in.Sfs.Wms.Inventory.Application.Contracts; +using Win_in.Sfs.Wms.Store.Domain; +using Win_in.Sfs.Wms.Store.Event.Inventories; + +namespace Win_in.Sfs.Wms.Store.Event.ExpectInOuts; + +public class ProductRecycleJobEventHandler : + StoreExpectInOutEventHandlerBase + , ILocalEventHandler> + , ILocalEventHandler>> + , ILocalEventHandler> + , ILocalEventHandler> +{ + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) + { + var entity = eventData.Entity; + + if (!entity.IsAutoComplete) + { + await AddExpectOutsAsync(new List() { entity }).ConfigureAwait(false); + } + } + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCreatedEntityEventData> eventData) + { + var entities = eventData.Entity; + foreach (var entity in entities) + { + await AddExpectOutsAsync(new List() { entity }).ConfigureAwait(false); + } + } + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCompletedEntityEventData eventData) + { + var entity = eventData.Entity; + + await ExpectOutAppService.RemoveAsync(entity.Number).ConfigureAwait(false); + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCancelledEntityEventData eventData) + { + var entity = eventData.Entity; + + await ExpectOutAppService.RemoveAsync(entity.Number).ConfigureAwait(false); + } + + private async Task AddExpectOutsAsync(List entities) + { + var expectOuts = new List(); + foreach (var entity in entities) + { + var entityExpectOuts = BuildExpectOutInventoryAsync(entity); + expectOuts.AddRange(entityExpectOuts); + } + await ExpectOutAppService.AddManyAsync(expectOuts).ConfigureAwait(false); + } + + private List BuildExpectOutInventoryAsync(ProductRecycleJob purchaseReturnJob) + { + var inputs = ObjectMapper.Map, List>(purchaseReturnJob.Details); + foreach (var input in inputs) + { + input.WarehouseCode = purchaseReturnJob.WarehouseCode; + input.Worker = purchaseReturnJob.Worker; + input.JobNumber = purchaseReturnJob.Number; + } + + return inputs; + } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductRecycleJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductRecycleJobEventHandler.cs new file mode 100644 index 000000000..5afef7af4 --- /dev/null +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductRecycleJobEventHandler.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.EventBus; +using Volo.Abp.Uow; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.Event; +using Win_in.Sfs.Wms.Store.Application.Contracts; +using Win_in.Sfs.Wms.Store.Domain; +using Win_in.Sfs.Wms.Store.Jobs.ProductRecycleJobs; + + +namespace Win_in.Sfs.Wms.Store.Event.BusinessJob; + + +public class ProductRecycleJobEventHandler : + StoreEventHandlerBase +, ILocalEventHandler> +, ILocalEventHandler> +{ + private readonly IProductRecycleNoteAppService _productRecycleNoteAppService; + private readonly IBomAppService _bomApp; + public ProductRecycleJobEventHandler( + IProductRecycleNoteAppService productRecycleNoteAppService, + IBomAppService bomApp + ) + { + _productRecycleNoteAppService = productRecycleNoteAppService; + _bomApp=bomApp; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) + { + var entity = eventData.Entity; + + if (entity.IsAutoComplete) + { + entity.CompleteTime = Clock.Now; + entity.JobStatus = EnumJobStatus.Done; + + foreach (var detail in eventData.Entity.Details) + { + detail.SetHandledFromRecommend(); + } + + var note = await BuildProductRecycleNoteAsync(entity).ConfigureAwait(false); + await _productRecycleNoteAppService.CreateAsync(note).ConfigureAwait(false); + } + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(SfsCompletedEntityEventData eventData) + { + var entity = eventData.Entity; + + var ProductRecycleNote = await BuildProductRecycleNoteAsync(entity).ConfigureAwait(false); + var dto= await _productRecycleNoteAppService.CreateAsync(ProductRecycleNote).ConfigureAwait(false); + eventData.Entity.Remark = dto.Number;//返给前台记录用于下载记录excle + } + private async Task BuildProductRecycleNoteAsync(ProductRecycleJob job) + { + var createInput = ObjectMapper.Map(job); + + createInput.MaterialDetails = await BuildMaterialDetailsAsync(job).ConfigureAwait(false); + + return createInput; + } + + private async Task> BuildMaterialDetailsAsync(ProductRecycleJob request) + { + var materialDetailInputs = new List(); + foreach (var detail in request.Details) + { + var materialdetails = detail.MaterialDetails; + var componentItemCode = materialdetails.Select(p => p.ItemCode).Distinct().ToList(); + var items = await ItemBasicAclService.GetByCodesAsync(componentItemCode).ConfigureAwait(false); + + foreach (var materialdetail in materialdetails) + { + var item = items.FirstOrDefault(p => p.Code == materialdetail.ItemCode); + var detailInput = BuildMaterialDetailInput(materialdetail, item, detail); + + materialDetailInputs.Add(detailInput); + } + } + + return materialDetailInputs; + } + + private static ProductRecycleMaterialDetailInput BuildMaterialDetailInput(ProductRecycleJobMaterialDetail materialdetail, ItemBasicDTO item, + ProductRecycleJobDetail detail) + { + var detailInput = new ProductRecycleMaterialDetailInput + { + ProductPackingCode = string.Empty, + ProductItemCode = detail.ItemCode, + ProductItemName = detail.ItemName, + ProductItemDesc1 = detail.ItemDesc1, + ProductItemDesc2 = detail.ItemDesc2, + ProductLot = string.Empty, + PackingCode = string.Empty, + ItemCode = materialdetail.ItemCode, + Qty = materialdetail.Qty , + Uom = detail.Uom, + BomVersion = detail.BomVersion, + LocationCode = materialdetail.LocationCode, + LocationErpCode = materialdetail.LocationErpCode, + WarehouseCode = materialdetail.WarehouseCode, + Lot = string.Empty, + Status = EnumInventoryStatus.OK, + LocationArea = materialdetail.LocationArea, + LocationGroup = materialdetail.LocationGroup, + }; + + if (item != null) + { + detailInput.ItemName = item.Name; + detailInput.ItemDesc1 = item.Desc1; + detailInput.ItemDesc2 = item.Desc2; + detailInput.StdPackQty = item.StdPackQty; + } + + return detailInput; + } +} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionRecycleJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionRecycleJobEventHandler.cs deleted file mode 100644 index 8e6c7fc5b..000000000 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/ProductionRecycleJobEventHandler.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.EventBus; -using Volo.Abp.Uow; -using Win_in.Sfs.Shared.Domain.Shared; -using Win_in.Sfs.Shared.Event; -using Win_in.Sfs.Wms.Store.Application.Contracts; -using Win_in.Sfs.Wms.Store.Domain; - -namespace Win_in.Sfs.Wms.Store.Event.BusinessJob; - - -public class ProductionRecycleJobEventHandler : - StoreEventHandlerBase -, ILocalEventHandler> -, ILocalEventHandler> -{ - private readonly IProductRecycleNoteAppService _productRecycleNoteAppService; - - public ProductionRecycleJobEventHandler( - IProductRecycleNoteAppService productRecycleNoteAppService - ) - { - _productRecycleNoteAppService = productRecycleNoteAppService; - } - - [UnitOfWork] - public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) - { - var entity = eventData.Entity; - - if (entity.IsAutoComplete) - { - entity.CompleteTime = Clock.Now; - entity.JobStatus = EnumJobStatus.Done; - - foreach (var detail in eventData.Entity.Details) - { - detail.SetHandledFromRecommend(); - } - - var note = BuildProductionReturnNote(entity); - await _productRecycleNoteAppService.CreateAsync(note).ConfigureAwait(false); - } - } - - [UnitOfWork] - public virtual async Task HandleEventAsync(SfsCompletedEntityEventData eventData) - { - var entity = eventData.Entity; - - var productRecycleNote = BuildProductionReturnNote(entity); - await _productRecycleNoteAppService.CreateAsync(productRecycleNote).ConfigureAwait(false); - - } - - private ProductRecycleNoteEditInput BuildProductionReturnNote(ProductRecycleJob entity) - { - var input = ObjectMapper.Map(entity); - - - input.Details = new List(); - - foreach (var detail in entity.Details.Where(detail => detail.HandledQty != 0)) - { - var inputDetail = ObjectMapper.Map(detail); - - input.Details.Add(inputDetail); - } - - return input; - } -} diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/ProductReceiptNoteEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/ProductReceiptNoteEventHandler.cs index 57683fbff..7b67fbf8f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/ProductReceiptNoteEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/ProductReceiptNoteEventHandler.cs @@ -9,6 +9,7 @@ using Win_in.Sfs.Wms.Store.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; +using System.Runtime.InteropServices; using Win_in.Sfs.Wms.Store.Application.Contracts; public class ProductReceiptNoteEventHandler @@ -22,14 +23,18 @@ public class ProductReceiptNoteEventHandler //private readonly IProductReceiptRequestAppService _productReceiptRequestApp; private readonly IProductReceiptRequestManager _productReceiptRequestManager; + private readonly IDeliverRequestAppService _deliverRequestAppService; + public ProductReceiptNoteEventHandler( IPutawayJobAppService putawayJobAppService //, IProductReceiptRequestAppService productReceiptRequestApp - , IProductReceiptRequestManager productReceiptRequestManager) + , IProductReceiptRequestManager productReceiptRequestManager, +IDeliverRequestAppService deliverRequestAppService) { _putawayJobAppService = putawayJobAppService; //_productReceiptRequestApp = productReceiptRequestApp; _productReceiptRequestManager = productReceiptRequestManager; + _deliverRequestAppService = deliverRequestAppService; } public virtual async Task HandleEventAsync(SfsCreatedEntityEventData eventData) @@ -95,6 +100,8 @@ public class ProductReceiptNoteEventHandler public virtual async Task HandleEventAsync(SfsHandledEntityEventData eventData) { - throw new System.NotImplementedException(); + var productReceiptNote = eventData.Entity; + var input = ObjectMapper.Map(productReceiptNote); + await _deliverRequestAppService.CreateAsync(input).ConfigureAwait(false); } } 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 d2c3ca821..9b82cb14f 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 @@ -74,8 +74,6 @@ 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); @@ -158,16 +156,16 @@ public class ProductRecycleRequestEventHandler 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 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); + var recommendList = await _balanceAppService.GetRecommendBalancesAsync(input).ConfigureAwait(false); //没有推荐库存时 跳过此明细 不生成任务 if (recommendList.Count != 0) { @@ -193,6 +191,8 @@ public class ProductRecycleRequestEventHandler detail.RecommendToLocationErpCode = balance.LocationErpCode; detail.RecommendToLocationCode = balance.LocationCode; + detail.RecommendToLocationGroup = balance.LocationGroup; + detail.RecommendToLocationArea= balance.LocationArea; detail.RecommendPackingCode = balance.PackingCode; detail.RecommendContainerCode = balance.ContainerCode; detail.RecommendSupplierBatch = balance.SupplierBatch; diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs index 40de8aa9b..08d4809bf 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs @@ -39,6 +39,7 @@ public partial class StoreEventAutoMapperProfile : Profile ProductionReturnJobAutoMapperProfile(); ProductReceiveJobAutoMapperProfile(); PurchaseReceiptJobAutoMapperProfile(); + ProductRecycleJobAutoMapperProfile(); PurchaseReturnJobAutoMapperProfile(); PutawayJobAutoMapperProfile(); UnplannedIssueJobAutoMapperProfile(); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductRecycleNoteEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductRecycleNoteEventHandler.cs index 9e2163502..a7377bd77 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductRecycleNoteEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/ProductRecycleNoteEventHandler.cs @@ -32,9 +32,9 @@ public class ProductRecycleNoteEventHandler var entity = eventData.Entity; await AddTransactionsOfProductAsync(entity).ConfigureAwait(false); - if (!string.IsNullOrEmpty(entity.RequestNumber)) + if (!string.IsNullOrEmpty(entity.Number)) { - await _requestAppService.CompleteByNumberAsync(entity.RequestNumber).ConfigureAwait(false); + await _requestAppService.CompleteByNumberAsync(entity.Number).ConfigureAwait(false); } } @@ -54,9 +54,9 @@ public class ProductRecycleNoteEventHandler { await AddTransactionsOfProductAsync(entity).ConfigureAwait(false); - if (!string.IsNullOrEmpty(entity.RequestNumber)) + if (!string.IsNullOrEmpty(entity.Number)) { - await _requestAppService.CompleteByNumberAsync(entity.RequestNumber).ConfigureAwait(false); + await _requestAppService.CompleteByNumberAsync(entity.Number).ConfigureAwait(false); } }