Browse Source

修改 非生产退料

dev_DY_CC
Zheng 7 months ago
parent
commit
315dcbbe5f
  1. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDetailDTO.cs
  2. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestDetailInput.cs
  3. 13
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestImportInput.cs
  4. 157
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobAppService.cs
  5. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs
  6. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestDetail.cs

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/DTOs/UnplannedReceiptRequestDetailDTO.cs

@ -38,10 +38,15 @@ public class UnplannedReceiptRequestDetailDTO
[Display(Name = "扩展属性")] [Display(Name = "扩展属性")]
public ExtraPropertyDictionary ExtraProperties { set; get; } public ExtraPropertyDictionary ExtraProperties { set; get; }
/// <summary> /// <summary>
/// 说明 /// 说明
/// </summary> /// </summary>
[Display(Name = "说明")] [Display(Name = "说明")]
public string Explain { get; set; } public string Explain { get; set; }
/// <summary>
/// 储位
/// </summary>
[Display(Name = "储位")]
public string ErpLocationCode { get; set; }
} }

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestDetailInput.cs

@ -36,4 +36,10 @@ public class UnplannedReceiptRequestDetailInput : SfsStoreDetailWithLotPackingQt
/// </summary> /// </summary>
[Display(Name = "说明")] [Display(Name = "说明")]
public string Explain { get; set; } public string Explain { get; set; }
/// <summary>
/// 储位
/// </summary>
[Display(Name = "储位")]
public string ErpLocationCode { get; set; }
} }

13
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/UnplannedReceiptRequests/Inputs/UnplannedReceiptRequestImportInput.cs

@ -33,13 +33,6 @@ public class UnplannedReceiptRequestImportInput : SfsStoreImportInputBase
[Display(Name = "单位")] [Display(Name = "单位")]
public string Uom { get; set; } public string Uom { get; set; }
/// <summary>
/// 调入库位
/// </summary>
[Display(Name = "调入库位")]
[Required(ErrorMessage = "调出库位不能为空")]
public string LocationCode { get; set; }
/// <summary> /// <summary>
/// 专案 /// 专案
/// </summary> /// </summary>
@ -87,4 +80,10 @@ public class UnplannedReceiptRequestImportInput : SfsStoreImportInputBase
[Display(Name = "说明")] [Display(Name = "说明")]
[Required(ErrorMessage = "说明不能为空")] [Required(ErrorMessage = "说明不能为空")]
public string Explain { get; set; } public string Explain { get; set; }
/// <summary>
/// 储位
/// </summary>
[Display(Name = "储位")]
public string ErpLocationCode { get; set; }
} }

157
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/UnplannedReceiptJobs/UnplannedReceiptJobAppService.cs

