Browse Source

Merge branch 'dev_DY_CC' of http://dev.ccwin-in.com:3000/BoXu.Zheng/WZC2 into dev_DY_CC

dev_DY_CC
lvzb 11 months ago
parent
commit
714c2957ae
  1. BIN
      .vs/WZC2/v17/.wsuo
  2. 12
      be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs
  3. 5
      be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/Types/EnumReceiptType.cs
  4. 10
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs
  5. 43
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs
  6. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs
  7. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobAppService.cs
  8. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/SparePartIssueJobs/SparePartIssueJobAppService.cs
  9. 20
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/proxy/IssueJobToRestoClient.cs
  10. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ContainerRequests/ContainerRequestAppService.cs
  11. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs
  12. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs
  13. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs
  14. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/KittingIssueRequests/KittingIssueRequestAppService.cs
  15. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/SparePartIssueRequests/SparePartIssueRequestAppService.cs
  16. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Options/RestoOptions.cs
  17. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequestManager.cs
  18. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/IAssembleIssueRequestManager.cs
  19. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestManager.cs
  20. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestManager.cs
  21. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/IInjectionIssueRequestManager.cs
  22. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/InjectionIssueRequestManager.cs
  23. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/IKittingIssueRequestManager.cs
  24. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/KittingIssueRequestManager.cs
  25. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/SparePartIssueRequests/ISparePartRequestManager.cs
  26. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/SparePartIssueRequests/SparePartIssueRequestManager.cs
  27. 13
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/AssembleIssueRequestEventHandler.cs
  28. 223
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/CoatingIssueRequestEventHandler.cs
  29. 223
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/InjectionIssueRequestEventHandler.cs
  30. 226
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/KittingIssueRequestEventHandler.cs
  31. 226
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/SparePartIssueRequestEventHandler.cs
  32. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductReceiptRequestEventHandler.cs
  33. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs
  34. 4
      build/src/docker/publish/conf/settings/appsettings.Development.json

BIN
.vs/WZC2/v17/.wsuo

Binary file not shown.

12
be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs

@ -122,17 +122,6 @@ public class InjectionMoldingRequestReader : IReader
_logger.LogInformation(MakeGrid($"标识{guid}读取{invterval}次接口表",camralist1));
sw.Stop();
//按区域、货位号、物品、标志
@ -454,6 +443,7 @@ public class InjectionMoldingRequestReader : IReader
sb.Append("|");
sb.AppendLine();
}
return sb.ToString();
}

5
be/Modules/Shared/src/Win_in.Sfs.Shared.Domain.Shared/Enums/Store/Types/EnumReceiptType.cs

@ -29,4 +29,9 @@ public enum EnumReceiptType
/// L7级物品完工
/// </summary>
MesScanReceiptToL7Parts = 4,
/// <summary>
/// 线边仓缴库
/// </summary>
ProductReceiptRequest=5,
}

10
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/AssembleIssueJobs/AssembleIssueJobAppService.cs

@ -33,6 +33,9 @@ public class AssembleIssueJobAppService
AssembleIssueJobCheckInput, AssembleIssueJobEditInput>,
IAssembleIssueJobAppService, ITransferLibCallback
{
protected IAssembleIssueRequestAppService AssembleIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestAppService>();
private readonly IAssembleIssueJobManager _assembleIssueJobManager;
private readonly ILocationAppService _locationAppService;
private readonly IAssembleIssueNoteAppService _assembleIssueNoteAppService;
@ -41,9 +44,6 @@ public class AssembleIssueJobAppService
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options;
protected IAssembleIssueRequestAppService AssembleIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestAppService>();
public AssembleIssueJobAppService(
IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager,
ILocationAppService locationAppService,
@ -133,7 +133,7 @@ public class AssembleIssueJobAppService
[HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var entitys = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber)
var entitys = await _repository.GetListAsync(p => p.AssembleRequestNumber == requestNumber,"",true)
.ConfigureAwait(false);
return ObjectMapper.Map<List<AssembleIssueJob>, List<AssembleIssueJobDTO>>(entitys);
}
@ -347,7 +347,7 @@ public class AssembleIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")));
}
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient, _options.Value.Path);
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
}
catch (Exception ex)

43
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs

@ -9,6 +9,7 @@ using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using MyNamespace;
using Volo.Abp;
@ -40,11 +41,14 @@ public class CoatingIssueJobAppService
private readonly IHttpClientFactory _httpClientFactory;
private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options;
private readonly ILogger<CoatingIssueJobAppService> _logger;
protected ICoatingIssueRequestAppService CoatingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestAppService>();
public CoatingIssueJobAppService(
ILogger<CoatingIssueJobAppService> logger,
ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager,
ILocationAppService locationAppService,
ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService
@ -59,6 +63,7 @@ public class CoatingIssueJobAppService
_httpClientFactory = httpClientFactory;
_options = options;
_transferLibRequestAppService = transferLibRequestAppService;
_logger = logger;
}
[HttpPost("get-by-number-2")]
@ -133,7 +138,7 @@ public class CoatingIssueJobAppService
[HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var entitys = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber)
var entitys = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber, "", true)
.ConfigureAwait(false);
return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entitys);
}
@ -315,7 +320,7 @@ public class CoatingIssueJobAppService
var ret = new ReusltObject();
ret.Code = "1";
ret.Message = "操作成功";
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
try
{
var IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>();
@ -341,12 +346,24 @@ public class CoatingIssueJobAppService
#if DEBUG
var json = JsonSerializer.Serialize(main);
_options.Value.Address = "http://localhost:59094/"; //测试地址
_options.Value.Address = "http://7e42682n64.goho.co:21171/"; //测试地址
_options.Value.Token = ""; //测试token
_options.Value.UserName = ""; //测试用户名
_options.Value.Password = ""; //测试密码
_options.Value.Path = "zozocnApi/custom/receiveProductionPlan"; //测试密码
#endif
//var json = JsonSerializer.Serialize(main);
_options.Value.Address = "http://7e42682n64.goho.co:21171/"; //测试地址
_options.Value.Token = ""; //测试token
_options.Value.UserName = ""; //测试用户名
_options.Value.Password = ""; //测试密码
_options.Value.Path = "zozocnApi/custom/receiveProductionPlan"; //测试密码
_logger.LogInformation(System.Text.Json.JsonSerializer.Serialize(_options));
if (!string.IsNullOrEmpty(_options.Value.Token))
{
var token = _options.Value.Token;
@ -361,15 +378,22 @@ public class CoatingIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")));
}
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient,_options.Value.Path);
var flag=DateTime.Now.ToString("yyyyMMddHHmmss");
_logger.LogInformation($"标志{flag}开始调用高通WMS:传递值{System.Text.Json.JsonSerializer.Serialize(main)}");
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
_logger.LogInformation($"标志{flag}调用高通WMS:返回值{ret}");
}
catch (Exception ex)
{
ret = new ReusltObject();
ret.Code = "2";
ret.Message = ex.Message;
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
return ret;
@ -382,7 +406,7 @@ public class CoatingIssueJobAppService
var json = JsonSerializer.Serialize(input);
#endif
var errors = new List<string>();
var ret = new ReusltObject { Code = "1", OperateTime = DateTime.Now.ToString("yyyy-MM-dd"), Message = "操作成功" };
var ret = new ReusltObject { Code = "1", OperateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Message = "操作成功" };
try
{
if (input.Jobs.Count > 0)
@ -546,12 +570,17 @@ public class CoatingIssueJobAppService
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
var flag = DateTime.Now.ToString("yyyyMMddHHmmss");
_logger.LogInformation($"立体库任务检查开始{flag}");
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
_logger.LogInformation($"立体库任务开始标记{flag}");
//TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<CoatingIssueJobDTO> { coatingIssueJobDto },
loctionDto.Code).ConfigureAwait(false);
_logger.LogInformation($"立体库任务结束标记{flag},返回值{ret}");
if (ret.Code != "1")
{
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/InjectionIssueJobs/InjectionIssueJobAppService.cs

@ -132,7 +132,7 @@ public class InjectionIssueJobAppService
[HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<InjectionIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var entitys = await _repository.GetListAsync(p => p.InjectionRequestNumber == requestNumber)
var entitys = await _repository.GetListAsync(p => p.InjectionRequestNumber == requestNumber, "", true)
.ConfigureAwait(false);
return ObjectMapper.Map<List<InjectionIssueJob>, List<InjectionIssueJobDTO>>(entitys);
}
@ -325,7 +325,7 @@ public class InjectionIssueJobAppService
#if DEBUG
var json = JsonSerializer.Serialize(main);
_options.Value.Address = "http://localhost:59094/"; //测试地址
_options.Value.Address = "http://7e42682n64.goho.co:21171/"; //测试地址
_options.Value.Token = ""; //测试token
_options.Value.UserName = ""; //测试用户名
_options.Value.Password = ""; //测试密码
@ -345,7 +345,7 @@ public class InjectionIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")));
}
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient, _options.Value.Path);
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
}
catch (Exception ex)

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

@ -132,7 +132,7 @@ public class KittingIssueJobAppService
[HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var entitys = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber)
var entitys = await _repository.GetListAsync(p => p.KittingRequestNumber == requestNumber, "", true)
.ConfigureAwait(false);
return ObjectMapper.Map<List<KittingIssueJob>, List<KittingIssueJobDTO>>(entitys);
}
@ -345,7 +345,7 @@ public class KittingIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")));
}
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient, _options.Value.Path);
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
}
catch (Exception ex)

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/SparePartIssueJobs/SparePartIssueJobAppService.cs

@ -124,7 +124,7 @@ public class SparePartIssueJobAppService
[HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<SparePartIssueJobDTO>> GetByRequestNumberAsync(string requestNumber)
{
var entitys = await _repository.GetListAsync(p => p.SparePartRequestNumber == requestNumber)
var entitys = await _repository.GetListAsync(p => p.SparePartRequestNumber == requestNumber, "", true)
.ConfigureAwait(false);
return ObjectMapper.Map<List<SparePartIssueJob>, List<SparePartIssueJobDTO>>(entitys);
}
@ -337,7 +337,7 @@ public class SparePartIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")));
}
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
var client = new IssueJobToRestoClient(_options.Value.Address, httpclient, _options.Value.Path);
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
}
catch (Exception ex)

20
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/proxy/IssueJobToRestoClient.cs

