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)); _logger.LogInformation(MakeGrid($"标识{guid}读取{invterval}次接口表",camralist1));
sw.Stop(); sw.Stop();
//按区域、货位号、物品、标志 //按区域、货位号、物品、标志
@ -454,6 +443,7 @@ public class InjectionMoldingRequestReader : IReader
sb.Append("|"); sb.Append("|");
sb.AppendLine(); sb.AppendLine();
} }
return sb.ToString(); 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级物品完工 /// L7级物品完工
/// </summary> /// </summary>
MesScanReceiptToL7Parts = 4, 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>, AssembleIssueJobCheckInput, AssembleIssueJobEditInput>,
IAssembleIssueJobAppService, ITransferLibCallback IAssembleIssueJobAppService, ITransferLibCallback
{ {
protected IAssembleIssueRequestAppService AssembleIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestAppService>();
private readonly IAssembleIssueJobManager _assembleIssueJobManager; private readonly IAssembleIssueJobManager _assembleIssueJobManager;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IAssembleIssueNoteAppService _assembleIssueNoteAppService; private readonly IAssembleIssueNoteAppService _assembleIssueNoteAppService;
@ -41,9 +44,6 @@ public class AssembleIssueJobAppService
private readonly ITransferLibRequestAppService _transferLibRequestAppService; private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options; private readonly IOptions<RestoOptions> _options;
protected IAssembleIssueRequestAppService AssembleIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestAppService>();
public AssembleIssueJobAppService( public AssembleIssueJobAppService(
IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager, IAssembleIssueJobRepository repository, IAssembleIssueJobManager assembleIssueJobManager,
ILocationAppService locationAppService, ILocationAppService locationAppService,
@ -133,7 +133,7 @@ public class AssembleIssueJobAppService
[HttpPost("by-request-number/{requestNumber}")] [HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<AssembleIssueJobDTO>> GetByRequestNumberAsync(string 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); .ConfigureAwait(false);
return ObjectMapper.Map<List<AssembleIssueJob>, List<AssembleIssueJobDTO>>(entitys); return ObjectMapper.Map<List<AssembleIssueJob>, List<AssembleIssueJobDTO>>(entitys);
} }
@ -347,7 +347,7 @@ public class AssembleIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); 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); ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
} }
catch (Exception ex) 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 Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MyNamespace; using MyNamespace;
using Volo.Abp; using Volo.Abp;
@ -40,11 +41,14 @@ public class CoatingIssueJobAppService
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
private readonly ITransferLibRequestAppService _transferLibRequestAppService; private readonly ITransferLibRequestAppService _transferLibRequestAppService;
private readonly IOptions<RestoOptions> _options; private readonly IOptions<RestoOptions> _options;
private readonly ILogger<CoatingIssueJobAppService> _logger;
protected ICoatingIssueRequestAppService CoatingIssueRequestAppService => protected ICoatingIssueRequestAppService CoatingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestAppService>(); LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestAppService>();
public CoatingIssueJobAppService( public CoatingIssueJobAppService(
ILogger<CoatingIssueJobAppService> logger,
ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager, ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager,
ILocationAppService locationAppService, ILocationAppService locationAppService,
ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService
@ -59,6 +63,7 @@ public class CoatingIssueJobAppService
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;
_options = options; _options = options;
_transferLibRequestAppService = transferLibRequestAppService; _transferLibRequestAppService = transferLibRequestAppService;
_logger = logger;
} }
[HttpPost("get-by-number-2")] [HttpPost("get-by-number-2")]
@ -133,7 +138,7 @@ public class CoatingIssueJobAppService
[HttpPost("by-request-number/{requestNumber}")] [HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string 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); .ConfigureAwait(false);
return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entitys); return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entitys);
} }
@ -315,7 +320,7 @@ public class CoatingIssueJobAppService
var ret = new ReusltObject(); var ret = new ReusltObject();
ret.Code = "1"; ret.Code = "1";
ret.Message = "操作成功"; ret.Message = "操作成功";
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd"); ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
try try
{ {
var IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>(); var IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>();
@ -341,12 +346,24 @@ public class CoatingIssueJobAppService
#if DEBUG #if DEBUG
var json = JsonSerializer.Serialize(main); 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.Token = ""; //测试token
_options.Value.UserName = ""; //测试用户名 _options.Value.UserName = ""; //测试用户名
_options.Value.Password = ""; //测试密码 _options.Value.Password = ""; //测试密码
_options.Value.Path = "zozocnApi/custom/receiveProductionPlan"; //测试密码
#endif #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)) if (!string.IsNullOrEmpty(_options.Value.Token))
{ {
var token = _options.Value.Token; var token = _options.Value.Token;
@ -361,15 +378,22 @@ public class CoatingIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); 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); ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
_logger.LogInformation($"标志{flag}调用高通WMS:返回值{ret}");
} }
catch (Exception ex) catch (Exception ex)
{ {
ret = new ReusltObject(); ret = new ReusltObject();
ret.Code = "2"; ret.Code = "2";
ret.Message = ex.Message; 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; return ret;
@ -382,7 +406,7 @@ public class CoatingIssueJobAppService
var json = JsonSerializer.Serialize(input); var json = JsonSerializer.Serialize(input);
#endif #endif
var errors = new List<string>(); 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 try
{ {
if (input.Jobs.Count > 0) if (input.Jobs.Count > 0)
@ -546,12 +570,17 @@ public class CoatingIssueJobAppService
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode) var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false); .ConfigureAwait(false);
var flag = DateTime.Now.ToString("yyyyMMddHHmmss");
_logger.LogInformation($"立体库任务检查开始{flag}");
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse) if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{ {
_logger.LogInformation($"立体库任务开始标记{flag}");
//TODO 立体库 //TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<CoatingIssueJobDTO> { coatingIssueJobDto }, var ret = await SyncIssueJobStereoAsync(new List<CoatingIssueJobDTO> { coatingIssueJobDto },
loctionDto.Code).ConfigureAwait(false); loctionDto.Code).ConfigureAwait(false);
_logger.LogInformation($"立体库任务结束标记{flag},返回值{ret}");
if (ret.Code != "1") if (ret.Code != "1")
{ {
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}"); 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}")] [HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<InjectionIssueJobDTO>> GetByRequestNumberAsync(string 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); .ConfigureAwait(false);
return ObjectMapper.Map<List<InjectionIssueJob>, List<InjectionIssueJobDTO>>(entitys); return ObjectMapper.Map<List<InjectionIssueJob>, List<InjectionIssueJobDTO>>(entitys);
} }
@ -325,7 +325,7 @@ public class InjectionIssueJobAppService
#if DEBUG #if DEBUG
var json = JsonSerializer.Serialize(main); 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.Token = ""; //测试token
_options.Value.UserName = ""; //测试用户名 _options.Value.UserName = ""; //测试用户名
_options.Value.Password = ""; //测试密码 _options.Value.Password = ""; //测试密码
@ -345,7 +345,7 @@ public class InjectionIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); 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); ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
} }
catch (Exception ex) 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}")] [HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<KittingIssueJobDTO>> GetByRequestNumberAsync(string 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); .ConfigureAwait(false);
return ObjectMapper.Map<List<KittingIssueJob>, List<KittingIssueJobDTO>>(entitys); return ObjectMapper.Map<List<KittingIssueJob>, List<KittingIssueJobDTO>>(entitys);
} }
@ -345,7 +345,7 @@ public class KittingIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); 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); ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
} }
catch (Exception ex) 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}")] [HttpPost("by-request-number/{requestNumber}")]
public virtual async Task<List<SparePartIssueJobDTO>> GetByRequestNumberAsync(string 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); .ConfigureAwait(false);
return ObjectMapper.Map<List<SparePartIssueJob>, List<SparePartIssueJobDTO>>(entitys); return ObjectMapper.Map<List<SparePartIssueJob>, List<SparePartIssueJobDTO>>(entitys);
} }
@ -337,7 +337,7 @@ public class SparePartIssueJobAppService
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); 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); ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
} }
catch (Exception ex) 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); 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. #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. #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
{ {
BaseUrl = baseUrl; BaseUrl = baseUrl;
_httpClient = httpClient; _httpClient = httpClient;
_path = path;
} }
private static System.Text.Json.JsonSerializerOptions CreateSerializerSettings() private static System.Text.Json.JsonSerializerOptions CreateSerializerSettings()
@ -58,6 +59,21 @@ namespace MyNamespace
_baseUrl += '/'; _baseUrl += '/';
} }
} }
private string _path;
public string Path
{
get { return _path; }
set
{
_path = value;
}
}
protected System.Text.Json.JsonSerializerOptions JsonSerializerSettings { get { return _settings.Value; } } protected System.Text.Json.JsonSerializerOptions JsonSerializerSettings { get { return _settings.Value; } }
@ -95,7 +111,7 @@ namespace MyNamespace
var urlBuilder_ = new System.Text.StringBuilder(); var urlBuilder_ = new System.Text.StringBuilder();
if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl);
// Operation Path: "CargoState/SyncIssueJobStereo" // Operation Path: "CargoState/SyncIssueJobStereo"
urlBuilder_.Append("CargoState/SyncIssueJobStereo");//修改路由需求 urlBuilder_.Append(_path);//修改路由需求
PrepareRequest(client_, request_, urlBuilder_); 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> /// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(ContainerRequestEditInput entity) 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, "事务类型", "事务类型不存在"); 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) foreach (var detail in assembleIssueRequest.Details)
{ {
if (detail.Qty >= detail.IssuedQty) if (detail.Qty > detail.IssuedQty)
{ {
return; 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) foreach (var detail in coatingIssueRequest.Details)
{ {
if (detail.Qty >= detail.IssuedQty) if (detail.Qty > detail.IssuedQty)
{ {
return; 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) foreach (var detail in injectionIssueRequest.Details)
{ {
if (detail.Qty >= detail.IssuedQty) if (detail.Qty > detail.IssuedQty)
{ {
return; 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) foreach (var detail in kittingIssueRequest.Details)
{ {
if (detail.Qty >= detail.IssuedQty) if (detail.Qty > detail.IssuedQty)
{ {
return; 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) foreach (var detail in sparePartIssueRequest.Details)
{ {
if (detail.Qty >= detail.IssuedQty) if (detail.Qty > detail.IssuedQty)
{ {
return; 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 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(); 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> 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(); 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 CompleteAsync(string number);
Task<CoatingIssueRequest> CreateByNumberAsync(CoatingIssueRequest entity); 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 CompleteAsync(string number);
Task<InjectionIssueRequest> CreateByNumberAsync(InjectionIssueRequest entity); 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(); 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 CompleteAsync(string number);
Task<KittingIssueRequest> CreateByNumberAsync(KittingIssueRequest entity); 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(); 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 CompleteAsync(string number);
Task<SparePartIssueRequest> CreateByNumberAsync(SparePartIssueRequest entity); 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(); 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.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -30,6 +31,7 @@ public class AssembleIssueRequestEventHandler
private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
protected IAssembleIssueRequestManager AssembleIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<IAssembleIssueRequestManager>();
private IMapper _mapper; private IMapper _mapper;
public AssembleIssueRequestEventHandler( public AssembleIssueRequestEventHandler(
@ -138,7 +140,9 @@ public class AssembleIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos) 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) //需求量大于 这条推荐库存的余额 if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{ {
@ -176,8 +180,13 @@ public class AssembleIssueRequestEventHandler
assembleIssueRequest, assembleIssueRequest,
assembleIssueRequestDetails.First()).ConfigureAwait(false); assembleIssueRequestDetails.First()).ConfigureAwait(false);
assembleIssueJobEditInput.Details = assembleIssueJobDetailInputs; assembleIssueJobEditInput.Details = assembleIssueJobDetailInputs;
assembleIssueJobEditInput.Details=assembleIssueJobEditInput.Details.Where(p => p.RecommendFromQty>0).ToList();
if (assembleIssueJobEditInput.Details != null && assembleIssueJobEditInput.Details.Any())
{
jobs.Add(assembleIssueJobEditInput); jobs.Add(assembleIssueJobEditInput);
} }
}
return jobs; return jobs;
} }
@ -653,6 +662,8 @@ public class AssembleIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty; requestDetail.ReceivedQty = allReceivedQty;
} }
} }
await AssembleIssueRequestManager.UpdateByEntityAsync(assembleIssueRequest).ConfigureAwait(false);
} }
/// <summary> /// <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.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class CoatingIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<CoatingIssueRequest>> , ILocalEventHandler<SfsCreatedEntityEventData<CoatingIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<CoatingIssueRequest>>> , ILocalEventHandler<SfsCreatedEntityEventData<List<CoatingIssueRequest>>>
{ {
private readonly ICoatingIssueJobAppService _coatingIssueJobAppService; private readonly ICoatingIssueJobAppService _CoatingIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
protected ICoatingIssueRequestManager CoatingIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestManager>();
private IMapper _mapper; private IMapper _mapper;
public CoatingIssueRequestEventHandler( public CoatingIssueRequestEventHandler(
ICoatingIssueJobAppService coatingIssueJobAppService, IProductionLineAppService productionLineAppService, ICoatingIssueJobAppService CoatingIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
) )
{ {
_coatingIssueJobAppService = coatingIssueJobAppService; _CoatingIssueJobAppService = CoatingIssueJobAppService;
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
@ -107,14 +109,14 @@ public class CoatingIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务-按数量 /// 创建注塑任务-按数量
/// </summary> /// </summary>
/// <param name="coatingIssueRequest"></param> /// <param name="CoatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetails"></param> /// <param name="CoatingIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<CoatingIssueJobEditInput>> CreateCoatingIssueJobWithQtyTypeAsync private async Task<List<CoatingIssueJobEditInput>> CreateCoatingIssueJobWithQtyTypeAsync
(CoatingIssueRequest coatingIssueRequest, List<CoatingIssueRequestDetail> coatingIssueRequestDetails, (CoatingIssueRequest CoatingIssueRequest, List<CoatingIssueRequestDetail> CoatingIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos, List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
@ -122,9 +124,9 @@ public class CoatingIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉 //用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos = var tempDetailDtos =
ObjectMapper.Map<List<CoatingIssueRequestDetail>, List<CoatingIssueRequestDetailDTO>>( ObjectMapper.Map<List<CoatingIssueRequestDetail>, List<CoatingIssueRequestDetailDTO>>(
coatingIssueRequestDetails); CoatingIssueRequestDetails);
var coatingIssueJobDetailInputs = new List<CoatingIssueJobDetailInput>(); var CoatingIssueJobDetailInputs = new List<CoatingIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0) if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{ {
@ -138,7 +140,9 @@ public class CoatingIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos) 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) //需求量大于 这条推荐库存的余额 if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{ {
@ -150,7 +154,7 @@ public class CoatingIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty; balanceDto.Qty = tempDetailDto.Qty;
} }
coatingIssueJobDetailInputs.Add( CoatingIssueJobDetailInputs.Add(
await BuildCoatingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto) await BuildCoatingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false)); .ConfigureAwait(false));
useBalanceList.Add(balanceDto); useBalanceList.Add(balanceDto);
@ -170,13 +174,18 @@ public class CoatingIssueRequestEventHandler
} }
} }
if (coatingIssueJobDetailInputs.Any()) if (CoatingIssueJobDetailInputs.Any())
{ {
var coatingIssueJobEditInput = await BuildCoatingIssueJobCreateInputWithQtyTypeAsync( var CoatingIssueJobEditInput = await BuildCoatingIssueJobCreateInputWithQtyTypeAsync(
coatingIssueRequest, CoatingIssueRequest,
coatingIssueRequestDetails.First()).ConfigureAwait(false); CoatingIssueRequestDetails.First()).ConfigureAwait(false);
coatingIssueJobEditInput.Details = coatingIssueJobDetailInputs; CoatingIssueJobEditInput.Details = CoatingIssueJobDetailInputs;
jobs.Add(coatingIssueJobEditInput);
CoatingIssueJobEditInput.Details = CoatingIssueJobEditInput.Details.Where(p => p.RecommendFromQty > 0).ToList();
if (CoatingIssueJobEditInput.Details != null && CoatingIssueJobEditInput.Details.Any())
{
jobs.Add(CoatingIssueJobEditInput);
}
} }
return jobs; return jobs;
@ -185,19 +194,19 @@ public class CoatingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按数量 /// 构造注塑任务-按数量
/// </summary> /// </summary>
/// <param name="coatingIssueRequest"></param> /// <param name="CoatingIssueRequest"></param>
/// <param name="requestDetailInput"></param> /// <param name="requestDetailInput"></param>
/// <returns></returns> /// <returns></returns>
private async Task<CoatingIssueJobEditInput> BuildCoatingIssueJobCreateInputWithQtyTypeAsync( 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.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup; job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode; job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = coatingIssueRequest.Worker; job.Worker = CoatingIssueRequest.Worker;
job.CoatingRequestNumber = coatingIssueRequest.Number; job.CoatingRequestNumber = CoatingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType; job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -208,31 +217,31 @@ public class CoatingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按数量 /// 构造注塑任务明细-按数量
/// </summary> /// </summary>
/// <param name="coatingIssueRequestDetail"></param> /// <param name="CoatingIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithQtyTypeAsync( private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithQtyTypeAsync(
CoatingIssueRequestDetailDTO coatingIssueRequestDetail, BalanceDTO balance) CoatingIssueRequestDetailDTO CoatingIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new CoatingIssueJobDetailInput(); var detail = new CoatingIssueJobDetailInput();
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.PositionCode = coatingIssueRequestDetail.PositionCode; detail.PositionCode = CoatingIssueRequestDetail.PositionCode;
detail.RecommendType = coatingIssueRequestDetail.RecommendType; detail.RecommendType = CoatingIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode; detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2; detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1; detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName; detail.ItemName = balance.ItemName;
detail.ProdLine = coatingIssueRequestDetail.ProdLine; detail.ProdLine = CoatingIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty; detail.RequestQty = balance.Qty;
detail.StdPackQty = coatingIssueRequestDetail.StdPackQty; detail.StdPackQty = CoatingIssueRequestDetail.StdPackQty;
detail.Status = balance.Status; detail.Status = balance.Status;
detail.RequestLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = coatingIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = coatingIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode; detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode; detail.RecommendFromContainerCode = balance.ContainerCode;
@ -264,11 +273,11 @@ public class CoatingIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup; detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode; detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = coatingIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = coatingIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = coatingIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode; detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode; detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -299,11 +308,11 @@ public class CoatingIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup; detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode; detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = coatingIssueRequestDetail.ToLocationCode; detail.TransferLibToLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode; detail.TransferLibToLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = coatingIssueRequestDetail.ToLocationArea; detail.TransferLibToLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode; detail.TransferLibToWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = coatingIssueRequestDetail.ToLocationGroup; detail.TransferLibToLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -316,28 +325,28 @@ public class CoatingIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务 按箱叫料-按箱 /// 创建注塑任务 按箱叫料-按箱
/// </summary> /// </summary>
/// <param name="coatingIssueRequest"></param> /// <param name="CoatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetailList"></param> /// <param name="CoatingIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<CoatingIssueJobEditInput>> CreateCoatingIssueJobWithBoxQtyTypeAsync private async Task<List<CoatingIssueJobEditInput>> CreateCoatingIssueJobWithBoxQtyTypeAsync
( (
CoatingIssueRequest coatingIssueRequest, CoatingIssueRequest CoatingIssueRequest,
List<CoatingIssueRequestDetail> coatingIssueRequestDetailList, List<CoatingIssueRequestDetail> CoatingIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos, List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
var inputJobs = new List<CoatingIssueJobEditInput>(); var inputJobs = new List<CoatingIssueJobEditInput>();
var jobs = await _coatingIssueJobAppService.GetByRequestNumberAsync(coatingIssueRequest.Number) var jobs = await _CoatingIssueJobAppService.GetByRequestNumberAsync(CoatingIssueRequest.Number)
.ConfigureAwait(false); .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); var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线 //获取生产线
@ -368,12 +377,12 @@ public class CoatingIssueRequestEventHandler
useBalanceList.Add(firstUsable); useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable); usableList.Remove(firstUsable);
var coatingIssueJobEditInput = var CoatingIssueJobEditInput =
await BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(coatingIssueRequest, await BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(CoatingIssueRequest,
detail, firstUsable) detail, firstUsable)
.ConfigureAwait(false); .ConfigureAwait(false);
inputJobs.Add(coatingIssueJobEditInput); inputJobs.Add(CoatingIssueJobEditInput);
} }
else else
{ {
@ -389,24 +398,24 @@ public class CoatingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按箱 /// 构造注塑任务-按箱
/// </summary> /// </summary>
/// <param name="coatingIssueRequest"></param> /// <param name="CoatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetail"></param> /// <param name="CoatingIssueRequestDetail"></param>
/// <param name="balanceDtos"></param> /// <param name="balanceDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task<CoatingIssueJobEditInput> BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync( private async Task<CoatingIssueJobEditInput> BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(
CoatingIssueRequest coatingIssueRequest, CoatingIssueRequest CoatingIssueRequest,
CoatingIssueRequestDetail coatingIssueRequestDetail, BalanceDTO balanceDtos) CoatingIssueRequestDetail CoatingIssueRequestDetail, BalanceDTO balanceDtos)
{ {
var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(coatingIssueRequest); var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(CoatingIssueRequest);
job.JobType = EnumJobType.IssueJob; job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = coatingIssueRequestDetail.ToLocationGroup; job.WorkGroupCode = CoatingIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = coatingIssueRequestDetail.ToWarehouseCode; job.WarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
job.Worker = coatingIssueRequest.Worker; job.Worker = CoatingIssueRequest.Worker;
job.CoatingRequestNumber = coatingIssueRequest.Number; job.CoatingRequestNumber = CoatingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType; job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(coatingIssueRequestDetail, balanceDtos) job.Details.Add(await BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(CoatingIssueRequestDetail, balanceDtos)
.ConfigureAwait(false)); .ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -417,28 +426,28 @@ public class CoatingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按箱 /// 构造注塑任务明细-按箱
/// </summary> /// </summary>
/// <param name="coatingIssueRequestDetail"></param> /// <param name="CoatingIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithBoxQtyTypeAsync( private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(
CoatingIssueRequestDetail coatingIssueRequestDetail, BalanceDTO balance) CoatingIssueRequestDetail CoatingIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new CoatingIssueJobDetailInput(); var detail = new CoatingIssueJobDetailInput();
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = coatingIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = coatingIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1; detail.RequestQty = 1;
detail.PositionCode = coatingIssueRequestDetail.PositionCode; detail.PositionCode = CoatingIssueRequestDetail.PositionCode;
detail.RecommendType = coatingIssueRequestDetail.RecommendType; detail.RecommendType = CoatingIssueRequestDetail.RecommendType;
detail.ProdLine = coatingIssueRequestDetail.ProdLine; detail.ProdLine = CoatingIssueRequestDetail.ProdLine;
detail.ItemCode = coatingIssueRequestDetail.ItemCode; detail.ItemCode = CoatingIssueRequestDetail.ItemCode;
detail.ItemName = coatingIssueRequestDetail.ItemName; detail.ItemName = CoatingIssueRequestDetail.ItemName;
detail.ItemDesc1 = coatingIssueRequestDetail.ItemDesc1; detail.ItemDesc1 = CoatingIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = coatingIssueRequestDetail.ItemDesc2; detail.ItemDesc2 = CoatingIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK; detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
@ -473,11 +482,11 @@ public class CoatingIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate; detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate; detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = coatingIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = CoatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = CoatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = coatingIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = CoatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = CoatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = coatingIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = CoatingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -489,26 +498,26 @@ public class CoatingIssueRequestEventHandler
//创建任务 //创建任务
private async Task<List<CoatingIssueJobDTO>> CreateAllCoatingIssueJobAsync( 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>(); var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in coatingIssueRequest.Details.GroupBy(p => foreach (var groupbyItemCodeAndProdLine in CoatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode })) new { p.ItemCode }))
{ {
foreach (var coatingIssueRequestDetail in groupbyItemCodeAndProdLine) foreach (var CoatingIssueRequestDetail in groupbyItemCodeAndProdLine)
{ {
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync( var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
coatingIssueRequestDetail.ProdLine, CoatingIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false); groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null) if (productionLineItemDto == null)
{ {
throw new UserFriendlyException( throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{coatingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】"); $"未在生产线物品关系表中维护【{CoatingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
} }
//原料 //原料
@ -521,7 +530,7 @@ public class CoatingIssueRequestEventHandler
//获取可用库存 //获取可用库存
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = coatingIssueRequestDetail.ItemCode, ItemCode = CoatingIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue, Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
@ -532,14 +541,14 @@ public class CoatingIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false); var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上 //因为是按箱叫料 先把值赋值给箱数量上
coatingIssueRequestDetail.BoxQty = coatingIssueRequestDetail.Qty; CoatingIssueRequestDetail.BoxQty = CoatingIssueRequestDetail.Qty;
if (usableList.Any()) if (usableList.Any())
{ {
//因为是原料所以按箱叫料 //因为是原料所以按箱叫料
coatingIssueJobEditInputs.AddRange( CoatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithBoxQtyTypeAsync(coatingIssueRequest, await CreateCoatingIssueJobWithBoxQtyTypeAsync(CoatingIssueRequest,
new EditableList<CoatingIssueRequestDetail> { coatingIssueRequestDetail }, new EditableList<CoatingIssueRequestDetail> { CoatingIssueRequestDetail },
sortByFifoAsync, sortByFifoAsync,
useBalanceList).ConfigureAwait(false)); useBalanceList).ConfigureAwait(false));
} }
@ -557,7 +566,7 @@ public class CoatingIssueRequestEventHandler
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode, ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = coatingIssueRequestDetail.Qty, Qty = CoatingIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -583,23 +592,23 @@ public class CoatingIssueRequestEventHandler
} }
} }
coatingIssueJobEditInputs.AddRange( CoatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithQtyTypeAsync(coatingIssueRequest, await CreateCoatingIssueJobWithQtyTypeAsync(CoatingIssueRequest,
new List<CoatingIssueRequestDetail> { coatingIssueRequestDetail }, temp, new List<CoatingIssueRequestDetail> { CoatingIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false)); useBalanceList).ConfigureAwait(false));
} }
} }
} }
} }
if (coatingIssueJobEditInputs.Count > 0) //有库存 可以创建任务 if (CoatingIssueJobEditInputs.Count > 0) //有库存 可以创建任务
{ {
//新增任务 //新增任务
var addCoatingIssueJobDtos = await _coatingIssueJobAppService var addCoatingIssueJobDtos = await _CoatingIssueJobAppService
.CreateManyAsync(coatingIssueJobEditInputs) .CreateManyAsync(CoatingIssueJobEditInputs)
.ConfigureAwait(false); .ConfigureAwait(false);
await UpdateCoatingIssueRequestDetailQtyAsync(coatingIssueRequest, addCoatingIssueJobDtos) await UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest, addCoatingIssueJobDtos)
.ConfigureAwait(false); .ConfigureAwait(false);
return addCoatingIssueJobDtos; return addCoatingIssueJobDtos;
@ -611,15 +620,15 @@ public class CoatingIssueRequestEventHandler
/// <summary> /// <summary>
/// 修改请求的 已发 已收数量 /// 修改请求的 已发 已收数量
/// </summary> /// </summary>
/// <param name="coatingIssueRequest"></param> /// <param name="CoatingIssueRequest"></param>
/// <param name="addCoatingIssueJobDtos"></param> /// <param name="addCoatingIssueJobDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest coatingIssueRequest, private async Task UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest CoatingIssueRequest,
List<CoatingIssueJobDTO> addCoatingIssueJobDtos) List<CoatingIssueJobDTO> addCoatingIssueJobDtos)
{ {
//原有任务 //原有任务
var existCoatingIssueJobDtos = await _coatingIssueJobAppService var existCoatingIssueJobDtos = await _CoatingIssueJobAppService
.GetByRequestNumberAsync(coatingIssueRequest.Number) .GetByRequestNumberAsync(CoatingIssueRequest.Number)
.ConfigureAwait(false); .ConfigureAwait(false);
//新增的任务和已有的任务总和 //新增的任务和已有的任务总和
@ -627,7 +636,7 @@ public class CoatingIssueRequestEventHandler
allCoatingIssueJobDtos.AddRange(addCoatingIssueJobDtos); allCoatingIssueJobDtos.AddRange(addCoatingIssueJobDtos);
allCoatingIssueJobDtos.AddRange(existCoatingIssueJobDtos); allCoatingIssueJobDtos.AddRange(existCoatingIssueJobDtos);
var groupByItemCodeLocationCode = coatingIssueRequest.Details.GroupBy(p => var groupByItemCodeLocationCode = CoatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode }); new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode) foreach (var group in groupByItemCodeLocationCode)
{ {
@ -653,6 +662,8 @@ public class CoatingIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty; requestDetail.ReceivedQty = allReceivedQty;
} }
} }
await CoatingIssueRequestManager.UpdateByEntityAsync(CoatingIssueRequest).ConfigureAwait(false);
} }
/// <summary> /// <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.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class InjectionIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<InjectionIssueRequest>> , ILocalEventHandler<SfsCreatedEntityEventData<InjectionIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<InjectionIssueRequest>>> , ILocalEventHandler<SfsCreatedEntityEventData<List<InjectionIssueRequest>>>
{ {
private readonly IInjectionIssueJobAppService _injectionIssueJobAppService; private readonly IInjectionIssueJobAppService _InjectionIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
protected IInjectionIssueRequestManager InjectionIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<IInjectionIssueRequestManager>();
private IMapper _mapper; private IMapper _mapper;
public InjectionIssueRequestEventHandler( public InjectionIssueRequestEventHandler(
IInjectionIssueJobAppService injectionIssueJobAppService, IProductionLineAppService productionLineAppService, IInjectionIssueJobAppService InjectionIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
) )
{ {
_injectionIssueJobAppService = injectionIssueJobAppService; _InjectionIssueJobAppService = InjectionIssueJobAppService;
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
@ -107,14 +109,14 @@ public class InjectionIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务-按数量 /// 创建注塑任务-按数量
/// </summary> /// </summary>
/// <param name="injectionIssueRequest"></param> /// <param name="InjectionIssueRequest"></param>
/// <param name="injectionIssueRequestDetails"></param> /// <param name="InjectionIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<InjectionIssueJobEditInput>> CreateInjectionIssueJobWithQtyTypeAsync private async Task<List<InjectionIssueJobEditInput>> CreateInjectionIssueJobWithQtyTypeAsync
(InjectionIssueRequest injectionIssueRequest, List<InjectionIssueRequestDetail> injectionIssueRequestDetails, (InjectionIssueRequest InjectionIssueRequest, List<InjectionIssueRequestDetail> InjectionIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos, List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
@ -122,9 +124,9 @@ public class InjectionIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉 //用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos = var tempDetailDtos =
ObjectMapper.Map<List<InjectionIssueRequestDetail>, List<InjectionIssueRequestDetailDTO>>( ObjectMapper.Map<List<InjectionIssueRequestDetail>, List<InjectionIssueRequestDetailDTO>>(
injectionIssueRequestDetails); InjectionIssueRequestDetails);
var injectionIssueJobDetailInputs = new List<InjectionIssueJobDetailInput>(); var InjectionIssueJobDetailInputs = new List<InjectionIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0) if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{ {
@ -138,7 +140,9 @@ public class InjectionIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos) 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) //需求量大于 这条推荐库存的余额 if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{ {
@ -150,7 +154,7 @@ public class InjectionIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty; balanceDto.Qty = tempDetailDto.Qty;
} }
injectionIssueJobDetailInputs.Add( InjectionIssueJobDetailInputs.Add(
await BuildInjectionIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto) await BuildInjectionIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false)); .ConfigureAwait(false));
useBalanceList.Add(balanceDto); useBalanceList.Add(balanceDto);
@ -170,13 +174,18 @@ public class InjectionIssueRequestEventHandler
} }
} }
if (injectionIssueJobDetailInputs.Any()) if (InjectionIssueJobDetailInputs.Any())
{ {
var injectionIssueJobEditInput = await BuildInjectionIssueJobCreateInputWithQtyTypeAsync( var InjectionIssueJobEditInput = await BuildInjectionIssueJobCreateInputWithQtyTypeAsync(
injectionIssueRequest, InjectionIssueRequest,
injectionIssueRequestDetails.First()).ConfigureAwait(false); InjectionIssueRequestDetails.First()).ConfigureAwait(false);
injectionIssueJobEditInput.Details = injectionIssueJobDetailInputs; InjectionIssueJobEditInput.Details = InjectionIssueJobDetailInputs;
jobs.Add(injectionIssueJobEditInput);
InjectionIssueJobEditInput.Details = InjectionIssueJobEditInput.Details.Where(p => p.RecommendFromQty > 0).ToList();
if (InjectionIssueJobEditInput.Details != null && InjectionIssueJobEditInput.Details.Any())
{
jobs.Add(InjectionIssueJobEditInput);
}
} }
return jobs; return jobs;
@ -185,19 +194,19 @@ public class InjectionIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按数量 /// 构造注塑任务-按数量
/// </summary> /// </summary>
/// <param name="injectionIssueRequest"></param> /// <param name="InjectionIssueRequest"></param>
/// <param name="requestDetailInput"></param> /// <param name="requestDetailInput"></param>
/// <returns></returns> /// <returns></returns>
private async Task<InjectionIssueJobEditInput> BuildInjectionIssueJobCreateInputWithQtyTypeAsync( 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.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup; job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode; job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = injectionIssueRequest.Worker; job.Worker = InjectionIssueRequest.Worker;
job.InjectionRequestNumber = injectionIssueRequest.Number; job.InjectionRequestNumber = InjectionIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType; job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -208,31 +217,31 @@ public class InjectionIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按数量 /// 构造注塑任务明细-按数量
/// </summary> /// </summary>
/// <param name="injectionIssueRequestDetail"></param> /// <param name="InjectionIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<InjectionIssueJobDetailInput> BuildInjectionIssueJobDetailWithQtyTypeAsync( private async Task<InjectionIssueJobDetailInput> BuildInjectionIssueJobDetailWithQtyTypeAsync(
InjectionIssueRequestDetailDTO injectionIssueRequestDetail, BalanceDTO balance) InjectionIssueRequestDetailDTO InjectionIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new InjectionIssueJobDetailInput(); var detail = new InjectionIssueJobDetailInput();
detail.RequestLocationCode = injectionIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.PositionCode = injectionIssueRequestDetail.PositionCode; detail.PositionCode = InjectionIssueRequestDetail.PositionCode;
detail.RecommendType = injectionIssueRequestDetail.RecommendType; detail.RecommendType = InjectionIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode; detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2; detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1; detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName; detail.ItemName = balance.ItemName;
detail.ProdLine = injectionIssueRequestDetail.ProdLine; detail.ProdLine = InjectionIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty; detail.RequestQty = balance.Qty;
detail.StdPackQty = injectionIssueRequestDetail.StdPackQty; detail.StdPackQty = InjectionIssueRequestDetail.StdPackQty;
detail.Status = balance.Status; detail.Status = balance.Status;
detail.RequestLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = injectionIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = injectionIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = injectionIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode; detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode; detail.RecommendFromContainerCode = balance.ContainerCode;
@ -264,11 +273,11 @@ public class InjectionIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup; detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode; detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = injectionIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = injectionIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = injectionIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode; detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode; detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -299,11 +308,11 @@ public class InjectionIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup; detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode; detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = injectionIssueRequestDetail.ToLocationCode; detail.TransferLibToLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode; detail.TransferLibToLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = injectionIssueRequestDetail.ToLocationArea; detail.TransferLibToLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode; detail.TransferLibToWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = injectionIssueRequestDetail.ToLocationGroup; detail.TransferLibToLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -316,28 +325,28 @@ public class InjectionIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务 按箱叫料-按箱 /// 创建注塑任务 按箱叫料-按箱
/// </summary> /// </summary>
/// <param name="injectionIssueRequest"></param> /// <param name="InjectionIssueRequest"></param>
/// <param name="injectionIssueRequestDetailList"></param> /// <param name="InjectionIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<InjectionIssueJobEditInput>> CreateInjectionIssueJobWithBoxQtyTypeAsync private async Task<List<InjectionIssueJobEditInput>> CreateInjectionIssueJobWithBoxQtyTypeAsync
( (
InjectionIssueRequest injectionIssueRequest, InjectionIssueRequest InjectionIssueRequest,
List<InjectionIssueRequestDetail> injectionIssueRequestDetailList, List<InjectionIssueRequestDetail> InjectionIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos, List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
var inputJobs = new List<InjectionIssueJobEditInput>(); var inputJobs = new List<InjectionIssueJobEditInput>();
var jobs = await _injectionIssueJobAppService.GetByRequestNumberAsync(injectionIssueRequest.Number) var jobs = await _InjectionIssueJobAppService.GetByRequestNumberAsync(InjectionIssueRequest.Number)
.ConfigureAwait(false); .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); var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线 //获取生产线
@ -368,12 +377,12 @@ public class InjectionIssueRequestEventHandler
useBalanceList.Add(firstUsable); useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable); usableList.Remove(firstUsable);
var injectionIssueJobEditInput = var InjectionIssueJobEditInput =
await BuildInjectionIssueJobCreateInputWithBoxQtyTypeAsync(injectionIssueRequest, await BuildInjectionIssueJobCreateInputWithBoxQtyTypeAsync(InjectionIssueRequest,
detail, firstUsable) detail, firstUsable)
.ConfigureAwait(false); .ConfigureAwait(false);
inputJobs.Add(injectionIssueJobEditInput); inputJobs.Add(InjectionIssueJobEditInput);
} }
else else
{ {
@ -389,24 +398,24 @@ public class InjectionIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按箱 /// 构造注塑任务-按箱
/// </summary> /// </summary>
/// <param name="injectionIssueRequest"></param> /// <param name="InjectionIssueRequest"></param>
/// <param name="injectionIssueRequestDetail"></param> /// <param name="InjectionIssueRequestDetail"></param>
/// <param name="balanceDtos"></param> /// <param name="balanceDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task<InjectionIssueJobEditInput> BuildInjectionIssueJobCreateInputWithBoxQtyTypeAsync( private async Task<InjectionIssueJobEditInput> BuildInjectionIssueJobCreateInputWithBoxQtyTypeAsync(
InjectionIssueRequest injectionIssueRequest, InjectionIssueRequest InjectionIssueRequest,
InjectionIssueRequestDetail injectionIssueRequestDetail, BalanceDTO balanceDtos) InjectionIssueRequestDetail InjectionIssueRequestDetail, BalanceDTO balanceDtos)
{ {
var job = ObjectMapper.Map<InjectionIssueRequest, InjectionIssueJobEditInput>(injectionIssueRequest); var job = ObjectMapper.Map<InjectionIssueRequest, InjectionIssueJobEditInput>(InjectionIssueRequest);
job.JobType = EnumJobType.IssueJob; job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = injectionIssueRequestDetail.ToLocationGroup; job.WorkGroupCode = InjectionIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = injectionIssueRequestDetail.ToWarehouseCode; job.WarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
job.Worker = injectionIssueRequest.Worker; job.Worker = InjectionIssueRequest.Worker;
job.InjectionRequestNumber = injectionIssueRequest.Number; job.InjectionRequestNumber = InjectionIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType; job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildInjectionIssueJobDetailWithBoxQtyTypeAsync(injectionIssueRequestDetail, balanceDtos) job.Details.Add(await BuildInjectionIssueJobDetailWithBoxQtyTypeAsync(InjectionIssueRequestDetail, balanceDtos)
.ConfigureAwait(false)); .ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -417,28 +426,28 @@ public class InjectionIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按箱 /// 构造注塑任务明细-按箱
/// </summary> /// </summary>
/// <param name="injectionIssueRequestDetail"></param> /// <param name="InjectionIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<InjectionIssueJobDetailInput> BuildInjectionIssueJobDetailWithBoxQtyTypeAsync( private async Task<InjectionIssueJobDetailInput> BuildInjectionIssueJobDetailWithBoxQtyTypeAsync(
InjectionIssueRequestDetail injectionIssueRequestDetail, BalanceDTO balance) InjectionIssueRequestDetail InjectionIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new InjectionIssueJobDetailInput(); var detail = new InjectionIssueJobDetailInput();
detail.RequestLocationCode = injectionIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = injectionIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = injectionIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1; detail.RequestQty = 1;
detail.PositionCode = injectionIssueRequestDetail.PositionCode; detail.PositionCode = InjectionIssueRequestDetail.PositionCode;
detail.RecommendType = injectionIssueRequestDetail.RecommendType; detail.RecommendType = InjectionIssueRequestDetail.RecommendType;
detail.ProdLine = injectionIssueRequestDetail.ProdLine; detail.ProdLine = InjectionIssueRequestDetail.ProdLine;
detail.ItemCode = injectionIssueRequestDetail.ItemCode; detail.ItemCode = InjectionIssueRequestDetail.ItemCode;
detail.ItemName = injectionIssueRequestDetail.ItemName; detail.ItemName = InjectionIssueRequestDetail.ItemName;
detail.ItemDesc1 = injectionIssueRequestDetail.ItemDesc1; detail.ItemDesc1 = InjectionIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = injectionIssueRequestDetail.ItemDesc2; detail.ItemDesc2 = InjectionIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK; detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
@ -473,11 +482,11 @@ public class InjectionIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate; detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate; detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = injectionIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = InjectionIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = injectionIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = InjectionIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = injectionIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = InjectionIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = injectionIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = InjectionIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = injectionIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = InjectionIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -489,26 +498,26 @@ public class InjectionIssueRequestEventHandler
//创建任务 //创建任务
private async Task<List<InjectionIssueJobDTO>> CreateAllInjectionIssueJobAsync( 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>(); var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in injectionIssueRequest.Details.GroupBy(p => foreach (var groupbyItemCodeAndProdLine in InjectionIssueRequest.Details.GroupBy(p =>
new { p.ItemCode })) new { p.ItemCode }))
{ {
foreach (var injectionIssueRequestDetail in groupbyItemCodeAndProdLine) foreach (var InjectionIssueRequestDetail in groupbyItemCodeAndProdLine)
{ {
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync( var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
injectionIssueRequestDetail.ProdLine, InjectionIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false); groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null) if (productionLineItemDto == null)
{ {
throw new UserFriendlyException( throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{injectionIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】"); $"未在生产线物品关系表中维护【{InjectionIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
} }
//原料 //原料
@ -521,7 +530,7 @@ public class InjectionIssueRequestEventHandler
//获取可用库存 //获取可用库存
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = injectionIssueRequestDetail.ItemCode, ItemCode = InjectionIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue, Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
@ -532,14 +541,14 @@ public class InjectionIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false); var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上 //因为是按箱叫料 先把值赋值给箱数量上
injectionIssueRequestDetail.BoxQty = injectionIssueRequestDetail.Qty; InjectionIssueRequestDetail.BoxQty = InjectionIssueRequestDetail.Qty;
if (usableList.Any()) if (usableList.Any())
{ {
//因为是原料所以按箱叫料 //因为是原料所以按箱叫料
injectionIssueJobEditInputs.AddRange( InjectionIssueJobEditInputs.AddRange(
await CreateInjectionIssueJobWithBoxQtyTypeAsync(injectionIssueRequest, await CreateInjectionIssueJobWithBoxQtyTypeAsync(InjectionIssueRequest,
new EditableList<InjectionIssueRequestDetail> { injectionIssueRequestDetail }, new EditableList<InjectionIssueRequestDetail> { InjectionIssueRequestDetail },
sortByFifoAsync, sortByFifoAsync,
useBalanceList).ConfigureAwait(false)); useBalanceList).ConfigureAwait(false));
} }
@ -557,7 +566,7 @@ public class InjectionIssueRequestEventHandler
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode, ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = injectionIssueRequestDetail.Qty, Qty = InjectionIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -583,23 +592,23 @@ public class InjectionIssueRequestEventHandler
} }
} }
injectionIssueJobEditInputs.AddRange( InjectionIssueJobEditInputs.AddRange(
await CreateInjectionIssueJobWithQtyTypeAsync(injectionIssueRequest, await CreateInjectionIssueJobWithQtyTypeAsync(InjectionIssueRequest,
new List<InjectionIssueRequestDetail> { injectionIssueRequestDetail }, temp, new List<InjectionIssueRequestDetail> { InjectionIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false)); useBalanceList).ConfigureAwait(false));
} }
} }
} }
} }
if (injectionIssueJobEditInputs.Count > 0) //有库存 可以创建任务 if (InjectionIssueJobEditInputs.Count > 0) //有库存 可以创建任务
{ {
//新增任务 //新增任务
var addInjectionIssueJobDtos = await _injectionIssueJobAppService var addInjectionIssueJobDtos = await _InjectionIssueJobAppService
.CreateManyAsync(injectionIssueJobEditInputs) .CreateManyAsync(InjectionIssueJobEditInputs)
.ConfigureAwait(false); .ConfigureAwait(false);
await UpdateInjectionIssueRequestDetailQtyAsync(injectionIssueRequest, addInjectionIssueJobDtos) await UpdateInjectionIssueRequestDetailQtyAsync(InjectionIssueRequest, addInjectionIssueJobDtos)
.ConfigureAwait(false); .ConfigureAwait(false);
return addInjectionIssueJobDtos; return addInjectionIssueJobDtos;
@ -611,15 +620,15 @@ public class InjectionIssueRequestEventHandler
/// <summary> /// <summary>
/// 修改请求的 已发 已收数量 /// 修改请求的 已发 已收数量
/// </summary> /// </summary>
/// <param name="injectionIssueRequest"></param> /// <param name="InjectionIssueRequest"></param>
/// <param name="addInjectionIssueJobDtos"></param> /// <param name="addInjectionIssueJobDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task UpdateInjectionIssueRequestDetailQtyAsync(InjectionIssueRequest injectionIssueRequest, private async Task UpdateInjectionIssueRequestDetailQtyAsync(InjectionIssueRequest InjectionIssueRequest,
List<InjectionIssueJobDTO> addInjectionIssueJobDtos) List<InjectionIssueJobDTO> addInjectionIssueJobDtos)
{ {
//原有任务 //原有任务
var existInjectionIssueJobDtos = await _injectionIssueJobAppService var existInjectionIssueJobDtos = await _InjectionIssueJobAppService
.GetByRequestNumberAsync(injectionIssueRequest.Number) .GetByRequestNumberAsync(InjectionIssueRequest.Number)
.ConfigureAwait(false); .ConfigureAwait(false);
//新增的任务和已有的任务总和 //新增的任务和已有的任务总和
@ -627,7 +636,7 @@ public class InjectionIssueRequestEventHandler
allInjectionIssueJobDtos.AddRange(addInjectionIssueJobDtos); allInjectionIssueJobDtos.AddRange(addInjectionIssueJobDtos);
allInjectionIssueJobDtos.AddRange(existInjectionIssueJobDtos); allInjectionIssueJobDtos.AddRange(existInjectionIssueJobDtos);
var groupByItemCodeLocationCode = injectionIssueRequest.Details.GroupBy(p => var groupByItemCodeLocationCode = InjectionIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode }); new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode) foreach (var group in groupByItemCodeLocationCode)
{ {
@ -653,6 +662,8 @@ public class InjectionIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty; requestDetail.ReceivedQty = allReceivedQty;
} }
} }
await InjectionIssueRequestManager.UpdateByEntityAsync(InjectionIssueRequest).ConfigureAwait(false);
} }
/// <summary> /// <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.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class KittingIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<KittingIssueRequest>> , ILocalEventHandler<SfsCreatedEntityEventData<KittingIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<KittingIssueRequest>>> , ILocalEventHandler<SfsCreatedEntityEventData<List<KittingIssueRequest>>>
{ {
private readonly IKittingIssueJobAppService _kittingIssueJobAppService; private readonly IKittingIssueJobAppService _KittingIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
protected IKittingIssueRequestManager KittingIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<IKittingIssueRequestManager>();
private IMapper _mapper; private IMapper _mapper;
public KittingIssueRequestEventHandler( public KittingIssueRequestEventHandler(
IKittingIssueJobAppService kittingIssueJobAppService, IProductionLineAppService productionLineAppService, IKittingIssueJobAppService KittingIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
) )
{ {
_kittingIssueJobAppService = kittingIssueJobAppService; _KittingIssueJobAppService = KittingIssueJobAppService;
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
@ -95,7 +97,7 @@ public class KittingIssueRequestEventHandler
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<KittingIssueRequest> eventData) public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<KittingIssueRequest> eventData)
{ {
_ = eventData.Entity; _ = eventData.Entity;
// await _kittingIssueJobAppService.CompleteByKittingIssueRequestAsync(entity.Number); // await _KittingIssueJobAppService.CompleteByKittingIssueRequestAsync(entity.Number);
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
} }
@ -107,14 +109,14 @@ public class KittingIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务-按数量 /// 创建注塑任务-按数量
/// </summary> /// </summary>
/// <param name="kittingIssueRequest"></param> /// <param name="KittingIssueRequest"></param>
/// <param name="kittingIssueRequestDetails"></param> /// <param name="KittingIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithQtyTypeAsync private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithQtyTypeAsync
(KittingIssueRequest kittingIssueRequest, List<KittingIssueRequestDetail> kittingIssueRequestDetails, (KittingIssueRequest KittingIssueRequest, List<KittingIssueRequestDetail> KittingIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos, List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
@ -122,9 +124,9 @@ public class KittingIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉 //用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos = var tempDetailDtos =
ObjectMapper.Map<List<KittingIssueRequestDetail>, List<KittingIssueRequestDetailDTO>>( ObjectMapper.Map<List<KittingIssueRequestDetail>, List<KittingIssueRequestDetailDTO>>(
kittingIssueRequestDetails); KittingIssueRequestDetails);
var kittingIssueJobDetailInputs = new List<KittingIssueJobDetailInput>(); var KittingIssueJobDetailInputs = new List<KittingIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0) if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{ {
@ -138,7 +140,9 @@ public class KittingIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos) 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) //需求量大于 这条推荐库存的余额 if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{ {
@ -150,7 +154,7 @@ public class KittingIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty; balanceDto.Qty = tempDetailDto.Qty;
} }
kittingIssueJobDetailInputs.Add( KittingIssueJobDetailInputs.Add(
await BuildKittingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto) await BuildKittingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false)); .ConfigureAwait(false));
useBalanceList.Add(balanceDto); useBalanceList.Add(balanceDto);
@ -170,12 +174,18 @@ public class KittingIssueRequestEventHandler
} }
} }
if (kittingIssueJobDetailInputs.Any()) if (KittingIssueJobDetailInputs.Any())
{ {
var kittingIssueJobEditInput = await BuildKittingIssueJobCreateInputWithQtyTypeAsync(kittingIssueRequest, var KittingIssueJobEditInput = await BuildKittingIssueJobCreateInputWithQtyTypeAsync(
kittingIssueRequestDetails.First()).ConfigureAwait(false); KittingIssueRequest,
kittingIssueJobEditInput.Details = kittingIssueJobDetailInputs; KittingIssueRequestDetails.First()).ConfigureAwait(false);
jobs.Add(kittingIssueJobEditInput); 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; return jobs;
@ -184,19 +194,19 @@ public class KittingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按数量 /// 构造注塑任务-按数量
/// </summary> /// </summary>
/// <param name="kittingIssueRequest"></param> /// <param name="KittingIssueRequest"></param>
/// <param name="requestDetailInput"></param> /// <param name="requestDetailInput"></param>
/// <returns></returns> /// <returns></returns>
private async Task<KittingIssueJobEditInput> BuildKittingIssueJobCreateInputWithQtyTypeAsync( 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.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup; job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode; job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = kittingIssueRequest.Worker; job.Worker = KittingIssueRequest.Worker;
job.KittingRequestNumber = kittingIssueRequest.Number; job.KittingRequestNumber = KittingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType; job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -207,31 +217,31 @@ public class KittingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按数量 /// 构造注塑任务明细-按数量
/// </summary> /// </summary>
/// <param name="kittingIssueRequestDetail"></param> /// <param name="KittingIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithQtyTypeAsync( private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithQtyTypeAsync(
KittingIssueRequestDetailDTO kittingIssueRequestDetail, BalanceDTO balance) KittingIssueRequestDetailDTO KittingIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new KittingIssueJobDetailInput(); var detail = new KittingIssueJobDetailInput();
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.PositionCode = kittingIssueRequestDetail.PositionCode; detail.PositionCode = KittingIssueRequestDetail.PositionCode;
detail.RecommendType = kittingIssueRequestDetail.RecommendType; detail.RecommendType = KittingIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode; detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2; detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1; detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName; detail.ItemName = balance.ItemName;
detail.ProdLine = kittingIssueRequestDetail.ProdLine; detail.ProdLine = KittingIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty; detail.RequestQty = balance.Qty;
detail.StdPackQty = kittingIssueRequestDetail.StdPackQty; detail.StdPackQty = KittingIssueRequestDetail.StdPackQty;
detail.Status = balance.Status; detail.Status = balance.Status;
detail.RequestLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = kittingIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = kittingIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode; detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode; detail.RecommendFromContainerCode = balance.ContainerCode;
@ -263,11 +273,11 @@ public class KittingIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup; detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode; detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = kittingIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = kittingIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode; detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode; detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -298,11 +308,11 @@ public class KittingIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup; detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode; detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.TransferLibToLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; detail.TransferLibToLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = kittingIssueRequestDetail.ToLocationArea; detail.TransferLibToLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; detail.TransferLibToWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = kittingIssueRequestDetail.ToLocationGroup; detail.TransferLibToLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -315,28 +325,28 @@ public class KittingIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务 按箱叫料-按箱 /// 创建注塑任务 按箱叫料-按箱
/// </summary> /// </summary>
/// <param name="kittingIssueRequest"></param> /// <param name="KittingIssueRequest"></param>
/// <param name="kittingIssueRequestDetailList"></param> /// <param name="KittingIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithBoxQtyTypeAsync private async Task<List<KittingIssueJobEditInput>> CreateKittingIssueJobWithBoxQtyTypeAsync
( (
KittingIssueRequest kittingIssueRequest, KittingIssueRequest KittingIssueRequest,
List<KittingIssueRequestDetail> kittingIssueRequestDetailList, List<KittingIssueRequestDetail> KittingIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos, List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
var inputJobs = new List<KittingIssueJobEditInput>(); var inputJobs = new List<KittingIssueJobEditInput>();
var jobs = await _kittingIssueJobAppService.GetByRequestNumberAsync(kittingIssueRequest.Number) var jobs = await _KittingIssueJobAppService.GetByRequestNumberAsync(KittingIssueRequest.Number)
.ConfigureAwait(false); .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); var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线 //获取生产线
@ -354,7 +364,8 @@ public class KittingIssueRequestEventHandler
//可用库存 //可用库存
var usableList = recommendbalanceDtos; 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(); .ToList();
if (usableList.Any()) if (usableList.Any())
{ {
@ -366,12 +377,12 @@ public class KittingIssueRequestEventHandler
useBalanceList.Add(firstUsable); useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable); usableList.Remove(firstUsable);
var kittingIssueJobEditInput = var KittingIssueJobEditInput =
await BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(kittingIssueRequest, await BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(KittingIssueRequest,
detail, firstUsable) detail, firstUsable)
.ConfigureAwait(false); .ConfigureAwait(false);
inputJobs.Add(kittingIssueJobEditInput); inputJobs.Add(KittingIssueJobEditInput);
} }
else else
{ {
@ -387,24 +398,24 @@ public class KittingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按箱 /// 构造注塑任务-按箱
/// </summary> /// </summary>
/// <param name="kittingIssueRequest"></param> /// <param name="KittingIssueRequest"></param>
/// <param name="kittingIssueRequestDetail"></param> /// <param name="KittingIssueRequestDetail"></param>
/// <param name="balanceDtos"></param> /// <param name="balanceDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task<KittingIssueJobEditInput> BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync( private async Task<KittingIssueJobEditInput> BuildKittingIssueJobCreateInputWithBoxQtyTypeAsync(
KittingIssueRequest kittingIssueRequest, KittingIssueRequest KittingIssueRequest,
KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balanceDtos) KittingIssueRequestDetail KittingIssueRequestDetail, BalanceDTO balanceDtos)
{ {
var job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(kittingIssueRequest); var job = ObjectMapper.Map<KittingIssueRequest, KittingIssueJobEditInput>(KittingIssueRequest);
job.JobType = EnumJobType.IssueJob; job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = kittingIssueRequestDetail.ToLocationGroup; job.WorkGroupCode = KittingIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; job.WarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
job.Worker = kittingIssueRequest.Worker; job.Worker = KittingIssueRequest.Worker;
job.KittingRequestNumber = kittingIssueRequest.Number; job.KittingRequestNumber = KittingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType; job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildKittingIssueJobDetailWithBoxQtyTypeAsync(kittingIssueRequestDetail, balanceDtos) job.Details.Add(await BuildKittingIssueJobDetailWithBoxQtyTypeAsync(KittingIssueRequestDetail, balanceDtos)
.ConfigureAwait(false)); .ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -415,28 +426,28 @@ public class KittingIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按箱 /// 构造注塑任务明细-按箱
/// </summary> /// </summary>
/// <param name="kittingIssueRequestDetail"></param> /// <param name="KittingIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithBoxQtyTypeAsync( private async Task<KittingIssueJobDetailInput> BuildKittingIssueJobDetailWithBoxQtyTypeAsync(
KittingIssueRequestDetail kittingIssueRequestDetail, BalanceDTO balance) KittingIssueRequestDetail KittingIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new KittingIssueJobDetailInput(); var detail = new KittingIssueJobDetailInput();
detail.RequestLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = kittingIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = kittingIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1; detail.RequestQty = 1;
detail.PositionCode = kittingIssueRequestDetail.PositionCode; detail.PositionCode = KittingIssueRequestDetail.PositionCode;
detail.RecommendType = kittingIssueRequestDetail.RecommendType; detail.RecommendType = KittingIssueRequestDetail.RecommendType;
detail.ProdLine = kittingIssueRequestDetail.ProdLine; detail.ProdLine = KittingIssueRequestDetail.ProdLine;
detail.ItemCode = kittingIssueRequestDetail.ItemCode; detail.ItemCode = KittingIssueRequestDetail.ItemCode;
detail.ItemName = kittingIssueRequestDetail.ItemName; detail.ItemName = KittingIssueRequestDetail.ItemName;
detail.ItemDesc1 = kittingIssueRequestDetail.ItemDesc1; detail.ItemDesc1 = KittingIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = kittingIssueRequestDetail.ItemDesc2; detail.ItemDesc2 = KittingIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK; detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
@ -471,11 +482,11 @@ public class KittingIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate; detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate; detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = kittingIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = KittingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = kittingIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = KittingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = kittingIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = KittingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = kittingIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = KittingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = kittingIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = KittingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -487,26 +498,26 @@ public class KittingIssueRequestEventHandler
//创建任务 //创建任务
private async Task<List<KittingIssueJobDTO>> CreateAllKittingIssueJobAsync( 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>(); var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in kittingIssueRequest.Details.GroupBy(p => foreach (var groupbyItemCodeAndProdLine in KittingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode })) new { p.ItemCode }))
{ {
foreach (var kittingIssueRequestDetail in groupbyItemCodeAndProdLine) foreach (var KittingIssueRequestDetail in groupbyItemCodeAndProdLine)
{ {
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync( var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
kittingIssueRequestDetail.ProdLine, KittingIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false); groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null) if (productionLineItemDto == null)
{ {
throw new UserFriendlyException( throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{kittingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】"); $"未在生产线物品关系表中维护【{KittingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
} }
//原料 //原料
@ -519,7 +530,7 @@ public class KittingIssueRequestEventHandler
//获取可用库存 //获取可用库存
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = kittingIssueRequestDetail.ItemCode, ItemCode = KittingIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue, Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
@ -530,14 +541,14 @@ public class KittingIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false); var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上 //因为是按箱叫料 先把值赋值给箱数量上
kittingIssueRequestDetail.BoxQty = kittingIssueRequestDetail.Qty; KittingIssueRequestDetail.BoxQty = KittingIssueRequestDetail.Qty;
if (usableList.Any()) if (usableList.Any())
{ {
//因为是原料所以按箱叫料 //因为是原料所以按箱叫料
kittingIssueJobEditInputs.AddRange( KittingIssueJobEditInputs.AddRange(
await CreateKittingIssueJobWithBoxQtyTypeAsync(kittingIssueRequest, await CreateKittingIssueJobWithBoxQtyTypeAsync(KittingIssueRequest,
new EditableList<KittingIssueRequestDetail> { kittingIssueRequestDetail }, new EditableList<KittingIssueRequestDetail> { KittingIssueRequestDetail },
sortByFifoAsync, sortByFifoAsync,
useBalanceList).ConfigureAwait(false)); useBalanceList).ConfigureAwait(false));
} }
@ -555,7 +566,7 @@ public class KittingIssueRequestEventHandler
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode, ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = kittingIssueRequestDetail.Qty, Qty = KittingIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -581,22 +592,23 @@ public class KittingIssueRequestEventHandler
} }
} }
kittingIssueJobEditInputs.AddRange( KittingIssueJobEditInputs.AddRange(
await CreateKittingIssueJobWithQtyTypeAsync(kittingIssueRequest, await CreateKittingIssueJobWithQtyTypeAsync(KittingIssueRequest,
new List<KittingIssueRequestDetail> { kittingIssueRequestDetail }, temp, new List<KittingIssueRequestDetail> { KittingIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false)); 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); .ConfigureAwait(false);
await UpdateKittingIssueRequestDetailQtyAsync(kittingIssueRequest, addKittingIssueJobDtos) await UpdateKittingIssueRequestDetailQtyAsync(KittingIssueRequest, addKittingIssueJobDtos)
.ConfigureAwait(false); .ConfigureAwait(false);
return addKittingIssueJobDtos; return addKittingIssueJobDtos;
@ -608,15 +620,15 @@ public class KittingIssueRequestEventHandler
/// <summary> /// <summary>
/// 修改请求的 已发 已收数量 /// 修改请求的 已发 已收数量
/// </summary> /// </summary>
/// <param name="kittingIssueRequest"></param> /// <param name="KittingIssueRequest"></param>
/// <param name="addKittingIssueJobDtos"></param> /// <param name="addKittingIssueJobDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task UpdateKittingIssueRequestDetailQtyAsync(KittingIssueRequest kittingIssueRequest, private async Task UpdateKittingIssueRequestDetailQtyAsync(KittingIssueRequest KittingIssueRequest,
List<KittingIssueJobDTO> addKittingIssueJobDtos) List<KittingIssueJobDTO> addKittingIssueJobDtos)
{ {
//原有任务 //原有任务
var existKittingIssueJobDtos = await _kittingIssueJobAppService var existKittingIssueJobDtos = await _KittingIssueJobAppService
.GetByRequestNumberAsync(kittingIssueRequest.Number) .GetByRequestNumberAsync(KittingIssueRequest.Number)
.ConfigureAwait(false); .ConfigureAwait(false);
//新增的任务和已有的任务总和 //新增的任务和已有的任务总和
@ -624,7 +636,7 @@ public class KittingIssueRequestEventHandler
allKittingIssueJobDtos.AddRange(addKittingIssueJobDtos); allKittingIssueJobDtos.AddRange(addKittingIssueJobDtos);
allKittingIssueJobDtos.AddRange(existKittingIssueJobDtos); allKittingIssueJobDtos.AddRange(existKittingIssueJobDtos);
var groupByItemCodeLocationCode = kittingIssueRequest.Details.GroupBy(p => var groupByItemCodeLocationCode = KittingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode }); new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode) foreach (var group in groupByItemCodeLocationCode)
{ {
@ -650,6 +662,8 @@ public class KittingIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty; requestDetail.ReceivedQty = allReceivedQty;
} }
} }
await KittingIssueRequestManager.UpdateByEntityAsync(KittingIssueRequest).ConfigureAwait(false);
} }
/// <summary> /// <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.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Acl.Balance;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -25,20 +26,21 @@ public class SparePartIssueRequestEventHandler
, ILocalEventHandler<SfsCreatedEntityEventData<SparePartIssueRequest>> , ILocalEventHandler<SfsCreatedEntityEventData<SparePartIssueRequest>>
, ILocalEventHandler<SfsCreatedEntityEventData<List<SparePartIssueRequest>>> , ILocalEventHandler<SfsCreatedEntityEventData<List<SparePartIssueRequest>>>
{ {
private readonly ISparePartIssueJobAppService _sparePartIssueJobAppService; private readonly ISparePartIssueJobAppService _SparePartIssueJobAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
protected ISparePartIssueRequestManager SparePartIssueRequestManager => LazyServiceProvider.LazyGetRequiredService<ISparePartIssueRequestManager>();
private IMapper _mapper; private IMapper _mapper;
public SparePartIssueRequestEventHandler( public SparePartIssueRequestEventHandler(
ISparePartIssueJobAppService sparePartIssueJobAppService, IProductionLineAppService productionLineAppService, ISparePartIssueJobAppService SparePartIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
) )
{ {
_sparePartIssueJobAppService = sparePartIssueJobAppService; _SparePartIssueJobAppService = SparePartIssueJobAppService;
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
@ -95,7 +97,7 @@ public class SparePartIssueRequestEventHandler
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<SparePartIssueRequest> eventData) public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<SparePartIssueRequest> eventData)
{ {
_ = eventData.Entity; _ = eventData.Entity;
// await _sparePartIssueJobAppService.CompleteBySparePartIssueRequestAsync(entity.Number); // await _SparePartIssueJobAppService.CompleteBySparePartIssueRequestAsync(entity.Number);
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
} }
@ -107,14 +109,14 @@ public class SparePartIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务-按数量 /// 创建注塑任务-按数量
/// </summary> /// </summary>
/// <param name="sparePartIssueRequest"></param> /// <param name="SparePartIssueRequest"></param>
/// <param name="sparePartIssueRequestDetails"></param> /// <param name="SparePartIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithQtyTypeAsync private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithQtyTypeAsync
(SparePartIssueRequest sparePartIssueRequest, List<SparePartIssueRequestDetail> sparePartIssueRequestDetails, (SparePartIssueRequest SparePartIssueRequest, List<SparePartIssueRequestDetail> SparePartIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos, List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
@ -122,9 +124,9 @@ public class SparePartIssueRequestEventHandler
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉 //用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos = var tempDetailDtos =
ObjectMapper.Map<List<SparePartIssueRequestDetail>, List<SparePartIssueRequestDetailDTO>>( ObjectMapper.Map<List<SparePartIssueRequestDetail>, List<SparePartIssueRequestDetailDTO>>(
sparePartIssueRequestDetails); SparePartIssueRequestDetails);
var sparePartIssueJobDetailInputs = new List<SparePartIssueJobDetailInput>(); var SparePartIssueJobDetailInputs = new List<SparePartIssueJobDetailInput>();
if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0) if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
{ {
@ -138,7 +140,9 @@ public class SparePartIssueRequestEventHandler
foreach (var tempDetailDto in tempDetailDtos) 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) //需求量大于 这条推荐库存的余额 if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{ {
@ -150,7 +154,7 @@ public class SparePartIssueRequestEventHandler
balanceDto.Qty = tempDetailDto.Qty; balanceDto.Qty = tempDetailDto.Qty;
} }
sparePartIssueJobDetailInputs.Add( SparePartIssueJobDetailInputs.Add(
await BuildSparePartIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto) await BuildSparePartIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false)); .ConfigureAwait(false));
useBalanceList.Add(balanceDto); useBalanceList.Add(balanceDto);
@ -170,12 +174,18 @@ public class SparePartIssueRequestEventHandler
} }
} }
if (sparePartIssueJobDetailInputs.Any()) if (SparePartIssueJobDetailInputs.Any())
{ {
var sparePartIssueJobEditInput = await BuildSparePartIssueJobCreateInputWithQtyTypeAsync(sparePartIssueRequest, var SparePartIssueJobEditInput = await BuildSparePartIssueJobCreateInputWithQtyTypeAsync(
sparePartIssueRequestDetails.First()).ConfigureAwait(false); SparePartIssueRequest,
sparePartIssueJobEditInput.Details = sparePartIssueJobDetailInputs; SparePartIssueRequestDetails.First()).ConfigureAwait(false);
jobs.Add(sparePartIssueJobEditInput); 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; return jobs;
@ -184,19 +194,19 @@ public class SparePartIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按数量 /// 构造注塑任务-按数量
/// </summary> /// </summary>
/// <param name="sparePartIssueRequest"></param> /// <param name="SparePartIssueRequest"></param>
/// <param name="requestDetailInput"></param> /// <param name="requestDetailInput"></param>
/// <returns></returns> /// <returns></returns>
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithQtyTypeAsync( 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.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = requestDetailInput.ToLocationGroup; job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = requestDetailInput.ToWarehouseCode; job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = sparePartIssueRequest.Worker; job.Worker = SparePartIssueRequest.Worker;
job.SparePartRequestNumber = sparePartIssueRequest.Number; job.SparePartRequestNumber = SparePartIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.QtyType; job.EnumIssueSendType = EnumIssueSendType.QtyType;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -207,31 +217,31 @@ public class SparePartIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按数量 /// 构造注塑任务明细-按数量
/// </summary> /// </summary>
/// <param name="sparePartIssueRequestDetail"></param> /// <param name="SparePartIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithQtyTypeAsync( private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithQtyTypeAsync(
SparePartIssueRequestDetailDTO sparePartIssueRequestDetail, BalanceDTO balance) SparePartIssueRequestDetailDTO SparePartIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new SparePartIssueJobDetailInput(); var detail = new SparePartIssueJobDetailInput();
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.PositionCode = sparePartIssueRequestDetail.PositionCode; detail.PositionCode = SparePartIssueRequestDetail.PositionCode;
detail.RecommendType = sparePartIssueRequestDetail.RecommendType; detail.RecommendType = SparePartIssueRequestDetail.RecommendType;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
detail.ItemCode = balance.ItemCode; detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2; detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1; detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName; detail.ItemName = balance.ItemName;
detail.ProdLine = sparePartIssueRequestDetail.ProdLine; detail.ProdLine = SparePartIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty; detail.RequestQty = balance.Qty;
detail.StdPackQty = sparePartIssueRequestDetail.StdPackQty; detail.StdPackQty = SparePartIssueRequestDetail.StdPackQty;
detail.Status = balance.Status; detail.Status = balance.Status;
detail.RequestLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = sparePartIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode; detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode; detail.RecommendFromContainerCode = balance.ContainerCode;
@ -263,11 +273,11 @@ public class SparePartIssueRequestEventHandler
detail.RecommendFromLocationGroup = balance.LocationGroup; detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode; detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendToLocationCode = sparePartIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = sparePartIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode; detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode; detail.TransferLibFromContainerCode = balance.ContainerCode;
@ -298,11 +308,11 @@ public class SparePartIssueRequestEventHandler
detail.TransferLibFromLocationGroup = balance.LocationGroup; detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode; detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = sparePartIssueRequestDetail.ToLocationCode; detail.TransferLibToLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; detail.TransferLibToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = sparePartIssueRequestDetail.ToLocationArea; detail.TransferLibToLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; detail.TransferLibToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; detail.TransferLibToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -315,28 +325,28 @@ public class SparePartIssueRequestEventHandler
/// <summary> /// <summary>
/// 创建注塑任务 按箱叫料-按箱 /// 创建注塑任务 按箱叫料-按箱
/// </summary> /// </summary>
/// <param name="sparePartIssueRequest"></param> /// <param name="SparePartIssueRequest"></param>
/// <param name="sparePartIssueRequestDetailList"></param> /// <param name="SparePartIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></param> /// <param name="recommendbalanceDtos"></param>
/// <param name="useBalanceList"></param> /// <param name="useBalanceList"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="UserFriendlyException"></exception> /// <exception cref="UserFriendlyException"></exception>
private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithBoxQtyTypeAsync private async Task<List<SparePartIssueJobEditInput>> CreateSparePartIssueJobWithBoxQtyTypeAsync
( (
SparePartIssueRequest sparePartIssueRequest, SparePartIssueRequest SparePartIssueRequest,
List<SparePartIssueRequestDetail> sparePartIssueRequestDetailList, List<SparePartIssueRequestDetail> SparePartIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos, List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList) List<BalanceDTO> useBalanceList)
{ {
var inputJobs = new List<SparePartIssueJobEditInput>(); var inputJobs = new List<SparePartIssueJobEditInput>();
var jobs = await _sparePartIssueJobAppService.GetByRequestNumberAsync(sparePartIssueRequest.Number) var jobs = await _SparePartIssueJobAppService.GetByRequestNumberAsync(SparePartIssueRequest.Number)
.ConfigureAwait(false); .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); var sumBoxQty = inputDetails.Sum(p => p.BoxQty - jobs.Count);
//获取生产线 //获取生产线
@ -354,7 +364,8 @@ public class SparePartIssueRequestEventHandler
//可用库存 //可用库存
var usableList = recommendbalanceDtos; 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(); .ToList();
if (usableList.Any()) if (usableList.Any())
{ {
@ -366,12 +377,12 @@ public class SparePartIssueRequestEventHandler
useBalanceList.Add(firstUsable); useBalanceList.Add(firstUsable);
usableList.Remove(firstUsable); usableList.Remove(firstUsable);
var sparePartIssueJobEditInput = var SparePartIssueJobEditInput =
await BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(sparePartIssueRequest, await BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(SparePartIssueRequest,
detail, firstUsable) detail, firstUsable)
.ConfigureAwait(false); .ConfigureAwait(false);
inputJobs.Add(sparePartIssueJobEditInput); inputJobs.Add(SparePartIssueJobEditInput);
} }
else else
{ {
@ -387,24 +398,24 @@ public class SparePartIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务-按箱 /// 构造注塑任务-按箱
/// </summary> /// </summary>
/// <param name="sparePartIssueRequest"></param> /// <param name="SparePartIssueRequest"></param>
/// <param name="sparePartIssueRequestDetail"></param> /// <param name="SparePartIssueRequestDetail"></param>
/// <param name="balanceDtos"></param> /// <param name="balanceDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync( private async Task<SparePartIssueJobEditInput> BuildSparePartIssueJobCreateInputWithBoxQtyTypeAsync(
SparePartIssueRequest sparePartIssueRequest, SparePartIssueRequest SparePartIssueRequest,
SparePartIssueRequestDetail sparePartIssueRequestDetail, BalanceDTO balanceDtos) SparePartIssueRequestDetail SparePartIssueRequestDetail, BalanceDTO balanceDtos)
{ {
var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(sparePartIssueRequest); var job = ObjectMapper.Map<SparePartIssueRequest, SparePartIssueJobEditInput>(SparePartIssueRequest);
job.JobType = EnumJobType.IssueJob; job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = sparePartIssueRequestDetail.ToLocationGroup; job.WorkGroupCode = SparePartIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; job.WarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
job.Worker = sparePartIssueRequest.Worker; job.Worker = SparePartIssueRequest.Worker;
job.SparePartRequestNumber = sparePartIssueRequest.Number; job.SparePartRequestNumber = SparePartIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType; job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(sparePartIssueRequestDetail, balanceDtos) job.Details.Add(await BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(SparePartIssueRequestDetail, balanceDtos)
.ConfigureAwait(false)); .ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -415,28 +426,28 @@ public class SparePartIssueRequestEventHandler
/// <summary> /// <summary>
/// 构造注塑任务明细-按箱 /// 构造注塑任务明细-按箱
/// </summary> /// </summary>
/// <param name="sparePartIssueRequestDetail"></param> /// <param name="SparePartIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <returns></returns> /// <returns></returns>
private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithBoxQtyTypeAsync( private async Task<SparePartIssueJobDetailInput> BuildSparePartIssueJobDetailWithBoxQtyTypeAsync(
SparePartIssueRequestDetail sparePartIssueRequestDetail, BalanceDTO balance) SparePartIssueRequestDetail SparePartIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new SparePartIssueJobDetailInput(); var detail = new SparePartIssueJobDetailInput();
detail.RequestLocationCode = sparePartIssueRequestDetail.ToLocationCode; detail.RequestLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; detail.RequestLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = sparePartIssueRequestDetail.ToLocationArea; detail.RequestLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1; detail.RequestQty = 1;
detail.PositionCode = sparePartIssueRequestDetail.PositionCode; detail.PositionCode = SparePartIssueRequestDetail.PositionCode;
detail.RecommendType = sparePartIssueRequestDetail.RecommendType; detail.RecommendType = SparePartIssueRequestDetail.RecommendType;
detail.ProdLine = sparePartIssueRequestDetail.ProdLine; detail.ProdLine = SparePartIssueRequestDetail.ProdLine;
detail.ItemCode = sparePartIssueRequestDetail.ItemCode; detail.ItemCode = SparePartIssueRequestDetail.ItemCode;
detail.ItemName = sparePartIssueRequestDetail.ItemName; detail.ItemName = SparePartIssueRequestDetail.ItemName;
detail.ItemDesc1 = sparePartIssueRequestDetail.ItemDesc1; detail.ItemDesc1 = SparePartIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = sparePartIssueRequestDetail.ItemDesc2; detail.ItemDesc2 = SparePartIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK; detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
@ -471,11 +482,11 @@ public class SparePartIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate; detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate; detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = sparePartIssueRequestDetail.ToLocationCode; detail.RecommendToLocationCode = SparePartIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = sparePartIssueRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = SparePartIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = sparePartIssueRequestDetail.ToLocationArea; detail.RecommendToLocationArea = SparePartIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = sparePartIssueRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = SparePartIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = sparePartIssueRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = SparePartIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -487,26 +498,26 @@ public class SparePartIssueRequestEventHandler
//创建任务 //创建任务
private async Task<List<SparePartIssueJobDTO>> CreateAllSparePartIssueJobAsync( 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>(); var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in sparePartIssueRequest.Details.GroupBy(p => foreach (var groupbyItemCodeAndProdLine in SparePartIssueRequest.Details.GroupBy(p =>
new { p.ItemCode })) new { p.ItemCode }))
{ {
foreach (var sparePartIssueRequestDetail in groupbyItemCodeAndProdLine) foreach (var SparePartIssueRequestDetail in groupbyItemCodeAndProdLine)
{ {
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync( var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
sparePartIssueRequestDetail.ProdLine, SparePartIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false); groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null) if (productionLineItemDto == null)
{ {
throw new UserFriendlyException( throw new UserFriendlyException(
$"未在生产线物品关系表中维护【{sparePartIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】"); $"未在生产线物品关系表中维护【{SparePartIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请配置【生产线物品关系】");
} }
//原料 //原料
@ -519,7 +530,7 @@ public class SparePartIssueRequestEventHandler
//获取可用库存 //获取可用库存
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = sparePartIssueRequestDetail.ItemCode, ItemCode = SparePartIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue, Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
@ -530,14 +541,14 @@ public class SparePartIssueRequestEventHandler
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false); var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上 //因为是按箱叫料 先把值赋值给箱数量上
sparePartIssueRequestDetail.BoxQty = sparePartIssueRequestDetail.Qty; SparePartIssueRequestDetail.BoxQty = SparePartIssueRequestDetail.Qty;
if (usableList.Any()) if (usableList.Any())
{ {
//因为是原料所以按箱叫料 //因为是原料所以按箱叫料
sparePartIssueJobEditInputs.AddRange( SparePartIssueJobEditInputs.AddRange(
await CreateSparePartIssueJobWithBoxQtyTypeAsync(sparePartIssueRequest, await CreateSparePartIssueJobWithBoxQtyTypeAsync(SparePartIssueRequest,
new EditableList<SparePartIssueRequestDetail> { sparePartIssueRequestDetail }, new EditableList<SparePartIssueRequestDetail> { SparePartIssueRequestDetail },
sortByFifoAsync, sortByFifoAsync,
useBalanceList).ConfigureAwait(false)); useBalanceList).ConfigureAwait(false));
} }
@ -555,7 +566,7 @@ public class SparePartIssueRequestEventHandler
var input = new RecommendBalanceRequestInput var input = new RecommendBalanceRequestInput
{ {
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode, ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = sparePartIssueRequestDetail.Qty, Qty = SparePartIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK }, Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto JsonSerializer.Deserialize<List<string>>(productionLineItemDto
@ -581,22 +592,23 @@ public class SparePartIssueRequestEventHandler
} }
} }
sparePartIssueJobEditInputs.AddRange( SparePartIssueJobEditInputs.AddRange(
await CreateSparePartIssueJobWithQtyTypeAsync(sparePartIssueRequest, await CreateSparePartIssueJobWithQtyTypeAsync(SparePartIssueRequest,
new List<SparePartIssueRequestDetail> { sparePartIssueRequestDetail }, temp, new List<SparePartIssueRequestDetail> { SparePartIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false)); 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); .ConfigureAwait(false);
await UpdateSparePartIssueRequestDetailQtyAsync(sparePartIssueRequest, addSparePartIssueJobDtos) await UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest, addSparePartIssueJobDtos)
.ConfigureAwait(false); .ConfigureAwait(false);
return addSparePartIssueJobDtos; return addSparePartIssueJobDtos;
@ -608,15 +620,15 @@ public class SparePartIssueRequestEventHandler
/// <summary> /// <summary>
/// 修改请求的 已发 已收数量 /// 修改请求的 已发 已收数量
/// </summary> /// </summary>
/// <param name="sparePartIssueRequest"></param> /// <param name="SparePartIssueRequest"></param>
/// <param name="addSparePartIssueJobDtos"></param> /// <param name="addSparePartIssueJobDtos"></param>
/// <returns></returns> /// <returns></returns>
private async Task UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest sparePartIssueRequest, private async Task UpdateSparePartIssueRequestDetailQtyAsync(SparePartIssueRequest SparePartIssueRequest,
List<SparePartIssueJobDTO> addSparePartIssueJobDtos) List<SparePartIssueJobDTO> addSparePartIssueJobDtos)
{ {
//原有任务 //原有任务
var existSparePartIssueJobDtos = await _sparePartIssueJobAppService var existSparePartIssueJobDtos = await _SparePartIssueJobAppService
.GetByRequestNumberAsync(sparePartIssueRequest.Number) .GetByRequestNumberAsync(SparePartIssueRequest.Number)
.ConfigureAwait(false); .ConfigureAwait(false);
//新增的任务和已有的任务总和 //新增的任务和已有的任务总和
@ -624,7 +636,7 @@ public class SparePartIssueRequestEventHandler
allSparePartIssueJobDtos.AddRange(addSparePartIssueJobDtos); allSparePartIssueJobDtos.AddRange(addSparePartIssueJobDtos);
allSparePartIssueJobDtos.AddRange(existSparePartIssueJobDtos); allSparePartIssueJobDtos.AddRange(existSparePartIssueJobDtos);
var groupByItemCodeLocationCode = sparePartIssueRequest.Details.GroupBy(p => var groupByItemCodeLocationCode = SparePartIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode }); new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode) foreach (var group in groupByItemCodeLocationCode)
{ {
@ -650,6 +662,8 @@ public class SparePartIssueRequestEventHandler
requestDetail.ReceivedQty = allReceivedQty; requestDetail.ReceivedQty = allReceivedQty;
} }
} }
await SparePartIssueRequestManager.UpdateByEntityAsync(SparePartIssueRequest).ConfigureAwait(false);
} }
/// <summary> /// <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); var note = ObjectMapper.Map<ProductReceiptRequest, ProductReceiptNoteEditInput>(request);
note.ReceiptType = EnumReceiptType.ProductReceiptRequest;
if (!Enum.TryParse(note.Type, true, out EnumTransSubType transSubType)) if (!Enum.TryParse(note.Type, true, out EnumTransSubType transSubType))
{ {
throw new UserFriendlyException($"{note.Type} 不是有效的子事务类型"); 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(); CoatingIssueJobAutoMapperProfile();
CoatingIssueNoteAutoMapperProfile(); CoatingIssueNoteAutoMapperProfile();
CoatingIssueRequestAutoMapperProfile(); CoatingIssueRequestAutoMapperProfile();
SparePartIssueNoteAutoMapperProfile();
MesNoteAutoMapperProfile(); MesNoteAutoMapperProfile();
} }

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

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

Loading…
Cancel
Save