Browse Source

新增 预计出控制

dev_DY_CC
郑勃旭 1 year ago
parent
commit
31c0afe0ae
  1. 16
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/ExpectOuts/IExpectOutAppService.cs
  2. 33
      be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/ExpectOuts/ExpectOutAppService.cs
  3. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/IKittingIssueJobAppService.cs
  4. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/KittingIssueRequests/IKittingIssueRequestAppService.cs
  5. 68
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs
  6. 105
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs
  7. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/KittingIssueRequestAutoMapperProfile.cs

16
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application.Contracts/ExpectOuts/IExpectOutAppService.cs

@ -24,13 +24,6 @@ public interface IExpectOutAppService
EnumInventoryStatus enumInventoryStatus, EnumInventoryStatus enumInventoryStatus,
string lot); string lot);
Task RemoveListByItemCodeAndStatusAndPackingCodeAsync(
string itemCode,
string locationCode,
string packingCode,
EnumInventoryStatus enumInventoryStatus,
string lot);
/// <summary> /// <summary>
/// 保存拆箱时涉及的明细修改 /// 保存拆箱时涉及的明细修改
/// </summary> /// </summary>
@ -43,4 +36,13 @@ public interface IExpectOutAppService
/// <returns></returns> /// <returns></returns>
Task<List<ExpectOutDTO>> GetListByJobNumberAsync(SplitPacking_UpdateDetailInput input); Task<List<ExpectOutDTO>> GetListByJobNumberAsync(SplitPacking_UpdateDetailInput input);
Task RemoveByNumberAndInventoryAsync(
string jobNumber,
string itemCode,
string locationCode,
string packingCode,
EnumInventoryStatus enumInventoryStatus,
string lot,
decimal qty);
} }

33
be/Modules/Inventory/src/Win_in.Sfs.Wms.Inventory.Application/ExpectOuts/ExpectOutAppService.cs