@ -1,12 +1,26 @@
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Shared.Domain.Shared;
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;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
using System.Linq;
using System.Text.Json;
using Castle.Components.DictionaryAdapter;
using Irony;
using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}unplanned-receipt-job")] [Route($"{StoreConsts.RootPath}unplanned-receipt-job")]
@ -16,11 +30,20 @@ public class UnplannedReceiptJobAppService
{ {
private readonly IUnplannedReceiptJobManager _unplannedReceiptJobManager; private readonly IUnplannedReceiptJobManager _unplannedReceiptJobManager;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
private readonly IExpectOutAppService _expectOutAppService;
public UnplannedReceiptJobAppService( public UnplannedReceiptJobAppService(
IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager IUnplannedReceiptJobRepository repository, IUnplannedReceiptJobManager UnplannedReceiptJobManager,
) : base(repository, UnplannedReceiptJobManager) ILocationAppService locationAppService,
IBalanceAppService balanceAppService,
IExpectOutAppService expectOutAppService) : base(repository, UnplannedReceiptJobManager)
{ {
_unplannedReceiptJobManager = UnplannedReceiptJobManager; _unplannedReceiptJobManager = UnplannedReceiptJobManager;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService;
} }
@ -38,4 +61,134 @@ public class UnplannedReceiptJobAppService
await _unplannedReceiptJobManager.CancelAsync(entity).ConfigureAwait(false); await _unplannedReceiptJobManager.CancelAsync(entity).ConfigureAwait(false);
} }
} }
/// <summary>
/// 根据储位推荐
/// </summary>
/// <returns></returns>
[HttpPost("create-by-recommend")]
public async Task CreateByRecommendAsync(UnplannedReceiptRequestDTO requestDto)
{
List<BalanceDTO> useBalancesOut = new EditableList<BalanceDTO>();
var jobs=await BuildUnplannedIssueJobAsync(requestDto, useBalancesOut).ConfigureAwait(false);
await _repository.InsertManyAsync(jobs).ConfigureAwait(false);
var outEditInputs=await BuildExpectOutAsync(useBalancesOut).ConfigureAwait(false);
await _expectOutAppService.AddManyAsync(outEditInputs).ConfigureAwait(false);
}
private async Task<List<UnplannedReceiptJob>> BuildUnplannedIssueJobAsync(UnplannedReceiptRequestDTO requestDto, List<BalanceDTO> useBalancesOut)
{
List<UnplannedReceiptJob> jobs = new EditableList<UnplannedReceiptJob>();
foreach (var requestDtoDetail in requestDto.Details)
{
var locationCodes=await _locationAppService.GetListByErpLocationCodes(new StringList(requestDtoDetail.ErpLocationCode)).ConfigureAwait(false);
var input = new RecommendBalanceRequestInput
{
ItemCode = requestDtoDetail.ItemCode,
Qty = requestDtoDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = locationCodes.Select(p=>p.Code).ToList(),
IsPackingCode = false
};
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);
usableList = usableList
.OrderBy(p => p.Lot)
.ThenBy(p => p.PutInTime)
.ThenBy(p => p.Qty) //2023-9-14 苑静雯 从小数开始发料
.ThenBy(p => p.LocationCode)
.ThenBy(p => p.PackingCode)
.ToList();
decimal qty = 0;
//实际要用库存
List<BalanceDTO> useBalances = new List<BalanceDTO>();
foreach (var balanceDto in usableList)
{
if (qty >= requestDtoDetail.Qty)
{
break;
}
if (qty + balanceDto.Qty > requestDtoDetail.Qty)
{
qty += requestDtoDetail.Qty - balanceDto.Qty;
}
else
{
qty += balanceDto.Qty;
}
useBalances.Add(balanceDto);
useBalancesOut.Add(balanceDto);
}
foreach (var balanceDtoGroup in useBalances.GroupBy(p=>p.LocationCode))
{
var locationDto=await _locationAppService.GetByCodeAsync(balanceDtoGroup.Key).ConfigureAwait(false);
var job = new UnplannedReceiptJob();
job.UnplannedReceiptRequestNumber = requestDto.Number;
job.JobType = EnumJobType.UnplannedReceiptJob;
job.JobStatus = EnumJobStatus.Open;
job.IsAutoComplete = false;
job.OANumber = requestDto.OANumber;
job.Details = new List<UnplannedReceiptJobDetail>();
job.WarehouseCode = balanceDtoGroup.First().WarehouseCode;
foreach (var balanceDto in balanceDtoGroup)
{
var jobDetail = new UnplannedReceiptJobDetail();
jobDetail.CaseCode = requestDtoDetail.CaseCode;
jobDetail.Explain = requestDtoDetail.Explain;
jobDetail.OnceBusiCode = requestDtoDetail.OnceBusiCode;
jobDetail.ProjCapacityCode = requestDtoDetail.ProjCapacityCode;
jobDetail.ReasonCode = requestDtoDetail.ReasonCode;
jobDetail.ItemCode = requestDtoDetail.ItemCode;
jobDetail.ItemDesc1 = requestDtoDetail.ItemDesc1;
jobDetail.ItemDesc2 = requestDtoDetail.ItemDesc2;
jobDetail.ItemName = requestDtoDetail.ItemName;
jobDetail.RecommendArriveDate = balanceDto.ArriveDate;
jobDetail.RecommendContainerCode = string.Empty;
jobDetail.RecommendExpireDate = balanceDto.ExpireDate;
jobDetail.RecommendLot = balanceDto.Lot;
jobDetail.RecommendPackingCode = balanceDto.PackingCode;
jobDetail.RecommendProduceDate = balanceDto.ProduceDate;
jobDetail.RecommendQty = balanceDto.Qty;
jobDetail.RecommendSupplierBatch = balanceDto.SupplierBatch;
jobDetail.RecommendToLocationArea = balanceDto.LocationArea;
jobDetail.RecommendToLocationCode = balanceDto.LocationCode;
jobDetail.RecommendToLocationErpCode = balanceDto.LocationErpCode;
jobDetail.RecommendToLocationGroup = balanceDto.LocationGroup;
jobDetail.RecommendToWarehouseCode = balanceDto.WarehouseCode;
job.Details.Add(jobDetail);
}
if (locationDto.Type==EnumLocationType.DimensionalStorehouse)//如果是立库的
{
await SendDimensionalStorehouseAsync().ConfigureAwait(false);
job.JobStatus = EnumJobStatus.Wait;
}
jobs.Add(job);
}
}
return jobs;
}
private async Task<List<ExpectOutEditInput>> BuildExpectOutAsync(List<BalanceDTO> balanceDtos)
{
return ObjectMapper.Map<List<BalanceDTO>, List<ExpectOutEditInput>>(balanceDtos);
}
/// <summary>
/// 给立体库发送
/// </summary>
/// <returns></returns>
public async Task SendDimensionalStorehouseAsync()
{
throw new System.NotImplementedException();
}
} }

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestForDongyangAppService.cs

