diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs index 7b698d394..bdc757940 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/UnplannedIssueJobs/IUnplannedIssueJobAppService.cs @@ -10,4 +10,8 @@ public interface IUnplannedIssueJobAppService Task CreateByRecommendAsync(UnplannedIssueRequest requestDto); + Task IsAllJobOverByRequestNumberAsync(string requestNumber); + + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/DTOs/UnplannedIssueRequestDTO.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/DTOs/UnplannedIssueRequestDTO.cs index 6abc9919d..9688315e9 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/DTOs/UnplannedIssueRequestDTO.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/DTOs/UnplannedIssueRequestDTO.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; + using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; @@ -39,3 +41,16 @@ public class UnplannedIssueRequestDTO : SfsStoreRequestDTOBase Errors { set; get; } + + public bool Status { set; get; } + + + +} + + + diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/IUnplannedIssueRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/IUnplannedIssueRequestAppService.cs index df00fd7cf..241aa6cf5 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/IUnplannedIssueRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/IUnplannedIssueRequestAppService.cs @@ -6,4 +6,7 @@ public interface IUnplannedIssueRequestAppService : ISfsStoreRequestMasterAppServiceBase { Task CreateByOAAsync(UnplannedIssueRequestEditInput input); + Task UpdateStatusByJobAsync(string requestNumber); + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs index 4f5bbe640..70b5d75d0 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestEditInput.cs @@ -60,6 +60,13 @@ public class UnplannedIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInput public class UnplannedIssueRequestImportDto { + + + /// + /// OA单据号 + /// + [Display(Name = "OA单据号")] + public string OANumber { get; set; } /// /// 部门代码 /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestImportInput.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestImportInput.cs index cba9dc85f..f4edec33c 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestImportInput.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedIssueRequests/Inputs/UnplannedIssueRequestImportInput.cs @@ -9,9 +9,9 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts; public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase , IHasQty { - [Display(Name = "领料类别", Order = 0)] - [Required(ErrorMessage = "领料类别不能为空")] - public EnumUnplannedIssueType UnplannedIssueType { get; set; } + //[Display(Name = "领料类别", Order = 0)] + //[Required(ErrorMessage = "领料类别不能为空")] + //public EnumUnplannedIssueType UnplannedIssueType { get; set; } /// /// ERP料号 @@ -38,7 +38,7 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase /// [Display(Name = "调出库位")] [Required(ErrorMessage = "调出库位不能为空")] - public string LocationCode { get; set; } + public string LocationErpCode { get; set; } /// /// 专案 @@ -59,13 +59,13 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase [Display(Name = "次交易码")] public string OnceBusiCode { get; set; } - /// - /// 箱码 - /// - [Display(Name = "箱码")] - [ImporterHeader(IsIgnore = true)] - [ExporterHeader(IsIgnore = true)] - public string PackingCode { get; set; } + ///// + ///// 箱码 + ///// + //[Display(Name = "箱码")] + //[ImporterHeader(IsIgnore = true)] + //[ExporterHeader(IsIgnore = true)] + //public string PackingCode { get; set; } /// /// 仓库代码 @@ -87,4 +87,95 @@ public class UnplannedIssueRequestImportInput : SfsStoreImportInputBase [Display(Name = "说明")] [Required(ErrorMessage = "说明不能为空")] public string Explain { get; set; } + + + + + ///// + ///// 部门代码 + ///// + //[Display(Name = "部门代码")] + //public string DeptCode { get; set; } + + ///// + ///// 部门名称 + ///// + //[Display(Name = "部门名称")] + //public string DeptName { get; set; } + + ///// + ///// 料号 + ///// + //[Display(Name = "料号")] + //[Required(ErrorMessage = "{0}是必填项")] + //public string ItemCode { get; set; } + + + + + + ///// + ///// 数量 + ///// + //[Display(Name = "数量")] + //[Required(ErrorMessage = "{0}是必填项")] + //public decimal Qty { get; set; } + + ///// + ///// 单位 + ///// + //[Display(Name = "单位")] + //public string Uom { get; set; } + + + + ///// + ///// 调出库位 + ///// + //[Display(Name = "调出库位")] + //[Required(ErrorMessage = "{0}是必填项")] + //public string LocationErpCode { get; set; } + ///// + ///// 专案 + ///// + //[Display(Name = "专案")] + //[Required(ErrorMessage = "{0}是必填项")] + //public string CaseCode { get; set; } + ///// + ///// 项目分类 + ///// + //[Display(Name = "项目分类")] + //[Required(ErrorMessage = "{0}是必填项")] + //public string ProjCapacityCode { get; set; } + + ///// + ///// 次交易码 + ///// + //[Display(Name = "次交易码")] + //[Required(ErrorMessage = "{0}是必填项")] + //public string OnceBusiCode { get; set; } + ///// + ///// 说明 + ///// + //[Display(Name = "说明")] + //public string Explain { get; set; } + + + + + + + + + + + + + + + + + + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs index f2d0afa9e..ac61ba485 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedIssueJobs/UnplannedIssueJobAppService.cs @@ -2,15 +2,19 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Reflection; using System.Threading.Tasks; using Castle.Components.DictionaryAdapter; using Irony; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; using Omu.ValueInjecter; using Volo.Abp; using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; using Volo.Abp.ObjectMapping; +using Volo.Abp.Uow; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Shared; @@ -29,21 +33,26 @@ public class UnplannedIssueJobAppService : SfsJobAppServiceBase, IUnplannedIssueJobAppService { - + protected IUnplannedIssueRequestAppService UnplannedReceiptRequestAppService => + LazyServiceProvider.LazyGetRequiredService(); private readonly IUnplannedIssueJobManager _unplannedIssueJobManager; private readonly ILocationAppService _locationAppService; private readonly IBalanceAppService _balanceAppService; private readonly IExpectOutAppService _expectOutAppService; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly ILogger _logger; public UnplannedIssueJobAppService( - IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService - ) : base(repository, unplannedIssueJobManager) + IUnplannedIssueJobRepository repository, IUnplannedIssueJobManager unplannedIssueJobManager, ILocationAppService locationAppService, + IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService, IUnitOfWorkManager unitOfWorkManager, ILogger logger + ) : base(repository, unplannedIssueJobManager ) { _unplannedIssueJobManager = unplannedIssueJobManager; _locationAppService = locationAppService; _balanceAppService = balanceAppService; _expectOutAppService = expectOutAppService; - + _unitOfWorkManager = unitOfWorkManager; + _logger = logger; } /// @@ -61,6 +70,15 @@ public class UnplannedIssueJobAppService } } + private async Task UpdateRequestStatusAsync(string requestNumber) + { + await UnplannedReceiptRequestAppService.UpdateStatusByJobAsync(requestNumber).ConfigureAwait(false); + } + + + + + /// /// 根据储位推荐 @@ -84,19 +102,53 @@ public class UnplannedIssueJobAppService - private List DeductInventory(List inventory, decimal quantityToDeduct) + + //public static string[] GetAllFields(Type type) + //{ + // // 获取公共实例字段 + // var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); + + // // 返回字段名称 + // return fields.Select(f => f.Name).ToArray(); + //} + + + + private async Task> DeductInventory(List inventory, decimal quantityToDeduct) { List balanceDTOs = new List(); decimal totalDeducted = 0; + foreach (var item in inventory) { decimal availableToDeduct = Math.Min(item.Qty, quantityToDeduct - totalDeducted); item.Qty -= availableToDeduct; totalDeducted += availableToDeduct; - BalanceDTO dto = new BalanceDTO(); - dto.InjectFrom(item); - dto.Qty = availableToDeduct; - balanceDTOs.Add(dto); + if (availableToDeduct > 0) + { + var locationDto = await _locationAppService.GetByCodeAsync(item.LocationCode).ConfigureAwait(false); + BalanceDTO dto = new BalanceDTO(); + switch (locationDto.Type) + { + case EnumLocationType.RAW: + dto.InjectFrom(item); + dto.Qty = availableToDeduct; + balanceDTOs.Add(dto); + break; + case EnumLocationType.FG: + case EnumLocationType.DimensionalStorehouse: + case EnumLocationType.CUST: + case EnumLocationType.KittingWip: + case EnumLocationType.OUTSIDE: + case EnumLocationType.SEMI: + case EnumLocationType.WIP: + case EnumLocationType.THIRDPARTY: + + dto.InjectFrom(item); + balanceDTOs.Add(dto); + break; + } + } // 如果已经扣减达到所需数量,退出循环 if (totalDeducted >= quantityToDeduct) { @@ -110,37 +162,15 @@ public class UnplannedIssueJobAppService - - //public override async Task GetAsync(Guid id) - //{ - // var entity=await _repository.GetAsync(id).ConfigureAwait(false); - // var entityDTO=ObjectMapper.Map(entity); - // var details=ObjectMapper.Map, List>(entity.Details); - // var facDetails=ObjectMapper.Map, List>(entity.FacDetails); - // entityDTO.Details = details; - // entityDTO.FacDetails = facDetails; - // return entityDTO; - // // var inspectJob = await _repository.FindAsync(id).ConfigureAwait(false); - //} - - - - - - - - - - - - private async Task> BuildUnplannedIssueJobAsync(UnplannedIssueRequest requestDto, List useBalancesOut) { List jobs = new EditableList(); + List Errors= new List(); foreach (var requestDtoDetail in requestDto.Details)//非计划领料明细 { var locationCodes = await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.LocationErpCode)).ConfigureAwait(false);//获取存放库位 + var input = new RecommendBalanceRequestInput { ItemCode = requestDtoDetail.ItemCode, @@ -150,6 +180,9 @@ public class UnplannedIssueJobAppService IsPackingCode = false }; var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);//获取推荐库存 + + usableList = usableList.Where(p => p.Qty> 0).ToList(); + usableList = usableList .OrderBy(p => p.Lot) .ThenBy(p => p.PutInTime) @@ -161,7 +194,7 @@ public class UnplannedIssueJobAppService decimal qty = 0; //实际要用库存 List useBalances = new List(); - var returnlist=DeductInventory(usableList, requestDtoDetail.Qty); + var returnlist=await DeductInventory(usableList, requestDtoDetail.Qty).ConfigureAwait(false); useBalances.AddRange(returnlist); useBalancesOut.AddRange(returnlist); @@ -194,18 +227,37 @@ public class UnplannedIssueJobAppService //} if (returnlist.Count == 0) { - throw new UserFriendlyException("库存余额不够!"); + Errors.Add($"{"非生产领料"+requestDto.Number+"零件号:"+requestDtoDetail.ItemCode + "库存不够" + requestDtoDetail.Qty.ToString()}"); + } - foreach (var balanceDtoGroup in useBalances.GroupBy(p => p.LocationCode)) { var locationDto = await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false); var job = new UnplannedIssueJob(); + switch (locationDto.Type) + { + case EnumLocationType.RAW: + job.UnplannedIssueType = EnumUnplannedIssueType.Raw; + break; + case EnumLocationType.FG: + case EnumLocationType.DimensionalStorehouse: + case EnumLocationType.CUST: + case EnumLocationType.KittingWip: + case EnumLocationType.OUTSIDE: + case EnumLocationType.SEMI: + case EnumLocationType.WIP: + case EnumLocationType.THIRDPARTY: + job.UnplannedIssueType = EnumUnplannedIssueType.Wip; + break; + } job.SetId(GuidGenerator.Create()); job.UnplannedIssueRequestNumber= requestDto.Number; job.JobType = EnumJobType.UnplannedIssueJob; job.JobStatus = EnumJobStatus.Open; job.IsAutoComplete = false; + job.DeptCode = requestDto.DeptCode; + job.DeptName = requestDto.DeptName; + job.Worker = requestDto.Worker; job.OANumber = requestDto.OANumber; job.Number =await _unplannedIssueJobManager.GetNumber().ConfigureAwait(true); job.Details = new List(); @@ -215,42 +267,7 @@ public class UnplannedIssueJobAppService foreach (var balanceDto in balanceDtoGroup) { - var jobDetail = new UnplannedIssueJobDetail(); - - jobDetail.Number = job.Number; - jobDetail.SetIdAndNumber(GuidGenerator,job.Id,job.Number); - - jobDetail.CaseCode = requestDtoDetail.CaseCode; - jobDetail.Explain = requestDtoDetail.Explain; - jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode; - jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode; - //jobDetail.ReasonCode = requestDtoDetail.ReasonCode; - jobDetail.ItemCode = requestDtoDetail.ItemCode; - jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1; - jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2; - jobDetail.ItemName = requestDtoDetail.ItemName; - jobDetail.RecommendArriveDate = balanceDto.ArriveDate; - jobDetail.RecommendContainerCode = string.Empty; - jobDetail.RecommendExpireDate = balanceDto.ExpireDate; - jobDetail.RecommendLot = balanceDto.Lot; - jobDetail.RecommendPackingCode = balanceDto.PackingCode; - jobDetail.RecommendProduceDate = balanceDto.ProduceDate; - jobDetail.RecommendQty = balanceDto.Qty; - jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; - jobDetail.StdPackQty = requestDtoDetail.StdPackQty; - jobDetail.RecommendPackingCode = balanceDto.PackingCode; - jobDetail.HandledPackingCode = balanceDto.PackingCode; - jobDetail.RecommendFromLocationArea = balanceDto.LocationArea; - jobDetail.RecommendFromLocationCode = balanceDto.LocationCode; - jobDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode; - jobDetail.RecommendFromLocationGroup = balanceDto.LocationGroup; - jobDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode; - jobDetail.HandledQty = balanceDto.Qty; - - - var jobfacDetail = new UnplannedIssueJobFacDetail(); - jobfacDetail.Number = job.Number; jobfacDetail.SetIdAndNumber(GuidGenerator, job.Id, job.Number); jobfacDetail.CaseCode = requestDtoDetail.CaseCode; @@ -272,17 +289,29 @@ public class UnplannedIssueJobAppService jobfacDetail.RecommendSupplierBatch = balanceDto.SupplierBatch; jobfacDetail.StdPackQty = requestDtoDetail.StdPackQty; jobfacDetail.RecommendPackingCode = balanceDto.PackingCode; - jobfacDetail.HandledPackingCode = balanceDto.PackingCode; - + jobfacDetail.HandledFromLocationGroup = balanceDto.LocationGroup; + jobfacDetail.HandledFromLocationArea = balanceDto.LocationArea; + jobfacDetail.HandledFromLocationCode = balanceDto.LocationCode; + jobfacDetail.HandledFromLocationErpCode = balanceDto.LocationErpCode; + jobfacDetail.HandledFromWarehouseCode = balanceDto.WarehouseCode; + jobfacDetail.HandledQty = balanceDto.Qty; + jobfacDetail.HandledSupplierBatch = balanceDto.Lot; + jobfacDetail.HandledArriveDate = balanceDto.ArriveDate; + jobfacDetail.HandledProduceDate = balanceDto.ProduceDate; + jobfacDetail.HandledExpireDate = balanceDto.ExpireDate; + jobfacDetail.HandledContainerCode =balanceDto.ContainerCode ; + jobfacDetail.HandledLot = balanceDto.Lot; + jobfacDetail.HandledPackingCode =balanceDto.PackingCode; jobfacDetail.RecommendFromLocationArea = balanceDto.LocationArea; jobfacDetail.RecommendFromLocationCode = balanceDto.LocationCode; jobfacDetail.RecommendFromLocationErpCode = balanceDto.LocationErpCode; jobfacDetail.RecommendFromLocationGroup = balanceDto.LocationGroup; jobfacDetail.RecommendFromWarehouseCode = balanceDto.WarehouseCode; + jobfacDetail.Status = balanceDto.Status; jobfacDetail.HandledQty = balanceDto.Qty; - + jobfacDetail.Uom = balanceDto.Uom; - job.Details.Add(jobDetail); + //job.Details.Add(jobDetail); job.FacDetails.Add(jobfacDetail); } if (locationDto.Type == EnumLocationType.DimensionalStorehouse)//如果是立库的 @@ -290,10 +319,16 @@ public class UnplannedIssueJobAppService await SendDimensionalStorehouseAsync().ConfigureAwait(false); job.JobStatus = EnumJobStatus.Wait; } - jobs.Add(job); } } + if (Errors.Count > 0) + { + foreach (var itm in Errors) + { + _logger.LogError(itm); + } + } return jobs; } @@ -341,6 +376,56 @@ public class UnplannedIssueJobAppService return issuenote; } + /// + /// 根据申请单号判断下面的任务是否都是完成或取消 + /// + /// + [HttpPost("is-all-job-over-by-request-number")] + public async Task IsAllJobOverByRequestNumberAsync(string requestNumber) + { + var unplannedRequestJobs = await _repository.GetListAsync(p => p.UnplannedIssueRequestNumber == requestNumber).ConfigureAwait(false); + if (unplannedRequestJobs.Any(p => + p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Partial || + p.JobStatus == EnumJobStatus.Doing || p.JobStatus == EnumJobStatus.Wait)) + { + return false; + } + return true; + } + + + [HttpPost("handle/{id}")] + + public override async Task CompleteAsync(Guid id, UnplannedIssueJobDTO dto) + { + var job = await _repository.GetAsync(id).ConfigureAwait(false); + var handleDto = new UnplannedIssueJobDTO(); + //using (var uow = _unitOfWorkManager.Begin()) + //{ + // 在工作单元中插入数据 + + if (job.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None or EnumJobStatus.Done)//需要考虑下 多次提交的问题 所以不判断 进行中 + { + throw new UserFriendlyException($"任务状态错误:编号为【{job.Number}】的任务已经【{job.JobStatus.GetDisplayName()}】"); + } + var handleEntity = ObjectMapper.Map(dto); + var handleResult = await _unplannedIssueJobManager.CompleteAsync(handleEntity, CurrentUser).ConfigureAwait(false); + handleDto = ObjectMapper.Map(handleResult); + await _expectOutAppService.RemoveAsync(dto.Number).ConfigureAwait(false); + handleResult.JobStatus = EnumJobStatus.Done; + handleResult.CompleteUserName = dto.Worker; + handleResult.JobStatus = EnumJobStatus.Done; + job = await _repository.UpdateAsync(handleResult).ConfigureAwait(false); + await UpdateRequestStatusAsync(job.UnplannedIssueRequestNumber).ConfigureAwait(false); + //}; + + + + return handleDto; + } + + + diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedIssuesNotes/UnplannedIssueNoteAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedIssuesNotes/UnplannedIssueNoteAppService.cs index 36faf9345..864823f42 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedIssuesNotes/UnplannedIssueNoteAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/UnplannedIssuesNotes/UnplannedIssueNoteAppService.cs @@ -50,7 +50,8 @@ public class UnplannedIssueNoteAppService : entity.Details.Add(detail); //2023-10-20 袁静雯要求修改计划外出入库 Worker为userName - var userName = await _userAppService.GetUserNameByUserAsync(input.Worker).ConfigureAwait(false); + var userName = input.Worker; + //await _userAppService.GetUserNameByUserAsync(input.Worker).ConfigureAwait(false); entity.Worker = userName; } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs index a46cd917a..27a27fffc 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestAppService.cs @@ -77,8 +77,9 @@ public abstract class UnplannedIssueRequestAppService : return dto; } - - - - + [HttpPost("update-status-by-job")] + public virtual async Task UpdateStatusByJobAsync(string requestNumber) + { + throw new System.NotImplementedException(); + } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs index 97585bfcc..2698cbfd3 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedIssueRequests/UnplannedIssueRequestForDongyangAppService.cs @@ -9,9 +9,11 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Omu.ValueInjecter; +using Org.BouncyCastle.Asn1.Ocsp; using Volo.Abp; using Volo.Abp.Data; using Volo.Abp.Domain.Entities; +using Volo.Abp.Uow; using Volo.Abp.Users; using Win_in.Sfs.Auth.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts; @@ -36,13 +38,19 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA private readonly IBalanceAppService _balanceAppService; private readonly ILocationAppService _locationAppService; private readonly ITransactionTypeAclService _transactionTypeAclService; + private readonly IUnplannedIssueJobAppService _unplannedIssueJobAppService; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly ILogger _logger; //private readonly IExportImportService _excelService; public UnplannedIssueRequestForDongyangAppService(IUnplannedIssueRequestRepository repository, IUnplannedIssueRequestManager unplannedIssueRequestManager, IDepartmentAppService departmentApp, IBalanceAppService balanceAppService, ILocationAppService locationAppService, IExportImportService excelService, - ITransactionTypeAclService transactionTypeAclService + ITransactionTypeAclService transactionTypeAclService, IUnplannedIssueJobAppService unplannedIssueJobAppService, IUnitOfWorkManager unitOfWorkManager + , ILogger logger + + ) : base( repository, unplannedIssueRequestManager, excelService) { _unplannedIssueRequestManager = unplannedIssueRequestManager; @@ -50,6 +58,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA _balanceAppService = balanceAppService; _locationAppService = locationAppService; _transactionTypeAclService = transactionTypeAclService; + _unplannedIssueJobAppService = unplannedIssueJobAppService; + _unitOfWorkManager = unitOfWorkManager; + _logger = logger; } /// /// OA创建计划外出库申请 @@ -86,11 +97,12 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA /// /// [HttpPost("import-dongyang")] - public async Task ImportDYAsync([FromForm] SfsImportRequestInput requestInput, [Required] IFormFile file) + public async Task ImportDYAsync([FromForm] SfsImportRequestInput requestInput, [Required] IFormFile file) { try { + using var ms = new MemoryStream(); await file.OpenReadStream().CopyToAsync(ms).ConfigureAwait(false); var inputFileBytes = ms.GetAllBytes(); @@ -98,14 +110,31 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA await CreateByDYOAsync(importList, EnumUnplannedIssueType.IMPORT).ConfigureAwait(false); - //if (errors.Count > 0) - //{ - // var fileContent = _excelService.Export(errors); - // return new TestResult(fileContent.FileContents, ExportImportService.ContentType) { FileDownloadName = "错误信息" }; - //} + List errorsList = new List(); + + foreach (var itm in importList) + { + if (string.IsNullOrEmpty(itm.CaseCode) + || string.IsNullOrEmpty(itm.ItemCode) + || itm.Qty == 0 + || string.IsNullOrEmpty(itm.ProjCapacityCode) + || string.IsNullOrEmpty(itm.LocationErpCode) + + ) + { + itm.Explain = "此项错误"; + errorsList.Add(itm); + } + } + + if (errorsList.Count > 0) + { + var fileContent = _excelService.Export(errorsList); + return new TestResult(fileContent.FileContents, ExportImportService.ContentType) { FileDownloadName =fileContent.FileDownloadName }; + } var fileContent1 = _excelService.Export(importList); - // return new TestResult(fileContent1.FileContents, ExportImportService.ContentType) { FileDownloadName = "Kitting导入文件" }; + return new JsonResult(new { Code = 200, FileDownloadName = fileContent1.FileDownloadName }); } catch (Exception e) @@ -115,6 +144,39 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA } + + + + + + + + + + private async Task SetEntityPropertiesAsync(UnplannedIssueRequest entity) + { + var userName = CurrentUser.GetUserName_New(); + var name = CurrentUser.GetName(); + if (userName != null) + { + var department = await _departmentApp.GetByUsernameAsync(userName).ConfigureAwait(false); + + if (department != null) + { + entity.DeptCode = department.Code; + entity.DeptName = department.Name; + } + entity.CreatorId = CurrentUser.Id; + entity.Worker = name; + } + + entity.BuildDate = DateTime.Now; + + //await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false); + } + + + /// /// OA接口 /// @@ -124,8 +186,18 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA public async Task CreateByAsync(List p_list) { + UnplannedIssueRequestDTO request = new UnplannedIssueRequestDTO(); + try + { + return await CreateByDYOAsync(p_list, EnumUnplannedIssueType.OA, true).ConfigureAwait(false); + } + catch (Exception e) + { + + throw new UserFriendlyException(e.Message); + } - return await CreateByDYOAsync(p_list, EnumUnplannedIssueType.OA, true).ConfigureAwait(false); + } @@ -134,6 +206,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA protected async Task CreateByDYOAsync(List p_list, EnumUnplannedIssueType type, bool isAutoSubmit=false) { + + + UnplannedIssueRequest request = new UnplannedIssueRequest(); if (p_list.Count == 0) { @@ -151,9 +226,9 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA request.DeptCode = first.DeptCode; request.DeptName = first.DeptName; request.BuildDate= DateTime.Now; - - + request.OANumber=first.OANumber; + await SetEntityPropertiesAsync(request).ConfigureAwait(false); List detailList = new List(); foreach (var itm in p_list) { @@ -162,13 +237,10 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA detail.Qty = itm.Qty; detail.LocationErpCode = itm.LocationErpCode; - detail.LocationCode = "Random"; detail.WarehouseCode ="Random"; detail.LocationGroup ="Random"; detail.LocationArea = "Random"; - - detail.CaseCode = first.CaseCode; detail.ProjCapacityCode = first.ProjCapacityCode; detail.OnceBusiCode = first.OnceBusiCode; @@ -186,6 +258,22 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA return dto; } + + [HttpPost("update-status-by-job")] + public override async Task UpdateStatusByJobAsync(string requestNumber) + { + var flag = await _unplannedIssueJobAppService.IsAllJobOverByRequestNumberAsync(requestNumber).ConfigureAwait(false); + if (flag) + { + var unplannedReceiptRequest = await _repository.FindAsync(p => p.Number == requestNumber).ConfigureAwait(false); + unplannedReceiptRequest.RequestStatus = EnumRequestStatus.Completed; + await _repository.UpdateAsync(unplannedReceiptRequest).ConfigureAwait(false); + } + } + + + + private async Task SetDetailPropertiesAsync(UnplannedIssueRequestDetail detail) { var itemBasic = await ItemBasicAclService.GetByCodeAsync(detail.ItemCode).ConfigureAwait(false); @@ -205,16 +293,12 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA packingcode =string.IsNullOrEmpty(detail.PackingCode)?"99999999":detail.PackingCode; - detail.PackingCode = packingcode; - - } - - - - - + detail.PackingCode = packingcode; + detail.Status = EnumInventoryStatus.OK; + + } /// @@ -226,71 +310,39 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA { var addList = dictionary.Where(p => p.Value == EntityState.Added).Select(p => p.Key); - foreach (var unplannedIssueRequest in addList) + foreach (var unplannedReceiptRequest in addList) { - if(unplannedIssueRequest.UnplannedIssueType != EnumUnplannedIssueType.Wip&& unplannedIssueRequest.UnplannedIssueType != EnumUnplannedIssueType.Raw) - { - throw new UserFriendlyException($"【{unplannedIssueRequest.UnplannedIssueType}】领料类型," + - $"不是{EnumUnplannedIssueType.Wip.GetDisplayName()}" + - $"或{EnumUnplannedIssueType.Raw.GetDisplayName()}】"); - } - await SetRequestAutoPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false); - await SetEntityPropertiesAsync(unplannedIssueRequest).ConfigureAwait(false); - List newDetails = new List(); - foreach (var detail in unplannedIssueRequest.Details) - { - //需要复制一个这个方法 去掉区域参数 换成库位参数 - RecommendBalanceRequestInput input = new RecommendBalanceRequestInput(); - if (unplannedIssueRequest.UnplannedIssueType == EnumUnplannedIssueType.Raw) - { - var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false); - if (locationDto.Type != EnumLocationType.RAW && locationDto.Type != EnumLocationType.SEMI && locationDto.Type != EnumLocationType.FG) - { - throw new UserFriendlyException($"【{detail.LocationCode}】库位类型错误," + - $"不是{EnumLocationType.RAW.GetDisplayName()}" + - $"或{EnumLocationType.SEMI.GetDisplayName()}" + - $"或{EnumLocationType.FG.GetDisplayName()}】"); - } - // unplannedIssueRequest.DirectCreateNote = false; - input.IsPackingCode = true;//只查询带箱码的推荐 - } - if (unplannedIssueRequest.UnplannedIssueType == EnumUnplannedIssueType.Wip) - { - var locationDto = await _locationAppService.GetByCodeAsync(detail.LocationCode).ConfigureAwait(false); - if (locationDto.Type != EnumLocationType.WIP) - { - throw new UserFriendlyException($"【{detail.LocationCode}】库位类型错误," + - $"不是{EnumLocationType.WIP.GetDisplayName()}】"); - } - } + //if (unplannedReceiptRequest.UnplannedIssueType != EnumUnplannedIssueType.Wip && unplannedReceiptRequest.UnplannedIssueType != EnumUnplannedIssueType.Raw) + //{ + // throw new UserFriendlyException($"【{unplannedReceiptRequest.UnplannedIssueType}】退料料类型," + + // $"不是{EnumUnplannedReceiptType.Wip.GetDisplayName()}" + + // $"或{EnumUnplannedReceiptType.Raw.GetDisplayName()}】"); + //} + await SetRequestAutoPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false); + await SetEntityPropertiesAsync(unplannedReceiptRequest).ConfigureAwait(false); - input.ItemCode = detail.ItemCode; - input.Locations = new List() { detail.LocationCode }; - input.Qty = detail.Qty; - input.Statuses = new List { EnumInventoryStatus.OK }; - var balanceLst = await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false); - if (balanceLst.Count == 0) - { - throw new UserFriendlyException($"无推荐库存零件号:{input.ItemCode}库位{input.Locations[0]}!"); - } - var sumQty = balanceLst.Sum(itm => itm.Qty); - if (detail.Qty > sumQty) - { - throw new UserFriendlyException($"库存数量不足!"); - } - foreach (var balance in balanceLst) - { - var newDetail = CreateNewDetail(detail, balance); - await SetDetailPropertiesAsync(newDetail, unplannedIssueRequest.UnplannedIssueType).ConfigureAwait(false); - newDetails.Add(newDetail); - } + foreach (var detail in unplannedReceiptRequest.Details) + { + await SetDetailPropertiesAsync(detail).ConfigureAwait(false); } - unplannedIssueRequest.Details.Clear();//删除所有明细} - unplannedIssueRequest.Details.AddRange(newDetails);//按推荐添加 } return dictionary; } + + + + + + + + + + + + + + /// /// 创建明细 /// @@ -349,29 +401,29 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA detail.LocationArea = location.AreaCode; detail.LocationCode = location.Code; } - string packingcode = string.Empty; - if(type!= EnumUnplannedIssueType.Wip) - { - packingcode = detail.PackingCode; - } - var balance = await _balanceAppService.GetByItemLocationAndPackingAsync( - packingcode, - detail.ItemCode, - detail.LocationCode).ConfigureAwait(false); + //string packingcode = string.Empty; + //if(type!= EnumUnplannedIssueType.Wip) + //{ + // packingcode = detail.PackingCode; + //} + //var balance = await _balanceAppService.GetByItemLocationAndPackingAsync( + // packingcode, + // detail.ItemCode, + // detail.LocationCode).ConfigureAwait(false); - if (balance != null) - { - detail.SupplierBatch = balance.SupplierBatch; - detail.ArriveDate = balance.ArriveDate; - detail.ProduceDate = balance.ProduceDate; - detail.ExpireDate = balance.ExpireDate; - - detail.Lot = balance.Lot; - detail.ContainerCode = balance.ContainerCode; - detail.PackingCode = balance.PackingCode; - detail.Qty = detail.Qty; - detail.Status = balance.Status; - } + //if (balance != null) + //{ + // detail.SupplierBatch = balance.SupplierBatch; + // detail.ArriveDate = balance.ArriveDate; + // detail.ProduceDate = balance.ProduceDate; + // detail.ExpireDate = balance.ExpireDate; + + // detail.Lot = balance.Lot; + // detail.ContainerCode = balance.ContainerCode; + // detail.PackingCode = balance.PackingCode; + // detail.Qty = detail.Qty; + // detail.Status = balance.Status; + //} //if (!string.IsNullOrEmpty(detail)) //{ @@ -419,33 +471,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA //} } - /// - /// 赋值主记录 - /// - /// - /// - private async Task SetEntityPropertiesAsync(UnplannedIssueRequest entity) - { - var userName = CurrentUser.GetUserName_New(); - var name = CurrentUser.GetName(); - if (userName != null) - { - var department = await _departmentApp.GetByUsernameAsync(userName).ConfigureAwait(false); - - if (department != null) - { - entity.DeptCode = department.Code; - entity.DeptName = department.Name; - } - - entity.Worker = name; - entity.CreatorId = CurrentUser.Id; - } - - entity.BuildDate = DateTime.Now; - await SetRequestAutoPropertiesAsync(entity).ConfigureAwait(false); - } /// /// 赋值业务事务 @@ -459,13 +485,27 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA Check.NotNull(tranType, "事务类型", "事务类型不存在"); - entity.AutoCompleteJob = tranType.AutoCompleteJob; - entity.AutoSubmit = tranType.AutoSubmitRequest; - entity.AutoAgree = tranType.AutoAgreeRequest; - entity.AutoHandle = tranType.AutoHandleRequest; - entity.DirectCreateNote = tranType.DirectCreateNote; + entity.AutoCompleteJob = false; + entity.AutoSubmit = true; + entity.AutoAgree = false; + entity.AutoHandle = false; + entity.DirectCreateNote = false; + + + + //entity.AutoCompleteJob = tranType.AutoCompleteJob; + //entity.AutoSubmit = tranType.AutoSubmitRequest; + //entity.AutoAgree = tranType.AutoAgreeRequest; + //entity.AutoHandle = tranType.AutoHandleRequest; + //entity.DirectCreateNote = tranType.DirectCreateNote; } + + + + + + #endregion #region 校验 @@ -491,11 +531,11 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA var balance = await BalanceAclService.GetByItemLocationAndPackingAsync( string.Empty, importInput.ItemCode, - importInput.LocationCode).ConfigureAwait(false); + importInput.LocationErpCode).ConfigureAwait(false); if (balance == null) { - validationRresult.Add(new ValidationResult($"ERP料号{importInput.ItemCode}在库位{importInput.LocationCode}没有库存记录", new string[] { "库存余额" })); + validationRresult.Add(new ValidationResult($"ERP料号{importInput.ItemCode}在库位{importInput.LocationErpCode}没有库存记录", new string[] { "库存余额" })); } else { @@ -543,7 +583,7 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA protected override async Task ValidateImportModelAsync(UnplannedIssueRequestImportInput model, List validationRresult) { _ = await CheckItemBasicAsync(model, validationRresult).ConfigureAwait(false); - _ = await CheckLocationAsync(model.LocationCode, validationRresult).ConfigureAwait(false); + await CheckErpLocationAsync(model.LocationErpCode, validationRresult).ConfigureAwait(false); await CheckOnceBusiCodeAsync(model, validationRresult).ConfigureAwait(false);//次交易码 //await CheckCaseCodeAsync(model, validationRresult).ConfigureAwait(false);//专案代码 @@ -566,14 +606,13 @@ public class UnplannedIssueRequestForDongyangAppService : UnplannedIssueRequestA return item; } - protected async Task CheckLocationAsync(string locationCode, List validationRresult) + protected virtual async Task CheckErpLocationAsync(string locationCode, List validationRresult) { - var location = await LocationAclService.GetByCodeAsync(locationCode).ConfigureAwait(false); - if (location == null) + var location = await _locationAppService.GetListByErpLocationCodes(new List { locationCode }).ConfigureAwait(false); + if (location == null || location.Count == 0) { - validationRresult.Add(new ValidationResult($"调出库位{locationCode}不存在", new string[] { "调出库位" })); + validationRresult.Add("调出储位", $"调入出位{locationCode}不存在"); } - return location; } protected async Task CheckOnceBusiCodeAsync(UnplannedIssueRequestImportInput importInput, List validationRresult) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs index f916d2d4f..8abb5c37a 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs @@ -326,7 +326,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ var location = await _locationAppService.GetListByErpLocationCodes(new List{ locationCode }).ConfigureAwait(false); if (location == null||location.Count==0) { - validationRresult.Add("调入储位", $"调入库位{locationCode}不存在"); + validationRresult.Add("调出储位", $"调入出位{locationCode}不存在"); } } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs index 922a5f395..010986984 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/UnplannedIssueJobs/UnplannedIssueJob.cs @@ -101,4 +101,7 @@ public class UnplannedIssueJob : SfsJobAggregateRootBase /// 执行任务 发料任务 /// - /// - /// - /// + /// + /// + /// /// public override async Task CompleteAsync(UnplannedIssueJob input, ICurrentUser user) { - UnplannedIssueJob entity = await Repository.FindAsync(input.Id).ConfigureAwait(false); + var entity = await Repository.GetAsync(input.Id).ConfigureAwait(false); entity.BuildDate = input.BuildDate; entity.DeptCode = input.DeptCode; entity.DeptName = input.DeptName; entity.CompleteUserName = input.CompleteUserName; entity.CompleteUserId = input.CompleteUserId; + + var first= entity.FacDetails.FirstOrDefault(); + + foreach (var detail in input.Details) { - //发料子任务 赋值实际转移 - await entity.BuildDetail(detail.Id, detail.HandledFromLocationGroup, detail.HandledFromLocationArea,detail.HandledFromLocationCode, detail.HandledFromLocationErpCode, detail.HandledFromWarehouseCode, detail.HandledQty, detail.HandledSupplierBatch, detail.HandledArriveDate, detail.HandledProduceDate, detail.HandledExpireDate, - detail.HandledContainerCode, detail.HandledLot, detail.HandledPackingCode, detail.ExtraProperties).ConfigureAwait(false); + detail.SetIdAndNumber(GuidGenerator, input.Id, input.Number); + detail.ReasonCode = first.ReasonCode; + detail.CaseCode = first.CaseCode; + detail.ProjCapacityCode = first.ProjCapacityCode; + detail.OnceBusiCode = first.OnceBusiCode; + detail.Explain = first.Explain; + detail.Status = EnumInventoryStatus.OK; + + entity.AddDetail(detail); + //发料子任务 赋值实际转移 } - return await base.CompleteAsync(entity, user).ConfigureAwait(false); } @@ -52,7 +66,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase ///// 临时修改 解决补料无法拿到订阅错误 ///// - ///// + ///// ///// //public virtual async Task> AddByEtoAsync(MaterialRequestHandledETO eventData) //{ @@ -89,7 +103,7 @@ public class UnplannedIssueJobManager : SfsJobManagerBase GetAsync(Expression> expression) { diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/UnplannedIssueJobEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/UnplannedIssueJobEventHandler.cs index a5c2f04ff..327e8fe7f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/UnplannedIssueJobEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/UnplannedIssueJobEventHandler.cs @@ -1,11 +1,13 @@ -using System; using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; using Volo.Abp.EventBus; +using Volo.Abp.EventBus.Local; 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; +using static Quartz.Logging.OperationName; namespace Win_in.Sfs.Wms.Store.Event.BusinessJob; @@ -44,6 +46,18 @@ public class UnplannedIssueJobEventHandler : var note = BuildUnplannedIssueNoteCreateInput(entity); await _noteApp.CreateAsync(note).ConfigureAwait(false); + entity.JobStatus=EnumJobStatus.Done; + + + //job.CompleteUserName = worker; + //job.JobStatus = EnumJobStatus.Done; + //job = await _repository.UpdateAsync(job).ConfigureAwait(false); + //await LocalEventBus.PublishAsync(new SfsCompletedEntityEventData(job), false).ConfigureAwait(false); + //await UpdateRequestStatusAsync(job.UnplannedReceiptRequestNumber).ConfigureAwait(false); + + + + } [UnitOfWork] @@ -71,17 +85,71 @@ public class UnplannedIssueJobEventHandler : /* createInput.Details = new List(); + //var strs= GetDifferentPropertyNames(typeof(UnplannedIssueJobDetail), typeof(UnplannedIssueNoteDetailInput)); + //var strs1 = GetDifferentPropertyNames(typeof(UnplannedIssueNoteDetailInput), typeof(UnplannedIssueJobDetail)); + + foreach (var inputDetail in entity.Details) { - var detail = ObjectMapper.Map(inputDetail); + if (inputDetail.HandledQty > 0) + { + var detail = ObjectMapper.Map(inputDetail); + detail.LocationCode = inputDetail.HandledFromLocationCode; + detail.LocationArea = inputDetail.HandledFromLocationArea; + detail.LocationGroup=inputDetail.HandledFromLocationGroup; + detail.LocationErpCode = inputDetail.HandledFromLocationErpCode; + detail.WarehouseCode = inputDetail.HandledFromWarehouseCode; + detail.PackingCode = inputDetail.HandledPackingCode; + detail.ContainerCode=inputDetail.HandledContainerCode; + detail.Qty=inputDetail.HandledQty; + detail.Lot=inputDetail.HandledLot; + detail.SupplierBatch = inputDetail.HandledSupplierBatch; + detail.ArriveDate=inputDetail.HandledArriveDate; + detail.ProduceDate = inputDetail.HandledProduceDate; + detail.ExpireDate=inputDetail.HandledExpireDate; + detail.Uom = inputDetail.Uom; + detail.ExtraProperties = inputDetail.ExtraProperties; + createInput.Details.Add(detail); + } + } + return createInput; + } - detail.ExtraProperties = inputDetail.ExtraProperties; + //public static string[] GetDifferentFieldNames(Type type1, Type type2) + //{ + // // 获取两个类型的字段 + // var fields1 = type1.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + // var fields2 = type2.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - createInput.Details.Add(detail); - } - */ + // // 获取字段名称 + // var fieldNames1 = fields1.Select(f => f.Name).ToArray(); + // var fieldNames2 = fields2.Select(f => f.Name).ToArray(); - return createInput; + // // 找出不同的字段名称 + // var differentFields = fieldNames1.Except(fieldNames2).ToArray(); + + + // return differentFields; + //} + + + public static string[] GetDifferentPropertyNames(Type type1, Type type2) + { + // 获取两个类型的属性 + var properties1 = type1.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + var properties2 = type2.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + + // 获取属性名称 + var propertyNames1 = properties1.Select(p => p.Name).ToArray(); + var propertyNames2 = properties2.Select(p => p.Name).ToArray(); + + // 找出不同的属性名称 + var differentProperties = propertyNames1.Except(propertyNames2) + .ToArray(); + + return differentProperties; } + + } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/UnplannedIssueNoteEventHandler.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/UnplannedIssueNoteEventHandler.cs index a1da37d65..e756006f9 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/UnplannedIssueNoteEventHandler.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/UnplannedIssueNoteEventHandler.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Volo.Abp.Domain.Entities; using Volo.Abp.EventBus; @@ -11,6 +12,7 @@ using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Event.Inventories; using Win_in.Sfs.Wms.Store.Event.Transaction; +using static Quartz.Logging.OperationName; namespace Win_in.Sfs.Wms.Store.Event.Transactions; @@ -23,8 +25,9 @@ public class UnplannedIssueNoteEventHandler private const EnumTransType TransType = EnumTransType.UnplannedIssue; private readonly IUnplannedIssueRequestAppService _unplannedIssueRequestApp; + private readonly IUnplannedIssueJobAppService _unplannedIssueJobApp; - public UnplannedIssueNoteEventHandler(IUnplannedIssueRequestAppService unplannedIssueRequestApp) + public UnplannedIssueNoteEventHandler(IUnplannedIssueRequestAppService unplannedIssueRequestApp,IUnplannedIssueJobAppService _unplannedIssueJobApp) { this._unplannedIssueRequestApp = unplannedIssueRequestApp; } @@ -37,11 +40,12 @@ public class UnplannedIssueNoteEventHandler if (!string.IsNullOrEmpty(entity.UnplannedIssueRequestNumber)) { - await _unplannedIssueRequestApp.CompleteByNumberAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false); - if (entity.UnplannedIssueType == EnumUnplannedIssueType.Raw) - { - await ExpectOutAppService.RemoveAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false); - } + //await _unplannedIssueRequestApp.UpdateStatusByJobAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false); + //await _unplannedIssueRequestApp.CompleteByNumberAsync(entity.UnplannedIssueRequestNumber).ConfigureAwait(false); + //if (entity.UnplannedIssueType == EnumUnplannedIssueType.Raw) + //{ + // await ExpectOutAppService.RemoveAsync(entity.JobNumber).ConfigureAwait(false); + //} } }