@ -43,6 +43,39 @@ public class ExpectOutAppService
await _expectOutManager.RemoveAsync(jobNumber).ConfigureAwait(false); await _expectOutManager.RemoveAsync(jobNumber).ConfigureAwait(false);
} }
[HttpPost("remove/job-number-and-inventory-balance")]
public virtual async Task RemoveByNumberAndInventoryAsync(
string jobNumber,
string itemCode,
string locationCode,
string packingCode,
EnumInventoryStatus enumInventoryStatus,
string lot,
decimal qty)
{
var expectOut= await _repository.FindAsync(p =>
p.ItemCode == itemCode &&
p.Status == enumInventoryStatus &&
p.PackingCode == packingCode &&
p.Lot == lot&&
p.JobNumber==jobNumber
).ConfigureAwait(false);
if (expectOut != null)
{
expectOut.Qty -= qty;
}
if (expectOut.Qty == 0)
{
await _repository.DeleteAsync(expectOut).ConfigureAwait(false);
}
else
{
await _repository.UpdateAsync(expectOut).ConfigureAwait(false);
}
}
[HttpPost("remove/{id}")] [HttpPost("remove/{id}")]
public virtual async Task RemoveAsync(Guid id) public virtual async Task RemoveAsync(Guid id)
{ {

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/IKittingIssueJobAppService.cs

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -11,4 +12,10 @@ public interface IKittingIssueJobAppService
Task CancelByMaterialRequestAsync(string requestNumber); Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber); Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
Task ExecuteDetailAsync(Guid masterId,Guid detailId, KittingIssueJobDetailDTO issueJobDetailDto);
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/KittingIssueRequests/IKittingIssueRequestAppService.cs

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -10,4 +11,5 @@ public interface IKittingIssueRequestAppService
{ {
Task<KittingIssueRequestDTO> CreateAndHandleAsync(KittingIssueRequestEditInput input); Task<KittingIssueRequestDTO> CreateAndHandleAsync(KittingIssueRequestEditInput input);
Task UpdateStatusCompletedAsync(string number);
} }

68
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs

@ -1,22 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using SQLitePCL;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts; 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;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -35,15 +27,22 @@ public class KittingIssueJobAppService
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService; private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly IKittingIssueNoteAppService _kittingIssueNoteAppService; private readonly IKittingIssueNoteAppService _kittingIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
protected IKittingIssueRequestAppService KittingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IKittingIssueRequestAppService>();
public KittingIssueJobAppService( public KittingIssueJobAppService(
IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager, IKittingIssueJobRepository repository, IKittingIssueJobManager kittingIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService, IKittingIssueNoteAppService kittingIssueNoteAppService) : base(repository, kittingIssueJobManager) ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
IKittingIssueNoteAppService kittingIssueNoteAppService, IExpectOutAppService expectOutAppService) : base(
repository, kittingIssueJobManager)
{ {
_kittingIssueJobManager = kittingIssueJobManager; _kittingIssueJobManager = kittingIssueJobManager;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService; _transferLibJobAppService = transferLibJobAppService;
_kittingIssueNoteAppService = kittingIssueNoteAppService; _kittingIssueNoteAppService = kittingIssueNoteAppService;
_expectOutAppService = expectOutAppService;
} }
[HttpPost("add-many")] [HttpPost("add-many")]
@ -145,8 +144,6 @@ public class KittingIssueJobAppService
jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode; jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode;
await _repository.UpdateAsync(job).ConfigureAwait(false); await _repository.UpdateAsync(job).ConfigureAwait(false);
return;
} }
/// <summary> /// <summary>
@ -154,31 +151,29 @@ public class KittingIssueJobAppService
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpPost("ExecuteDetail/{masterId}")] [HttpPost("ExecuteDetail/{masterId}")]
public async Task ExecuteDetailAsync(Guid masterId,Guid detailId, KittingIssueJobDetailDTO issueJobDetailDto) public async Task ExecuteDetailAsync(Guid masterId, Guid detailId, KittingIssueJobDetailDTO issueJobDetailDto)
{ {
var kittingIssueJob= await _repository.GetAsync(masterId).ConfigureAwait(false); var kittingIssueJob = await _repository.GetAsync(masterId).ConfigureAwait(false);
var kittingIssueJobDto=ObjectMapper.Map<KittingIssueJob, KittingIssueJobDTO>(kittingIssueJob); var kittingIssueJobDto = ObjectMapper.Map<KittingIssueJob, KittingIssueJobDTO>(kittingIssueJob);
kittingIssueJobDto.Details = new List<KittingIssueJobDetailDTO>() { issueJobDetailDto }; kittingIssueJobDto.Details = new List<KittingIssueJobDetailDTO> { issueJobDetailDto };
var kittingIssueNoteEditInput=await BuildKittingIssueNoteAsync(kittingIssueJobDto).ConfigureAwait(false); var kittingIssueNoteEditInput = await BuildKittingIssueNoteAsync(kittingIssueJobDto).ConfigureAwait(false);
await _kittingIssueNoteAppService.CreateAsync(kittingIssueNoteEditInput).ConfigureAwait(false); await _kittingIssueNoteAppService.CreateAsync(kittingIssueNoteEditInput).ConfigureAwait(false);
kittingIssueJobDto = ObjectMapper.Map<KittingIssueJob, KittingIssueJobDTO>(kittingIssueJob); kittingIssueJobDto = ObjectMapper.Map<KittingIssueJob, KittingIssueJobDTO>(kittingIssueJob);
if (kittingIssueJob.EnumIssueSendType == EnumIssueSendType.QtyType)//按箱叫料 因为任务只有1箱 所以可以直接完成 if (kittingIssueJob.EnumIssueSendType == EnumIssueSendType.QtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成
{ {
await CompleteAsync(masterId, kittingIssueJobDto).ConfigureAwait(false); await UpdateJobStatusDoneAsync(kittingIssueJob, issueJobDetailDto).ConfigureAwait(false);
} }
else else
{ {
var detail = kittingIssueJob.Details.First(p=>p.Id==issueJobDetailDto.Id); var detail = kittingIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id);
if (issueJobDetailDto.HandledToQty >= detail.RequestQty) if (issueJobDetailDto.HandledToQty >= detail.RequestQty)
{ {
await CompleteAsync(masterId, kittingIssueJobDto).ConfigureAwait(false); await UpdateJobStatusDoneAsync(kittingIssueJob, issueJobDetailDto).ConfigureAwait(false);
} }
} }
await _kittingIssueNoteAppService.CreateAsync(kittingIssueNoteEditInput).ConfigureAwait(false);
} }
#region 私有 #region 私有
@ -190,7 +185,8 @@ public class KittingIssueJobAppService
/// <returns></returns> /// <returns></returns>
private async Task<KittingIssueNoteEditInput> BuildKittingIssueNoteAsync(KittingIssueJobDTO kittingIssueJobDto) private async Task<KittingIssueNoteEditInput> BuildKittingIssueNoteAsync(KittingIssueJobDTO kittingIssueJobDto)
{ {
var kittingIssueNoteCreateInput = ObjectMapper.Map<KittingIssueJobDTO, KittingIssueNoteEditInput>(kittingIssueJobDto); var kittingIssueNoteCreateInput =
ObjectMapper.Map<KittingIssueJobDTO, KittingIssueNoteEditInput>(kittingIssueJobDto);
kittingIssueNoteCreateInput.JobNumber = kittingIssueJobDto.Number; kittingIssueNoteCreateInput.JobNumber = kittingIssueJobDto.Number;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -264,5 +260,29 @@ public class KittingIssueJobAppService
} }
} }
private async Task UpdateJobStatusDoneAsync(KittingIssueJob kittingIssueJob,
KittingIssueJobDetailDTO kittingIssueJobDetailDto)
{
if (kittingIssueJob.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None
or EnumJobStatus.Done) //需要考虑下 多次提交的问题 所以不判断 进行中
{
throw new UserFriendlyException(
$"任务状态错误:编号为【{kittingIssueJob.Number}】的任务已经【{kittingIssueJob.JobStatus.GetDisplayName()}】");
}
kittingIssueJob.JobStatus = EnumJobStatus.Done;
await _expectOutAppService.RemoveByNumberAndInventoryAsync(kittingIssueJob.Number,
kittingIssueJobDetailDto.ItemCode,
kittingIssueJobDetailDto.HandledToLocationCode, kittingIssueJobDetailDto.HandledToPackingCode,
kittingIssueJobDetailDto.Status, kittingIssueJobDetailDto.HandledToLot,
kittingIssueJobDetailDto.HandledToQty).ConfigureAwait(false);
await KittingIssueRequestAppService.UpdateStatusCompletedAsync(kittingIssueJob.KittingRequestNumber)
.ConfigureAwait(false);
await Task.CompletedTask.ConfigureAwait(false);
}
#endregion #endregion
} }

