From 79e1107189a3990af7e587d81046c5473aa416ed Mon Sep 17 00:00:00 2001 From: "boxu.zheng" Date: Fri, 17 May 2024 16:07:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IAssembleIssueJobAppService.cs | 9 +- .../ICoatingIssueJobAppService.cs | 2 - .../AssembleIssueJobAppService.cs | 440 ++++++++++-------- .../CoatingIssueJobAppService.cs | 181 +++---- .../InjectionIssueJobAppService.cs | 6 +- .../KittingIssueJobAppService.cs | 6 +- .../AssembleIssueRequestAppService.cs | 270 +++++++---- .../CoatingIssueRequestAppService.cs | 265 ++++++----- .../InjectionIssueRequestAppService.cs | 259 +++++------ .../KittingIssueRequestAppService.cs | 211 ++++----- 10 files changed, 912 insertions(+), 737 deletions(-) diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/IAssembleIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/IAssembleIssueJobAppService.cs index ab78d78ac..397ebd6d5 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/IAssembleIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/AssembleIssueJobs/IAssembleIssueJobAppService.cs @@ -9,8 +9,6 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts; public interface IAssembleIssueJobAppService : ISfsJobAppServiceBase { - Task CancelByMaterialRequestAsync(string requestNumber); - Task> GetByRequestNumberAsync(string requestNumber); /// @@ -20,4 +18,11 @@ public interface IAssembleIssueJobAppService Task ExecuteDetailAsync(Guid masterId, Guid detailId, AssembleIssueJobDetailDTO issueJobDetailDto); Task CompleteAsync(Guid id); + + /// + /// 请求点了完成,任务全部都完成 + /// + /// + /// + Task CompleteByRequestNumberAsync(string requestNumber); } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs index 3f3f7d933..73d3674de 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs @@ -9,8 +9,6 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts; public interface ICoatingIssueJobAppService : ISfsJobAppServiceBase { - Task CancelByMaterialRequestAsync(string requestNumber); - Task> GetByRequestNumberAsync(string requestNumber); /// diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs index 74f0dbdd8..6a83867ce 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; -using System.Data; using System.Linq; -using System.Linq.Expressions; -using System.Net.Http.Headers; using System.Net.Http; -using System.Threading; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; using System.Threading.Tasks; using Castle.Components.DictionaryAdapter; using Microsoft.AspNetCore.Authorization; @@ -13,10 +12,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using MyNamespace; using Volo.Abp; -using Volo.Abp.Application.Dtos; using Win_in.Sfs.Basedata.Application.Contracts; -using Win_in.Sfs.Basedata.Domain.Shared; -using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Wms.Inventory.Application.Contracts; @@ -38,10 +34,10 @@ public class AssembleIssueJobAppService { private readonly IAssembleIssueJobManager _assembleIssueJobManager; private readonly ILocationAppService _locationAppService; - private readonly ITransferLibJobAppService _transferLibJobAppService; private readonly IAssembleIssueNoteAppService _assembleIssueNoteAppService; private readonly IExpectOutAppService _expectOutAppService; private readonly IHttpClientFactory _httpClientFactory; + private readonly ITransferLibRequestAppService _transferLibRequestAppService; private readonly IOptions _options; protected IAssembleIssueRequestAppService AssembleIssueRequestAppService => @@ -49,23 +45,19 @@ public class AssembleIssueJobAppService public AssembleIssueJobAppService( IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager, - ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService, + ILocationAppService locationAppService, IAssembleIssueNoteAppService assembleIssueNoteAppService, IExpectOutAppService expectOutAppService , IHttpClientFactory httpClientFactory - , IOptions options - - - - ) : base( + , IOptions options, ITransferLibRequestAppService transferLibRequestAppService) : base( repository, assembleIssueJobManager) { _assembleIssueJobManager = assembleIssueJobManager; _locationAppService = locationAppService; - _transferLibJobAppService = transferLibJobAppService; _assembleIssueNoteAppService = assembleIssueNoteAppService; _expectOutAppService = expectOutAppService; _httpClientFactory = httpClientFactory; _options = options; + _transferLibRequestAppService = transferLibRequestAppService; } [HttpPost("add-many")] @@ -101,23 +93,31 @@ public class AssembleIssueJobAppService [HttpPost("invalid")] public override async Task CancelAsync(Guid id) { - var injectionJob = await _repository.GetAsync(id).ConfigureAwait(false); - if (injectionJob == null) + var assembleJob = await _repository.GetAsync(id).ConfigureAwait(false); + if (assembleJob == null) { throw new UserFriendlyException($"未找到ID为 {id} 的任务"); } - await _assembleIssueJobManager.CancelAsync(injectionJob).ConfigureAwait(false); - } + if (assembleJob.JobStatus == EnumJobStatus.Open || + assembleJob.JobStatus == EnumJobStatus.Partial || + assembleJob.JobStatus == EnumJobStatus.Wait || + assembleJob.JobStatus == EnumJobStatus.Doing) + { + await _expectOutAppService.RemoveByNumberAsync(assembleJob.Number).ConfigureAwait(false); + await _transferLibRequestAppService.CancelByCallRequestNumberAsync(assembleJob.AssembleRequestNumber) + .ConfigureAwait(false); - [HttpPost("cancel-by-request/{requestNumber}")] - public virtual async Task CancelByMaterialRequestAsync(string requestNumber) - { - var entities = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber) - .ConfigureAwait(false); - foreach (var entity in entities) + assembleJob.JobStatus = EnumJobStatus.Cancelled; + await _repository.UpdateAsync(assembleJob).ConfigureAwait(false); + } + else { - await _assembleIssueJobManager.CancelAsync(entity).ConfigureAwait(false); + throw new UserFriendlyException($"任务状态不是" + + $"{EnumJobStatus.Open.GetDisplayName()}、" + + $"{EnumJobStatus.Partial.GetDisplayName()}、" + + $"{EnumJobStatus.Doing.GetDisplayName()}、" + + $"{EnumJobStatus.Wait.GetDisplayName()}"); } } @@ -139,11 +139,15 @@ public class AssembleIssueJobAppService { var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false); - var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync(dto.Number).ConfigureAwait(false); + if (job.JobStatus != EnumJobStatus.Wait) + { + throw new UserFriendlyException($"任务状态不是{EnumJobStatus.Wait.GetDisplayName()}"); + } var transferLibNoteDetail = dto.Details.First(); var jobDetail = job.Details.First(); + job.JobStatus = EnumJobStatus.Open; jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; @@ -199,24 +203,43 @@ public class AssembleIssueJobAppService issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty; issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty; - assembleIssueJob.Details = new EditableList() { issueJobDetail }; + assembleIssueJob.Details = new EditableList { issueJobDetail }; if (assembleIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成 { - await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); + if (issueJobDetailDto.RecommendToPackingCode != issueJobDetailDto.HandledToPackingCode) + { + await CheckPackingCodeIsUserAsync(issueJobDetailDto.HandledToPackingCode, assembleIssueJob.Number) + .ConfigureAwait(false); + } + + await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty) + .ConfigureAwait(false); + await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false); } else { var detail = assembleIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id); if (issueJobDetail.HandledToQty >= detail.RequestQty) { - await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); + await UpdateRequestAndjobStatusDoneAsync(assembleIssueJob, issueJobDetailDto, + issueJobDetailDto.HandledToQty).ConfigureAwait(false); + } + else + { + await RemoveExpectOutAsync(assembleIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty) + .ConfigureAwait(false); } } await _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false); } + /// + /// 完成任务 + /// + /// + /// [HttpPost("Complete/{id}")] public async Task CompleteAsync(Guid id) { @@ -224,17 +247,187 @@ public class AssembleIssueJobAppService assembleIssueJob.JobStatus = EnumJobStatus.Done; - await _expectOutAppService.RemoveByNumberAndInventoryAsync(assembleIssueJob.Number, - assembleIssueJob.Details.First().ItemCode, - assembleIssueJob.Details.First().HandledToLocationCode, assembleIssueJob.Details.First().HandledToPackingCode, - assembleIssueJob.Details.First().Status, assembleIssueJob.Details.First().HandledToLot, - assembleIssueJob.Details.First().HandledToQty).ConfigureAwait(false); - await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false); + await AssembleIssueRequestAppService.UpdateStatusCompletedAsync(assembleIssueJob.AssembleRequestNumber) + .ConfigureAwait(false); + await _transferLibRequestAppService.CancelByCallRequestNumberAsync(assembleIssueJob.AssembleRequestNumber) + .ConfigureAwait(false); + await _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false); } + /// + /// 请求点了完成,任务全部都完成 + /// + /// + /// + [HttpPost("complete-by-request/{requestNumber}")] + public async Task CompleteByRequestNumberAsync(string requestNumber) + { + var assembleIssueJobs = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber) + .ConfigureAwait(false); + + foreach (var assembleIssueJob in assembleIssueJobs) + { + assembleIssueJob.JobStatus = EnumJobStatus.Done; + await _repository.UpdateAsync(assembleIssueJob).ConfigureAwait(false); + await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false); + await _transferLibRequestAppService.CancelByCallRequestNumberAsync(assembleIssueJob.AssembleRequestNumber) + .ConfigureAwait(false); + } + } + + #region 立库 + + /// + /// 立体库同步 + /// + /// + /// + /// + [HttpPost("sync-issue-job-stereo")] + public async Task SyncIssueJobStereoAsync(List input, string pLoc) + { + var ret = new ReusltObject(); + ret.Code = "1"; + ret.Message = "操作成功"; + ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); + try + { + var IssueJobToRestoDetailDTOs = new List(); + var main = new IssueJobToRestoDTO(); + main.OperatorName = CurrentUser.UserName; + foreach (var job in input) + { + foreach (var jobitem in job.Details) + { + IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO + { + Count = jobitem.HandledToQty, + ProductNo = jobitem.ItemCode, + NeedSite = pLoc, + WorkNo = job.Number, + TaskNo = job.Number + }); + } + } + + main.Details = IssueJobToRestoDetailDTOs; + var httpclient = _httpClientFactory.CreateClient(); +#if DEBUG + + var json = JsonSerializer.Serialize(main); + _options.Value.Address = "http://localhost:59094/"; //测试地址 + _options.Value.Token = ""; //测试token + _options.Value.UserName = ""; //测试用户名 + _options.Value.Password = ""; //测试密码 + +#endif + if (!string.IsNullOrEmpty(_options.Value.Token)) + { + var token = _options.Value.Token; + httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + + if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password)) + { + var username = _options.Value.UserName; + var password = _options.Value.Password; + httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", + Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); + } + + var client = new IssueJobToRestoClient(_options.Value.Address, httpclient); + ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false); + } + catch (Exception ex) + { + ret = new ReusltObject(); + ret.Code = "2"; + ret.Message = ex.Message; + ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); + } + + return ret; + } + + [HttpPost("receive-issue-job-stereo")] + public virtual async Task SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input) + { +#if DEBUG + var json = JsonSerializer.Serialize(input); +#endif + var errors = new List(); + var ret = new ReusltObject { Code = "1", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = "操作成功" }; + try + { + if (input.Jobs.Count > 0) + { + var jobs = input.Jobs; + var numbers = jobs.Select(p => p.JobNumber); + var query = _repository.WithDetails() + .Where(p => numbers.Contains(p.Number)); + var entities = query.ToList(); + var dtos = ObjectMapper.Map, List>(entities); + if (input.Jobs.Count == entities.Count) + { + errors.Add("立体库提交出库任务和WMS任务不符,请核对! \n"); + } + + foreach (var itm in dtos) + { + var first = jobs.FirstOrDefault(p => p.JobNumber == itm.Number); + var itmDetails = itm.Details.ToList(); + var details = new List(); + foreach (var detail in first.Details) + { + var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode); + var dto = new AssembleIssueJobDetailDTO(); + dto.HandledFromLocationCode = entity.HandledFromLocationCode; + dto.HandledToLocationCode = entity.HandledToLocationCode; + dto.ItemCode = detail.ItemCode; + dto.RecommendFromQty = detail.Qty; + dto.RecommendToQty = detail.Qty; + dto.HandledFromQty = detail.Qty; + dto.HandledToQty = detail.Qty; + dto.Status = entity.Status; + details.Add(dto); + } + + itm.Details = details; + await CompleteAsync(itm.Id, itm).ConfigureAwait(false); + } + } + else + { + errors.Add("立体库确认单据里无数据! \n"); + } + } + catch (Exception ex) + { + ret = new ReusltObject + { + Code = "2", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = ex.Message + }; + return ret; + } + + if (errors.Count > 0) + { + ret = new ReusltObject + { + Code = "2", + OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), + Message = string.Join(",", errors.ToArray()) + }; + } + + return ret; + } + + #endregion + #region 私有 /// @@ -334,21 +527,21 @@ public class AssembleIssueJobAppService if (loctionDto.Type == EnumLocationType.DimensionalStorehouse) { //TODO 立体库 - var ret = await SyncIssueJobStereoAsync(new List { assembleIssueJobDto }, loctionDto.Code).ConfigureAwait(false); + var ret = await SyncIssueJobStereoAsync(new List { assembleIssueJobDto }, + loctionDto.Code).ConfigureAwait(false); if (ret.Code != "1") { throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}"); } } - - } /// - /// 修改当前任务状态 和 该任务的请求状态 + /// 修改当前任务状态 和 该任务的请求状态 /// /// /// + /// /// /// private async Task UpdateRequestAndjobStatusDoneAsync(AssembleIssueJob assembleIssueJob, @@ -363,11 +556,7 @@ public class AssembleIssueJobAppService assembleIssueJob.JobStatus = EnumJobStatus.Done; - await _expectOutAppService.RemoveByNumberAndInventoryAsync(assembleIssueJob.Number, - assembleIssueJobDetailDto.ItemCode, - assembleIssueJobDetailDto.HandledToLocationCode, assembleIssueJobDetailDto.HandledToPackingCode, - assembleIssueJobDetailDto.Status, assembleIssueJobDetailDto.HandledToLot, - handledToQty).ConfigureAwait(false); + await RemoveExpectOutAsync(assembleIssueJob, assembleIssueJobDetailDto, handledToQty).ConfigureAwait(false); //await _expectOutAppService.RemoveByNumberAsync(assembleIssueJob.Number).ConfigureAwait(false); @@ -377,158 +566,33 @@ public class AssembleIssueJobAppService await Task.CompletedTask.ConfigureAwait(false); } - - - /// - /// 立体库同步 + /// 判断实际TO的箱码是否被占用 /// - /// - /// + /// + /// /// - [HttpPost("sync-issue-job-stereo")] - - public async Task SyncIssueJobStereoAsync(List input, string p_loc) + /// + private async Task CheckPackingCodeIsUserAsync(string packingCode, string jobNumber) { - ReusltObject ret = new ReusltObject(); - ret.Code = "1"; - ret.Message = "操作成功"; - ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); - try + var list = await _expectOutAppService.GetListByPackingCodeAsync(packingCode).ConfigureAwait(false); + list = list.Where(p => p.JobNumber != jobNumber).ToList(); + if (list.Any()) { - List IssueJobToRestoDetailDTOs = new List(); - IssueJobToRestoDTO main = new IssueJobToRestoDTO(); - main.OperatorName = CurrentUser.UserName; - foreach (var job in input) - { - foreach (var jobitem in job.Details) - { - IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO() - { - Count = jobitem.HandledToQty, - ProductNo = jobitem.ItemCode, - NeedSite = p_loc, - WorkNo = job.Number, - TaskNo = job.Number - }); - } - } - main.Details = IssueJobToRestoDetailDTOs; - var httpclient = _httpClientFactory.CreateClient(); -#if DEBUG - - string json = System.Text.Json.JsonSerializer.Serialize(main); - _options.Value.Address = "http://localhost:59094/";//测试地址 - _options.Value.Token = "";//测试token - _options.Value.UserName = "";//测试用户名 - _options.Value.Password = "";//测试密码 - -#endif - if (!string.IsNullOrEmpty(_options.Value.Token)) - { - var token = _options.Value.Token; - httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); - } - if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password)) - { - var username = _options.Value.UserName; - var password = _options.Value.Password; - httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{username}:{password}"))); - } - - IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, httpclient); - ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false); - } - catch (Exception ex) - { - ret = new ReusltObject(); - ret.Code = "2"; - ret.Message = ex.Message; - ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); + throw new UserFriendlyException($"任务号【{list.First().JobNumber}】的任务,已占用【{packingCode}】箱码的库存。"); } - - return ret; - } - [HttpPost("receive-issue-job-stereo")] - public virtual async Task SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input) + private async Task RemoveExpectOutAsync(AssembleIssueJob assembleIssueJob, + AssembleIssueJobDetailDTO assembleIssueJobDetailDto, + decimal handledToQty) { - -#if DEBUG - var json = System.Text.Json.JsonSerializer.Serialize(input); -#endif - List errors = new List(); - var ret = new ReusltObject() - { - Code = "1", - OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), - Message = "操作成功" - }; - try - { - - if (input.Jobs.Count > 0) - { - var jobs = input.Jobs; - var numbers = jobs.Select(p => p.JobNumber); - var query = _repository.WithDetails() - .Where(p => numbers.Contains(p.Number)); - var entities = query.ToList(); - var dtos = ObjectMapper.Map, List>(entities); - if (input.Jobs.Count == entities.Count) - { - errors.Add("立体库提交出库任务和WMS任务不符,请核对! \n"); - } - foreach (var itm in dtos) - { - var first = jobs.FirstOrDefault(p => p.JobNumber == itm.Number); - var itmDetails = itm.Details.ToList(); - List details = new List(); - foreach (var detail in first.Details) - { - var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode); - AssembleIssueJobDetailDTO dto = new AssembleIssueJobDetailDTO(); - dto.HandledFromLocationCode = entity.HandledFromLocationCode; - dto.HandledToLocationCode = entity.HandledToLocationCode; - dto.ItemCode = detail.ItemCode; - dto.RecommendFromQty = detail.Qty; - dto.RecommendToQty = detail.Qty; - dto.HandledFromQty = detail.Qty; - dto.HandledToQty = detail.Qty; - dto.Status = entity.Status; - details.Add(dto); - } - itm.Details = details; - await CompleteAsync(itm.Id, itm).ConfigureAwait(false); - } - } - else - { - errors.Add("立体库确认单据里无数据! \n"); - } - } - catch (Exception ex) - { - ret = new ReusltObject() - { - Code = "2", - OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), - Message = ex.Message - }; - return ret; - } - if (errors.Count > 0) - { - - ret = new ReusltObject() - { - Code = "2", - OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), - Message = string.Join(",", errors.ToArray()) - }; - } - return ret; + await _expectOutAppService.RemoveByNumberAndInventoryAsync(assembleIssueJob.Number, + assembleIssueJobDetailDto.ItemCode, + assembleIssueJobDetailDto.HandledToLocationCode, assembleIssueJobDetailDto.HandledToPackingCode, + assembleIssueJobDetailDto.Status, assembleIssueJobDetailDto.HandledToLot, + handledToQty).ConfigureAwait(false); } + #endregion } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs index 6243dd37a..c5d07ac77 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; using System.Threading.Tasks; using Castle.Components.DictionaryAdapter; using Microsoft.AspNetCore.Authorization; @@ -10,7 +12,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using MyNamespace; using Volo.Abp; -using Volo.Abp.ObjectMapping; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; @@ -18,12 +19,9 @@ using Win_in.Sfs.Wms.Inventory.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; -using Win_in.Sfs.Wms.Store.Jobs.IssueJobs; using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy; using Win_in.Sfs.Wms.Store.Notes; using Win_in.Sfs.Wms.Store.Options; -using static IdentityModel.ClaimComparer; -using static Volo.Abp.Identity.Settings.IdentitySettingNames; namespace Win_in.Sfs.Wms.Store.Application; @@ -36,10 +34,10 @@ public class CoatingIssueJobAppService { private readonly ICoatingIssueJobManager _coatingIssueJobManager; private readonly ILocationAppService _locationAppService; - private readonly ITransferLibJobAppService _transferLibJobAppService; private readonly ICoatingIssueNoteAppService _coatingIssueNoteAppService; private readonly IExpectOutAppService _expectOutAppService; private readonly IHttpClientFactory _httpClientFactory; + private readonly ITransferLibRequestAppService _transferLibRequestAppService; private readonly IOptions _options; protected ICoatingIssueRequestAppService CoatingIssueRequestAppService => @@ -47,23 +45,19 @@ public class CoatingIssueJobAppService public CoatingIssueJobAppService( ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager, - ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService, + ILocationAppService locationAppService, ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService , IHttpClientFactory httpClientFactory - , IOptions options - - - - ) : base( + , IOptions options, ITransferLibRequestAppService transferLibRequestAppService) : base( repository, coatingIssueJobManager) { _coatingIssueJobManager = coatingIssueJobManager; _locationAppService = locationAppService; - _transferLibJobAppService = transferLibJobAppService; _coatingIssueNoteAppService = coatingIssueNoteAppService; _expectOutAppService = expectOutAppService; _httpClientFactory = httpClientFactory; _options = options; + _transferLibRequestAppService = transferLibRequestAppService; } [HttpPost("add-many")] @@ -105,27 +99,25 @@ public class CoatingIssueJobAppService throw new UserFriendlyException($"未找到ID为 {id} 的任务"); } - if (coatingJob.JobStatus == EnumJobStatus.Open || coatingJob.JobStatus == EnumJobStatus.Partial || - coatingJob.JobStatus == EnumJobStatus.Wait) + if (coatingJob.JobStatus == EnumJobStatus.Open || + coatingJob.JobStatus == EnumJobStatus.Partial || + coatingJob.JobStatus == EnumJobStatus.Wait || + coatingJob.JobStatus == EnumJobStatus.Doing) { - throw new UserFriendlyException($"任务状态不是{coatingJob.JobStatus == EnumJobStatus.Open}、" + - $"{coatingJob.JobStatus == EnumJobStatus.Partial}、" + - $"{coatingJob.JobStatus == EnumJobStatus.Wait}"); - } - - await _expectOutAppService.RemoveByNumberAsync(coatingJob.Number).ConfigureAwait(false); - coatingJob.JobStatus = EnumJobStatus.Cancelled; - await _repository.UpdateAsync(coatingJob).ConfigureAwait(false); - } + await _expectOutAppService.RemoveByNumberAsync(coatingJob.Number).ConfigureAwait(false); + await _transferLibRequestAppService.CancelByCallRequestNumberAsync(coatingJob.CoatingRequestNumber) + .ConfigureAwait(false); - [HttpPost("cancel-by-request/{requestNumber}")] - public virtual async Task CancelByMaterialRequestAsync(string requestNumber) - { - var entities = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber) - .ConfigureAwait(false); - foreach (var entity in entities) + coatingJob.JobStatus = EnumJobStatus.Cancelled; + await _repository.UpdateAsync(coatingJob).ConfigureAwait(false); + } + else { - await _coatingIssueJobManager.CancelAsync(entity).ConfigureAwait(false); + throw new UserFriendlyException($"任务状态不是" + + $"{EnumJobStatus.Open.GetDisplayName()}、" + + $"{EnumJobStatus.Partial.GetDisplayName()}、" + + $"{EnumJobStatus.Doing.GetDisplayName()}、" + + $"{EnumJobStatus.Wait.GetDisplayName()}"); } } @@ -211,22 +203,32 @@ public class CoatingIssueJobAppService issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty; issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty; - coatingIssueJob.Details = new EditableList() { issueJobDetail }; + coatingIssueJob.Details = new EditableList { issueJobDetail }; if (coatingIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成 { - await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); + if (issueJobDetailDto.RecommendToPackingCode != issueJobDetailDto.HandledToPackingCode) + { + await CheckPackingCodeIsUserAsync(issueJobDetailDto.HandledToPackingCode, coatingIssueJob.Number) + .ConfigureAwait(false); + } + + await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty) + .ConfigureAwait(false); + await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false); } else { var detail = coatingIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id); if (issueJobDetail.HandledToQty >= detail.RequestQty) { - await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); + await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, + issueJobDetailDto.HandledToQty).ConfigureAwait(false); } else { - await RemoveExpectOutAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false); + await RemoveExpectOutAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty) + .ConfigureAwait(false); } } @@ -234,7 +236,7 @@ public class CoatingIssueJobAppService } /// - /// 完成任务 + /// 完成任务 /// /// /// @@ -247,72 +249,79 @@ public class CoatingIssueJobAppService await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false); - await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(coatingIssueJob.CoatingRequestNumber).ConfigureAwait(false); + await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(coatingIssueJob.CoatingRequestNumber) + .ConfigureAwait(false); + await _transferLibRequestAppService.CancelByCallRequestNumberAsync(coatingIssueJob.CoatingRequestNumber) + .ConfigureAwait(false); + await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false); } /// - /// 请求点了完成,任务全部都完成 + /// 请求点了完成,任务全部都完成 /// /// /// [HttpPost("complete-by-request/{requestNumber}")] public async Task CompleteByRequestNumberAsync(string requestNumber) { - var coatingIssueJobs = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber).ConfigureAwait(false); + var coatingIssueJobs = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber) + .ConfigureAwait(false); foreach (var coatingIssueJob in coatingIssueJobs) { coatingIssueJob.JobStatus = EnumJobStatus.Done; await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false); await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false); + await _transferLibRequestAppService.CancelByCallRequestNumberAsync(coatingIssueJob.CoatingRequestNumber) + .ConfigureAwait(false); } } #region 立库 /// - /// 立体库同步 + /// 立体库同步 /// /// - /// + /// /// [HttpPost("sync-issue-job-stereo")] - - public async Task SyncIssueJobStereoAsync(List input, string p_loc) + public async Task SyncIssueJobStereoAsync(List input, string pLoc) { - ReusltObject ret = new ReusltObject(); + var ret = new ReusltObject(); ret.Code = "1"; ret.Message = "操作成功"; ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); try { - List IssueJobToRestoDetailDTOs = new List(); - IssueJobToRestoDTO main = new IssueJobToRestoDTO(); + var IssueJobToRestoDetailDTOs = new List(); + var main = new IssueJobToRestoDTO(); main.OperatorName = CurrentUser.UserName; foreach (var job in input) { foreach (var jobitem in job.Details) { - IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO() + IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO { Count = jobitem.HandledToQty, ProductNo = jobitem.ItemCode, - NeedSite = p_loc, + NeedSite = pLoc, WorkNo = job.Number, TaskNo = job.Number }); } } + main.Details = IssueJobToRestoDetailDTOs; var httpclient = _httpClientFactory.CreateClient(); #if DEBUG - string json = System.Text.Json.JsonSerializer.Serialize(main); - _options.Value.Address = "http://localhost:59094/";//测试地址 - _options.Value.Token = "";//测试token - _options.Value.UserName = "";//测试用户名 - _options.Value.Password = "";//测试密码 + var json = JsonSerializer.Serialize(main); + _options.Value.Address = "http://localhost:59094/"; //测试地址 + _options.Value.Token = ""; //测试token + _options.Value.UserName = ""; //测试用户名 + _options.Value.Password = ""; //测试密码 #endif if (!string.IsNullOrEmpty(_options.Value.Token)) @@ -320,14 +329,16 @@ public class CoatingIssueJobAppService var token = _options.Value.Token; httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); } + if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password)) { var username = _options.Value.UserName; var password = _options.Value.Password; - httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{username}:{password}"))); + httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", + Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); } - IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, httpclient); + var client = new IssueJobToRestoClient(_options.Value.Address, httpclient); ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false); } catch (Exception ex) @@ -339,47 +350,40 @@ public class CoatingIssueJobAppService } return ret; - } [HttpPost("receive-issue-job-stereo")] public virtual async Task SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input) { - #if DEBUG - var json = System.Text.Json.JsonSerializer.Serialize(input); + var json = JsonSerializer.Serialize(input); #endif - List errors = new List(); - var ret = new ReusltObject() - { - Code = "1", - OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), - Message = "操作成功" - }; + var errors = new List(); + var ret = new ReusltObject { Code = "1", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = "操作成功" }; try { - if (input.Jobs.Count > 0) { var jobs = input.Jobs; var numbers = jobs.Select(p => p.JobNumber); var query = _repository.WithDetails() - .Where(p => numbers.Contains(p.Number)); + .Where(p => numbers.Contains(p.Number)); var entities = query.ToList(); var dtos = ObjectMapper.Map, List>(entities); if (input.Jobs.Count == entities.Count) { errors.Add("立体库提交出库任务和WMS任务不符,请核对! \n"); } + foreach (var itm in dtos) { - var first = jobs.FirstOrDefault(p => p.JobNumber == itm.Number); + var first = jobs.FirstOrDefault(p => p.JobNumber == itm.Number); var itmDetails = itm.Details.ToList(); - List details = new List(); + var details = new List(); foreach (var detail in first.Details) { var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode); - CoatingIssueJobDetailDTO dto = new CoatingIssueJobDetailDTO(); + var dto = new CoatingIssueJobDetailDTO(); dto.HandledFromLocationCode = entity.HandledFromLocationCode; dto.HandledToLocationCode = entity.HandledToLocationCode; dto.ItemCode = detail.ItemCode; @@ -390,6 +394,7 @@ public class CoatingIssueJobAppService dto.Status = entity.Status; details.Add(dto); } + itm.Details = details; await CompleteAsync(itm.Id, itm).ConfigureAwait(false); } @@ -401,24 +406,23 @@ public class CoatingIssueJobAppService } catch (Exception ex) { - ret = new ReusltObject() + ret = new ReusltObject { - Code = "2", - OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), - Message = ex.Message + Code = "2", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = ex.Message }; return ret; } + if (errors.Count > 0) { - - ret = new ReusltObject() + ret = new ReusltObject { Code = "2", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = string.Join(",", errors.ToArray()) }; } + return ret; } @@ -523,18 +527,17 @@ public class CoatingIssueJobAppService if (loctionDto.Type == EnumLocationType.DimensionalStorehouse) { //TODO 立体库 - var ret = await SyncIssueJobStereoAsync(new List { coatingIssueJobDto }, loctionDto.Code).ConfigureAwait(false); + var ret = await SyncIssueJobStereoAsync(new List { coatingIssueJobDto }, + loctionDto.Code).ConfigureAwait(false); if (ret.Code != "1") { throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}"); } } - - } /// - /// 修改当前任务状态 和 该任务的请求状态 + /// 修改当前任务状态 和 该任务的请求状态 /// /// /// @@ -563,7 +566,25 @@ public class CoatingIssueJobAppService await Task.CompletedTask.ConfigureAwait(false); } - private async Task RemoveExpectOutAsync(CoatingIssueJob coatingIssueJob, CoatingIssueJobDetailDTO coatingIssueJobDetailDto, + /// + /// 判断实际TO的箱码是否被占用 + /// + /// + /// + /// + /// + private async Task CheckPackingCodeIsUserAsync(string packingCode, string jobNumber) + { + var list = await _expectOutAppService.GetListByPackingCodeAsync(packingCode).ConfigureAwait(false); + list = list.Where(p => p.JobNumber != jobNumber).ToList(); + if (list.Any()) + { + throw new UserFriendlyException($"任务号【{list.First().JobNumber}】的任务,已占用【{packingCode}】箱码的库存。"); + } + } + + private async Task RemoveExpectOutAsync(CoatingIssueJob coatingIssueJob, + CoatingIssueJobDetailDTO coatingIssueJobDetailDto, decimal handledToQty) { await _expectOutAppService.RemoveByNumberAndInventoryAsync(coatingIssueJob.Number, diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs index 7b44ace96..5c7ef0224 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs @@ -283,10 +283,10 @@ public class InjectionIssueJobAppService /// 立体库同步 /// /// - /// + /// /// [HttpPost("sync-issue-job-stereo")] - public async Task SyncIssueJobStereoAsync(List input, string p_loc) + public async Task SyncIssueJobStereoAsync(List input, string pLoc) { var ret = new ReusltObject(); ret.Code = "1"; @@ -305,7 +305,7 @@ public class InjectionIssueJobAppService { Count = jobitem.HandledToQty, ProductNo = jobitem.ItemCode, - NeedSite = p_loc, + NeedSite = pLoc, WorkNo = job.Number, TaskNo = job.Number }); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs index d8b66d4d9..bfbc7120f 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs @@ -283,10 +283,10 @@ public class KittingIssueJobAppService /// 立体库同步 /// /// - /// + /// /// [HttpPost("sync-issue-job-stereo")] - public async Task SyncIssueJobStereoAsync(List input, string p_loc) + public async Task SyncIssueJobStereoAsync(List input, string pLoc) { var ret = new ReusltObject(); ret.Code = "1"; @@ -305,7 +305,7 @@ public class KittingIssueJobAppService { Count = jobitem.HandledToQty, ProductNo = jobitem.ItemCode, - NeedSite = p_loc, + NeedSite = pLoc, WorkNo = job.Number, TaskNo = job.Number }); diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs index 968831b05..2ceccb4e4 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs @@ -9,6 +9,7 @@ using NUglify.Helpers; using Volo.Abp; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; @@ -16,44 +17,38 @@ using Win_in.Sfs.Wms.Store.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Application; /// -/// 装配叫料申请 +/// 装配叫料申请 /// [Authorize] [Route($"{StoreConsts.RootPath}assemble-issue-request")] -public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase, IAssembleIssueRequestAppService { private readonly IAssembleIssueRequestManager _assembleIssueRequestManager; - private readonly IItemStoreRelationAppService _itemStoreRelationApp; - private readonly IAreaAppService _areaApp; private readonly ILocationAppService _locationAppService; private readonly IItemBasicAppService _itemBasicAppService; private readonly IProductionLineAppService _productionLineAppService; private readonly IAssembleIssueJobAppService _assembleIssueJobAppService; - private readonly ITransactionTypeAppService _transactionTypeAppService; public AssembleIssueRequestAppService( IAssembleIssueRequestRepository repository, IAssembleIssueRequestManager assembleIssueRequestManager, - IPreparationPlanManager preparationPlanManager, - IItemStoreRelationAppService itemStoreRelationApp, - IAreaAppService areaApp, ILocationAppService locationAppService, IItemBasicAppService itemBasicAppService, IProductionLineAppService productionLineAppService, - ITransactionTypeAppService transactionTypeAppService, IAssembleIssueJobAppService assembleIssueJobAppService) + ITransactionTypeAppService transactionTypeAppService, + IAssembleIssueJobAppService assembleIssueJobAppService) : base(repository, assembleIssueRequestManager) { _assembleIssueRequestManager = assembleIssueRequestManager; - _itemStoreRelationApp = itemStoreRelationApp; - _areaApp = areaApp; _locationAppService = locationAppService; _itemBasicAppService = itemBasicAppService; _productionLineAppService = productionLineAppService; - _transactionTypeAppService = transactionTypeAppService; _assembleIssueJobAppService = assembleIssueJobAppService; } @@ -63,6 +58,61 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) + { + var request = await _repository.GetAsync(id).ConfigureAwait(false); + + var list = await _assembleIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); + if (list.Any()) + { + foreach (var assembleIssueJobDto in list) + { + if (assembleIssueJobDto.JobStatus == EnumJobStatus.Open || + assembleIssueJobDto.JobStatus == EnumJobStatus.Partial || + assembleIssueJobDto.JobStatus == EnumJobStatus.Doing || + assembleIssueJobDto.JobStatus == EnumJobStatus.Wait) + { + await _assembleIssueJobAppService.CancelAsync(assembleIssueJobDto.Id).ConfigureAwait(false); + } + } + } + + if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling || + request.RequestStatus == EnumRequestStatus.New) + { + request.RequestStatus = EnumRequestStatus.Cancelled; + await _repository.UpdateAsync(request).ConfigureAwait(false); + } + else + { + throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消"); + } + + return ObjectMapper.Map(request); + } + + public override async Task CompleteAsync(Guid id) + { + var assembleIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false); + if (assembleIssueRequest.RequestStatus == EnumRequestStatus.Handling || + assembleIssueRequest.RequestStatus == EnumRequestStatus.Partial || + assembleIssueRequest.RequestStatus == EnumRequestStatus.New) + { + assembleIssueRequest.RequestStatus = EnumRequestStatus.Completed; + } + else + { + throw new UserFriendlyException($"【{assembleIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成"); + } + + await _assembleIssueJobAppService.CompleteByRequestNumberAsync(assembleIssueRequest.Number) + .ConfigureAwait(false); + + return ObjectMapper.Map(await _repository + .UpdateAsync(assembleIssueRequest) + .ConfigureAwait(false)); + } + [HttpPost("")] public override async Task CreateAsync(AssembleIssueRequestEditInput input) { @@ -81,7 +131,8 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase - /// 赋值Request业务属性 - /// - /// - /// - private async Task SetRequestAutoPropertiesAsync(AssembleIssueRequestEditInput entity) - { - var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) - .ConfigureAwait(false); - Check.NotNull(tranType, "事务类型", "事务类型不存在"); - entity.AutoSubmit = tranType.AutoSubmitRequest; - entity.AutoAgree = tranType.AutoAgreeRequest; - entity.AutoHandle = tranType.AutoHandleRequest; - entity.AutoCompleteJob = tranType.AutoCompleteJob; - entity.DirectCreateNote = tranType.DirectCreateNote; - } - [HttpPost("create-and-handle")] public async Task CreateAndHandleAsync(AssembleIssueRequestEditInput input) { @@ -140,36 +174,17 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) - { - var request = await _repository.GetAsync(id).ConfigureAwait(false); - - var list = await _assembleIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); - if (list.Any()) - { - foreach (var assembleIssueJobDto in list) - { - if (assembleIssueJobDto.JobStatus == EnumJobStatus.Open || - assembleIssueJobDto.JobStatus == EnumJobStatus.Partial || - assembleIssueJobDto.JobStatus == EnumJobStatus.Doing || - assembleIssueJobDto.JobStatus == EnumJobStatus.Wait) - { - await _assembleIssueJobAppService.CancelAsync(assembleIssueJobDto.Id).ConfigureAwait(false); - } - } - } - - return await base.CancelAsync(id).ConfigureAwait(false); - } - [HttpPost("UpdateStatusCompleted")] public async Task UpdateStatusCompletedAsync(string number) { var assembleIssueRequest = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false); - await UpdateAssembleIssueRequestDetailQtyAsync(assembleIssueRequest, new EditableList()).ConfigureAwait(false); + await UpdateAssembleIssueRequestDetailQtyAsync(assembleIssueRequest, new EditableList()) + .ConfigureAwait(false); - var assembleIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(assembleIssueRequest.Number).ConfigureAwait(false); + var assembleIssueJobDtos = await _assembleIssueJobAppService + .GetByRequestNumberAsync(assembleIssueRequest.Number) + .ConfigureAwait(false); if (assembleIssueJobDtos.Any(p => p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing || @@ -177,26 +192,61 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase= detail.IssuedQty) { - if (detail.Qty >= detail.IssuedQty) - { - flag = false; - return; - } + return; } + } + + CheckStatus(EnumRequestStatus.Completed, assembleIssueRequest.RequestStatus); + assembleIssueRequest.RequestStatus = EnumRequestStatus.Completed; + await _repository.UpdateAsync(assembleIssueRequest).ConfigureAwait(false); + } + + [HttpPost("IsHasNewJob")] + public async Task IsHasNewJobAsync(string requestNumber, List jobNumber) + { + var joblIssueJobDtos = + await _assembleIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); + if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) + { + var jobNumberList = joblIssueJobDtos.Select(p => p.Number); - if (flag) + var difference = jobNumberList.Except(jobNumber); + if (difference.Any()) { - CheckStatus(EnumRequestStatus.Completed, assembleIssueRequest.RequestStatus); - assembleIssueRequest.RequestStatus = EnumRequestStatus.Completed; - await _repository.UpdateAsync(assembleIssueRequest).ConfigureAwait(false); + var result = "已生成任务号"; + difference.ForEach(p => result += "【" + p + "】"); + result += "的任务"; + return result; } + + return "无任务生成,请检查库存"; } + + return "无任务生成,请检查库存"; + } + + #region 私有 + + /// + /// 赋值Request业务属性 + /// + /// + /// + private async Task SetRequestAutoPropertiesAsync(AssembleIssueRequestEditInput entity) + { + var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) + .ConfigureAwait(false); + Check.NotNull(tranType, "事务类型", "事务类型不存在"); + entity.AutoSubmit = tranType.AutoSubmitRequest; + entity.AutoAgree = tranType.AutoAgreeRequest; + entity.AutoHandle = tranType.AutoHandleRequest; + entity.AutoCompleteJob = tranType.AutoCompleteJob; + entity.DirectCreateNote = tranType.DirectCreateNote; } /// @@ -209,7 +259,8 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase addAssembleIssueJobDtos) { //原有任务 - var existAssembleIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(assembleIssueRequest.Number) + var existAssembleIssueJobDtos = await _assembleIssueJobAppService + .GetByRequestNumberAsync(assembleIssueRequest.Number) .ConfigureAwait(false); //新增的任务和已有的任务总和 @@ -247,32 +298,7 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase IsHasNewJobAsync(string requestNumber, List jobNumber) - { - var joblIssueJobDtos = await _assembleIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); - if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) - { - var jobNumberList = joblIssueJobDtos.Select(p => p.Number); - - var difference = jobNumberList.Except(jobNumber); - if (difference.Any()) - { - var result = "已生成任务号"; - difference.ForEach(p => result += "【" + p + "】"); - result += "的任务"; - return result; - } - else - { - return "无任务生成,请检查库存"; - } - } - else - { - return "无任务生成,请检查库存"; - } - } + #endregion #region 校验 @@ -297,32 +323,32 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase { - EnumRequestStatus.Agreed, EnumRequestStatus.Partial, + EnumRequestStatus.Agreed, EnumRequestStatus.Partial }; break; case EnumRequestStatus.Completed: validSourceStatuses = new List { - EnumRequestStatus.Handling, EnumRequestStatus.Partial, + EnumRequestStatus.Handling, EnumRequestStatus.Partial }; break; case EnumRequestStatus.Cancelled: validSourceStatuses = new List { - EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed, + EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed }; break; case EnumRequestStatus.Abort: validSourceStatuses = new List { - EnumRequestStatus.Handling, EnumRequestStatus.Partial, + EnumRequestStatus.Handling, EnumRequestStatus.Partial }; break; case EnumRequestStatus.Partial: { validSourceStatuses = new List { - EnumRequestStatus.Handling, EnumRequestStatus.Partial, + EnumRequestStatus.Handling, EnumRequestStatus.Partial }; break; } @@ -354,7 +380,8 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase + /// 获取已完成的叫料单数量 + /// + /// + [HttpPost("get-uncompleted-request")] + public async Task> GetUnCompletedRequestAsync(List pList) + { + var returnList = new List(); + //枚举类型查不到改成SQL查询 + var list = await _repository.GetListAsync(p => + p.RequestStatus != EnumRequestStatus.Completed && p.IssueRequestType == EnumIssueRequestType.Vision) + .ConfigureAwait(false); + foreach (var itm in list) + { + var query = from detail in itm.Details + join citm in pList on new + { + detail.ItemCode, + locCode = detail.ToLocationCode, + areaCode = detail.PositionCode + } equals + new { citm.ItemCode, locCode = citm.LocCode, areaCode = citm.PositionCode } + select new UnCompletedRequestDto + { + ItemCode = detail.ItemCode, + LocCode = detail.ToLocationCode, + PositionCode = detail.PositionCode + }; + + returnList.AddRange(query.ToList()); + } + + return returnList; + } + + #endregion } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs index 6fca950b0..f8be3c92e 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs @@ -9,6 +9,7 @@ using NUglify.Helpers; using Volo.Abp; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared; +using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain.Shared; @@ -16,44 +17,38 @@ using Win_in.Sfs.Wms.Store.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Application; /// -/// 喷涂叫料申请 +/// 喷涂叫料申请 /// [Authorize] [Route($"{StoreConsts.RootPath}coating-issue-request")] -public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase, ICoatingIssueRequestAppService { private readonly ICoatingIssueRequestManager _coatingIssueRequestManager; - private readonly IItemStoreRelationAppService _itemStoreRelationApp; - private readonly IAreaAppService _areaApp; private readonly ILocationAppService _locationAppService; private readonly IItemBasicAppService _itemBasicAppService; private readonly IProductionLineAppService _productionLineAppService; private readonly ICoatingIssueJobAppService _coatingIssueJobAppService; - private readonly ITransactionTypeAppService _transactionTypeAppService; public CoatingIssueRequestAppService( ICoatingIssueRequestRepository repository, ICoatingIssueRequestManager coatingIssueRequestManager, - IPreparationPlanManager preparationPlanManager, - IItemStoreRelationAppService itemStoreRelationApp, - IAreaAppService areaApp, ILocationAppService locationAppService, IItemBasicAppService itemBasicAppService, IProductionLineAppService productionLineAppService, - ITransactionTypeAppService transactionTypeAppService, ICoatingIssueJobAppService coatingIssueJobAppService) + ITransactionTypeAppService transactionTypeAppService, + ICoatingIssueJobAppService coatingIssueJobAppService) : base(repository, coatingIssueRequestManager) { _coatingIssueRequestManager = coatingIssueRequestManager; - _itemStoreRelationApp = itemStoreRelationApp; - _areaApp = areaApp; _locationAppService = locationAppService; _itemBasicAppService = itemBasicAppService; _productionLineAppService = productionLineAppService; - _transactionTypeAppService = transactionTypeAppService; _coatingIssueJobAppService = coatingIssueJobAppService; } @@ -63,6 +58,61 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) + { + var request = await _repository.GetAsync(id).ConfigureAwait(false); + + var list = await _coatingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); + if (list.Any()) + { + foreach (var coatingIssueJobDto in list) + { + if (coatingIssueJobDto.JobStatus == EnumJobStatus.Open || + coatingIssueJobDto.JobStatus == EnumJobStatus.Partial || + coatingIssueJobDto.JobStatus == EnumJobStatus.Doing || + coatingIssueJobDto.JobStatus == EnumJobStatus.Wait) + { + await _coatingIssueJobAppService.CancelAsync(coatingIssueJobDto.Id).ConfigureAwait(false); + } + } + } + + if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling || + request.RequestStatus == EnumRequestStatus.New) + { + request.RequestStatus = EnumRequestStatus.Cancelled; + await _repository.UpdateAsync(request).ConfigureAwait(false); + } + else + { + throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消"); + } + + return ObjectMapper.Map(request); + } + + public override async Task CompleteAsync(Guid id) + { + var coatingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false); + if (coatingIssueRequest.RequestStatus == EnumRequestStatus.Handling || + coatingIssueRequest.RequestStatus == EnumRequestStatus.Partial || + coatingIssueRequest.RequestStatus == EnumRequestStatus.New) + { + coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed; + } + else + { + throw new UserFriendlyException($"【{coatingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成"); + } + + await _coatingIssueJobAppService.CompleteByRequestNumberAsync(coatingIssueRequest.Number) + .ConfigureAwait(false); + + return ObjectMapper.Map(await _repository + .UpdateAsync(coatingIssueRequest) + .ConfigureAwait(false)); + } + [HttpPost("")] public override async Task CreateAsync(CoatingIssueRequestEditInput input) { @@ -101,7 +151,7 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase - /// 赋值Request业务属性 - /// - /// - /// - private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity) - { - var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) - .ConfigureAwait(false); - Check.NotNull(tranType, "事务类型", "事务类型不存在"); - entity.AutoSubmit = tranType.AutoSubmitRequest; - entity.AutoAgree = tranType.AutoAgreeRequest; - entity.AutoHandle = tranType.AutoHandleRequest; - entity.AutoCompleteJob = tranType.AutoCompleteJob; - entity.DirectCreateNote = tranType.DirectCreateNote; - } - [HttpPost("create-and-handle")] public async Task CreateAndHandleAsync(CoatingIssueRequestEditInput input) { @@ -141,39 +174,6 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) - { - var request = await _repository.GetAsync(id).ConfigureAwait(false); - - var list = await _coatingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); - if (list.Any()) - { - foreach (var coatingIssueJobDto in list) - { - if (coatingIssueJobDto.JobStatus == EnumJobStatus.Open || - coatingIssueJobDto.JobStatus == EnumJobStatus.Partial || - coatingIssueJobDto.JobStatus == EnumJobStatus.Doing || - coatingIssueJobDto.JobStatus == EnumJobStatus.Wait) - { - await _coatingIssueJobAppService.CancelAsync(coatingIssueJobDto.Id).ConfigureAwait(false); - } - } - } - - if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling || - request.RequestStatus == EnumRequestStatus.New) - { - request.RequestStatus = EnumRequestStatus.Cancelled; - await _repository.UpdateAsync(request).ConfigureAwait(false); - } - else - { - throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消"); - } - - return ObjectMapper.Map(request); - } - [HttpPost("UpdateStatusCompleted")] public async Task UpdateStatusCompletedAsync(string number) { @@ -182,7 +182,8 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase()) .ConfigureAwait(false); - var coatingIssueJobDtos = await _coatingIssueJobAppService.GetByRequestNumberAsync(coatingIssueRequest.Number) + var coatingIssueJobDtos = await _coatingIssueJobAppService + .GetByRequestNumberAsync(coatingIssueRequest.Number) .ConfigureAwait(false); if (coatingIssueJobDtos.Any(p => @@ -192,23 +193,60 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase= detail.IssuedQty) { - flag = false; return; } } - if (flag) + CheckStatus(EnumRequestStatus.Completed, coatingIssueRequest.RequestStatus); + coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed; + await _repository.UpdateAsync(coatingIssueRequest).ConfigureAwait(false); + } + + [HttpPost("IsHasNewJob")] + public async Task IsHasNewJobAsync(string requestNumber, List jobNumber) + { + var joblIssueJobDtos = + await _coatingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); + if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) { - CheckStatus(EnumRequestStatus.Completed, coatingIssueRequest.RequestStatus); - coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed; - await _repository.UpdateAsync(coatingIssueRequest).ConfigureAwait(false); + var jobNumberList = joblIssueJobDtos.Select(p => p.Number); + + var difference = jobNumberList.Except(jobNumber); + if (difference.Any()) + { + var result = "已生成任务号"; + difference.ForEach(p => result += "【" + p + "】"); + result += "的任务"; + return result; + } + + return "无任务生成,请检查库存"; } + + return "无任务生成,请检查库存"; + } + + #region 私有 + + /// + /// 赋值Request业务属性 + /// + /// + /// + private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity) + { + var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) + .ConfigureAwait(false); + Check.NotNull(tranType, "事务类型", "事务类型不存在"); + entity.AutoSubmit = tranType.AutoSubmitRequest; + entity.AutoAgree = tranType.AutoAgreeRequest; + entity.AutoHandle = tranType.AutoHandleRequest; + entity.AutoCompleteJob = tranType.AutoCompleteJob; + entity.DirectCreateNote = tranType.DirectCreateNote; } /// @@ -260,49 +298,7 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase IsHasNewJobAsync(string requestNumber, List jobNumber) - { - var joblIssueJobDtos = - await _coatingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); - if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) - { - var jobNumberList = joblIssueJobDtos.Select(p => p.Number); - - var difference = jobNumberList.Except(jobNumber); - if (difference.Any()) - { - var result = "已生成任务号"; - difference.ForEach(p => result += "【" + p + "】"); - result += "的任务"; - return result; - } - - return "无任务生成,请检查库存"; - } - - return "无任务生成,请检查库存"; - } - - public override async Task CompleteAsync(Guid id) - { - var coatingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false); - if (coatingIssueRequest.RequestStatus == EnumRequestStatus.Handling || - coatingIssueRequest.RequestStatus == EnumRequestStatus.Partial || - coatingIssueRequest.RequestStatus == EnumRequestStatus.New) - { - coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed; - } - else - { - throw new UserFriendlyException($"【{coatingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成"); - } - - await _coatingIssueJobAppService.CompleteByRequestNumberAsync(coatingIssueRequest.Number).ConfigureAwait(false); - - return ObjectMapper.Map(await _repository.UpdateAsync(coatingIssueRequest) - .ConfigureAwait(false)); - } + #endregion #region 校验 @@ -398,4 +394,43 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase + /// 获取已完成的叫料单数量 + /// + /// + [HttpPost("get-uncompleted-request")] + public async Task> GetUnCompletedRequestAsync(List pList) + { + var returnList = new List(); + //枚举类型查不到改成SQL查询 + var list = await _repository.GetListAsync(p => + p.RequestStatus != EnumRequestStatus.Completed && p.IssueRequestType == EnumIssueRequestType.Vision) + .ConfigureAwait(false); + foreach (var itm in list) + { + var query = from detail in itm.Details + join citm in pList on new + { + detail.ItemCode, + locCode = detail.ToLocationCode, + areaCode = detail.PositionCode + } equals + new { citm.ItemCode, locCode = citm.LocCode, areaCode = citm.PositionCode } + select new UnCompletedRequestDto + { + ItemCode = detail.ItemCode, + LocCode = detail.ToLocationCode, + PositionCode = detail.PositionCode + }; + + returnList.AddRange(query.ToList()); + } + + return returnList; + } + + #endregion } diff --git a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs index 8874b643b..545cc625b 100644 --- a/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs +++ b/be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs @@ -17,44 +17,38 @@ using Win_in.Sfs.Wms.Store.Domain.Shared; namespace Win_in.Sfs.Wms.Store.Application; /// -/// 注塑叫料申请 +/// 注塑叫料申请 /// [Authorize] [Route($"{StoreConsts.RootPath}injection-issue-request")] -public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase, IInjectionIssueRequestAppService { private readonly IInjectionIssueRequestManager _injectionIssueRequestManager; - private readonly IItemStoreRelationAppService _itemStoreRelationApp; - private readonly IAreaAppService _areaApp; private readonly ILocationAppService _locationAppService; private readonly IItemBasicAppService _itemBasicAppService; private readonly IProductionLineAppService _productionLineAppService; private readonly IInjectionIssueJobAppService _injectionIssueJobAppService; - private readonly ITransactionTypeAppService _transactionTypeAppService; public InjectionIssueRequestAppService( IInjectionIssueRequestRepository repository, IInjectionIssueRequestManager injectionIssueRequestManager, - IPreparationPlanManager preparationPlanManager, - IItemStoreRelationAppService itemStoreRelationApp, - IAreaAppService areaApp, ILocationAppService locationAppService, IItemBasicAppService itemBasicAppService, IProductionLineAppService productionLineAppService, - ITransactionTypeAppService transactionTypeAppService, IInjectionIssueJobAppService injectionIssueJobAppService) + ITransactionTypeAppService transactionTypeAppService, + IInjectionIssueJobAppService injectionIssueJobAppService) : base(repository, injectionIssueRequestManager) { _injectionIssueRequestManager = injectionIssueRequestManager; - _itemStoreRelationApp = itemStoreRelationApp; - _areaApp = areaApp; _locationAppService = locationAppService; _itemBasicAppService = itemBasicAppService; _productionLineAppService = productionLineAppService; - _transactionTypeAppService = transactionTypeAppService; _injectionIssueJobAppService = injectionIssueJobAppService; } @@ -64,6 +58,61 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) + { + var request = await _repository.GetAsync(id).ConfigureAwait(false); + + var list = await _injectionIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); + if (list.Any()) + { + foreach (var injectionIssueJobDto in list) + { + if (injectionIssueJobDto.JobStatus == EnumJobStatus.Open || + injectionIssueJobDto.JobStatus == EnumJobStatus.Partial || + injectionIssueJobDto.JobStatus == EnumJobStatus.Doing || + injectionIssueJobDto.JobStatus == EnumJobStatus.Wait) + { + await _injectionIssueJobAppService.CancelAsync(injectionIssueJobDto.Id).ConfigureAwait(false); + } + } + } + + if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling || + request.RequestStatus == EnumRequestStatus.New) + { + request.RequestStatus = EnumRequestStatus.Cancelled; + await _repository.UpdateAsync(request).ConfigureAwait(false); + } + else + { + throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消"); + } + + return ObjectMapper.Map(request); + } + + public override async Task CompleteAsync(Guid id) + { + var injectionIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false); + if (injectionIssueRequest.RequestStatus == EnumRequestStatus.Handling || + injectionIssueRequest.RequestStatus == EnumRequestStatus.Partial || + injectionIssueRequest.RequestStatus == EnumRequestStatus.New) + { + injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed; + } + else + { + throw new UserFriendlyException($"【{injectionIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成"); + } + + await _injectionIssueJobAppService.CompleteByRequestNumberAsync(injectionIssueRequest.Number) + .ConfigureAwait(false); + + return ObjectMapper.Map(await _repository + .UpdateAsync(injectionIssueRequest) + .ConfigureAwait(false)); + } + [HttpPost("")] public override async Task CreateAsync(InjectionIssueRequestEditInput input) { @@ -115,23 +164,6 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase - /// 赋值Request业务属性 - /// - /// - /// - private async Task SetRequestAutoPropertiesAsync(InjectionIssueRequestEditInput entity) - { - var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) - .ConfigureAwait(false); - Check.NotNull(tranType, "事务类型", "事务类型不存在"); - entity.AutoSubmit = tranType.AutoSubmitRequest; - entity.AutoAgree = tranType.AutoAgreeRequest; - entity.AutoHandle = tranType.AutoHandleRequest; - entity.AutoCompleteJob = tranType.AutoCompleteJob; - entity.DirectCreateNote = tranType.DirectCreateNote; - } - [HttpPost("create-and-handle")] public async Task CreateAndHandleAsync(InjectionIssueRequestEditInput input) { @@ -142,39 +174,6 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) - { - var request = await _repository.GetAsync(id).ConfigureAwait(false); - - var list = await _injectionIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); - if (list.Any()) - { - foreach (var injectionIssueJobDto in list) - { - if (injectionIssueJobDto.JobStatus == EnumJobStatus.Open || - injectionIssueJobDto.JobStatus == EnumJobStatus.Partial || - injectionIssueJobDto.JobStatus == EnumJobStatus.Doing || - injectionIssueJobDto.JobStatus == EnumJobStatus.Wait) - { - await _injectionIssueJobAppService.CancelAsync(injectionIssueJobDto.Id).ConfigureAwait(false); - } - } - } - - if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling || - request.RequestStatus == EnumRequestStatus.New) - { - request.RequestStatus = EnumRequestStatus.Cancelled; - await _repository.UpdateAsync(request).ConfigureAwait(false); - } - else - { - throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消"); - } - - return ObjectMapper.Map(request); - } - [HttpPost("UpdateStatusCompleted")] public async Task UpdateStatusCompletedAsync(string number) { @@ -183,7 +182,8 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase()) .ConfigureAwait(false); - var injectionIssueJobDtos = await _injectionIssueJobAppService.GetByRequestNumberAsync(injectionIssueRequest.Number) + var injectionIssueJobDtos = await _injectionIssueJobAppService + .GetByRequestNumberAsync(injectionIssueRequest.Number) .ConfigureAwait(false); if (injectionIssueJobDtos.Any(p => @@ -193,23 +193,60 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase= detail.IssuedQty) { - flag = false; return; } } - if (flag) + CheckStatus(EnumRequestStatus.Completed, injectionIssueRequest.RequestStatus); + injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed; + await _repository.UpdateAsync(injectionIssueRequest).ConfigureAwait(false); + } + + [HttpPost("IsHasNewJob")] + public async Task IsHasNewJobAsync(string requestNumber, List jobNumber) + { + var joblIssueJobDtos = + await _injectionIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); + if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) { - CheckStatus(EnumRequestStatus.Completed, injectionIssueRequest.RequestStatus); - injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed; - await _repository.UpdateAsync(injectionIssueRequest).ConfigureAwait(false); + var jobNumberList = joblIssueJobDtos.Select(p => p.Number); + + var difference = jobNumberList.Except(jobNumber); + if (difference.Any()) + { + var result = "已生成任务号"; + difference.ForEach(p => result += "【" + p + "】"); + result += "的任务"; + return result; + } + + return "无任务生成,请检查库存"; } + + return "无任务生成,请检查库存"; + } + + #region 私有 + + /// + /// 赋值Request业务属性 + /// + /// + /// + private async Task SetRequestAutoPropertiesAsync(InjectionIssueRequestEditInput entity) + { + var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) + .ConfigureAwait(false); + Check.NotNull(tranType, "事务类型", "事务类型不存在"); + entity.AutoSubmit = tranType.AutoSubmitRequest; + entity.AutoAgree = tranType.AutoAgreeRequest; + entity.AutoHandle = tranType.AutoHandleRequest; + entity.AutoCompleteJob = tranType.AutoCompleteJob; + entity.DirectCreateNote = tranType.DirectCreateNote; } /// @@ -261,49 +298,7 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase IsHasNewJobAsync(string requestNumber, List jobNumber) - { - var joblIssueJobDtos = - await _injectionIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); - if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) - { - var jobNumberList = joblIssueJobDtos.Select(p => p.Number); - - var difference = jobNumberList.Except(jobNumber); - if (difference.Any()) - { - var result = "已生成任务号"; - difference.ForEach(p => result += "【" + p + "】"); - result += "的任务"; - return result; - } - - return "无任务生成,请检查库存"; - } - - return "无任务生成,请检查库存"; - } - - public override async Task CompleteAsync(Guid id) - { - var injectionIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false); - if (injectionIssueRequest.RequestStatus == EnumRequestStatus.Handling || - injectionIssueRequest.RequestStatus == EnumRequestStatus.Partial || - injectionIssueRequest.RequestStatus == EnumRequestStatus.New) - { - injectionIssueRequest.RequestStatus = EnumRequestStatus.Completed; - } - else - { - throw new UserFriendlyException($"【{injectionIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成"); - } - - await _injectionIssueJobAppService.CompleteByRequestNumberAsync(injectionIssueRequest.Number).ConfigureAwait(false); - - return ObjectMapper.Map(await _repository.UpdateAsync(injectionIssueRequest) - .ConfigureAwait(false)); - } + #endregion #region 校验 @@ -350,13 +345,13 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase + { + validSourceStatuses = new List { EnumRequestStatus.Handling, EnumRequestStatus.Partial }; - break; - } + break; + } default: throw new ArgumentOutOfRangeException(nameof(targetStatus), targetStatus, null); } @@ -398,12 +393,16 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase /// 获取已完成的叫料单数量 /// /// [HttpPost("get-uncompleted-request")] - public async Task> GetUnCompletedRequestAsync(List p_list) + public async Task> GetUnCompletedRequestAsync(List pList) { var returnList = new List(); //枚举类型查不到改成SQL查询 @@ -413,19 +412,15 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) + { + var request = await _repository.GetAsync(id).ConfigureAwait(false); + + var list = await _kittingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); + if (list.Any()) + { + foreach (var kittingIssueJobDto in list) + { + if (kittingIssueJobDto.JobStatus == EnumJobStatus.Open || + kittingIssueJobDto.JobStatus == EnumJobStatus.Partial || + kittingIssueJobDto.JobStatus == EnumJobStatus.Doing || + kittingIssueJobDto.JobStatus == EnumJobStatus.Wait) + { + await _kittingIssueJobAppService.CancelAsync(kittingIssueJobDto.Id).ConfigureAwait(false); + } + } + } + + if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling || + request.RequestStatus == EnumRequestStatus.New) + { + request.RequestStatus = EnumRequestStatus.Cancelled; + await _repository.UpdateAsync(request).ConfigureAwait(false); + } + else + { + throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消"); + } + + return ObjectMapper.Map(request); + } + + public override async Task CompleteAsync(Guid id) + { + var kittingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false); + if (kittingIssueRequest.RequestStatus == EnumRequestStatus.Handling || + kittingIssueRequest.RequestStatus == EnumRequestStatus.Partial || + kittingIssueRequest.RequestStatus == EnumRequestStatus.New) + { + kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed; + } + else + { + throw new UserFriendlyException($"【{kittingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成"); + } + + await _kittingIssueJobAppService.CompleteByRequestNumberAsync(kittingIssueRequest.Number).ConfigureAwait(false); + + return ObjectMapper.Map(await _repository + .UpdateAsync(kittingIssueRequest) + .ConfigureAwait(false)); + } + [HttpPost("")] public override async Task CreateAsync(KittingIssueRequestEditInput input) { @@ -114,23 +160,6 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase - /// 赋值Request业务属性 - /// - /// - /// - private async Task SetRequestAutoPropertiesAsync(KittingIssueRequestEditInput entity) - { - var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) - .ConfigureAwait(false); - Check.NotNull(tranType, "事务类型", "事务类型不存在"); - entity.AutoSubmit = tranType.AutoSubmitRequest; - entity.AutoAgree = tranType.AutoAgreeRequest; - entity.AutoHandle = tranType.AutoHandleRequest; - entity.AutoCompleteJob = tranType.AutoCompleteJob; - entity.DirectCreateNote = tranType.DirectCreateNote; - } - [HttpPost("create-and-handle")] public async Task CreateAndHandleAsync(KittingIssueRequestEditInput input) { @@ -141,39 +170,6 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase CancelAsync(Guid id) - { - var request = await _repository.GetAsync(id).ConfigureAwait(false); - - var list = await _kittingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false); - if (list.Any()) - { - foreach (var kittingIssueJobDto in list) - { - if (kittingIssueJobDto.JobStatus == EnumJobStatus.Open || - kittingIssueJobDto.JobStatus == EnumJobStatus.Partial || - kittingIssueJobDto.JobStatus == EnumJobStatus.Doing || - kittingIssueJobDto.JobStatus == EnumJobStatus.Wait) - { - await _kittingIssueJobAppService.CancelAsync(kittingIssueJobDto.Id).ConfigureAwait(false); - } - } - } - - if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling || - request.RequestStatus == EnumRequestStatus.New) - { - request.RequestStatus = EnumRequestStatus.Cancelled; - await _repository.UpdateAsync(request).ConfigureAwait(false); - } - else - { - throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消"); - } - - return ObjectMapper.Map(request); - } - [HttpPost("UpdateStatusCompleted")] public async Task UpdateStatusCompletedAsync(string number) { @@ -192,23 +188,60 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase= detail.IssuedQty) { - flag = false; return; } } - if (flag) + CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus); + kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed; + await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false); + } + + [HttpPost("IsHasNewJob")] + public async Task IsHasNewJobAsync(string requestNumber, List jobNumber) + { + var joblIssueJobDtos = + await _kittingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); + if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) { - CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus); - kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed; - await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false); + var jobNumberList = joblIssueJobDtos.Select(p => p.Number); + + var difference = jobNumberList.Except(jobNumber); + if (difference.Any()) + { + var result = "已生成任务号"; + difference.ForEach(p => result += "【" + p + "】"); + result += "的任务"; + return result; + } + + return "无任务生成,请检查库存"; } + + return "无任务生成,请检查库存"; + } + + #region 私有 + + /// + /// 赋值Request业务属性 + /// + /// + /// + private async Task SetRequestAutoPropertiesAsync(KittingIssueRequestEditInput entity) + { + var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None) + .ConfigureAwait(false); + Check.NotNull(tranType, "事务类型", "事务类型不存在"); + entity.AutoSubmit = tranType.AutoSubmitRequest; + entity.AutoAgree = tranType.AutoAgreeRequest; + entity.AutoHandle = tranType.AutoHandleRequest; + entity.AutoCompleteJob = tranType.AutoCompleteJob; + entity.DirectCreateNote = tranType.DirectCreateNote; } /// @@ -260,49 +293,7 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase IsHasNewJobAsync(string requestNumber, List jobNumber) - { - var joblIssueJobDtos = - await _kittingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false); - if (joblIssueJobDtos != null && joblIssueJobDtos.Any()) - { - var jobNumberList = joblIssueJobDtos.Select(p => p.Number); - - var difference = jobNumberList.Except(jobNumber); - if (difference.Any()) - { - var result = "已生成任务号"; - difference.ForEach(p => result += "【" + p + "】"); - result += "的任务"; - return result; - } - - return "无任务生成,请检查库存"; - } - - return "无任务生成,请检查库存"; - } - - public override async Task CompleteAsync(Guid id) - { - var kittingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false); - if (kittingIssueRequest.RequestStatus == EnumRequestStatus.Handling || - kittingIssueRequest.RequestStatus == EnumRequestStatus.Partial || - kittingIssueRequest.RequestStatus == EnumRequestStatus.New) - { - kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed; - } - else - { - throw new UserFriendlyException($"【{kittingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成"); - } - - await _kittingIssueJobAppService.CompleteByRequestNumberAsync(kittingIssueRequest.Number).ConfigureAwait(false); - - return ObjectMapper.Map(await _repository.UpdateAsync(kittingIssueRequest) - .ConfigureAwait(false)); - } + #endregion #region 校验