@ -34,11 +34,12 @@ namespace MyNamespace
private static System.Lazy<System.Text.Json.JsonSerializerOptions> _settings = new System.Lazy<System.Text.Json.JsonSerializerOptions>(CreateSerializerSettings, true);
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public IssueJobToRestoClient(string baseUrl, System.Net.Http.HttpClient httpClient)
public IssueJobToRestoClient(string baseUrl, System.Net.Http.HttpClient httpClient,string path)
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
{
BaseUrl = baseUrl;
_httpClient = httpClient;
_path = path;
}
private static System.Text.Json.JsonSerializerOptions CreateSerializerSettings()
@ -58,6 +59,21 @@ namespace MyNamespace
_baseUrl += '/';
}
}
private string _path;
public string Path
{
get { return _path; }
set
{
_path = value;
}
}
protected System.Text.Json.JsonSerializerOptions JsonSerializerSettings { get { return _settings.Value; } }
@ -95,7 +111,7 @@ namespace MyNamespace
var urlBuilder_ = new System.Text.StringBuilder();
if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl);
// Operation Path: "CargoState/SyncIssueJobStereo"
urlBuilder_.Append("CargoState/SyncIssueJobStereo");//修改路由需求
urlBuilder_.Append(_path);//修改路由需求
PrepareRequest(client_, request_, urlBuilder_);

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/ContainerRequests/ContainerRequestAppService.cs

@ -78,7 +78,7 @@ public class ContainerRequestAppService :
/// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(ContainerRequestEditInput entity)
{
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false);
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.TransferLib, EnumTransSubType.Transfer_Warehouse).ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在");

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/AssembleIssueRequests/AssembleIssueRequestAppService.cs