105
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs

@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -27,6 +29,7 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService; private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly IKittingIssueJobAppService _kittingIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService; private readonly ITransactionTypeAppService _transactionTypeAppService;
@ -39,8 +42,7 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
ILocationAppService locationAppService, ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService, IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService, IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService ITransactionTypeAppService transactionTypeAppService, IKittingIssueJobAppService kittingIssueJobAppService)
)
: base(repository, kittingIssueRequestManager) : base(repository, kittingIssueRequestManager)
{ {
_kittingIssueRequestManager = kittingIssueRequestManager; _kittingIssueRequestManager = kittingIssueRequestManager;
@ -51,6 +53,7 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService; _transactionTypeAppService = transactionTypeAppService;
_kittingIssueJobAppService = kittingIssueJobAppService;
} }
public override async Task<KittingIssueRequestDTO> HandleAsync(Guid id) public override async Task<KittingIssueRequestDTO> HandleAsync(Guid id)
@ -135,8 +138,106 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
return kittingIssueRequestDto; return kittingIssueRequestDto;
} }
[HttpPost("UpdateStatusCompleted")]
public async Task UpdateStatusCompletedAsync(string number)
{
var kittingIssueRequest=await _repository.FindAsync(p=>p.Number== number).ConfigureAwait(false);
var kittingIssueJobDtos=await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number).ConfigureAwait(false);
if (!kittingIssueJobDtos.Any(p =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing ||
p.JobStatus == EnumJobStatus.Partial) )
{
return;
}
else
{
bool flag = true;
foreach (var detail in kittingIssueRequest.Details)
{
if (detail.Qty > detail.IssuedQty)
{
flag = false;
return;
}
}
if (flag)
{
CheckStatus(EnumRequestStatus.Completed, kittingIssueRequest.RequestStatus);
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(kittingIssueRequest).ConfigureAwait(false);
}
}
kittingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
#region 校验 #region 校验
private void CheckStatus(EnumRequestStatus targetStatus, EnumRequestStatus nowStatus)
{
var validSourceStatuses = new List<EnumRequestStatus>();
switch (targetStatus)
{
case EnumRequestStatus.None:
break;
case EnumRequestStatus.New:
break;
case EnumRequestStatus.Reviewing:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.New };
break;
case EnumRequestStatus.Refused:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Agreed:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Handling:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Agreed, EnumRequestStatus.Partial,
};
break;
case EnumRequestStatus.Completed:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
};
break;
case EnumRequestStatus.Cancelled:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed,
};
break;
case EnumRequestStatus.Abort:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
};
break;
case EnumRequestStatus.Partial:
{
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial,
};
break;
}
default:
throw new ArgumentOutOfRangeException(nameof(targetStatus), targetStatus, null);
}
if (!validSourceStatuses.Contains(nowStatus))
{
throw new UserFriendlyException(
$"当前状态为 {nowStatus.GetDisplayName()} ,无法变更为 {targetStatus.GetDisplayName()}");
}
}
private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode) private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode)
{ {
if (itemBasicDto == null) if (itemBasicDto == null)

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/KittingIssueRequestAutoMapperProfile.cs

@ -30,6 +30,7 @@ public partial class StoreEventAutoMapperProfile : Profile
.Ignore(x => x.CompleteUserName) .Ignore(x => x.CompleteUserName)
.Ignore(x => x.CompleteTime) .Ignore(x => x.CompleteTime)
.Ignore(x => x.Details) .Ignore(x => x.Details)
.Ignore(x=>x.EnumIssueSendType)
; ;
} }
} }

Loading…
Cancel
Save