@ -293,11 +293,11 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
var balance = await BalanceAclService.GetByItemLocationAndPackingAsync( var balance = await BalanceAclService.GetByItemLocationAndPackingAsync(
string.Empty, string.Empty,
importInput.ItemCode, importInput.ItemCode,
importInput.LocationCode).ConfigureAwait(false); importInput.ErpLocationCode).ConfigureAwait(false);
if (balance == null) if (balance == null)
{ {
validationRresult.Add("库存余额", $"ERP料号{importInput.ItemCode}在库位{importInput.LocationCode}没有库存记录"); validationRresult.Add("库存余额", $"ERP料号{importInput.ItemCode}在储位{importInput.ErpLocationCode}没有库存记录");
} }
else else
{ {
@ -347,7 +347,7 @@ public class UnplannedReceiptRequestForDongyangAppService : UnplannedReceiptRequ
//await base.CheckImportInputBusinessAsync(importInput, importMethod); //await base.CheckImportInputBusinessAsync(importInput, importMethod);
_ = await CheckItemBasicAsync(importInput, validationRresult).ConfigureAwait(false); _ = await CheckItemBasicAsync(importInput, validationRresult).ConfigureAwait(false);
_ = await CheckLocationAsync(importInput.LocationCode, validationRresult).ConfigureAwait(false); _ = await CheckLocationAsync(importInput.ErpLocationCode, validationRresult).ConfigureAwait(false);
await CheckOnceBusiCodeAsync(importInput, validationRresult).ConfigureAwait(false);//次交易码 await CheckOnceBusiCodeAsync(importInput, validationRresult).ConfigureAwait(false);//次交易码
// await CheckCaseCodeAsync(importInput, validationRresult).ConfigureAwait(false);//专案代码 // await CheckCaseCodeAsync(importInput, validationRresult).ConfigureAwait(false);//专案代码

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/UnplannedReceiptRequests/UnplannedReceiptRequestDetail.cs

@ -44,4 +44,10 @@ public class UnplannedReceiptRequestDetail : SfsStoreDetailWithLotPackingQtyLoca
[Display(Name = "说明")] [Display(Name = "说明")]
public string Explain { get; set; } public string Explain { get; set; }
/// <summary>
/// 储位
/// </summary>
[Display(Name = "储位")]
public string ErpLocationCode { get; set; }
} }

Loading…
Cancel
Save