@ -195,7 +195,7 @@ public class AssembleIssueRequestAppService : SfsStoreRequestAppServiceBase<Asse
foreach (var detail in assembleIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
if (detail.Qty > detail.IssuedQty)
{
return;
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs

@ -195,7 +195,7 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
foreach (var detail in coatingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
if (detail.Qty > detail.IssuedQty)
{
return;
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/InjectionIssueRequests/InjectionIssueRequestAppService.cs

@ -195,7 +195,7 @@ public class InjectionIssueRequestAppService : SfsStoreRequestAppServiceBase<Inj
foreach (var detail in injectionIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
if (detail.Qty > detail.IssuedQty)
{
return;
}

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

@ -198,7 +198,7 @@ public class KittingIssueRequestAppService : SfsStoreRequestAppServiceBase<Kitti
foreach (var detail in kittingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
if (detail.Qty > detail.IssuedQty)
{
return;
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/SparePartIssueRequests/SparePartIssueRequestAppService.cs

@ -191,7 +191,7 @@ public class SparePartIssueRequestAppService : SfsStoreRequestAppServiceBase<Spa
foreach (var detail in sparePartIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
if (detail.Qty > detail.IssuedQty)
{
return;
}

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Options/RestoOptions.cs

@ -16,6 +16,8 @@ public class RestoOptions
// 令牌
public string Token { set; get; }
public string Path { set; get; }
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/AssembleIssueRequestManager.cs

@ -55,4 +55,9 @@ public class AssembleIssueRequestManager
{
throw new System.NotImplementedException();
}
public virtual async Task<AssembleIssueRequest> UpdateByEntityAsync(AssembleIssueRequest request)
{
return await _repository.UpdateAsync(request).ConfigureAwait(false);
}
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/AssembleIssueRequests/IAssembleIssueRequestManager.cs

@ -11,4 +11,5 @@ public interface IAssembleIssueRequestManager : ISfsStoreRequestManager<Assemble
Task<AssembleIssueRequest> CreateByNumberAsync(AssembleIssueRequest entity);
Task<AssembleIssueRequest> UpdateByEntityAsync(AssembleIssueRequest request);
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestManager.cs

@ -52,4 +52,9 @@ public class CoatingIssueRequestManager
{
throw new System.NotImplementedException();
}
public virtual async Task<CoatingIssueRequest> UpdateByEntityAsync(CoatingIssueRequest request)
{
return await _repository.UpdateAsync(request).ConfigureAwait(false);
}
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestManager.cs

@ -9,4 +9,5 @@ public interface ICoatingIssueRequestManager : ISfsStoreRequestManager<CoatingIs
Task CompleteAsync(string number);
Task<CoatingIssueRequest> CreateByNumberAsync(CoatingIssueRequest entity);
Task<CoatingIssueRequest> UpdateByEntityAsync(CoatingIssueRequest request);
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/IInjectionIssueRequestManager.cs

@ -10,4 +10,5 @@ public interface IInjectionIssueRequestManager : ISfsStoreRequestManager<Injecti
Task CompleteAsync(string number);
Task<InjectionIssueRequest> CreateByNumberAsync(InjectionIssueRequest entity);
Task<InjectionIssueRequest> UpdateByEntityAsync(InjectionIssueRequest request);
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/InjectionIssueRequests/InjectionIssueRequestManager.cs

@ -52,4 +52,9 @@ public class InjectionIssueRequestManager
{
throw new System.NotImplementedException();
}
public virtual async Task<InjectionIssueRequest> UpdateByEntityAsync(InjectionIssueRequest request)
{
return await _repository.UpdateAsync(request).ConfigureAwait(false);
}
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/IKittingIssueRequestManager.cs

@ -10,4 +10,5 @@ public interface IKittingIssueRequestManager : ISfsStoreRequestManager<KittingIs
Task CompleteAsync(string number);
Task<KittingIssueRequest> CreateByNumberAsync(KittingIssueRequest entity);
Task<KittingIssueRequest> UpdateByEntityAsync(KittingIssueRequest request);
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/KittingIssueRequests/KittingIssueRequestManager.cs

@ -52,4 +52,9 @@ public class KittingIssueRequestManager
{
throw new System.NotImplementedException();
}
public virtual async Task<KittingIssueRequest> UpdateByEntityAsync(KittingIssueRequest request)
{
return await _repository.UpdateAsync(request).ConfigureAwait(false);
}
}

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/SparePartIssueRequests/ISparePartRequestManager.cs

@ -10,4 +10,5 @@ public interface ISparePartIssueRequestManager : ISfsStoreRequestManager<SparePa
Task CompleteAsync(string number);
Task<SparePartIssueRequest> CreateByNumberAsync(SparePartIssueRequest entity);
Task<SparePartIssueRequest> UpdateByEntityAsync(SparePartIssueRequest request);
}

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/SparePartIssueRequests/SparePartIssueRequestManager.cs

@ -52,4 +52,9 @@ public class SparePartIssueRequestManager
{
throw new System.NotImplementedException();
}
public virtual async Task<SparePartIssueRequest> UpdateByEntityAsync(SparePartIssueRequest request)
{
return await _repository.UpdateAsync(request).ConfigureAwait(false);
}
}

13
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/AssembleIssueRequestEventHandler.cs

@ -14,6 +14,7 @@ using Win_in.Sfs.Shared.Event;
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.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -30,6 +31,7 @@ public class AssembleIssueRequestEventHandler
private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
protected IAssembleIssueRequestManager AssembleIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestManager>();
private IMapper _mapper;
public AssembleIssueRequestEventHandler(
@ -138,7 +140,9 @@ public class AssembleIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos)
{
//未发送的数量
tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty;
tempDetailDto.Qty = tempDetailDto.Qty>tempDetailDto.IssuedQty?
tempDetailDto.Qty - tempDetailDto.IssuedQty:
0;
if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{
@ -176,8 +180,13 @@ public class AssembleIssueRequestEventHandler
assembleIssueRequest,
assembleIssueRequestDetails.First()).ConfigureAwait(false);
assembleIssueJobEditInput.Details = assembleIssueJobDetailInputs;
assembleIssueJobEditInput.Details=assembleIssueJobEditInput.Details.Where(p => p.RecommendFromQty>0).ToList();
if (assembleIssueJobEditInput.Details != null && assembleIssueJobEditInput.Details.Any())
{
jobs.Add(assembleIssueJobEditInput);
}
}
return jobs;
}
@ -653,6 +662,8 @@ public class AssembleIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty;
}
}
await AssembleIssueRequestManager.UpdateByEntityAsync(assembleIssueRequest).ConfigureAwait(false);
}
/// <summary>

223
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/CoatingIssueRequestEventHandler.cs

@ -14,6 +14,7 @@ using Win_in.Sfs.Shared.Event;
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.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class CoatingIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<CoatingIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<CoatingIssueRequest>>>
{
private readonly ICoatingIssueJobAppService _coatingIssueJobAppService;
private readonly ICoatingIssueJobAppService _CoatingIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
protected ICoatingIssueRequestManager CoatingIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestManager>();
private IMapper _mapper;
public CoatingIssueRequestEventHandler(
ICoatingIssueJobAppService coatingIssueJobAppService, IProductionLineAppService productionLineAppService,
ICoatingIssueJobAppService CoatingIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
)
{
_coatingIssueJobAppService = coatingIssueJobAppService;
_CoatingIssueJobAppService = CoatingIssueJobAppService;
_productionLineAppService = productionLineAppService;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
@ -107,14 +109,14 @@ public class CoatingIssueRequestEventHandler
/// <summary>
/// 创建注塑任务-按数量
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetails"></param>
/// <param name="CoatingIssueRequest"></param>
/// <param name="CoatingIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<CoatingIssueJobEditInput>> CreateCoatingIssueJobWithQtyTypeAsync
(CoatingIssueRequest coatingIssueRequest, List<CoatingIssueRequestDetail> coatingIssueRequestDetails,
(CoatingIssueRequest CoatingIssueRequest, List<CoatingIssueRequestDetail> CoatingIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
@ -122,9 +124,9 @@ public class CoatingIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos =
ObjectMapper.Map<List<CoatingIssueRequestDetail>, List<CoatingIssueRequestDetailDTO>>(
coatingIssueRequestDetails);
CoatingIssueRequestDetails);
var coatingIssueJobDetailInputs = new List<CoatingIssueJobDetailInput>();
var CoatingIssueJobDetailInputs = new List<CoatingIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{
@ -138,7 +140,9 @@ public class CoatingIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos)
{
//未发送的数量
tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty;
tempDetailDto.Qty = tempDetailDto.Qty > tempDetailDto.IssuedQty ?
tempDetailDto.Qty - tempDetailDto.IssuedQty :
0;
if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{
@ -150,7 +154,7 @@ public class CoatingIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty;
}
coatingIssueJobDetailInputs.Add(
CoatingIssueJobDetailInputs.Add(
await BuildCoatingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false));
useBalanceList.Add(balanceDto);
@ -170,13 +174,18 @@ public class CoatingIssueRequestEventHandler
}
}
if (coatingIssueJobDetailInputs.Any())
if (CoatingIssueJobDetailInputs.Any())
{
var coatingIssueJobEditInput = await BuildCoatingIssueJobCreateInputWithQtyTypeAsync(
coatingIssueRequest,
coatingIssueRequestDetails.First()).ConfigureAwait(false);
coatingIssueJobEditInput.Details = coatingIssueJobDetailInputs;
jobs.Add(coatingIssueJobEditInput);
var CoatingIssueJobEditInput = await BuildCoatingIssueJobCreateInputWithQtyTypeAsync(
CoatingIssueRequest,
CoatingIssueRequestDetails.First()).ConfigureAwait(false);
CoatingIssueJobEditInput.Details = CoatingIssueJobDetailInputs;
CoatingIssueJobEditInput.Details = CoatingIssueJobEditInput.Details.Where(p => p.RecommendFromQty > 0).ToList();
if (CoatingIssueJobEditInput.Details != null && CoatingIssueJobEditInput.Details.Any())
{
jobs.Add(CoatingIssueJobEditInput);
}
}
return jobs;
@ -185,19 +194,19 @@ public class CoatingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按数量
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="CoatingIssueRequest"></param>
/// <param name="requestDetailInput"></param>
/// <returns></returns>
private async Task<CoatingIssueJobEditInput> BuildCoatingIssueJobCreateInputWithQtyTypeAsync(
CoatingIssueRequest coatingIssueRequest, CoatingIssueRequestDetail requestDetailInput)
CoatingIssueRequest CoatingIssueRequest, CoatingIssueRequestDetail requestDetailInput)
{
var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(coatingIssueRequest);
var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(CoatingIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = coatingIssueRequest.Worker;
job.CoatingRequestNumber = coatingIssueRequest.Number;
job.Worker = CoatingIssueRequest.Worker;
job.CoatingRequestNumber = CoatingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false);
@ -208,31 +217,31 @@ public class CoatingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按数量
/// </summary>
/// <param name="coatingIssueRequestDetail"></param>
/// <param name="CoatingIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithQtyTypeAsync(
CoatingIssueRequestDetailDTO coatingIssueRequestDetail, BalanceDTO balance)
CoatingIssueRequestDetailDTO CoatingIssueRequestDetail, BalanceDTO balance)
{
var detail = new CoatingIssueJobDetailInput();
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.PositionCode = coatingIssueRequestDetail.PositionCode;
detail.RecommendType = coatingIssueRequestDetail.RecommendType;
detail.RequestLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.PositionCode = CoatingIssueRequestDetail.PositionCode;
detail.RecommendType = CoatingIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName;
detail.ProdLine = coatingIssueRequestDetail.ProdLine;
detail.ProdLine = CoatingIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty;
detail.StdPackQty = coatingIssueRequestDetail.StdPackQty;
detail.StdPackQty = CoatingIssueRequestDetail.StdPackQty;
detail.Status = balance.Status;
detail.RequestLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RequestLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode;
@ -264,11 +273,11 @@ public class CoatingIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -299,11 +308,11 @@ public class CoatingIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.TransferLibToLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -316,28 +325,28 @@ public class CoatingIssueRequestEventHandler
/// <summary>
/// 创建注塑任务 按箱叫料-按箱
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetailList"></param>
/// <param name="CoatingIssueRequest"></param>
/// <param name="CoatingIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<CoatingIssueJobEditInput>> CreateCoatingIssueJobWithBoxQtyTypeAsync
(
CoatingIssueRequest coatingIssueRequest,
List<CoatingIssueRequestDetail> coatingIssueRequestDetailList,
CoatingIssueRequest CoatingIssueRequest,
List<CoatingIssueRequestDetail> CoatingIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
var inputJobs = new List<CoatingIssueJobEditInput>();
var jobs = await _coatingIssueJobAppService.GetByRequestNumberAsync(coatingIssueRequest.Number)
var jobs = await _CoatingIssueJobAppService.GetByRequestNumberAsync(CoatingIssueRequest.Number)
.ConfigureAwait(false);
foreach (var detail in coatingIssueRequestDetailList)
foreach (var detail in CoatingIssueRequestDetailList)
{
//当前物品的集合
var inputDetails = coatingIssueRequestDetailList;
var inputDetails = CoatingIssueRequestDetailList;
//获取请求下 这个物品和这个库位一个需要多少箱
var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线
@ -368,12 +377,12 @@ public class CoatingIssueRequestEventHandler
useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable);
var coatingIssueJobEditInput =
await BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(coatingIssueRequest,
var CoatingIssueJobEditInput =
await BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(CoatingIssueRequest,
detail, firstUsable)
.ConfigureAwait(false);
inputJobs.Add(coatingIssueJobEditInput);
inputJobs.Add(CoatingIssueJobEditInput);
}
else
{
@ -389,24 +398,24 @@ public class CoatingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按箱
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetail"></param>
/// <param name="CoatingIssueRequest"></param>
/// <param name="CoatingIssueRequestDetail"></param>
/// <param name="balanceDtos"></param>
/// <returns></returns>
private async Task<CoatingIssueJobEditInput> BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(
CoatingIssueRequest coatingIssueRequest,
CoatingIssueRequestDetail coatingIssueRequestDetail, BalanceDTO balanceDtos)
CoatingIssueRequest CoatingIssueRequest,
CoatingIssueRequestDetail CoatingIssueRequestDetail, BalanceDTO balanceDtos)
{
var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(coatingIssueRequest);
var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(CoatingIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = coatingIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
job.Worker = coatingIssueRequest.Worker;
job.CoatingRequestNumber = coatingIssueRequest.Number;
job.WorkGroupCode = CoatingIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
job.Worker = CoatingIssueRequest.Worker;
job.CoatingRequestNumber = CoatingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(coatingIssueRequestDetail, balanceDtos)
job.Details.Add(await BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(CoatingIssueRequestDetail, balanceDtos)
.ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false);
@ -417,28 +426,28 @@ public class CoatingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按箱
/// </summary>
/// <param name="coatingIssueRequestDetail"></param>
/// <param name="CoatingIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(
CoatingIssueRequestDetail coatingIssueRequestDetail, BalanceDTO balance)
CoatingIssueRequestDetail CoatingIssueRequestDetail, BalanceDTO balance)
{
var detail = new CoatingIssueJobDetailInput();
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1;
detail.PositionCode = coatingIssueRequestDetail.PositionCode;
detail.RecommendType = coatingIssueRequestDetail.RecommendType;
detail.ProdLine = coatingIssueRequestDetail.ProdLine;
detail.PositionCode = CoatingIssueRequestDetail.PositionCode;
detail.RecommendType = CoatingIssueRequestDetail.RecommendType;
detail.ProdLine = CoatingIssueRequestDetail.ProdLine;
detail.ItemCode = coatingIssueRequestDetail.ItemCode;
detail.ItemName = coatingIssueRequestDetail.ItemName;
detail.ItemDesc1 = coatingIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = coatingIssueRequestDetail.ItemDesc2;
detail.ItemCode = CoatingIssueRequestDetail.ItemCode;
detail.ItemName = CoatingIssueRequestDetail.ItemName;
detail.ItemDesc1 = CoatingIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = CoatingIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom;
@ -473,11 +482,11 @@ public class CoatingIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -489,26 +498,26 @@ public class CoatingIssueRequestEventHandler
//创建任务
private async Task<List<CoatingIssueJobDTO>> CreateAllCoatingIssueJobAsync(
CoatingIssueRequest coatingIssueRequest)
CoatingIssueRequest CoatingIssueRequest)
{
var coatingIssueJobEditInputs = new List<CoatingIssueJobEditInput>();
var CoatingIssueJobEditInputs = new List<CoatingIssueJobEditInput>();
//已用的库存的集合
var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in coatingIssueRequest.Details.GroupBy(p =>
foreach (var groupbyItemCodeAndProdLine in CoatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode }))
{
foreach (var coatingIssueRequestDetail in groupbyItemCodeAndProdLine)
foreach (var CoatingIssueRequestDetail in groupbyItemCodeAndProdLine)
{
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
coatingIssueRequestDetail.ProdLine,
CoatingIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null)
{
throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{coatingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
$"未在生产线物品关系表中维护【{CoatingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
}
//原料
@ -521,7 +530,7 @@ public class CoatingIssueRequestEventHandler
//获取可用库存
var input = new RecommendBalanceRequestInput
{
ItemCode = coatingIssueRequestDetail.ItemCode,
ItemCode = CoatingIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
@ -532,14 +541,14 @@ public class CoatingIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上
coatingIssueRequestDetail.BoxQty = coatingIssueRequestDetail.Qty;
CoatingIssueRequestDetail.BoxQty = CoatingIssueRequestDetail.Qty;
if (usableList.Any())
{
//因为是原料所以按箱叫料
coatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithBoxQtyTypeAsync(coatingIssueRequest,
new EditableList<CoatingIssueRequestDetail> { coatingIssueRequestDetail },
CoatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithBoxQtyTypeAsync(CoatingIssueRequest,
new EditableList<CoatingIssueRequestDetail> { CoatingIssueRequestDetail },
sortByFifoAsync,
useBalanceList).ConfigureAwait(false));
}
@ -557,7 +566,7 @@ public class CoatingIssueRequestEventHandler
var input = new RecommendBalanceRequestInput
{
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = coatingIssueRequestDetail.Qty,
Qty = CoatingIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -583,23 +592,23 @@ public class CoatingIssueRequestEventHandler
}
}
coatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithQtyTypeAsync(coatingIssueRequest,
new List<CoatingIssueRequestDetail> { coatingIssueRequestDetail }, temp,
CoatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithQtyTypeAsync(CoatingIssueRequest,
new List<CoatingIssueRequestDetail> { CoatingIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false));
}
}
}
}
if (coatingIssueJobEditInputs.Count > 0) //有库存 可以创建任务
if (CoatingIssueJobEditInputs.Count > 0) //有库存 可以创建任务
{
//新增任务
var addCoatingIssueJobDtos = await _coatingIssueJobAppService
.CreateManyAsync(coatingIssueJobEditInputs)
var addCoatingIssueJobDtos = await _CoatingIssueJobAppService
.CreateManyAsync(CoatingIssueJobEditInputs)
.ConfigureAwait(false);
await UpdateCoatingIssueRequestDetailQtyAsync(coatingIssueRequest, addCoatingIssueJobDtos)
await UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest, addCoatingIssueJobDtos)
.ConfigureAwait(false);
return addCoatingIssueJobDtos;
@ -611,15 +620,15 @@ public class CoatingIssueRequestEventHandler
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="CoatingIssueRequest"></param>
/// <param name="addCoatingIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest coatingIssueRequest,
private async Task UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest CoatingIssueRequest,
List<CoatingIssueJobDTO> addCoatingIssueJobDtos)
{
//原有任务
var existCoatingIssueJobDtos = await _coatingIssueJobAppService
.GetByRequestNumberAsync(coatingIssueRequest.Number)
var existCoatingIssueJobDtos = await _CoatingIssueJobAppService
.GetByRequestNumberAsync(CoatingIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
@ -627,7 +636,7 @@ public class CoatingIssueRequestEventHandler
allCoatingIssueJobDtos.AddRange(addCoatingIssueJobDtos);
allCoatingIssueJobDtos.AddRange(existCoatingIssueJobDtos);
var groupByItemCodeLocationCode = coatingIssueRequest.Details.GroupBy(p =>
var groupByItemCodeLocationCode = CoatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
@ -653,6 +662,8 @@ public class CoatingIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty;
}
}
await CoatingIssueRequestManager.UpdateByEntityAsync(CoatingIssueRequest).ConfigureAwait(false);
}
/// <summary>

223
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/InjectionIssueRequestEventHandler.cs

@ -14,6 +14,7 @@ using Win_in.Sfs.Shared.Event;
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.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class InjectionIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<InjectionIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<InjectionIssueRequest>>>
{
private readonly IInjectionIssueJobAppService _injectionIssueJobAppService;
private readonly IInjectionIssueJobAppService _InjectionIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
protected IInjectionIssueRequestManager InjectionIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<IInjectionIssueRequestManager>();
private IMapper _mapper;
public InjectionIssueRequestEventHandler(
IInjectionIssueJobAppService injectionIssueJobAppService, IProductionLineAppService productionLineAppService,
IInjectionIssueJobAppService InjectionIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
)
{
_injectionIssueJobAppService = injectionIssueJobAppService;
_InjectionIssueJobAppService = InjectionIssueJobAppService;
_productionLineAppService = productionLineAppService;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
@ -107,14 +109,14 @@ public class InjectionIssueRequestEventHandler
/// <summary>
/// 创建注塑任务-按数量
/// </summary>
/// <param name="injectionIssueRequest"></param>
/// <param name="injectionIssueRequestDetails"></param>
/// <param name="InjectionIssueRequest"></param>
/// <param name="InjectionIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<InjectionIssueJobEditInput>> CreateInjectionIssueJobWithQtyTypeAsync
(InjectionIssueRequest injectionIssueRequest, List<InjectionIssueRequestDetail> injectionIssueRequestDetails,
(InjectionIssueRequest InjectionIssueRequest, List<InjectionIssueRequestDetail> InjectionIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
@ -122,9 +124,9 @@ public class InjectionIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos =
ObjectMapper.Map<List<InjectionIssueRequestDetail>, List<InjectionIssueRequestDetailDTO>>(
injectionIssueRequestDetails);
InjectionIssueRequestDetails);
var injectionIssueJobDetailInputs = new List<InjectionIssueJobDetailInput>();
var InjectionIssueJobDetailInputs = new List<InjectionIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{
@ -138,7 +140,9 @@ public class InjectionIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos)
{
//未发送的数量
tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty;
tempDetailDto.Qty = tempDetailDto.Qty > tempDetailDto.IssuedQty ?
tempDetailDto.Qty - tempDetailDto.IssuedQty :
0;
if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{
@ -150,7 +154,7 @@ public class InjectionIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty;
}
injectionIssueJobDetailInputs.Add(
InjectionIssueJobDetailInputs.Add(
await BuildInjectionIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false));
useBalanceList.Add(balanceDto);
@ -170,13 +174,18 @@ public class InjectionIssueRequestEventHandler
}
}
if (injectionIssueJobDetailInputs.Any())
if (InjectionIssueJobDetailInputs.Any())
{
var injectionIssueJobEditInput = await BuildInjectionIssueJobCreateInputWithQtyTypeAsync(
injectionIssueRequest,
injectionIssueRequestDetails.First()).ConfigureAwait(false);
injectionIssueJobEditInput.Details = injectionIssueJobDetailInputs;
jobs.Add(injectionIssueJobEditInput);
var InjectionIssueJobEditInput = await BuildInjectionIssueJobCreateInputWithQtyTypeAsync(
InjectionIssueRequest,
InjectionIssueRequestDetails.First()).ConfigureAwait(false);
InjectionIssueJobEditInput.Details = InjectionIssueJobDetailInputs;
InjectionIssueJobEditInput.Details = InjectionIssueJobEditInput.Details.Where(p => p.RecommendFromQty > 0).ToList();
if (InjectionIssueJobEditInput.Details != null && InjectionIssueJobEditInput.Details.Any())
{
jobs.Add(InjectionIssueJobEditInput);
}
}
return jobs;
@ -185,19 +194,19 @@ public class InjectionIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按数量
/// </summary>
/// <param name="injectionIssueRequest"></param>
/// <param name="InjectionIssueRequest"></param>
/// <param name="requestDetailInput"></param>
/// <returns></returns>
private async Task<InjectionIssueJobEditInput> BuildInjectionIssueJobCreateInputWithQtyTypeAsync(
InjectionIssueRequest injectionIssueRequest, InjectionIssueRequestDetail requestDetailInput)
InjectionIssueRequest InjectionIssueRequest, InjectionIssueRequestDetail requestDetailInput)
{
var job = ObjectMapper.Map<InjectionIssueRequest, InjectionIssueJobEditInput>(injectionIssueRequest);
var job = ObjectMapper.Map<InjectionIssueRequest, InjectionIssueJobEditInput>(InjectionIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = injectionIssueRequest.Worker;
job.InjectionRequestNumber = injectionIssueRequest.Number;
job.Worker = InjectionIssueRequest.Worker;
job.InjectionRequestNumber = InjectionIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false);
@ -208,31 +217,31 @@ public class InjectionIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按数量
/// </summary>
/// <param name="injectionIssueRequestDetail"></param>
/// <param name="InjectionIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<InjectionIssueJobDetailInput> BuildInjectionIssueJobDetailWithQtyTypeAsync(
InjectionIssueRequestDetailDTO injectionIssueRequestDetail, BalanceDTO balance)
InjectionIssueRequestDetailDTO InjectionIssueRequestDetail, BalanceDTO balance)
{
var detail = new InjectionIssueJobDetailInput();
detail.RequestLocationCode = injectionIssueRequestDetail.ToLocationCode;
detail.PositionCode = injectionIssueRequestDetail.PositionCode;
detail.RecommendType = injectionIssueRequestDetail.RecommendType;
detail.RequestLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.PositionCode = InjectionIssueRequestDetail.PositionCode;
detail.RecommendType = InjectionIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName;
detail.ProdLine = injectionIssueRequestDetail.ProdLine;
detail.ProdLine = InjectionIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty;
detail.StdPackQty = injectionIssueRequestDetail.StdPackQty;
detail.StdPackQty = InjectionIssueRequestDetail.StdPackQty;
detail.Status = balance.Status;
detail.RequestLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = injectionIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = injectionIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = injectionIssueRequestDetail.ToLocationCode;
detail.RequestLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode;
@ -264,11 +273,11 @@ public class InjectionIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = injectionIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = injectionIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = injectionIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -299,11 +308,11 @@ public class InjectionIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = injectionIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = injectionIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = injectionIssueRequestDetail.ToLocationGroup;
detail.TransferLibToLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -316,28 +325,28 @@ public class InjectionIssueRequestEventHandler
/// <summary>
/// 创建注塑任务 按箱叫料-按箱
/// </summary>
/// <param name="injectionIssueRequest"></param>
/// <param name="injectionIssueRequestDetailList"></param>
/// <param name="InjectionIssueRequest"></param>
/// <param name="InjectionIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<InjectionIssueJobEditInput>> CreateInjectionIssueJobWithBoxQtyTypeAsync
(
InjectionIssueRequest injectionIssueRequest,
List<InjectionIssueRequestDetail> injectionIssueRequestDetailList,
InjectionIssueRequest InjectionIssueRequest,
List<InjectionIssueRequestDetail> InjectionIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
var inputJobs = new List<InjectionIssueJobEditInput>();
var jobs = await _injectionIssueJobAppService.GetByRequestNumberAsync(injectionIssueRequest.Number)
var jobs = await _InjectionIssueJobAppService.GetByRequestNumberAsync(InjectionIssueRequest.Number)
.ConfigureAwait(false);
foreach (var detail in injectionIssueRequestDetailList)
foreach (var detail in InjectionIssueRequestDetailList)
{
//当前物品的集合
var inputDetails = injectionIssueRequestDetailList;
var inputDetails = InjectionIssueRequestDetailList;
//获取请求下 这个物品和这个库位一个需要多少箱
var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线
@ -368,12 +377,12 @@ public class InjectionIssueRequestEventHandler
useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable);
var injectionIssueJobEditInput =
await BuildInjectionIssueJobCreateInputWithBoxQtyTypeAsync(injectionIssueRequest,
var InjectionIssueJobEditInput =
await BuildInjectionIssueJobCreateInputWithBoxQtyTypeAsync(InjectionIssueRequest,
detail, firstUsable)
.ConfigureAwait(false);
inputJobs.Add(injectionIssueJobEditInput);
inputJobs.Add(InjectionIssueJobEditInput);
}
else
{
@ -389,24 +398,24 @@ public class InjectionIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按箱
/// </summary>
/// <param name="injectionIssueRequest"></param>
/// <param name="injectionIssueRequestDetail"></param>
/// <param name="InjectionIssueRequest"></param>
/// <param name="InjectionIssueRequestDetail"></param>
/// <param name="balanceDtos"></param>
/// <returns></returns>
private async Task<InjectionIssueJobEditInput> BuildInjectionIssueJobCreateInputWithBoxQtyTypeAsync(
InjectionIssueRequest injectionIssueRequest,
InjectionIssueRequestDetail injectionIssueRequestDetail, BalanceDTO balanceDtos)
InjectionIssueRequest InjectionIssueRequest,
InjectionIssueRequestDetail InjectionIssueRequestDetail, BalanceDTO balanceDtos)
{
var job = ObjectMapper.Map<InjectionIssueRequest, InjectionIssueJobEditInput>(injectionIssueRequest);
var job = ObjectMapper.Map<InjectionIssueRequest, InjectionIssueJobEditInput>(InjectionIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = injectionIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = injectionIssueRequestDetail.ToWarehouseCode;
job.Worker = injectionIssueRequest.Worker;
job.InjectionRequestNumber = injectionIssueRequest.Number;
job.WorkGroupCode = InjectionIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
job.Worker = InjectionIssueRequest.Worker;
job.InjectionRequestNumber = InjectionIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildInjectionIssueJobDetailWithBoxQtyTypeAsync(injectionIssueRequestDetail, balanceDtos)
job.Details.Add(await BuildInjectionIssueJobDetailWithBoxQtyTypeAsync(InjectionIssueRequestDetail, balanceDtos)
.ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false);
@ -417,28 +426,28 @@ public class InjectionIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按箱
/// </summary>
/// <param name="injectionIssueRequestDetail"></param>
/// <param name="InjectionIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<InjectionIssueJobDetailInput> BuildInjectionIssueJobDetailWithBoxQtyTypeAsync(
InjectionIssueRequestDetail injectionIssueRequestDetail, BalanceDTO balance)
InjectionIssueRequestDetail InjectionIssueRequestDetail, BalanceDTO balance)
{
var detail = new InjectionIssueJobDetailInput();
detail.RequestLocationCode = injectionIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = injectionIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = injectionIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1;
detail.PositionCode = injectionIssueRequestDetail.PositionCode;
detail.RecommendType = injectionIssueRequestDetail.RecommendType;
detail.ProdLine = injectionIssueRequestDetail.ProdLine;
detail.PositionCode = InjectionIssueRequestDetail.PositionCode;
detail.RecommendType = InjectionIssueRequestDetail.RecommendType;
detail.ProdLine = InjectionIssueRequestDetail.ProdLine;
detail.ItemCode = injectionIssueRequestDetail.ItemCode;
detail.ItemName = injectionIssueRequestDetail.ItemName;
detail.ItemDesc1 = injectionIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = injectionIssueRequestDetail.ItemDesc2;
detail.ItemCode = InjectionIssueRequestDetail.ItemCode;
detail.ItemName = InjectionIssueRequestDetail.ItemName;
detail.ItemDesc1 = InjectionIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = InjectionIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom;
@ -473,11 +482,11 @@ public class InjectionIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = injectionIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = injectionIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = injectionIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -489,26 +498,26 @@ public class InjectionIssueRequestEventHandler
//创建任务
private async Task<List<InjectionIssueJobDTO>> CreateAllInjectionIssueJobAsync(
InjectionIssueRequest injectionIssueRequest)
InjectionIssueRequest InjectionIssueRequest)
{
var injectionIssueJobEditInputs = new List<InjectionIssueJobEditInput>();
var InjectionIssueJobEditInputs = new List<InjectionIssueJobEditInput>();
//已用的库存的集合
var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in injectionIssueRequest.Details.GroupBy(p =>
foreach (var groupbyItemCodeAndProdLine in InjectionIssueRequest.Details.GroupBy(p =>
new { p.ItemCode }))
{
foreach (var injectionIssueRequestDetail in groupbyItemCodeAndProdLine)
foreach (var InjectionIssueRequestDetail in groupbyItemCodeAndProdLine)
{
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
injectionIssueRequestDetail.ProdLine,
InjectionIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null)
{
throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{injectionIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
$"未在生产线物品关系表中维护【{InjectionIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
}
//原料
@ -521,7 +530,7 @@ public class InjectionIssueRequestEventHandler
//获取可用库存
var input = new RecommendBalanceRequestInput
{
ItemCode = injectionIssueRequestDetail.ItemCode,
ItemCode = InjectionIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
@ -532,14 +541,14 @@ public class InjectionIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上
injectionIssueRequestDetail.BoxQty = injectionIssueRequestDetail.Qty;
InjectionIssueRequestDetail.BoxQty = InjectionIssueRequestDetail.Qty;
if (usableList.Any())
{
//因为是原料所以按箱叫料
injectionIssueJobEditInputs.AddRange(
await CreateInjectionIssueJobWithBoxQtyTypeAsync(injectionIssueRequest,
new EditableList<InjectionIssueRequestDetail> { injectionIssueRequestDetail },
InjectionIssueJobEditInputs.AddRange(
await CreateInjectionIssueJobWithBoxQtyTypeAsync(InjectionIssueRequest,
new EditableList<InjectionIssueRequestDetail> { InjectionIssueRequestDetail },
sortByFifoAsync,
useBalanceList).ConfigureAwait(false));
}
@ -557,7 +566,7 @@ public class InjectionIssueRequestEventHandler
var input = new RecommendBalanceRequestInput
{
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = injectionIssueRequestDetail.Qty,
Qty = InjectionIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -583,23 +592,23 @@ public class InjectionIssueRequestEventHandler
}
}
injectionIssueJobEditInputs.AddRange(
await CreateInjectionIssueJobWithQtyTypeAsync(injectionIssueRequest,
new List<InjectionIssueRequestDetail> { injectionIssueRequestDetail }, temp,
InjectionIssueJobEditInputs.AddRange(
await CreateInjectionIssueJobWithQtyTypeAsync(InjectionIssueRequest,
new List<InjectionIssueRequestDetail> { InjectionIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false));
}
}
}
}
if (injectionIssueJobEditInputs.Count > 0) //有库存 可以创建任务
if (InjectionIssueJobEditInputs.Count > 0) //有库存 可以创建任务
{
//新增任务
var addInjectionIssueJobDtos = await _injectionIssueJobAppService
.CreateManyAsync(injectionIssueJobEditInputs)
var addInjectionIssueJobDtos = await _InjectionIssueJobAppService
.CreateManyAsync(InjectionIssueJobEditInputs)
.ConfigureAwait(false);
await UpdateInjectionIssueRequestDetailQtyAsync(injectionIssueRequest, addInjectionIssueJobDtos)
await UpdateInjectionIssueRequestDetailQtyAsync(InjectionIssueRequest, addInjectionIssueJobDtos)
.ConfigureAwait(false);
return addInjectionIssueJobDtos;
@ -611,15 +620,15 @@ public class InjectionIssueRequestEventHandler
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="injectionIssueRequest"></param>
/// <param name="InjectionIssueRequest"></param>
/// <param name="addInjectionIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateInjectionIssueRequestDetailQtyAsync(InjectionIssueRequest injectionIssueRequest,
private async Task UpdateInjectionIssueRequestDetailQtyAsync(InjectionIssueRequest InjectionIssueRequest,
List<InjectionIssueJobDTO> addInjectionIssueJobDtos)
{
//原有任务
var existInjectionIssueJobDtos = await _injectionIssueJobAppService
.GetByRequestNumberAsync(injectionIssueRequest.Number)
var existInjectionIssueJobDtos = await _InjectionIssueJobAppService
.GetByRequestNumberAsync(InjectionIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
@ -627,7 +636,7 @@ public class InjectionIssueRequestEventHandler
allInjectionIssueJobDtos.AddRange(addInjectionIssueJobDtos);
allInjectionIssueJobDtos.AddRange(existInjectionIssueJobDtos);
var groupByItemCodeLocationCode = injectionIssueRequest.Details.GroupBy(p =>
var groupByItemCodeLocationCode = InjectionIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
@ -653,6 +662,8 @@ public class InjectionIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty;
}
}
await InjectionIssueRequestManager.UpdateByEntityAsync(InjectionIssueRequest).ConfigureAwait(false);
}
/// <summary>

226
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/KittingIssueRequestEventHandler.cs

@ -14,6 +14,7 @@ using Win_in.Sfs.Shared.Event;
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.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class KittingIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<KittingIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<KittingIssueRequest>>>
{
private readonly IKittingIssueJobAppService _kittingIssueJobAppService;
private readonly IKittingIssueJobAppService _KittingIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
protected IKittingIssueRequestManager KittingIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<IKittingIssueRequestManager>();
private IMapper _mapper;
public KittingIssueRequestEventHandler(
IKittingIssueJobAppService kittingIssueJobAppService, IProductionLineAppService productionLineAppService,
IKittingIssueJobAppService KittingIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
)
{
_kittingIssueJobAppService = kittingIssueJobAppService;
_KittingIssueJobAppService = KittingIssueJobAppService;
_productionLineAppService = productionLineAppService;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
@ -95,7 +97,7 @@ public class KittingIssueRequestEventHandler
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<KittingIssueRequest> eventData)
{
_ = eventData.Entity;
// await _kittingIssueJobAppService.CompleteByKittingIssueRequestAsync(entity.Number);
// await _KittingIssueJobAppService.CompleteByKittingIssueRequestAsync(entity.Number);
await Task.CompletedTask.ConfigureAwait(false);
}
@ -107,14 +109,14 @@ public class KittingIssueRequestEventHandler
/// <summary>
/// 创建注塑任务-按数量
/// </summary>
/// <param name="kittingIssueRequest"></param>
/// <param name="kittingIssueRequestDetails"></param>
/// <param name="KittingIssueRequest"></param>
/// <param name="KittingIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithQtyTypeAsync
(KittingIssueRequest kittingIssueRequest, List<KittingIssueRequestDetail> kittingIssueRequestDetails,
(KittingIssueRequest KittingIssueRequest, List<KittingIssueRequestDetail> KittingIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
@ -122,9 +124,9 @@ public class KittingIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos =
ObjectMapper.Map<List<KittingIssueRequestDetail>, List<KittingIssueRequestDetailDTO>>(
kittingIssueRequestDetails);
KittingIssueRequestDetails);
var kittingIssueJobDetailInputs = new List<KittingIssueJobDetailInput>();
var KittingIssueJobDetailInputs = new List<KittingIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{
@ -138,7 +140,9 @@ public class KittingIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos)
{
//未发送的数量
tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty;
tempDetailDto.Qty = tempDetailDto.Qty > tempDetailDto.IssuedQty ?
tempDetailDto.Qty - tempDetailDto.IssuedQty :
0;
if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{
@ -150,7 +154,7 @@ public class KittingIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty;
}
kittingIssueJobDetailInputs.Add(
KittingIssueJobDetailInputs.Add(
await BuildKittingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false));
useBalanceList.Add(balanceDto);
@ -170,12 +174,18 @@ public class KittingIssueRequestEventHandler
}
}
if (kittingIssueJobDetailInputs.Any())
if (KittingIssueJobDetailInputs.Any())
{
var kittingIssueJobEditInput = await BuildKittingIssueJobCreateInputWithQtyTypeAsync(kittingIssueRequest,
kittingIssueRequestDetails.First()).ConfigureAwait(false);
kittingIssueJobEditInput.Details = kittingIssueJobDetailInputs;
jobs.Add(kittingIssueJobEditInput);
var KittingIssueJobEditInput = await BuildKittingIssueJobCreateInputWithQtyTypeAsync(
KittingIssueRequest,
KittingIssueRequestDetails.First()).ConfigureAwait(false);
KittingIssueJobEditInput.Details = KittingIssueJobDetailInputs;
KittingIssueJobEditInput.Details = KittingIssueJobEditInput.Details.Where(p => p.RecommendFromQty > 0).ToList();
if (KittingIssueJobEditInput.Details != null && KittingIssueJobEditInput.Details.Any())
{
jobs.Add(KittingIssueJobEditInput);
}
}
return jobs;
@ -184,19 +194,19 @@ public class KittingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按数量
/// </summary>
/// <param name="kittingIssueRequest"></param>
/// <param name="KittingIssueRequest"></param>
/// <param name="requestDetailInput"></param>
/// <returns></returns>
private async Task<KittingIssueJobEditInput> BuildKittingIssueJobCreateInputWithQtyTypeAsync(
KittingIssueRequest kittingIssueRequest, KittingIssueRequestDetail requestDetailInput)
KittingIssueRequest KittingIssueRequest, KittingIssueRequestDetail requestDetailInput)
{
var job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(kittingIssueRequest);
var job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(KittingIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = kittingIssueRequest.Worker;
job.KittingRequestNumber = kittingIssueRequest.Number;
job.Worker = KittingIssueRequest.Worker;
job.KittingRequestNumber = KittingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false);
@ -207,31 +217,31 @@ public class KittingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按数量
/// </summary>
/// <param name="kittingIssueRequestDetail"></param>
/// <param name="KittingIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithQtyTypeAsync(
KittingIssueRequestDetailDTO kittingIssueRequestDetail, BalanceDTO balance)
KittingIssueRequestDetailDTO KittingIssueRequestDetail, BalanceDTO balance)
{
var detail = new KittingIssueJobDetailInput();
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode;
detail.PositionCode = kittingIssueRequestDetail.PositionCode;
detail.RecommendType = kittingIssueRequestDetail.RecommendType;
detail.RequestLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.PositionCode = KittingIssueRequestDetail.PositionCode;
detail.RecommendType = KittingIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName;
detail.ProdLine = kittingIssueRequestDetail.ProdLine;
detail.ProdLine = KittingIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty;
detail.StdPackQty = kittingIssueRequestDetail.StdPackQty;
detail.StdPackQty = KittingIssueRequestDetail.StdPackQty;
detail.Status = balance.Status;
detail.RequestLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = kittingIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = kittingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode;
detail.RequestLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode;
@ -263,11 +273,11 @@ public class KittingIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = kittingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = kittingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = kittingIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -298,11 +308,11 @@ public class KittingIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = kittingIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = kittingIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = kittingIssueRequestDetail.ToLocationGroup;
detail.TransferLibToLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -315,28 +325,28 @@ public class KittingIssueRequestEventHandler
/// <summary>
/// 创建注塑任务 按箱叫料-按箱
/// </summary>
/// <param name="kittingIssueRequest"></param>
/// <param name="kittingIssueRequestDetailList"></param>
/// <param name="KittingIssueRequest"></param>
/// <param name="KittingIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithBoxQtyTypeAsync
(
KittingIssueRequest kittingIssueRequest,
List<KittingIssueRequestDetail> kittingIssueRequestDetailList,
KittingIssueRequest KittingIssueRequest,
List<KittingIssueRequestDetail> KittingIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
var inputJobs = new List<KittingIssueJobEditInput>();
var jobs = await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number)
var jobs = await _KittingIssueJobAppService.GetByRequestNumberAsync(KittingIssueRequest.Number)
.ConfigureAwait(false);
foreach (var detail in kittingIssueRequestDetailList)
foreach (var detail in KittingIssueRequestDetailList)
{
//当前物品的集合
var inputDetails = kittingIssueRequestDetailList;
var inputDetails = KittingIssueRequestDetailList;
//获取请求下 这个物品和这个库位一个需要多少箱
var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线
@ -354,7 +364,8 @@ public class KittingIssueRequestEventHandler
//可用库存
var usableList = recommendbalanceDtos;
usableList = usableList.Where(p => !useBalanceList.Select(p => p.PackingCode).Contains(p.PackingCode))
usableList = usableList.Where(p =>
!useBalanceList.Select(balanceDto => balanceDto.PackingCode).Contains(p.PackingCode))
.ToList();
if (usableList.Any())
{
@ -366,12 +377,12 @@ public class KittingIssueRequestEventHandler
useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable);
var kittingIssueJobEditInput =
await BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(kittingIssueRequest,
var KittingIssueJobEditInput =
await BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(KittingIssueRequest,
detail, firstUsable)
.ConfigureAwait(false);
inputJobs.Add(kittingIssueJobEditInput);
inputJobs.Add(KittingIssueJobEditInput);
}
else
{
@ -387,24 +398,24 @@ public class KittingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按箱
/// </summary>
/// <param name="kittingIssueRequest"></param>
/// <param name="kittingIssueRequestDetail"></param>
/// <param name="KittingIssueRequest"></param>
/// <param name="KittingIssueRequestDetail"></param>
/// <param name="balanceDtos"></param>
/// <returns></returns>
private async Task<KittingIssueJobEditInput> BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(
KittingIssueRequest kittingIssueRequest,
KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balanceDtos)
KittingIssueRequest KittingIssueRequest,
KittingIssueRequestDetail KittingIssueRequestDetail, BalanceDTO balanceDtos)
{
var job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(kittingIssueRequest);
var job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(KittingIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = kittingIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = kittingIssueRequestDetail.ToWarehouseCode;
job.Worker = kittingIssueRequest.Worker;
job.KittingRequestNumber = kittingIssueRequest.Number;
job.WorkGroupCode = KittingIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
job.Worker = KittingIssueRequest.Worker;
job.KittingRequestNumber = KittingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildKittingIssueJobDetailWithBoxQtyTypeAsync(kittingIssueRequestDetail, balanceDtos)
job.Details.Add(await BuildKittingIssueJobDetailWithBoxQtyTypeAsync(KittingIssueRequestDetail, balanceDtos)
.ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false);
@ -415,28 +426,28 @@ public class KittingIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按箱
/// </summary>
/// <param name="kittingIssueRequestDetail"></param>
/// <param name="KittingIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithBoxQtyTypeAsync(
KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balance)
KittingIssueRequestDetail KittingIssueRequestDetail, BalanceDTO balance)
{
var detail = new KittingIssueJobDetailInput();
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = kittingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = kittingIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1;
detail.PositionCode = kittingIssueRequestDetail.PositionCode;
detail.RecommendType = kittingIssueRequestDetail.RecommendType;
detail.ProdLine = kittingIssueRequestDetail.ProdLine;
detail.PositionCode = KittingIssueRequestDetail.PositionCode;
detail.RecommendType = KittingIssueRequestDetail.RecommendType;
detail.ProdLine = KittingIssueRequestDetail.ProdLine;
detail.ItemCode = kittingIssueRequestDetail.ItemCode;
detail.ItemName = kittingIssueRequestDetail.ItemName;
detail.ItemDesc1 = kittingIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = kittingIssueRequestDetail.ItemDesc2;
detail.ItemCode = KittingIssueRequestDetail.ItemCode;
detail.ItemName = KittingIssueRequestDetail.ItemName;
detail.ItemDesc1 = KittingIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = KittingIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom;
@ -471,11 +482,11 @@ public class KittingIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = kittingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = kittingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = kittingIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -487,26 +498,26 @@ public class KittingIssueRequestEventHandler
//创建任务
private async Task<List<KittingIssueJobDTO>> CreateAllKittingIssueJobAsync(
KittingIssueRequest kittingIssueRequest)
KittingIssueRequest KittingIssueRequest)
{
var kittingIssueJobEditInputs = new List<KittingIssueJobEditInput>();
var KittingIssueJobEditInputs = new List<KittingIssueJobEditInput>();
//已用的库存的集合
var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in kittingIssueRequest.Details.GroupBy(p =>
foreach (var groupbyItemCodeAndProdLine in KittingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode }))
{
foreach (var kittingIssueRequestDetail in groupbyItemCodeAndProdLine)
foreach (var KittingIssueRequestDetail in groupbyItemCodeAndProdLine)
{
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
kittingIssueRequestDetail.ProdLine,
KittingIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null)
{
throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{kittingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
$"未在生产线物品关系表中维护【{KittingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
}
//原料
@ -519,7 +530,7 @@ public class KittingIssueRequestEventHandler
//获取可用库存
var input = new RecommendBalanceRequestInput
{
ItemCode = kittingIssueRequestDetail.ItemCode,
ItemCode = KittingIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
@ -530,14 +541,14 @@ public class KittingIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上
kittingIssueRequestDetail.BoxQty = kittingIssueRequestDetail.Qty;
KittingIssueRequestDetail.BoxQty = KittingIssueRequestDetail.Qty;
if (usableList.Any())
{
//因为是原料所以按箱叫料
kittingIssueJobEditInputs.AddRange(
await CreateKittingIssueJobWithBoxQtyTypeAsync(kittingIssueRequest,
new EditableList<KittingIssueRequestDetail> { kittingIssueRequestDetail },
KittingIssueJobEditInputs.AddRange(
await CreateKittingIssueJobWithBoxQtyTypeAsync(KittingIssueRequest,
new EditableList<KittingIssueRequestDetail> { KittingIssueRequestDetail },
sortByFifoAsync,
useBalanceList).ConfigureAwait(false));
}
@ -555,7 +566,7 @@ public class KittingIssueRequestEventHandler
var input = new RecommendBalanceRequestInput
{
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = kittingIssueRequestDetail.Qty,
Qty = KittingIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -581,22 +592,23 @@ public class KittingIssueRequestEventHandler
}
}
kittingIssueJobEditInputs.AddRange(
await CreateKittingIssueJobWithQtyTypeAsync(kittingIssueRequest,
new List<KittingIssueRequestDetail> { kittingIssueRequestDetail }, temp,
KittingIssueJobEditInputs.AddRange(
await CreateKittingIssueJobWithQtyTypeAsync(KittingIssueRequest,
new List<KittingIssueRequestDetail> { KittingIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false));
}
}
}
}
if (kittingIssueJobEditInputs.Count > 0) //有库存 可以创建任务
if (KittingIssueJobEditInputs.Count > 0) //有库存 可以创建任务
{
//新增任务
var addKittingIssueJobDtos = await _kittingIssueJobAppService.CreateManyAsync(kittingIssueJobEditInputs)
var addKittingIssueJobDtos = await _KittingIssueJobAppService
.CreateManyAsync(KittingIssueJobEditInputs)
.ConfigureAwait(false);
await UpdateKittingIssueRequestDetailQtyAsync(kittingIssueRequest, addKittingIssueJobDtos)
await UpdateKittingIssueRequestDetailQtyAsync(KittingIssueRequest, addKittingIssueJobDtos)
.ConfigureAwait(false);
return addKittingIssueJobDtos;
@ -608,15 +620,15 @@ public class KittingIssueRequestEventHandler
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="kittingIssueRequest"></param>
/// <param name="KittingIssueRequest"></param>
/// <param name="addKittingIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateKittingIssueRequestDetailQtyAsync(KittingIssueRequest kittingIssueRequest,
private async Task UpdateKittingIssueRequestDetailQtyAsync(KittingIssueRequest KittingIssueRequest,
List<KittingIssueJobDTO> addKittingIssueJobDtos)
{
//原有任务
var existKittingIssueJobDtos = await _kittingIssueJobAppService
.GetByRequestNumberAsync(kittingIssueRequest.Number)
var existKittingIssueJobDtos = await _KittingIssueJobAppService
.GetByRequestNumberAsync(KittingIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
@ -624,7 +636,7 @@ public class KittingIssueRequestEventHandler
allKittingIssueJobDtos.AddRange(addKittingIssueJobDtos);
allKittingIssueJobDtos.AddRange(existKittingIssueJobDtos);
var groupByItemCodeLocationCode = kittingIssueRequest.Details.GroupBy(p =>
var groupByItemCodeLocationCode = KittingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
@ -650,6 +662,8 @@ public class KittingIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty;
}
}
await KittingIssueRequestManager.UpdateByEntityAsync(KittingIssueRequest).ConfigureAwait(false);
}
/// <summary>

226
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/IssueRequest/SparePartIssueRequestEventHandler.cs

@ -14,6 +14,7 @@ using Win_in.Sfs.Shared.Event;
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.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class SparePartIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<SparePartIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<SparePartIssueRequest>>>
{
private readonly ISparePartIssueJobAppService _sparePartIssueJobAppService;
private readonly ISparePartIssueJobAppService _SparePartIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService;
protected ISparePartIssueRequestManager SparePartIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<ISparePartIssueRequestManager>();
private IMapper _mapper;
public SparePartIssueRequestEventHandler(
ISparePartIssueJobAppService sparePartIssueJobAppService, IProductionLineAppService productionLineAppService,
ISparePartIssueJobAppService SparePartIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
)
{
_sparePartIssueJobAppService = sparePartIssueJobAppService;
_SparePartIssueJobAppService = SparePartIssueJobAppService;
_productionLineAppService = productionLineAppService;
_locationAppService = locationAppService;
_balanceAppService = balanceAppService;
@ -95,7 +97,7 @@ public class SparePartIssueRequestEventHandler
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<SparePartIssueRequest> eventData)
{
_ = eventData.Entity;
// await _sparePartIssueJobAppService.CompleteBySparePartIssueRequestAsync(entity.Number);
// await _SparePartIssueJobAppService.CompleteBySparePartIssueRequestAsync(entity.Number);
await Task.CompletedTask.ConfigureAwait(false);
}
@ -107,14 +109,14 @@ public class SparePartIssueRequestEventHandler
/// <summary>
/// 创建注塑任务-按数量
/// </summary>
/// <param name="sparePartIssueRequest"></param>
/// <param name="sparePartIssueRequestDetails"></param>
/// <param name="SparePartIssueRequest"></param>
/// <param name="SparePartIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithQtyTypeAsync
(SparePartIssueRequest sparePartIssueRequest, List<SparePartIssueRequestDetail> sparePartIssueRequestDetails,
(SparePartIssueRequest SparePartIssueRequest, List<SparePartIssueRequestDetail> SparePartIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
@ -122,9 +124,9 @@ public class SparePartIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos =
ObjectMapper.Map<List<SparePartIssueRequestDetail>, List<SparePartIssueRequestDetailDTO>>(
sparePartIssueRequestDetails);
SparePartIssueRequestDetails);
var sparePartIssueJobDetailInputs = new List<SparePartIssueJobDetailInput>();
var SparePartIssueJobDetailInputs = new List<SparePartIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{
@ -138,7 +140,9 @@ public class SparePartIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos)
{
//未发送的数量
tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty;
tempDetailDto.Qty = tempDetailDto.Qty > tempDetailDto.IssuedQty ?
tempDetailDto.Qty - tempDetailDto.IssuedQty :
0;
if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{
@ -150,7 +154,7 @@ public class SparePartIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty;
}
sparePartIssueJobDetailInputs.Add(
SparePartIssueJobDetailInputs.Add(
await BuildSparePartIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false));
useBalanceList.Add(balanceDto);
@ -170,12 +174,18 @@ public class SparePartIssueRequestEventHandler
}
}
if (sparePartIssueJobDetailInputs.Any())
if (SparePartIssueJobDetailInputs.Any())
{
var sparePartIssueJobEditInput = await BuildSparePartIssueJobCreateInputWithQtyTypeAsync(sparePartIssueRequest,
sparePartIssueRequestDetails.First()).ConfigureAwait(false);
sparePartIssueJobEditInput.Details = sparePartIssueJobDetailInputs;
jobs.Add(sparePartIssueJobEditInput);
var SparePartIssueJobEditInput = await BuildSparePartIssueJobCreateInputWithQtyTypeAsync(
SparePartIssueRequest,
SparePartIssueRequestDetails.First()).ConfigureAwait(false);
SparePartIssueJobEditInput.Details = SparePartIssueJobDetailInputs;
SparePartIssueJobEditInput.Details = SparePartIssueJobEditInput.Details.Where(p => p.RecommendFromQty > 0).ToList();
if (SparePartIssueJobEditInput.Details != null && SparePartIssueJobEditInput.Details.Any())
{
jobs.Add(SparePartIssueJobEditInput);
}
}
return jobs;
@ -184,19 +194,19 @@ public class SparePartIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按数量
/// </summary>
/// <param name="sparePartIssueRequest"></param>
/// <param name="SparePartIssueRequest"></param>
/// <param name="requestDetailInput"></param>
/// <returns></returns>
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithQtyTypeAsync(
SparePartIssueRequest sparePartIssueRequest, SparePartIssueRequestDetail requestDetailInput)
SparePartIssueRequest SparePartIssueRequest, SparePartIssueRequestDetail requestDetailInput)
{
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(sparePartIssueRequest);
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(SparePartIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = sparePartIssueRequest.Worker;
job.SparePartRequestNumber = sparePartIssueRequest.Number;
job.Worker = SparePartIssueRequest.Worker;
job.SparePartRequestNumber = SparePartIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false);
@ -207,31 +217,31 @@ public class SparePartIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按数量
/// </summary>
/// <param name="sparePartIssueRequestDetail"></param>
/// <param name="SparePartIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithQtyTypeAsync(
SparePartIssueRequestDetailDTO sparePartIssueRequestDetail, BalanceDTO balance)
SparePartIssueRequestDetailDTO SparePartIssueRequestDetail, BalanceDTO balance)
{
var detail = new SparePartIssueJobDetailInput();
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode;
detail.PositionCode = sparePartIssueRequestDetail.PositionCode;
detail.RecommendType = sparePartIssueRequestDetail.RecommendType;
detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.PositionCode = SparePartIssueRequestDetail.PositionCode;
detail.RecommendType = SparePartIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName;
detail.ProdLine = sparePartIssueRequestDetail.ProdLine;
detail.ProdLine = SparePartIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty;
detail.StdPackQty = sparePartIssueRequestDetail.StdPackQty;
detail.StdPackQty = SparePartIssueRequestDetail.StdPackQty;
detail.Status = balance.Status;
detail.RequestLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = sparePartIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = sparePartIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode;
detail.RequestLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode;
@ -263,11 +273,11 @@ public class SparePartIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = sparePartIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = sparePartIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -298,11 +308,11 @@ public class SparePartIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = sparePartIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = sparePartIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup;
detail.TransferLibToLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -315,28 +325,28 @@ public class SparePartIssueRequestEventHandler
/// <summary>
/// 创建注塑任务 按箱叫料-按箱
/// </summary>
/// <param name="sparePartIssueRequest"></param>
/// <param name="sparePartIssueRequestDetailList"></param>
/// <param name="SparePartIssueRequest"></param>
/// <param name="SparePartIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithBoxQtyTypeAsync
(
SparePartIssueRequest sparePartIssueRequest,
List<SparePartIssueRequestDetail> sparePartIssueRequestDetailList,
SparePartIssueRequest SparePartIssueRequest,
List<SparePartIssueRequestDetail> SparePartIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{
var inputJobs = new List<SparePartIssueJobEditInput>();
var jobs = await _sparePartIssueJobAppService.GetByRequestNumberAsync(sparePartIssueRequest.Number)
var jobs = await _SparePartIssueJobAppService.GetByRequestNumberAsync(SparePartIssueRequest.Number)
.ConfigureAwait(false);
foreach (var detail in sparePartIssueRequestDetailList)
foreach (var detail in SparePartIssueRequestDetailList)
{
//当前物品的集合
var inputDetails = sparePartIssueRequestDetailList;
var inputDetails = SparePartIssueRequestDetailList;
//获取请求下 这个物品和这个库位一个需要多少箱
var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线
@ -354,7 +364,8 @@ public class SparePartIssueRequestEventHandler
//可用库存
var usableList = recommendbalanceDtos;
usableList = usableList.Where(p => !useBalanceList.Select(p => p.PackingCode).Contains(p.PackingCode))
usableList = usableList.Where(p =>
!useBalanceList.Select(balanceDto => balanceDto.PackingCode).Contains(p.PackingCode))
.ToList();
if (usableList.Any())
{
@ -366,12 +377,12 @@ public class SparePartIssueRequestEventHandler
useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable);
var sparePartIssueJobEditInput =
await BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(sparePartIssueRequest,
var SparePartIssueJobEditInput =
await BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(SparePartIssueRequest,
detail, firstUsable)
.ConfigureAwait(false);
inputJobs.Add(sparePartIssueJobEditInput);
inputJobs.Add(SparePartIssueJobEditInput);
}
else
{
@ -387,24 +398,24 @@ public class SparePartIssueRequestEventHandler
/// <summary>
/// 构造注塑任务-按箱
/// </summary>
/// <param name="sparePartIssueRequest"></param>
/// <param name="sparePartIssueRequestDetail"></param>
/// <param name="SparePartIssueRequest"></param>
/// <param name="SparePartIssueRequestDetail"></param>
/// <param name="balanceDtos"></param>
/// <returns></returns>
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(
SparePartIssueRequest sparePartIssueRequest,
SparePartIssueRequestDetail sparePartIssueRequestDetail, BalanceDTO balanceDtos)
SparePartIssueRequest SparePartIssueRequest,
SparePartIssueRequestDetail SparePartIssueRequestDetail, BalanceDTO balanceDtos)
{
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(sparePartIssueRequest);
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(SparePartIssueRequest);
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = sparePartIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode;
job.Worker = sparePartIssueRequest.Worker;
job.SparePartRequestNumber = sparePartIssueRequest.Number;
job.WorkGroupCode = SparePartIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
job.Worker = SparePartIssueRequest.Worker;
job.SparePartRequestNumber = SparePartIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(sparePartIssueRequestDetail, balanceDtos)
job.Details.Add(await BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(SparePartIssueRequestDetail, balanceDtos)
.ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false);
@ -415,28 +426,28 @@ public class SparePartIssueRequestEventHandler
/// <summary>
/// 构造注塑任务明细-按箱
/// </summary>
/// <param name="sparePartIssueRequestDetail"></param>
/// <param name="SparePartIssueRequestDetail"></param>
/// <param name="balance"></param>
/// <returns></returns>
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(
SparePartIssueRequestDetail sparePartIssueRequestDetail, BalanceDTO balance)
SparePartIssueRequestDetail SparePartIssueRequestDetail, BalanceDTO balance)
{
var detail = new SparePartIssueJobDetailInput();
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = sparePartIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = sparePartIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1;
detail.PositionCode = sparePartIssueRequestDetail.PositionCode;
detail.RecommendType = sparePartIssueRequestDetail.RecommendType;
detail.ProdLine = sparePartIssueRequestDetail.ProdLine;
detail.PositionCode = SparePartIssueRequestDetail.PositionCode;
detail.RecommendType = SparePartIssueRequestDetail.RecommendType;
detail.ProdLine = SparePartIssueRequestDetail.ProdLine;
detail.ItemCode = sparePartIssueRequestDetail.ItemCode;
detail.ItemName = sparePartIssueRequestDetail.ItemName;
detail.ItemDesc1 = sparePartIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = sparePartIssueRequestDetail.ItemDesc2;
detail.ItemCode = SparePartIssueRequestDetail.ItemCode;
detail.ItemName = SparePartIssueRequestDetail.ItemName;
detail.ItemDesc1 = SparePartIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = SparePartIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom;
@ -471,11 +482,11 @@ public class SparePartIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = sparePartIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = sparePartIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup;
detail.RecommendToLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false);
return detail;
@ -487,26 +498,26 @@ public class SparePartIssueRequestEventHandler
//创建任务
private async Task<List<SparePartIssueJobDTO>> CreateAllSparePartIssueJobAsync(
SparePartIssueRequest sparePartIssueRequest)
SparePartIssueRequest SparePartIssueRequest)
{
var sparePartIssueJobEditInputs = new List<SparePartIssueJobEditInput>();
var SparePartIssueJobEditInputs = new List<SparePartIssueJobEditInput>();
//已用的库存的集合
var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in sparePartIssueRequest.Details.GroupBy(p =>
foreach (var groupbyItemCodeAndProdLine in SparePartIssueRequest.Details.GroupBy(p =>
new { p.ItemCode }))
{
foreach (var sparePartIssueRequestDetail in groupbyItemCodeAndProdLine)
foreach (var SparePartIssueRequestDetail in groupbyItemCodeAndProdLine)
{
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
sparePartIssueRequestDetail.ProdLine,
SparePartIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null)
{
throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{sparePartIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
$"未在生产线物品关系表中维护【{SparePartIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
}
//原料
@ -519,7 +530,7 @@ public class SparePartIssueRequestEventHandler
//获取可用库存
var input = new RecommendBalanceRequestInput
{
ItemCode = sparePartIssueRequestDetail.ItemCode,
ItemCode = SparePartIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
@ -530,14 +541,14 @@ public class SparePartIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上
sparePartIssueRequestDetail.BoxQty = sparePartIssueRequestDetail.Qty;
SparePartIssueRequestDetail.BoxQty = SparePartIssueRequestDetail.Qty;
if (usableList.Any())
{
//因为是原料所以按箱叫料
sparePartIssueJobEditInputs.AddRange(
await CreateSparePartIssueJobWithBoxQtyTypeAsync(sparePartIssueRequest,
new EditableList<SparePartIssueRequestDetail> { sparePartIssueRequestDetail },
SparePartIssueJobEditInputs.AddRange(
await CreateSparePartIssueJobWithBoxQtyTypeAsync(SparePartIssueRequest,
new EditableList<SparePartIssueRequestDetail> { SparePartIssueRequestDetail },
sortByFifoAsync,
useBalanceList).ConfigureAwait(false));
}
@ -555,7 +566,7 @@ public class SparePartIssueRequestEventHandler
var input = new RecommendBalanceRequestInput
{
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = sparePartIssueRequestDetail.Qty,
Qty = SparePartIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -581,22 +592,23 @@ public class SparePartIssueRequestEventHandler
}
}
sparePartIssueJobEditInputs.AddRange(
await CreateSparePartIssueJobWithQtyTypeAsync(sparePartIssueRequest,
new List<SparePartIssueRequestDetail> { sparePartIssueRequestDetail }, temp,
SparePartIssueJobEditInputs.AddRange(
await CreateSparePartIssueJobWithQtyTypeAsync(SparePartIssueRequest,
new List<SparePartIssueRequestDetail> { SparePartIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false));
}
}
}
}
if (sparePartIssueJobEditInputs.Count > 0) //有库存 可以创建任务
if (SparePartIssueJobEditInputs.Count > 0) //有库存 可以创建任务
{
//新增任务
var addSparePartIssueJobDtos = await _sparePartIssueJobAppService.CreateManyAsync(sparePartIssueJobEditInputs)
var addSparePartIssueJobDtos = await _SparePartIssueJobAppService
.CreateManyAsync(SparePartIssueJobEditInputs)
.ConfigureAwait(false);
await UpdateSparePartIssueRequestDetailQtyAsync(sparePartIssueRequest, addSparePartIssueJobDtos)
await UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest, addSparePartIssueJobDtos)
.ConfigureAwait(false);
return addSparePartIssueJobDtos;
@ -608,15 +620,15 @@ public class SparePartIssueRequestEventHandler
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="sparePartIssueRequest"></param>
/// <param name="SparePartIssueRequest"></param>
/// <param name="addSparePartIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest sparePartIssueRequest,
private async Task UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest SparePartIssueRequest,
List<SparePartIssueJobDTO> addSparePartIssueJobDtos)
{
//原有任务
var existSparePartIssueJobDtos = await _sparePartIssueJobAppService
.GetByRequestNumberAsync(sparePartIssueRequest.Number)
var existSparePartIssueJobDtos = await _SparePartIssueJobAppService
.GetByRequestNumberAsync(SparePartIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
@ -624,7 +636,7 @@ public class SparePartIssueRequestEventHandler
allSparePartIssueJobDtos.AddRange(addSparePartIssueJobDtos);
allSparePartIssueJobDtos.AddRange(existSparePartIssueJobDtos);
var groupByItemCodeLocationCode = sparePartIssueRequest.Details.GroupBy(p =>
var groupByItemCodeLocationCode = SparePartIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
@ -650,6 +662,8 @@ public class SparePartIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty;
}
}
await SparePartIssueRequestManager.UpdateByEntityAsync(SparePartIssueRequest).ConfigureAwait(false);
}
/// <summary>

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/ProductReceiptRequestEventHandler.cs

@ -181,6 +181,8 @@ public class ProductReceiptRequestEventHandler
{
var note = ObjectMapper.Map<ProductReceiptRequest, ProductReceiptNoteEditInput>(request);
note.ReceiptType = EnumReceiptType.ProductReceiptRequest;
if (!Enum.TryParse(note.Type, true, out EnumTransSubType transSubType))
{
throw new UserFriendlyException($"{note.Type} 不是有效的子事务类型");

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/StoreEventAutoMapperProfile.cs

@ -119,6 +119,7 @@ public partial class StoreEventAutoMapperProfile : Profile
CoatingIssueJobAutoMapperProfile();
CoatingIssueNoteAutoMapperProfile();
CoatingIssueRequestAutoMapperProfile();
SparePartIssueNoteAutoMapperProfile();
MesNoteAutoMapperProfile();
}

4
build/src/docker/publish/conf/settings/appsettings.Development.json

@ -117,8 +117,8 @@
//"BaseUrl": "http://localhost:59093/"
},
"BaseData": {
"BaseUrl": "http://dev.ccwin-in.com:60084/"
//"BaseUrl": "http://localhost:59094/"
//"BaseUrl": "http://dev.ccwin-in.com:60084/"
"BaseUrl": "http://localhost:59094/"
},
"Default": {
"BaseUrl": "http://dev.ccwin-in.com:60083/"

Loading…
Cancel
Save