Browse Source

涂装叫料功能更新

dev_DY_CC
周红军 12 months ago
parent
commit
bb4fd8743e
  1. 11
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobPermissions.cs
  2. 31
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/DTOs/CoatingIssueJobDTO.cs
  3. 21
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs
  4. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobCheckInput.cs
  5. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobEditInput.cs
  6. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobPermissions.cs
  7. 23
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNotePermissions.cs
  8. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/DTOs/CoatingIssueNoteDTO.cs
  9. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs
  10. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteEditInput.cs
  11. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteImportInput.cs
  12. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs
  13. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/KittingIssueNotePermissions.cs
  14. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Permissions/StorePermissionDefinitionProvider.cs
  15. 19
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestPermissions.cs
  16. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDTO.cs
  17. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDetailDTO.cs
  18. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/ICoatingIssueRequestAppService.cs
  19. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestDetailInput.cs
  20. 8
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestEditInput.cs
  21. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestImportInput.cs
  22. 648
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAppService.cs
  23. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAutoMapperProfile.cs
  24. 5
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs
  25. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAutoMapperProfile.cs
  26. 303
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAppService.cs
  27. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAutoMapperProfile.cs
  28. 14
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs
  29. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobDetail.cs
  30. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobManager.cs
  31. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobManager.cs
  32. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobRepository.cs
  33. 55
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingssueExtension.cs
  34. 12
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs
  35. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteManager.cs
  36. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteManager.cs
  37. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteRepository.cs
  38. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequest.cs
  39. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestDetail.cs
  40. 7
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestManager.cs
  41. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestManager.cs
  42. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestRepository.cs
  43. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs
  44. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs
  45. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobEfCoreRepository.cs
  46. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs
  47. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteEfCoreRepository.cs
  48. 9
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/IssueRequests/CoatingIssueRequests/CoatingIssueRequestDbContextModelCreatingExtensions.cs
  49. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/IssueRequests/CoatingIssueRequests/CoatingIssueRequestEfCoreRepository.cs
  50. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContext.cs
  51. 3
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreEntityFrameworkCoreModule.cs
  52. 15
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/CoatingIssueJobAutoMapperProfile.cs
  53. 2
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Notes/CoatingIssueNoteAutoMapperProfile.cs
  54. 6
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/CoatingIssueRequestAutoMapperProfile.cs
  55. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/DataExchanges/AssembleIssueNoteEventHandler.cs
  56. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/DataExchanges/CoatingIssueNoteEventHandler.cs
  57. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/DataExchanges/KittingIssueNoteEventHandler.cs
  58. 128
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/CoatingIssueJobEventHandler.cs
  59. 0
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/CoatingIssueJobEventHandler.cs
  60. 689
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/CoatingIssueRequestEventHandler.cs
  61. 4
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/CoatingIssueNoteEventHandler.cs
  62. 1
      be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Transactions/CoatingIssueNoteEventHandler.cs

11
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobPermissions.cs

@ -1,7 +1,5 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
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.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
@ -15,9 +13,10 @@ public static class CoatingIssueJobPermissions
public static void AddCoatingIssueJobPermission(this PermissionGroupDefinition permissionGroup) public static void AddCoatingIssueJobPermission(this PermissionGroupDefinition permissionGroup)
{ {
var IssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(IssueJob))); var coatingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueJob)));
IssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); coatingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
IssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); coatingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
IssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); coatingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
} }
} }

31
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/DTOs/CoatingIssueJobDTO.cs

@ -1,15 +1,14 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
/// <summary> /// <summary>
/// 料任务 /// 涂装叫料任务
/// </summary> /// </summary>
[Display(Name = "料任务")] [Display(Name = "涂装叫料任务")]
public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO> public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO>
{ {
/// <summary> /// <summary>
@ -17,37 +16,25 @@ public class CoatingIssueJobDTO : SfsJobDTOBase<CoatingIssueJobDetailDTO>
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public EnumIssueRequestType IssueRequestType { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary> /// <summary>
/// 生产线 /// 生产线
/// </summary> /// </summary>
[Display(Name = "生产线")] [Display(Name = "生产线")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string ProdLine { get; set; } public string ProdLine { get; set; }
/// <summary> /// <summary>
/// 要货单号 /// 要货单号
/// </summary> /// </summary>
[Display(Name = "要货单号")] [Display(Name = "要货单号")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string MaterialRequestNumber { get; set; } public string CoatingRequestNumber { get; set; }
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

21
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobAppService.cs

@ -1,15 +1,30 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ICoatingIssueJobAppService public interface ICoatingIssueJobAppService
: ISfsJobAppServiceBase<CoatingIssueJobDTO, SfsJobRequestInputBase, CoatingIssueJobCheckInput, CoatingIssueJobEditInput> : ISfsJobAppServiceBase<CoatingIssueJobDTO, SfsJobRequestInputBase, CoatingIssueJobCheckInput, CoatingIssueJobEditInput>
{ {
Task CancelByMaterialRequestAsync(string coatingIssueNumber); Task CancelByMaterialRequestAsync(string requestNumber);
Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber); Task<List<CoatingIssueJobDTO>> GetByRequestNumberAsync(string requestNumber);
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
Task ExecuteDetailAsync(Guid masterId, Guid detailId, CoatingIssueJobDetailDTO issueJobDetailDto);
Task CompleteAsync(Guid id);
/// <summary>
/// 请求点了完成,任务全部都完成
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
Task CompleteByRequestNumberAsync(string requestNumber);
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobCheckInput.cs

@ -1,6 +1,4 @@
using Win_in.Sfs.Wms.Store.Application.Contracts; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
public class CoatingIssueJobCheckInput : SfsJobCheckInputBase public class CoatingIssueJobCheckInput : SfsJobCheckInputBase
{ {

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/CoatingIssueJobs/Inputs/CoatingIssueJobEditInput.cs

@ -4,9 +4,8 @@ using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput<CoatingIssueJobDetailInput> public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCreateInput<CoatingIssueJobDetailInput>
{ {
@ -24,7 +23,7 @@ public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCrea
[Display(Name = "要货单号")] [Display(Name = "要货单号")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
[StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")] [StringLength(SfsEfCorePropertyConst.CodeLength, ErrorMessage = "{0}最多输入{1}个字符")]
public string MaterialRequestNumber { get; set; } public string KittingRequestNumber { get; set; }
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
@ -59,12 +58,13 @@ public class CoatingIssueJobEditInput : SfsJobCreateUpdateInputBase, ISfsJobCrea
[Display(Name = "任务明细")] [Display(Name = "任务明细")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public List<CoatingIssueJobDetailInput> Details { get; set; } = new(); public List<CoatingIssueJobDetailInput> Details { get; set; } = new();
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#endregion #endregion
} }

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Jobs/IssueJobs/KittingIssueJobs/KittingIssueJobPermissions.cs

@ -14,11 +14,10 @@ public static class KittingIssueJobPermissions
public static void AddKittingIssueJobPermission(this PermissionGroupDefinition permissionGroup) public static void AddKittingIssueJobPermission(this PermissionGroupDefinition permissionGroup)
{ {
var KittingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueJob))); var kittingIssueJobPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueJob)));
KittingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); kittingIssueJobPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
KittingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); kittingIssueJobPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
KittingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); kittingIssueJobPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
} }
} }

23
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNotePermissions.cs

@ -1,31 +1,20 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class CoatingIssueNotePermissions public static class CoatingIssueNotePermissions
{ {
public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueNote);
public const string Default = StorePermissions.GroupName + "." + nameof(IssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
//自动发料记录
public const string AutoIssueNote = StorePermissions.GroupName + "." + nameof(AutoIssueNote);
//直接发料
public const string DirectIssueNote = StorePermissions.GroupName + "." + nameof(DirectIssueNote);
public static void AddCoatingIssueNotePermission(this PermissionGroupDefinition permissionGroup) public static void AddCoatingIssueNotePermission(this PermissionGroupDefinition permissionGroup)
{ {
var issueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(IssueNote))); var coatingIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueNote)));
issueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); coatingIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
issueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); coatingIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
issueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); coatingIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoIssueNote, StorePermissionDefinitionProvider.L(nameof(AutoIssueNote)));
permissionGroup.AddPermission(DirectIssueNote, StorePermissionDefinitionProvider.L(nameof(DirectIssueNote)));
} }
} }

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/DTOs/CoatingIssueNoteDTO.cs

@ -2,12 +2,12 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, IHasJobNumber, IHasRequestNumber public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, IHasJobNumber, IHasRequestNumber
{ {
/// <summary> /// <summary>
/// 任务ID /// 任务ID
/// </summary> /// </summary>
@ -19,6 +19,7 @@ public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, I
/// </summary> /// </summary>
[Display(Name = "请求代码")] [Display(Name = "请求代码")]
public string RequestNumber { get; set; } public string RequestNumber { get; set; }
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
@ -42,4 +43,6 @@ public class CoatingIssueNoteDTO : SfsStoreDTOBase<CoatingIssueNoteDetailDTO>, I
/// </summary> /// </summary>
[Display(Name = "确认时间")] [Display(Name = "确认时间")]
public DateTime? ConfirmTime { get; set; } public DateTime? ConfirmTime { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteAppService.cs

@ -3,15 +3,12 @@ using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ICoatingIssueNoteAppService : ISfsStoreMasterReadOnlyAppServiceBase<CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase> public interface ICoatingIssueNoteAppService : ISfsStoreMasterReadOnlyAppServiceBase<CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase>
{ {
Task<CoatingIssueNoteDTO> CreateAsync(CoatingIssueNoteEditInput input); Task<CoatingIssueNoteDTO> CreateAsync(CoatingIssueNoteEditInput input);
Task<CoatingIssueNoteDTO> ConfirmAsync(Guid id); Task<CoatingIssueNoteDTO> ConfirmAsync(Guid id);
} }

7
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteEditInput.cs

@ -2,9 +2,8 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
{ {
@ -28,7 +27,7 @@ public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary> /// </summary>
[Display(Name = "任务ID")] [Display(Name = "任务ID")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public string JobNumber { get; set; } public string JobNumber { get; set; }
/// <summary> /// <summary>
/// 明细列表 /// 明细列表
@ -53,5 +52,7 @@ public class CoatingIssueNoteEditInput : SfsStoreCreateOrUpdateInputBase
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
#endregion #endregion
} }

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/CoatingIssueNotes/Inputs/CoatingIssueNoteImportInput.cs

@ -1,8 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumber, IHasRequestNumber public class CoatingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumber, IHasRequestNumber
{ {
@ -32,4 +31,6 @@ public class CoatingIssueNoteImportInput : SfsStoreImportInputBase, IHasJobNumbe
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
[Required(ErrorMessage = "{0}是必填项")] [Required(ErrorMessage = "{0}是必填项")]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/IKittingIssueNoteAppService.cs

@ -10,7 +10,5 @@ public interface IKittingIssueNoteAppService : ISfsStoreMasterReadOnlyAppService
{ {
Task<KittingIssueNoteDTO> CreateAsync(KittingIssueNoteEditInput input); Task<KittingIssueNoteDTO> CreateAsync(KittingIssueNoteEditInput input);
Task<KittingIssueNoteDTO> ConfirmAsync(Guid id); Task<KittingIssueNoteDTO> ConfirmAsync(Guid id);
} }

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Notes/IssueNotes/KittingIssueNotes/KittingIssueNotePermissions.cs

@ -5,20 +5,16 @@ namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class KittingIssueNotePermissions public static class KittingIssueNotePermissions
{ {
public const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueNote); public const string Default = StorePermissions.GroupName + "." + nameof(KittingIssueNote);
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
public static void AddKittingIssueNotePermission(this PermissionGroupDefinition permissionGroup) public static void AddKittingIssueNotePermission(this PermissionGroupDefinition permissionGroup)
{ {
var kittingIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueNote))); var kittingIssueNotePermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(KittingIssueNote)));
kittingIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); kittingIssueNotePermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
kittingIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); kittingIssueNotePermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
kittingIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); kittingIssueNotePermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
} }
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Permissions/StorePermissionDefinitionProvider.cs

@ -29,13 +29,15 @@ public class StorePermissionDefinitionProvider : PermissionDefinitionProvider
storeGroup.AddMaterialRequestPermission(); storeGroup.AddMaterialRequestPermission();
storeGroup.AddInjectionIssueRequestPermission(); storeGroup.AddInjectionIssueRequestPermission();
storeGroup.AddKittingIssueRequestPermission(); storeGroup.AddKittingIssueRequestPermission();
storeGroup.AddCoatingIssueRequestPermission();
storeGroup.AddAssembleIssueRequestPermission(); storeGroup.AddAssembleIssueRequestPermission();
storeGroup.AddThirdLocationRequestPermission(); storeGroup.AddThirdLocationRequestPermission();
storeGroup.AddContainerRequestPermission(); storeGroup.AddContainerRequestPermission();
storeGroup.AddIssueNotePermission(); storeGroup.AddIssueNotePermission();
storeGroup.AddInjectionIssueNotePermission(); storeGroup.AddInjectionIssueNotePermission();
storeGroup.AddAssembleIssueNotePermission(); storeGroup.AddAssembleIssueNotePermission();
storeGroup.AddKittingIssueNotePermission(); storeGroup.AddCoatingIssueNotePermission();
storeGroup.AddKittingIssueNotePermission();
storeGroup.AddThirdLocationNotePermission(); storeGroup.AddThirdLocationNotePermission();
storeGroup.AddContainerNotePermission(); storeGroup.AddContainerNotePermission();
storeGroup.AddUnplannedReceiptNotePermission(); storeGroup.AddUnplannedReceiptNotePermission();

19
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/CoatingIssueRequestPermissions.cs

@ -1,27 +1,20 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public static class CoatingIssueRequestPermissions public static class CoatingIssueRequestPermissions
{ {
public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueRequest); public const string Default = StorePermissions.GroupName + "." + nameof(CoatingIssueRequest);
public const string Create = Default + "." + StorePermissions.CreateStr; public const string Create = Default + "." + StorePermissions.CreateStr;
public const string Update = Default + "." + StorePermissions.UpdateStr; public const string Update = Default + "." + StorePermissions.UpdateStr;
public const string Delete = Default + "." + StorePermissions.DeleteStr; public const string Delete = Default + "." + StorePermissions.DeleteStr;
//自动叫料申请
public const string AutoMaterialRequest = StorePermissions.GroupName + "." + nameof(AutoMaterialRequest);
public static void AddCoatingIssueRequestPermission(this PermissionGroupDefinition permissionGroup) public static void AddCoatingIssueRequestPermission(this PermissionGroupDefinition permissionGroup)
{ {
var MaterialRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueRequest))); var coatingIssueRequestPermission = permissionGroup.AddPermission(Default, StorePermissionDefinitionProvider.L(nameof(CoatingIssueRequest)));
MaterialRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr)); coatingIssueRequestPermission.AddChild(Create, StorePermissionDefinitionProvider.L(StorePermissions.CreateStr));
MaterialRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr)); coatingIssueRequestPermission.AddChild(Update, StorePermissionDefinitionProvider.L(StorePermissions.UpdateStr));
MaterialRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr)); coatingIssueRequestPermission.AddChild(Delete, StorePermissionDefinitionProvider.L(StorePermissions.DeleteStr));
permissionGroup.AddPermission(AutoMaterialRequest, StorePermissionDefinitionProvider.L(nameof(AutoMaterialRequest)));
} }
} }

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDTO.cs

@ -1,8 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestDTO : SfsStoreRequestDTOBase<CoatingIssueRequestDetailDTO>, IHasNumber public class CoatingIssueRequestDTO : SfsStoreRequestDTOBase<CoatingIssueRequestDetailDTO>, IHasNumber
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/DTOS/CoatingIssueRequestDetailDTO.cs

@ -3,9 +3,8 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase public class CoatingIssueRequestDetailDTO : SfsStoreDetailWithQtyDTOBase
{ {

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/ICoatingIssueRequestAppService.cs

@ -1,15 +1,16 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public interface ICoatingIssueRequestAppService public interface ICoatingIssueRequestAppService
: ISfsStoreRequestMasterAppServiceBase<CoatingIssueRequestDTO, SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetailDTO, SfsStoreRequestInputBase> : ISfsStoreRequestMasterAppServiceBase<CoatingIssueRequestDTO, SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetailDTO, SfsStoreRequestInputBase>
{ {
Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input); Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input);
Task UpdateStatusCompletedAsync(string number);
Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber);
} }

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestDetailInput.cs

@ -2,9 +2,8 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestDetailInput : SfsStoreDetailWithQtyInputBase public class CoatingIssueRequestDetailInput : SfsStoreDetailWithQtyInputBase
{ {

8
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestEditInput.cs

@ -1,19 +1,19 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
public class CoatingIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputBase public class CoatingIssueRequestEditInput : SfsStoreRequestCreateOrUpdateInputBase
{ {
#region Base #region Base
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
public string Type { get; set; } public EnumIssueRequestType IssueRequestType { get; set; }
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库

15
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application.Contracts/Requests/IssueRequest/CoatingIssueRequests/Inputs/CoatingIssueRequestImportInput.cs

@ -1,23 +1,18 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Application.Contracts; using Win_in.Sfs.Shared.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Application.Contracts;
[Display(Name = "叫料申请")] [Display(Name = "喷涂叫料申请导入")]
public class CoatingIssueRequestImportInput : SfsStoreImportInputBase public class CoatingIssueRequestImportInput : SfsStoreImportInputBase
{ {
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
[Display(Name = "叫料类型")] [Display(Name = "叫料类型")]
[Required(ErrorMessage = "{0}是必填项")] public EnumIssueRequestType IssueRequestType { get; set; }
[ImporterHeader(Name = "叫料类型")]
[ExporterHeader(DisplayName = "叫料类型")]
[ValueMapping("人工拉动", EnumMaterialRequestType.Issue_Manual)]
public string Type { get; set; }
/// <summary> /// <summary>
/// 物品代码 /// 物品代码

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

@ -1,26 +1,20 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Net.Http.Headers;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter; using Castle.Components.DictionaryAdapter;
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MyNamespace; using MyNamespace;
using Omu.ValueInjecter;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.ObjectMapping; using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Basedata.Domain.Shared;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
@ -28,6 +22,8 @@ using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy; using Win_in.Sfs.Wms.Store.Jobs.IssueJobs.proxy;
using Win_in.Sfs.Wms.Store.Notes; using Win_in.Sfs.Wms.Store.Notes;
using Win_in.Sfs.Wms.Store.Options; using Win_in.Sfs.Wms.Store.Options;
using static IdentityModel.ClaimComparer;
using static Volo.Abp.Identity.Settings.IdentitySettingNames;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
@ -41,94 +37,91 @@ public class CoatingIssueJobAppService
private readonly ICoatingIssueJobManager _coatingIssueJobManager; private readonly ICoatingIssueJobManager _coatingIssueJobManager;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly ITransferLibJobAppService _transferLibJobAppService; private readonly ITransferLibJobAppService _transferLibJobAppService;
private readonly ICoatingIssueNoteAppService _coatingIssueNoteAppService;
private readonly IExpectOutAppService _expectOutAppService;
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<RestoOptions> _options; private readonly IOptions<RestoOptions> _options;
protected ICoatingIssueRequestAppService CoatingIssueRequestAppService =>
LazyServiceProvider.LazyGetRequiredService<ICoatingIssueRequestAppService>();
public CoatingIssueJobAppService( public CoatingIssueJobAppService(
ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager, ICoatingIssueJobRepository repository, ICoatingIssueJobManager coatingIssueJobManager,
ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService ILocationAppService locationAppService, ITransferLibJobAppService transferLibJobAppService,
ICoatingIssueNoteAppService coatingIssueNoteAppService, IExpectOutAppService expectOutAppService
, IHttpClientFactory httpClientFactory , IHttpClientFactory httpClientFactory
, IOptions<RestoOptions> options , IOptions<RestoOptions> options
) : base(repository, coatingIssueJobManager)
) : base(
repository, coatingIssueJobManager)
{ {
_coatingIssueJobManager = coatingIssueJobManager; _coatingIssueJobManager = coatingIssueJobManager;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_transferLibJobAppService = transferLibJobAppService; _transferLibJobAppService = transferLibJobAppService;
_coatingIssueNoteAppService = coatingIssueNoteAppService;
_expectOutAppService = expectOutAppService;
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;
_options=options; _options = options;
} }
[HttpPost("add-many")] [HttpPost("add-many")]
public override async Task<List<CoatingIssueJobDTO>> CreateManyAsync(List<CoatingIssueJobEditInput> inputs) public override async Task<List<CoatingIssueJobDTO>> CreateManyAsync(List<CoatingIssueJobEditInput> inputs)
{ {
foreach (var input in inputs) foreach (var input in inputs)
{ {
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
} }
return await base.CreateManyAsync(inputs).ConfigureAwait(false); var coatingIssueJobDtos = await base.CreateManyAsync(inputs).ConfigureAwait(false);
foreach (var coatingIssueJobDto in coatingIssueJobDtos)
{
await CheckDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
}
return coatingIssueJobDtos;
} }
[HttpPost("")] [HttpPost("")]
public override async Task<CoatingIssueJobDTO> CreateAsync(CoatingIssueJobEditInput input) public override async Task<CoatingIssueJobDTO> CreateAsync(CoatingIssueJobEditInput input)
{ {
await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false); await CheckMinRowAndSetStatusAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(input).ConfigureAwait(false);
var coatingIssueJobDto = await base.CreateAsync(input).ConfigureAwait(false);
await CheckDimensionalStorehouseAsync(coatingIssueJobDto).ConfigureAwait(false);
return await base.CreateAsync(input).ConfigureAwait(false); return coatingIssueJobDto;
} }
/// <summary> [HttpPost("invalid")]
/// 判断是不是在最底层 如果不是则把状态变更为等待 并把库移推荐的From和To赋值 public override async Task CancelAsync(Guid id)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckMinRowAndSetStatusAsync(CoatingIssueJobEditInput input)
{ {
var jobDetailInputdetail = input.Details.FirstOrDefault(); var kittingJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (kittingJob == null)
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1)
{ {
input.JobStatus = EnumJobStatus.Wait; throw new UserFriendlyException($"未找到ID为 {id} 的任务");
}
jobDetailInputdetail.TransferLibFromArriveDate = jobDetailInputdetail.RecommendFromArriveDate;
jobDetailInputdetail.TransferLibFromContainerCode = jobDetailInputdetail.RecommendFromContainerCode;
jobDetailInputdetail.TransferLibFromExpireDate = jobDetailInputdetail.RecommendFromExpireDate;
jobDetailInputdetail.TransferLibFromLocationArea = jobDetailInputdetail.RecommendFromLocationArea;
jobDetailInputdetail.TransferLibFromLocationCode = jobDetailInputdetail.RecommendFromLocationCode;
jobDetailInputdetail.TransferLibFromLocationErpCode = jobDetailInputdetail.RecommendFromLocationErpCode;
jobDetailInputdetail.TransferLibFromLocationGroup = jobDetailInputdetail.RecommendFromLocationGroup;
jobDetailInputdetail.TransferLibFromLot = jobDetailInputdetail.RecommendFromLot;
jobDetailInputdetail.TransferLibFromPackingCode = jobDetailInputdetail.RecommendFromPackingCode;
jobDetailInputdetail.TransferLibFromProduceDate = jobDetailInputdetail.RecommendFromProduceDate;
jobDetailInputdetail.TransferLibFromQty = jobDetailInputdetail.RecommendFromQty;
jobDetailInputdetail.TransferLibFromSupplierBatch = jobDetailInputdetail.RecommendFromSupplierBatch;
jobDetailInputdetail.TransferLibFromWarehouseCode = jobDetailInputdetail.RecommendFromWarehouseCode;
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate; if (kittingJob.JobStatus == EnumJobStatus.Open || kittingJob.JobStatus == EnumJobStatus.Partial ||
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode; kittingJob.JobStatus == EnumJobStatus.Wait)
jobDetailInputdetail.TransferLibToExpireDate = jobDetailInputdetail.RecommendToExpireDate; {
jobDetailInputdetail.TransferLibToLocationArea = jobDetailInputdetail.RecommendToLocationArea; throw new UserFriendlyException($"任务状态不是{kittingJob.JobStatus == EnumJobStatus.Open}、" +
jobDetailInputdetail.TransferLibToLocationCode = jobDetailInputdetail.RecommendToLocationCode; $"{kittingJob.JobStatus == EnumJobStatus.Partial}、" +
jobDetailInputdetail.TransferLibToLocationErpCode = jobDetailInputdetail.RecommendToLocationErpCode; $"{kittingJob.JobStatus == EnumJobStatus.Wait}");
jobDetailInputdetail.TransferLibToLocationGroup = jobDetailInputdetail.RecommendToLocationGroup;
jobDetailInputdetail.TransferLibToLot = jobDetailInputdetail.RecommendToLot;
jobDetailInputdetail.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode;
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate;
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty;
jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch;
jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.RecommendToWarehouseCode;
} }
await _expectOutAppService.RemoveByNumberAsync(kittingJob.Number).ConfigureAwait(false);
kittingJob.JobStatus = EnumJobStatus.Cancelled;
await _repository.UpdateAsync(kittingJob).ConfigureAwait(false);
} }
[HttpPost("cancel-by-request/{requestNumber}")] [HttpPost("cancel-by-request/{requestNumber}")]
public virtual async Task CancelByMaterialRequestAsync(string requestNumber) public virtual async Task CancelByMaterialRequestAsync(string requestNumber)
{ {
var entities = await _repository.GetListAsync(p => p.MaterialRequestNumber == requestNumber) var entities = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber)
.ConfigureAwait(false); .ConfigureAwait(false);
foreach (var entity in entities) foreach (var entity in entities)
{ {
@ -136,38 +129,33 @@ public class CoatingIssueJobAppService
} }
} }
[HttpPost("invalid")]
public override async Task CancelAsync(Guid id)
{
var coatingIssueJob = await _repository.GetAsync(id).ConfigureAwait(false);
if (coatingIssueJob == null)
{
throw new UserFriendlyException($"未找到ID为 {id} 的任务");
}
await _coatingIssueJobManager.CancelAsync(coatingIssueJob).ConfigureAwait(false);
}
[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.MaterialRequestNumber == requestNumber) var entitys = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber)
.ConfigureAwait(false); .ConfigureAwait(false);
return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entitys); return ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entitys);
} }
/// <summary>
/// 库移回调
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost("Do-Call-Back")] [HttpPost("Do-Call-Back")]
public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto) public async Task DoTransferLibCallbackAsync(TransferLibJobDTO dto)
{ {
var job = await _repository.FindAsync(p => p.Number == dto.JobNumber).ConfigureAwait(false); var job = await _repository.FindAsync(p => p.Number == dto.CallJobNumber).ConfigureAwait(false);
//todo 等云峰写好换成真实的 if (job.JobStatus != EnumJobStatus.Wait)
var transferLibJobDto = await _transferLibJobAppService.GetByNumberAsync("AAA").ConfigureAwait(false); {
var transferLibNote = new TransferLibNote(); throw new UserFriendlyException($"任务状态不是{EnumJobStatus.Wait.GetDisplayName()}");
}
var transferLibNoteDetail = transferLibNote.Details.First(); var transferLibNoteDetail = dto.Details.First();
var jobDetail = job.Details.First(); var jobDetail = job.Details.First();
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate; jobDetail.TransferLibFromArriveDate = transferLibNoteDetail.HandledFromArriveDate;
@ -199,133 +187,391 @@ public class CoatingIssueJobAppService
jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode; jobDetail.TransferLibToWarehouseCode = transferLibNoteDetail.HandledToWarehouseCode;
await _repository.UpdateAsync(job).ConfigureAwait(false); await _repository.UpdateAsync(job).ConfigureAwait(false);
}
/// <summary>
/// 执行任务明细
/// </summary>
/// <returns></returns>
[HttpPost("ExecuteDetail/{masterId}")]
public async Task ExecuteDetailAsync(Guid masterId, Guid detailId, CoatingIssueJobDetailDTO issueJobDetailDto)
{
var coatingIssueJob = await _repository.GetAsync(masterId).ConfigureAwait(false);
coatingIssueJob.JobStatus = EnumJobStatus.Doing;
var coatingIssueJobDto = ObjectMapper.Map<CoatingIssueJob, CoatingIssueJobDTO>(coatingIssueJob);
coatingIssueJobDto.Details = new List<CoatingIssueJobDetailDTO> { issueJobDetailDto };
var coatingIssueNoteEditInput = await BuildCoatingIssueNoteAsync(coatingIssueJobDto).ConfigureAwait(false);
await _coatingIssueNoteAppService.CreateAsync(coatingIssueNoteEditInput).ConfigureAwait(false);
var issueJobDetail = ObjectMapper.Map<CoatingIssueJobDetailDTO, CoatingIssueJobDetail>(issueJobDetailDto);
var entityDetail = coatingIssueJob.Details.Find(p => p.Id == detailId);
issueJobDetail.HandledFromQty = entityDetail.HandledFromQty;
issueJobDetail.HandledToQty = entityDetail.HandledToQty;
issueJobDetail.HandledToQty += issueJobDetailDto.HandledToQty;
issueJobDetail.HandledFromQty += issueJobDetailDto.HandledFromQty;
coatingIssueJob.Details = new EditableList<CoatingIssueJobDetail>() { issueJobDetail };
if (coatingIssueJob.EnumIssueSendType == EnumIssueSendType.BoxQtyType) //按箱叫料 因为任务只有1箱 所以可以直接完成
{
await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false);
}
else
{
var detail = coatingIssueJob.Details.First(p => p.Id == issueJobDetailDto.Id);
if (issueJobDetail.HandledToQty >= detail.RequestQty)
{
await UpdateRequestAndjobStatusDoneAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false);
}
else
{
await RemoveExpectOutAsync(coatingIssueJob, issueJobDetailDto, issueJobDetailDto.HandledToQty).ConfigureAwait(false);
}
}
await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false);
}
/// <summary>
/// 完成任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("Complete/{id}")]
public async Task CompleteAsync(Guid id)
{
var coatingIssueJob = await _repository.FindAsync(id).ConfigureAwait(false);
coatingIssueJob.JobStatus = EnumJobStatus.Done;
await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(coatingIssueJob.CoatingRequestNumber).ConfigureAwait(false);
await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false);
}
/// <summary>
/// 请求点了完成,任务全部都完成
/// </summary>
/// <param name="requestNumber"></param>
/// <returns></returns>
[HttpPost("complete-by-request/{requestNumber}")]
public async Task CompleteByRequestNumberAsync(string requestNumber)
{
var coatingIssueJobs = await _repository.GetListAsync(p => p.CoatingRequestNumber == requestNumber).ConfigureAwait(false);
foreach (var coatingIssueJob in coatingIssueJobs)
{
coatingIssueJob.JobStatus = EnumJobStatus.Done;
await _repository.UpdateAsync(coatingIssueJob).ConfigureAwait(false);
await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
}
}
#region 立库
/// <summary>
/// 立体库同步
/// </summary>
/// <param name="input"></param>
/// <param name="p_loc"></param>
/// <returns></returns>
[HttpPost("sync-issue-job-stereo")]
public async Task<ReusltObject> SyncIssueJobStereoAsync(List<CoatingIssueJobDTO> input, string p_loc)
{
ReusltObject ret = new ReusltObject();
ret.Code = "1";
ret.Message = "操作成功";
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
try
{
List<IssueJobToRestoDetailDTO> IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>();
IssueJobToRestoDTO main = new IssueJobToRestoDTO();
main.OperatorName = CurrentUser.UserName;
foreach (var job in input)
{
foreach (var jobitem in job.Details)
{
IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO()
{
Count = jobitem.HandledToQty,
ProductNo = jobitem.ItemCode,
NeedSite = p_loc,
WorkNo = job.Number,
TaskNo = job.Number
});
}
}
main.Details = IssueJobToRestoDetailDTOs;
var httpclient = _httpClientFactory.CreateClient();
#if DEBUG
string json = System.Text.Json.JsonSerializer.Serialize(main);
_options.Value.Address = "http://localhost:59094/";//测试地址
_options.Value.Token = "";//测试token
_options.Value.UserName = "";//测试用户名
_options.Value.Password = "";//测试密码
#endif
if (!string.IsNullOrEmpty(_options.Value.Token))
{
var token = _options.Value.Token;
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
if (!string.IsNullOrEmpty(_options.Value.UserName) && !string.IsNullOrEmpty(_options.Value.Password))
{
var username = _options.Value.UserName;
var password = _options.Value.Password;
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{username}:{password}")));
}
IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, httpclient);
ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
}
catch (Exception ex)
{
ret = new ReusltObject();
ret.Code = "2";
ret.Message = ex.Message;
ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
}
return ret;
}
[HttpPost("receive-issue-job-stereo")]
public virtual async Task<ReusltObject> SyncReciveIssueJobStereoAsync(IssueRequestFromRestoDTO input)
{
#if DEBUG
var json = System.Text.Json.JsonSerializer.Serialize(input);
#endif
List<string> errors = new List<string>();
var ret = new ReusltObject()
{
Code = "1",
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
Message = "操作成功"
};
try
{
if (input.Jobs.Count > 0)
{
var jobs = input.Jobs;
var numbers = jobs.Select(p => p.JobNumber);
var query = _repository.WithDetails()
.Where(p => numbers.Contains(p.Number));
var entities = query.ToList();
var dtos = ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entities);
if (input.Jobs.Count == entities.Count)
{
errors.Add("立体库提交出库任务和WMS任务不符,请核对! \n");
}
foreach (var itm in dtos)
{
var first = jobs.FirstOrDefault<IssueJobFromRestoDTO>(p => p.JobNumber == itm.Number);
var itmDetails = itm.Details.ToList();
List<CoatingIssueJobDetailDTO> details = new List<CoatingIssueJobDetailDTO>();
foreach (var detail in first.Details)
{
var entity = itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode);
CoatingIssueJobDetailDTO dto = new CoatingIssueJobDetailDTO();
dto.HandledFromLocationCode = entity.HandledFromLocationCode;
dto.HandledToLocationCode = entity.HandledToLocationCode;
dto.ItemCode = detail.ItemCode;
dto.RecommendFromQty = detail.Qty;
dto.RecommendToQty = detail.Qty;
dto.HandledFromQty = detail.Qty;
dto.HandledToQty = detail.Qty;
dto.Status = entity.Status;
details.Add(dto);
}
itm.Details = details;
await CompleteAsync(itm.Id, itm).ConfigureAwait(false);
}
}
else
{
errors.Add("立体库确认单据里无数据! \n");
}
}
catch (Exception ex)
{
ret = new ReusltObject()
{
Code = "2",
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
Message = ex.Message
};
return ret;
}
if (errors.Count > 0)
{
ret = new ReusltObject()
{
Code = "2",
OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
Message = string.Join(",", errors.ToArray())
};
}
return ret;
}
#endregion
#region 私有
/// <summary>
/// 创建补料记录实体
/// </summary>
/// <param name="coatingIssueJobDto"></param>
/// <returns></returns>
private async Task<CoatingIssueNoteEditInput> BuildCoatingIssueNoteAsync(CoatingIssueJobDTO coatingIssueJobDto)
{
var coatingIssueNoteCreateInput =
ObjectMapper.Map<CoatingIssueJobDTO, CoatingIssueNoteEditInput>(coatingIssueJobDto);
coatingIssueNoteCreateInput.JobNumber = coatingIssueJobDto.Number;
await Task.CompletedTask.ConfigureAwait(false);
return coatingIssueNoteCreateInput;
}
/// <summary>
/// 判断是不是在最底层 如果不是则把状态变更为等待 并把库移推荐的From和To赋值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckMinRowAndSetStatusAsync(CoatingIssueJobEditInput input)
{
var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode != 1)
{
input.JobStatus = EnumJobStatus.Wait;
}
else if (loctionDto.Type == EnumLocationType.RAW && loctionDto.RowCode == 1)
{
jobDetailInputdetail.TransferLibFromArriveDate = jobDetailInputdetail.RecommendFromArriveDate;
jobDetailInputdetail.TransferLibFromContainerCode = jobDetailInputdetail.RecommendFromContainerCode;
jobDetailInputdetail.TransferLibFromExpireDate = jobDetailInputdetail.RecommendFromExpireDate;
jobDetailInputdetail.TransferLibFromLocationArea = jobDetailInputdetail.RecommendFromLocationArea;
jobDetailInputdetail.TransferLibFromLocationCode = jobDetailInputdetail.RecommendFromLocationCode;
jobDetailInputdetail.TransferLibFromLocationErpCode = jobDetailInputdetail.RecommendFromLocationErpCode;
jobDetailInputdetail.TransferLibFromLocationGroup = jobDetailInputdetail.RecommendFromLocationGroup;
jobDetailInputdetail.TransferLibFromLot = jobDetailInputdetail.RecommendFromLot;
jobDetailInputdetail.TransferLibFromPackingCode = jobDetailInputdetail.RecommendFromPackingCode;
jobDetailInputdetail.TransferLibFromProduceDate = jobDetailInputdetail.RecommendFromProduceDate;
jobDetailInputdetail.TransferLibFromQty = jobDetailInputdetail.RecommendFromQty;
jobDetailInputdetail.TransferLibFromSupplierBatch = jobDetailInputdetail.RecommendFromSupplierBatch;
jobDetailInputdetail.TransferLibFromWarehouseCode = jobDetailInputdetail.RecommendFromWarehouseCode;
jobDetailInputdetail.TransferLibToArriveDate = jobDetailInputdetail.RecommendToArriveDate;
jobDetailInputdetail.TransferLibToContainerCode = jobDetailInputdetail.RecommendToContainerCode;
jobDetailInputdetail.TransferLibToExpireDate = jobDetailInputdetail.RecommendToExpireDate;
jobDetailInputdetail.TransferLibToLot = jobDetailInputdetail.RecommendToLot;
jobDetailInputdetail.TransferLibToPackingCode = jobDetailInputdetail.RecommendToPackingCode;
jobDetailInputdetail.TransferLibToProduceDate = jobDetailInputdetail.RecommendToProduceDate;
jobDetailInputdetail.TransferLibToQty = jobDetailInputdetail.RecommendToQty;
jobDetailInputdetail.TransferLibToSupplierBatch = jobDetailInputdetail.RecommendToSupplierBatch;
jobDetailInputdetail.TransferLibToWarehouseCode = jobDetailInputdetail.TransferLibFromWarehouseCode;
jobDetailInputdetail.TransferLibToLocationArea = jobDetailInputdetail.TransferLibFromLocationArea;
jobDetailInputdetail.TransferLibToLocationCode = jobDetailInputdetail.TransferLibFromLocationCode;
jobDetailInputdetail.TransferLibToLocationErpCode = jobDetailInputdetail.TransferLibFromLocationErpCode;
jobDetailInputdetail.TransferLibToLocationGroup = jobDetailInputdetail.TransferLibFromLocationGroup;
}
}
/// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(CoatingIssueJobEditInput input)
{
var jobDetailInputdetail = input.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
input.JobStatus = EnumJobStatus.Wait;
}
}
return; /// <summary>
/// 判断是不是在立体库
/// </summary>
/// <param name="coatingIssueJobDto"></param>
/// <returns></returns>
private async Task CheckDimensionalStorehouseAsync(CoatingIssueJobDTO coatingIssueJobDto)
{
var jobDetailInputdetail = coatingIssueJobDto.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(jobDetailInputdetail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (loctionDto.Type == EnumLocationType.DimensionalStorehouse)
{
//TODO 立体库
var ret = await SyncIssueJobStereoAsync(new List<CoatingIssueJobDTO> { coatingIssueJobDto }, loctionDto.Code).ConfigureAwait(false);
if (ret.Code != "1")
{
throw new UserFriendlyException($"调用立体库不成功!原因:{ret.Message}");
}
}
}
/// <summary>
/// 修改当前任务状态 和 该任务的请求状态
/// </summary>
/// <param name="coatingIssueJob"></param>
/// <param name="coatingIssueJobDetailDto"></param>
/// <param name="handledToQty"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task UpdateRequestAndjobStatusDoneAsync(CoatingIssueJob coatingIssueJob,
CoatingIssueJobDetailDTO coatingIssueJobDetailDto, decimal handledToQty)
{
if (coatingIssueJob.JobStatus is EnumJobStatus.Closed or EnumJobStatus.Cancelled or EnumJobStatus.None
or EnumJobStatus.Done) //需要考虑下 多次提交的问题 所以不判断 进行中
{
throw new UserFriendlyException(
$"任务状态错误:编号为【{coatingIssueJob.Number}】的任务状态为【{coatingIssueJob.JobStatus.GetDisplayName()}】");
}
coatingIssueJob.JobStatus = EnumJobStatus.Done;
await RemoveExpectOutAsync(coatingIssueJob, coatingIssueJobDetailDto, handledToQty).ConfigureAwait(false);
//await _expectOutAppService.RemoveByNumberAsync(coatingIssueJob.Number).ConfigureAwait(false);
await CoatingIssueRequestAppService.UpdateStatusCompletedAsync(coatingIssueJob.CoatingRequestNumber)
.ConfigureAwait(false);
await Task.CompletedTask.ConfigureAwait(false);
} }
private async Task RemoveExpectOutAsync(CoatingIssueJob coatingIssueJob, CoatingIssueJobDetailDTO coatingIssueJobDetailDto,
decimal handledToQty)
{
await _expectOutAppService.RemoveByNumberAndInventoryAsync(coatingIssueJob.Number,
coatingIssueJobDetailDto.ItemCode,
coatingIssueJobDetailDto.HandledToLocationCode, coatingIssueJobDetailDto.HandledToPackingCode,
coatingIssueJobDetailDto.Status, coatingIssueJobDetailDto.HandledToLot,
handledToQty).ConfigureAwait(false);
}
//[HttpPost("sync-issue-job-stereo")] #endregion
//public virtual async Task<ReusltObject> SyncCoatingJobStereoAsync(List<CoatingIssueJobDTO> input)
//{
// ReusltObject ret=new ReusltObject();
// ret.Code = "1";
// ret.Message = "操作成功";
// ret.OperateTime = DateTime.Now.ToString("yyyy-MM-dd");
// List<IssueJobToRestoDetailDTO> IssueJobToRestoDetailDTOs = new List<IssueJobToRestoDetailDTO>();
// IssueJobToRestoDTO main=new IssueJobToRestoDTO();
// main.OperatorName=CurrentUser.UserName;
// foreach (var job in input)
// {
// foreach (var jobitem in job.Details)
// {
// IssueJobToRestoDetailDTOs.Add(new IssueJobToRestoDetailDTO()
// {
// Count=jobitem.HandledToQty,
// ProductNo=jobitem.ItemCode,
// NeedSite=jobitem.HandledToLocationCode,
// WorkNo=job.Number,
// TaskNo=job.Number
// });
// }
// }
// main.Details=IssueJobToRestoDetailDTOs;
// #region
// IssueJobToRestoClient client = new IssueJobToRestoClient(_options.Value.Address, _httpClientFactory.CreateClient());
// ret = await client.SyncIssueJobStereoAsync(main).ConfigureAwait(false);
// #endregion
// return ret;
//}
//[HttpPost("receive-issue-job-stereo")]
//public virtual async Task<ReusltObject> SyncReciveCoatingJobStereoAsync(IssueRequestFromRestoDTO input)
//{
// List<string> errors = new List<string>();
// var ret=new ReusltObject()
// {
// Code = "1",
// OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
// Message = "操作成功"
// };
// try
// {
// if (input.Jobs.Count > 0)
// {
// var inputs = input.Jobs;
// var numbers = inputs.Select(p => p.JobNumber);
// var query = _repository.WithDetails()
// .Where(p => numbers.Contains(p.Number));
// var entities = query.ToList();
// if (input.Jobs.Count == entities.Count) {
// errors.Add("出库任务和WMS出库任务不符,请核对! \n");
// }
// var dtos = ObjectMapper.Map<List<CoatingIssueJob>, List<CoatingIssueJobDTO>>(entities);
// foreach (var itm in dtos)
// {
// var first = inputs.FirstOrDefault<IssueJobFromRestoDTO>(p => p.JobNumber == itm.Number);
// var itmDetails = itm.Details;
// List<CoatingIssueJobDetailDTO> details = new List<CoatingIssueJobDetailDTO>();
// foreach (var detail in first.Details)
// {
// var entity=itmDetails.FirstOrDefault(p => p.ItemCode == detail.ItemCode);
// CoatingIssueJobDetailDTO dto = new CoatingIssueJobDetailDTO();
// dto.HandledFromLocationCode = entity.HandledFromContainerCode;
// dto.HandledToLocationCode = entity.HandledToLocationCode;
// dto.ItemCode = detail.ItemCode;
// dto.RecommendFromQty = detail.Qty;
// dto.RecommendToQty = detail.Qty;
// dto.HandledFromQty = detail.Qty;
// dto.HandledToQty = detail.Qty;
// details.Add(dto);
// }
// itm.Details = details;
// await CompleteAsync(itm.Id, itm).ConfigureAwait(false);
// }
// }
// else
// {
// errors.Add("立体库确认单据里无数据! \n");
// }
// }
// catch (Exception ex)
// {
// ret=new ReusltObject()
// {
// Code = "2",
// OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
// Message = ex.Message
// };
// return ret;
// }
// if (errors.Count > 0)
// {
// ret= new ReusltObject()
// {
// Code = "2",
// OperateTime = DateTime.Now.ToString("yyyy-MM-dd"),
// Message = string.Join(",",errors.ToArray())
// };
// }
// return ret;
//}
} }

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobAutoMapperProfile.cs

@ -2,7 +2,6 @@ using AutoMapper;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
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.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
@ -13,8 +12,6 @@ public partial class StoreApplicationAutoMapperProfile : Profile
CreateMap<CoatingIssueJob, CoatingIssueJobDTO>() CreateMap<CoatingIssueJob, CoatingIssueJobDTO>()
.ReverseMap(); .ReverseMap();
//CreateMap<CoatingIssueJobDTO, CoatingIssueJob>();
CreateMap<CoatingIssueJobDetail, CoatingIssueJobDetailDTO>() CreateMap<CoatingIssueJobDetail, CoatingIssueJobDetailDTO>()
; ;

5
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAppService.cs

@ -14,12 +14,11 @@ using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}coating-note")] [Route($"{StoreConsts.RootPath}coating-issue-note")]
public class CoatingIssueNoteAppService : public class CoatingIssueNoteAppService :
SfsStoreWithDetailsAppServiceBase<CoatingIssueNote, CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteEditInput, CoatingIssueNoteDetail, SfsStoreWithDetailsAppServiceBase<CoatingIssueNote, CoatingIssueNoteDTO, SfsStoreRequestInputBase, CoatingIssueNoteEditInput, CoatingIssueNoteDetail,
CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase, CoatingIssueNoteImportInput>, CoatingIssueNoteDetailDTO, SfsStoreRequestInputBase, CoatingIssueNoteImportInput>,
@ -60,6 +59,4 @@ public class CoatingIssueNoteAppService :
return ObjectMapper.Map<CoatingIssueNote, CoatingIssueNoteDTO>(coatingIssueNote); return ObjectMapper.Map<CoatingIssueNote, CoatingIssueNoteDTO>(coatingIssueNote);
} }
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteAutoMapperProfile.cs

@ -2,8 +2,6 @@ using AutoMapper;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
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.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;

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

@ -1,80 +1,68 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using DocumentFormat.OpenXml.Office.PowerPoint.Y2021.M06.Main; using Castle.Components.DictionaryAdapter;
using IdentityModel;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using NUglify.Helpers;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Basedata.Application;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared; using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;
/// <summary> /// <summary>
/// 喷涂叫料 /// 喷涂叫料申请
/// </summary> /// </summary>
[Authorize] [Authorize]
[Route($"{StoreConsts.RootPath}coating-request")] [Route($"{StoreConsts.RootPath}coating-issue-request")]
public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<CoatingIssueRequest, CoatingIssueRequestDTO, public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<CoatingIssueRequest, CoatingIssueRequestDTO,
SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetail, CoatingIssueRequestDetailDTO, SfsStoreRequestInputBase, CoatingIssueRequestEditInput, CoatingIssueRequestDetail, CoatingIssueRequestDetailDTO,
SfsStoreRequestInputBase, CoatingIssueRequestImportInput>, SfsStoreRequestInputBase, CoatingIssueRequestImportInput>,
ICoatingIssueRequestAppService ICoatingIssueRequestAppService
{ {
private readonly ICoatingIssueRequestManager _coatingMaterialRequestManager; private readonly ICoatingIssueRequestManager _coatingIssueRequestManager;
private readonly IItemStoreRelationAppService _itemStoreRelationApp; private readonly IItemStoreRelationAppService _itemStoreRelationApp;
private readonly IAreaAppService _areaApp; private readonly IAreaAppService _areaApp;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IItemBasicAppService _itemBasicAppService; private readonly IItemBasicAppService _itemBasicAppService;
private readonly IProductionLineAppService _productionLineAppService; private readonly IProductionLineAppService _productionLineAppService;
private readonly ICoatingIssueJobAppService _coatingIssueJobAppService;
private readonly ITransactionTypeAppService _transactionTypeAppService; private readonly ITransactionTypeAppService _transactionTypeAppService;
public CoatingIssueRequestAppService( public CoatingIssueRequestAppService(
ICoatingIssueRequestRepository repository, ICoatingIssueRequestRepository repository,
ICoatingIssueRequestManager coatingMaterialRequestManager, ICoatingIssueRequestManager coatingIssueRequestManager,
IPreparationPlanManager preparationPlanManager, IPreparationPlanManager preparationPlanManager,
IItemStoreRelationAppService itemStoreRelationApp, IItemStoreRelationAppService itemStoreRelationApp,
IAreaAppService areaApp, IAreaAppService areaApp,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IItemBasicAppService itemBasicAppService, IItemBasicAppService itemBasicAppService,
IProductionLineAppService productionLineAppService, IProductionLineAppService productionLineAppService,
ITransactionTypeAppService transactionTypeAppService ITransactionTypeAppService transactionTypeAppService, ICoatingIssueJobAppService coatingIssueJobAppService)
) : base(repository, coatingIssueRequestManager)
: base(repository, coatingMaterialRequestManager)
{ {
_coatingMaterialRequestManager = coatingMaterialRequestManager; _coatingIssueRequestManager = coatingIssueRequestManager;
_itemStoreRelationApp = itemStoreRelationApp; _itemStoreRelationApp = itemStoreRelationApp;
_areaApp = areaApp; _areaApp = areaApp;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_itemBasicAppService = itemBasicAppService; _itemBasicAppService = itemBasicAppService;
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_transactionTypeAppService = transactionTypeAppService; _transactionTypeAppService = transactionTypeAppService;
_coatingIssueJobAppService = coatingIssueJobAppService;
} }
public override async Task<CoatingIssueRequestDTO> HandleAsync(Guid id) public override async Task<CoatingIssueRequestDTO> HandleAsync(Guid id)
{ {
await Task.CompletedTask.ConfigureAwait(false); return await base.HandleAsync(id).ConfigureAwait(false);
return null;
} }
[HttpPost("")] [HttpPost("")]
public override async Task<CoatingIssueRequestDTO> CreateAsync(CoatingIssueRequestEditInput input) public override async Task<CoatingIssueRequestDTO> CreateAsync(CoatingIssueRequestEditInput input)
{ {
@ -86,18 +74,22 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
} }
} }
foreach (var detailInput in input.Details) //赋值生产线 foreach (var detailInput in input.Details)
{ {
var toLocationDto = var toLocationDto =
await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false); await _locationAppService.GetByCodeAsync(detailInput.ToLocationCode).ConfigureAwait(false);
CheckLocation(toLocationDto, detailInput.ToLocationCode); CheckLocation(toLocationDto, detailInput.ToLocationCode);
var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false); var itemBasicDto = await _itemBasicAppService.GetByCodeAsync(detailInput.ItemCode).ConfigureAwait(false);
CheckItemBasic(itemBasicDto, detailInput.ItemCode); CheckItemBasic(itemBasicDto, detailInput.ItemCode);
var productionLineDto = await _productionLineAppService.GetByLocationCodeAsync(detailInput.ToLocationCode)
.ConfigureAwait(false);
CheckProductionLine(productionLineDto, detailInput.ProdLine);
detailInput.ProdLine = productionLineDto.Code;
detailInput.ToLocationArea = toLocationDto.AreaCode; detailInput.ToLocationArea = toLocationDto.AreaCode;
detailInput.ToLocationGroup = toLocationDto.LocationGroupCode; detailInput.ToLocationGroup = toLocationDto.LocationGroupCode;
detailInput.ToWarehouseCode = toLocationDto.WarehouseCode; detailInput.ToWarehouseCode = toLocationDto.WarehouseCode;
detailInput.ProdLine = detailInput.ToLocationCode;
detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode; detailInput.ToLocationErpCode = toLocationDto.ErpLocationCode;
detailInput.ItemDesc1 = itemBasicDto.Desc1; detailInput.ItemDesc1 = itemBasicDto.Desc1;
@ -109,12 +101,13 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
//因为是刚创建的 所以发料数一定是0 //因为是刚创建的 所以发料数一定是0
detailInput.IssuedQty = 0; detailInput.IssuedQty = 0;
detailInput.RecommendType = EnumRecommendType.KITTING;
} }
await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false); await SetRequestAutoPropertiesAsync(input).ConfigureAwait(false);
var entity = ObjectMapper.Map<CoatingIssueRequestEditInput, CoatingIssueRequest>(input); var entity = ObjectMapper.Map<CoatingIssueRequestEditInput, CoatingIssueRequest>(input);
var result = await _coatingMaterialRequestManager.CreateByNumberAsync(entity).ConfigureAwait(false); var result = await _coatingIssueRequestManager.CreateByNumberAsync(entity).ConfigureAwait(false);
var dto = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(result); var dto = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(result);
@ -122,13 +115,14 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
} }
/// <summary> /// <summary>
/// 赋值Request业务属性 /// 赋值Request业务属性
/// </summary> /// </summary>
/// <param name="entity"></param> /// <param name="entity"></param>
/// <returns></returns> /// <returns></returns>
private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity) private async Task SetRequestAutoPropertiesAsync(CoatingIssueRequestEditInput entity)
{ {
var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None).ConfigureAwait(false); var tranType = await _transactionTypeAppService.GetByTransTypeAsync(EnumTransType.Issue, EnumTransSubType.None)
.ConfigureAwait(false);
Check.NotNull(tranType, "事务类型", "事务类型不存在"); Check.NotNull(tranType, "事务类型", "事务类型不存在");
entity.AutoSubmit = tranType.AutoSubmitRequest; entity.AutoSubmit = tranType.AutoSubmitRequest;
entity.AutoAgree = tranType.AutoAgreeRequest; entity.AutoAgree = tranType.AutoAgreeRequest;
@ -140,15 +134,239 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
[HttpPost("create-and-handle")] [HttpPost("create-and-handle")]
public async Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input) public async Task<CoatingIssueRequestDTO> CreateAndHandleAsync(CoatingIssueRequestEditInput input)
{ {
var coatingMaterialRequestDto = await CreateAsync(input).ConfigureAwait(false); var coatingIssueRequestDto = await CreateAsync(input).ConfigureAwait(false);
//await HandleAsync(coatingIssueRequestDto.Id).ConfigureAwait(false);
return coatingIssueRequestDto;
}
public override async Task<CoatingIssueRequestDTO> CancelAsync(Guid id)
{
var request = await _repository.GetAsync(id).ConfigureAwait(false);
var list = await _coatingIssueJobAppService.GetByRequestNumberAsync(request.Number).ConfigureAwait(false);
if (list.Any())
{
foreach (var coatingIssueJobDto in list)
{
if (coatingIssueJobDto.JobStatus == EnumJobStatus.Open ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Partial ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Doing ||
coatingIssueJobDto.JobStatus == EnumJobStatus.Wait)
{
await _coatingIssueJobAppService.CancelAsync(coatingIssueJobDto.Id).ConfigureAwait(false);
}
}
}
if (request.RequestStatus == EnumRequestStatus.Partial || request.RequestStatus == EnumRequestStatus.Handling ||
request.RequestStatus == EnumRequestStatus.New)
{
request.RequestStatus = EnumRequestStatus.Cancelled;
await _repository.UpdateAsync(request).ConfigureAwait(false);
}
else
{
throw new UserFriendlyException($"【{request.RequestStatus.GetDisplayName()}】状态不允许取消");
}
return ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(request);
}
[HttpPost("UpdateStatusCompleted")]
public async Task UpdateStatusCompletedAsync(string number)
{
var coatingIssueRequest = await _repository.FindAsync(p => p.Number == number).ConfigureAwait(false);
await UpdateCoatingIssueRequestDetailQtyAsync(coatingIssueRequest, new EditableList<CoatingIssueJobDTO>())
.ConfigureAwait(false);
var coatingIssueJobDtos = await _coatingIssueJobAppService.GetByRequestNumberAsync(coatingIssueRequest.Number)
.ConfigureAwait(false);
if (coatingIssueJobDtos.Any(p =>
p.JobStatus == EnumJobStatus.Open || p.JobStatus == EnumJobStatus.Doing ||
p.JobStatus == EnumJobStatus.Partial))
{
return;
}
var flag = true;
foreach (var detail in coatingIssueRequest.Details)
{
if (detail.Qty >= detail.IssuedQty)
{
flag = false;
return;
}
}
if (flag)
{
CheckStatus(EnumRequestStatus.Completed, coatingIssueRequest.RequestStatus);
coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
await _repository.UpdateAsync(coatingIssueRequest).ConfigureAwait(false);
}
}
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="addCoatingIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest coatingIssueRequest,
List<CoatingIssueJobDTO> addCoatingIssueJobDtos)
{
//原有任务
var existCoatingIssueJobDtos = await _coatingIssueJobAppService
.GetByRequestNumberAsync(coatingIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
var allCoatingIssueJobDtos = new List<CoatingIssueJobDTO>();
allCoatingIssueJobDtos.AddRange(addCoatingIssueJobDtos);
allCoatingIssueJobDtos.AddRange(existCoatingIssueJobDtos);
var groupByItemCodeLocationCode = coatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
foreach (var requestDetail in group)
{
//所有已发数量
decimal allIssuedQty = 0;
//所有已发数量
decimal allReceivedQty = 0;
foreach (var allCoatingIssueJobDto in allCoatingIssueJobDtos)
{
var jobDetailDtos = allCoatingIssueJobDto.Details.Where(p =>
p.ItemCode == group.Key.ItemCode && p.RequestLocationCode == group.Key.ToLocationCode);
//所有已发数量
allIssuedQty += jobDetailDtos.Sum(p => p.RequestQty);
//所有已发数量
allReceivedQty += jobDetailDtos.Sum(p => p.HandledToQty);
}
requestDetail.IssuedQty += allIssuedQty;
requestDetail.ReceivedQty += allReceivedQty;
}
}
await _repository.UpdateAsync(coatingIssueRequest).ConfigureAwait(false);
}
[HttpPost("IsHasNewJob")]
public async Task<string> IsHasNewJobAsync(string requestNumber, List<string> jobNumber)
{
var joblIssueJobDtos =
await _coatingIssueJobAppService.GetByRequestNumberAsync(requestNumber).ConfigureAwait(false);
if (joblIssueJobDtos != null && joblIssueJobDtos.Any())
{
var jobNumberList = joblIssueJobDtos.Select(p => p.Number);
var difference = jobNumberList.Except(jobNumber);
if (difference.Any())
{
var result = "已生成任务号";
difference.ForEach(p => result += "【" + p + "】");
result += "的任务";
return result;
}
return "无任务生成,请检查库存";
}
return "无任务生成,请检查库存";
}
public override async Task<CoatingIssueRequestDTO> CompleteAsync(Guid id)
{
var coatingIssueRequest = await _repository.GetAsync(id).ConfigureAwait(false);
if (coatingIssueRequest.RequestStatus == EnumRequestStatus.Handling ||
coatingIssueRequest.RequestStatus == EnumRequestStatus.Partial ||
coatingIssueRequest.RequestStatus == EnumRequestStatus.New)
{
coatingIssueRequest.RequestStatus = EnumRequestStatus.Completed;
}
else
{
throw new UserFriendlyException($"【{coatingIssueRequest.RequestStatus.GetDisplayName()}】状态不允许完成");
}
await HandleAsync(coatingMaterialRequestDto.Id).ConfigureAwait(false); await _coatingIssueJobAppService.CompleteByRequestNumberAsync(coatingIssueRequest.Number).ConfigureAwait(false);
return coatingMaterialRequestDto; return ObjectMapper.Map<CoatingIssueRequest, CoatingIssueRequestDTO>(await _repository.UpdateAsync(coatingIssueRequest)
.ConfigureAwait(false));
} }
#region 校验 #region 校验
private void CheckStatus(EnumRequestStatus targetStatus, EnumRequestStatus nowStatus)
{
var validSourceStatuses = new List<EnumRequestStatus>();
switch (targetStatus)
{
case EnumRequestStatus.None:
break;
case EnumRequestStatus.New:
break;
case EnumRequestStatus.Reviewing:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.New };
break;
case EnumRequestStatus.Refused:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Agreed:
validSourceStatuses = new List<EnumRequestStatus> { EnumRequestStatus.Reviewing };
break;
case EnumRequestStatus.Handling:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Agreed, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Completed:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Cancelled:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.New, EnumRequestStatus.Reviewing, EnumRequestStatus.Agreed
};
break;
case EnumRequestStatus.Abort:
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
case EnumRequestStatus.Partial:
{
validSourceStatuses = new List<EnumRequestStatus>
{
EnumRequestStatus.Handling, EnumRequestStatus.Partial
};
break;
}
default:
throw new ArgumentOutOfRangeException(nameof(targetStatus), targetStatus, null);
}
if (!validSourceStatuses.Contains(nowStatus))
{
throw new UserFriendlyException(
$"当前状态为 {nowStatus.GetDisplayName()} ,无法变更为 {targetStatus.GetDisplayName()}");
}
}
private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode) private void CheckItemBasic(ItemBasicDTO itemBasicDto, string itemCode)
{ {
if (itemBasicDto == null) if (itemBasicDto == null)
@ -164,9 +382,18 @@ public class CoatingIssueRequestAppService : SfsStoreRequestAppServiceBase<Coati
throw new UserFriendlyException($"库位代码为【{locationCode}】不存在"); throw new UserFriendlyException($"库位代码为【{locationCode}】不存在");
} }
if (locationDto.Type != EnumLocationType.WIP) if (locationDto.Type != EnumLocationType.KittingWip)
{
throw new UserFriendlyException(
$"库位代码【{locationCode}】不是【{EnumLocationType.KittingWip.GetDisplayName()}】类型");
}
}
private void CheckProductionLine(ProductionLineDTO productionLineDto, string productionCode)
{
if (productionLineDto == null)
{ {
throw new UserFriendlyException($"库位代码【{locationCode}】不是【{EnumLocationType.WIP.GetDisplayName()}】类型"); throw new UserFriendlyException($"未找到生产线【{productionCode}】");
} }
} }

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Application/Requests/IssuelRequests/CoatingIssueRequests/CoatingIssueRequestAutoMapperProfile.cs

@ -3,7 +3,6 @@ using Volo.Abp.AutoMapper;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Application; namespace Win_in.Sfs.Wms.Store.Application;

14
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJob.cs

@ -4,9 +4,8 @@ using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary> /// <summary>
/// 涂装发料任务 /// 涂装发料任务
@ -23,26 +22,23 @@ public class CoatingIssueJob : SfsJobAggregateRootBase<CoatingIssueJobDetail>
/// <summary> /// <summary>
/// 生产线 /// 生产线
/// </summary> /// </summary>
[IgnoreUpdate]
public string ProdLine { get; set; } public string ProdLine { get; set; }
/// <summary> /// <summary>
/// 要单号 /// 要单号
/// </summary> /// </summary>
[IgnoreUpdate] public string CoatingRequestNumber { get; set; }
public string MaterialRequestNumber { get; set; }
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[Display(Name = "使用在途库")] [Display(Name = "使用在途库")]
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
/// <summary> /// <summary>
/// 任务明细 /// 任务明细
/// </summary> /// </summary>
[IgnoreUpdate] public override List<CoatingIssueJobDetail> Details { get; set; } = new List<CoatingIssueJobDetail>();
public override List<CoatingIssueJobDetail> Details { get; set; } = new List<CoatingIssueJobDetail>();
public EnumIssueSendType EnumIssueSendType { get; set; }
} }

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobDetail.cs

@ -8,7 +8,6 @@ namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueJobDetail : SfsDetailEntityBase public class CoatingIssueJobDetail : SfsDetailEntityBase
{ {
#region 库存基础信息 #region 库存基础信息
/// <summary> /// <summary>

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/CoatingIssueJobManager.cs

@ -10,7 +10,6 @@ using Volo.Abp.Users;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Inventory.Application.Contracts; using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Domain;
@ -18,14 +17,14 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
{ {
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
private readonly IExpectOutAppService _expectOutAppService; private readonly IExpectOutAppService _expectOutAppService;
private readonly ICoatingIssueJobRepository _repository;
public CoatingIssueJobManager( public CoatingIssueJobManager(
ICoatingIssueJobRepository repository, IBalanceAppService balanceAppService, IExpectOutAppService expectOutAppService) : base(repository) ICoatingIssueJobRepository repository,
IBalanceAppService balanceAppService,
IExpectOutAppService expectOutAppService) : base(repository)
{ {
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
_expectOutAppService = expectOutAppService; _expectOutAppService = expectOutAppService;
_repository= repository;
} }
/// <summary> /// <summary>
@ -38,7 +37,6 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
public override async Task<CoatingIssueJob> CompleteAsync(CoatingIssueJob input, ICurrentUser user) public override async Task<CoatingIssueJob> CompleteAsync(CoatingIssueJob input, ICurrentUser user)
{ {
var entity = await Repository.FindAsync(input.Id).ConfigureAwait(false); var entity = await Repository.FindAsync(input.Id).ConfigureAwait(false);
var inputDetail = input.Details.First(); var inputDetail = input.Details.First();
var detail = entity.Details.First(); var detail = entity.Details.First();
@ -54,7 +52,6 @@ public class CoatingIssueJobManager : SfsJobManagerBase<CoatingIssueJob, Coating
$" 的库存被占用【预计出】"); $" 的库存被占用【预计出】");
} }
//var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(detail.HandledFromPackingCode, detail.ItemCode, detail.HandledFromLocationCode, detail.Status, detail.HandledFromLot).ConfigureAwait(false);
var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(inputDetail.HandledFromPackingCode, inputDetail.ItemCode, inputDetail.HandledFromLocationCode, inputDetail.Status, inputDetail.HandledFromLot).ConfigureAwait(false); var balanceDto = await _balanceAppService.GetRealQtyByPackingCodeAndItemCodeAndLocationCodeAndStatusAsync(inputDetail.HandledFromPackingCode, inputDetail.ItemCode, inputDetail.HandledFromLocationCode, inputDetail.Status, inputDetail.HandledFromLot).ConfigureAwait(false);
if (balanceDto.Qty <= 0) if (balanceDto.Qty <= 0)
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobManager.cs

@ -1,9 +1,8 @@
using System; using System;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs; namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueJobManager : IJobManager<CoatingIssueJob> public interface ICoatingIssueJobManager : IJobManager<CoatingIssueJob>
{ {

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingIssueJobRepository.cs

@ -1,6 +1,4 @@
using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
public interface ICoatingIssueJobRepository : ISfsJobRepositoryBase<CoatingIssueJob> public interface ICoatingIssueJobRepository : ISfsJobRepositoryBase<CoatingIssueJob>
{ {

55
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Jobs/IssueJobs/CoatingIssueJobs/ICoatingssueExtension.cs

@ -1,55 +0,0 @@
using Volo.Abp.Timing;
using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
public static class CoatingIssueExtension
{
// public static IssueJob SetDetails(this IssueJob job,IGuidGenerator guidGenerator, LocationDTO location)
// {
// foreach (var detail in job.Details)
// {
// detail.SetIdAndNumber(guidGenerator,job.Id,job.Number);
// detail.RecommendLocationCode = location.Code;
// detail.SetBatch(detail.RecommendBatch);
// }
// return job;
// }
public static IssueJob Init(this IssueJob job)
{
job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open;
return job;
}
public static IssueJob SetWorkGroup(this IssueJob job, string warehouseCode, string workGroupCode, string groupCode)
{
job.WorkGroupCode = workGroupCode;
job.WarehouseCode = warehouseCode;
job.ProdLine = groupCode;
return job;
}
public static IssueJob SetWorker(this IssueJob job, string worker)
{
job.Worker = worker;
return job;
}
public static IssueJob SetPriority(this IssueJob job, IClock clock)
{
job.Priority = PriorityHelper.GetPriority(clock);
job.PriorityIncrement = 1;
return job;
}
// public static IssueJob SetIdAndNumber(this IssueJob job,IGuidGenerator guidGenerator, ISnowflakeIdGenerator numberGenerator)
// {
// var number = (numberGenerator.CreateAsync().GetAwaiter().GetResult()).ToString();
// job.SetIdAndNumber(guidGenerator, number);
// return job;
// }
}

12
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNote.cs

@ -4,12 +4,11 @@ using System.ComponentModel.DataAnnotations;
using Volo.Abp; using Volo.Abp;
using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary> /// <summary>
/// 喷涂叫料申请 /// 涂装叫料记录
/// </summary> /// </summary>
public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail>, IHasJobNumber, IHasRequestNumber public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail>, IHasJobNumber, IHasRequestNumber
{ {
@ -22,12 +21,9 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
/// <summary> /// <summary>
/// 明细列表 /// 明细列表
/// </summary> /// </summary>
[IgnoreUpdate]
public override List<CoatingIssueNoteDetail> Details { get; set; } = new List<CoatingIssueNoteDetail>(); public override List<CoatingIssueNoteDetail> Details { get; set; } = new List<CoatingIssueNoteDetail>();
[IgnoreUpdate]
public string RequestNumber { get; set; } public string RequestNumber { get; set; }
/// <summary> /// <summary>
/// 叫料类型 /// 叫料类型
/// </summary> /// </summary>
@ -37,14 +33,12 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
/// <summary> /// <summary>
/// 使用在途库 /// 使用在途库
/// </summary> /// </summary>
[IgnoreUpdate]
public bool UseOnTheWayLocation { get; set; } public bool UseOnTheWayLocation { get; set; }
/// <summary> /// <summary>
/// 确认时间 /// 确认时间
/// </summary> /// </summary>
[Display(Name = "确认时间")] [Display(Name = "确认时间")]
[IgnoreUpdate]
public DateTime? ConfirmTime { get; set; } public DateTime? ConfirmTime { get; set; }
/// <summary> /// <summary>
@ -53,6 +47,8 @@ public class CoatingIssueNote : SfsStoreAggregateRootBase<CoatingIssueNoteDetail
[Display(Name = "已确认")] [Display(Name = "已确认")]
public bool Confirmed { get; set; } public bool Confirmed { get; set; }
public EnumIssueSendType EnumIssueSendType { get; set; }
public void Confirm(DateTime confirmTime) public void Confirm(DateTime confirmTime)
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteManager.cs

@ -4,9 +4,8 @@ using Microsoft.Extensions.Logging;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueNoteManager : SfsStoreManagerBase<CoatingIssueNote, CoatingIssueNoteDetail>, ICoatingIssueNoteManager public class CoatingIssueNoteManager : SfsStoreManagerBase<CoatingIssueNote, CoatingIssueNoteDetail>, ICoatingIssueNoteManager
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteManager.cs

@ -1,8 +1,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes; namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueNoteManager : ISfsStoreManager<CoatingIssueNote, CoatingIssueNoteDetail> public interface ICoatingIssueNoteManager : ISfsStoreManager<CoatingIssueNote, CoatingIssueNoteDetail>
{ {

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Notes/IssueNotes/CoatingIssueNotes/ICoatingIssueNoteRepository.cs

@ -1,6 +1,4 @@
using Win_in.Sfs.Wms.Store.Domain; namespace Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Notes.IssueNotes;
public interface ICoatingIssueNoteRepository : ISfsStoreRepositoryBase<CoatingIssueNote> public interface ICoatingIssueNoteRepository : ISfsStoreRepositoryBase<CoatingIssueNote>
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequest.cs

@ -2,9 +2,8 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Win_in.Sfs.Shared.Domain.Entities; using Win_in.Sfs.Shared.Domain.Entities;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
/// <summary> /// <summary>
/// 喷涂叫料申请 /// 喷涂叫料申请

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/CoatingIssueRequestDetail.cs

@ -3,9 +3,8 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation public class CoatingIssueRequestDetail : SfsStoreDetailWithQtyEntityBase, IHasToLocation
{ {

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

@ -1,15 +1,10 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using DocumentFormat.OpenXml.Math;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using static Win_in.Sfs.Wms.Store.Domain.Shared.StoreSettings;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
public class CoatingIssueRequestManager public class CoatingIssueRequestManager
: SfsStoreRequestManagerBase<CoatingIssueRequest, CoatingIssueRequestDetail> : SfsStoreRequestManagerBase<CoatingIssueRequest, CoatingIssueRequestDetail>

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

@ -1,10 +1,8 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueRequestManager : ISfsStoreRequestManager<CoatingIssueRequest, CoatingIssueRequestDetail>, public interface ICoatingIssueRequestManager : ISfsStoreRequestManager<CoatingIssueRequest, CoatingIssueRequestDetail>,
IBulkImportService<CoatingIssueRequest> IBulkImportService<CoatingIssueRequest>
{ {

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Domain/Requests/IssueRequests/CoatingIssuelRequests/ICoatingIssueRequestRepository.cs

@ -1,7 +1,6 @@
using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.Requests.MaterialRequests; namespace Win_in.Sfs.Wms.Store.Domain;
public interface ICoatingIssueRequestRepository : ISfsStoreRepositoryBase<CoatingIssueRequest>, public interface ICoatingIssueRequestRepository : ISfsStoreRepositoryBase<CoatingIssueRequest>,
ISfsBulkRepositoryBase<CoatingIssueRequest> ISfsBulkRepositoryBase<CoatingIssueRequest>

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/IStoreDbContext.cs

@ -2,10 +2,6 @@ using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
[ConnectionStringName(StoreDbProperties.ConnectionStringName)] [ConnectionStringName(StoreDbProperties.ConnectionStringName)]

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobDbContextModelCreatingExtensions.cs

@ -3,7 +3,6 @@ using Volo.Abp.EntityFrameworkCore.Modeling;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.EntityFrameworkCore; using Win_in.Sfs.Shared.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
@ -22,7 +21,7 @@ public static class CoatingIssueJobDbContextModelCreatingExtensions
//Configure Job base properties //Configure Job base properties
b.ConfigureJob<CoatingIssueJob, CoatingIssueJobDetail>(); b.ConfigureJob<CoatingIssueJob, CoatingIssueJobDetail>();
//Properties //Properties
b.Property(q => q.MaterialRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.CoatingRequestNumber).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.JobType).HasConversion<string>(); b.Property(q => q.JobType).HasConversion<string>();
b.Property(q => q.JobStatus).HasConversion<string>(); b.Property(q => q.JobStatus).HasConversion<string>();

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Jobs/IssueJobs/CoatingIssueJob/CoatingIssueJobEfCoreRepository.cs

@ -1,5 +1,5 @@
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

1
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteDbContextModelCreatingExtensions.cs

@ -2,7 +2,6 @@ using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling; using Volo.Abp.EntityFrameworkCore.Modeling;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Notes/IssueNotes/CoatingIssueNotes/CoatingIssueNoteEfCoreRepository.cs

@ -1,5 +1,5 @@
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

9
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/IssueRequests/CoatingIssueRequests/CoatingIssueRequestDbContextModelCreatingExtensions.cs

@ -1,7 +1,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling; using Volo.Abp.EntityFrameworkCore.Modeling;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;
@ -43,13 +43,16 @@ public static class CoatingIssueRequestDbContextModelCreatingExtensions
b.Property(q => q.ToLocationErpCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToLocationErpCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.ToWarehouseCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToWarehouseCode).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.ToLocationArea).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToLocationArea).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.ToLocationGroup).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ToLocationGroup).IsRequired().HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength); b.Property(q => q.ProdLine).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.IssuedQty).HasPrecision(18, 6); b.Property(q => q.IssuedQty).HasPrecision(18, 6);
b.Property(q => q.ReceivedQty).HasPrecision(18, 6); b.Property(q => q.ReceivedQty).HasPrecision(18, 6);
b.Property(q => q.Status).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>(); b.Property(q => q.Status).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>();
b.Property(q => q.PositionCode).HasMaxLength(SfsPropertyConst.CodeLength);
b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>(); b.Property(q => q.RecommendType).HasMaxLength(SfsPropertyConst.NameLength).HasConversion<string>();
//Relations //Relations
//Indexes //Indexes
b.HasIndex(q => new { q.Number, q.ItemCode, q.ToLocationCode }).IsUnique(); b.HasIndex(q => new { q.Number, q.ItemCode, q.ToLocationCode }).IsUnique();
b.HasIndex(q => new { q.ItemCode }); b.HasIndex(q => new { q.ItemCode });

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/Requests/IssueRequests/CoatingIssueRequests/CoatingIssueRequestEfCoreRepository.cs

@ -1,5 +1,5 @@
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests; using Win_in.Sfs.Wms.Store.Domain;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreDbContext.cs

@ -3,9 +3,6 @@ using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Equipments; using Win_in.Sfs.Wms.Store.Equipments;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

3
be/Modules/Store/src/Win_in.Sfs.Wms.Store.EntityFrameworkCore/StoreEntityFrameworkCoreModule.cs

@ -5,9 +5,6 @@ using Volo.Abp.EntityFrameworkCore.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Win_in.Sfs.Wms.Store.CountAdjustRequests; using Win_in.Sfs.Wms.Store.CountAdjustRequests;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
using Win_in.Sfs.Wms.Store.UnplannedIssueRequests; using Win_in.Sfs.Wms.Store.UnplannedIssueRequests;
namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore; namespace Win_in.Sfs.Wms.Store.EntityFrameworkCore;

15
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Jobs/CoatingIssueJobAutoMapperProfile.cs

@ -5,8 +5,6 @@ using Win_in.Sfs.Shared.Application;
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.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Event; namespace Win_in.Sfs.Wms.Store.Event;
@ -17,7 +15,7 @@ public partial class StoreEventAutoMapperProfile : Profile
CreateMap<CoatingIssueJob, CoatingIssueNote>() CreateMap<CoatingIssueJob, CoatingIssueNote>()
.ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number)) .ForMember(x => x.JobNumber, y => y.MapFrom(d => d.Number))
.ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.MaterialRequestNumber)) .ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.CoatingRequestNumber))
.ForMember(x => x.ActiveDate, y => y.MapFrom(d => DateTime.Now)) .ForMember(x => x.ActiveDate, y => y.MapFrom(d => DateTime.Now))
.ForMember(x => x.Worker, y => y.MapFrom(d => d.CompleteUserName)) .ForMember(x => x.Worker, y => y.MapFrom(d => d.CompleteUserName))
.Ignore(x => x.Confirmed) .Ignore(x => x.Confirmed)
@ -28,12 +26,21 @@ public partial class StoreEventAutoMapperProfile : Profile
; ;
CreateMap<CoatingIssueJob, CoatingIssueNoteEditInput>() CreateMap<CoatingIssueJob, CoatingIssueNoteEditInput>()
.ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.MaterialRequestNumber)) .ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.CoatingRequestNumber))
.Ignore(x => x.Confirmed) .Ignore(x => x.Confirmed)
.Ignore(x => x.JobNumber) .Ignore(x => x.JobNumber)
.Ignore(x => x.ActiveDate) .Ignore(x => x.ActiveDate)
; ;
CreateMap<CoatingIssueJobDetail, CoatingIssueNoteDetailInput>() CreateMap<CoatingIssueJobDetail, CoatingIssueNoteDetailInput>()
; ;
CreateMap<CoatingIssueJobDTO, CoatingIssueNoteEditInput>()
.ForMember(x => x.RequestNumber, y => y.MapFrom(d => d.CoatingRequestNumber))
.Ignore(x => x.Confirmed)
.Ignore(x => x.JobNumber)
.Ignore(x => x.ActiveDate)
;
CreateMap<CoatingIssueJobDetailDTO, CoatingIssueNoteDetailInput>()
;
} }
} }

2
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Notes/CoatingIssueNoteAutoMapperProfile.cs

@ -2,7 +2,6 @@ using AutoMapper;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
using Win_in.Sfs.Wms.Inventory.Application.Contracts; using Win_in.Sfs.Wms.Inventory.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Event; namespace Win_in.Sfs.Wms.Store.Event;
@ -49,5 +48,4 @@ public partial class StoreEventAutoMapperProfile : Profile
; ;
} }
} }

6
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/CoatingMaterialRequestAutoMapperProfile.cs → be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/AutoMapperProfiles/Requests/CoatingIssueRequestAutoMapperProfile.cs

@ -4,8 +4,6 @@ using Win_in.Sfs.Shared.Application;
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.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Event; namespace Win_in.Sfs.Wms.Store.Event;
@ -14,7 +12,7 @@ public partial class StoreEventAutoMapperProfile : Profile
private void CoatingIssueRequestAutoMapperProfile() private void CoatingIssueRequestAutoMapperProfile()
{ {
CreateMap<CoatingIssueRequest, CoatingIssueJobEditInput>() CreateMap<CoatingIssueRequest, CoatingIssueJobEditInput>()
.ForMember(x => x.MaterialRequestNumber, y => y.MapFrom(d => d.Number)) .ForMember(x => x.KittingRequestNumber, y => y.MapFrom(d => d.Number))
.Ignore(x => x.WarehouseCode) .Ignore(x => x.WarehouseCode)
.Ignore(x => x.UpStreamJobNumber) .Ignore(x => x.UpStreamJobNumber)
.Ignore(x => x.JobType) .Ignore(x => x.JobType)
@ -32,7 +30,7 @@ public partial class StoreEventAutoMapperProfile : Profile
.Ignore(x => x.CompleteUserName) .Ignore(x => x.CompleteUserName)
.Ignore(x => x.CompleteTime) .Ignore(x => x.CompleteTime)
.Ignore(x => x.Details) .Ignore(x => x.Details)
.Ignore(x => x.EnumIssueSendType)
; ;
} }
} }

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

@ -7,7 +7,6 @@ using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
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.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Event.DataExchanges; namespace Win_in.Sfs.Wms.Store.Event.DataExchanges;

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

@ -7,7 +7,6 @@ using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
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.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Event.DataExchanges; namespace Win_in.Sfs.Wms.Store.Event.DataExchanges;

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

@ -7,7 +7,6 @@ using Win_in.Sfs.Shared.Domain;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
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.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Event.DataExchanges; namespace Win_in.Sfs.Wms.Store.Event.DataExchanges;

128
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Jobs/CoatingIssueJobEventHandler.cs

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Castle.Components.DictionaryAdapter;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
@ -9,8 +10,6 @@ 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.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Event.BusinessJob; namespace Win_in.Sfs.Wms.Store.Event.BusinessJob;
@ -43,9 +42,7 @@ public class CoatingIssueJobEventHandler :
[UnitOfWork] [UnitOfWork]
public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<CoatingIssueJob> eventData) public virtual async Task HandleEventAsync(SfsCompletedEntityEventData<CoatingIssueJob> eventData)
{ {
var entity = eventData.Entity; await Task.CompletedTask.ConfigureAwait(false);
var coatingIssueNote = await BuildCoatingIssueNoteAsync(entity).ConfigureAwait(false);
await _coatingIssueNoteAppService.CreateAsync(coatingIssueNote).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -127,63 +124,70 @@ public class CoatingIssueJobEventHandler :
/// <returns></returns> /// <returns></returns>
private async Task CreateTransferLibAsync(CoatingIssueJob coatingIssueJob) private async Task CreateTransferLibAsync(CoatingIssueJob coatingIssueJob)
{ {
if (!await IsMinRowAsync(coatingIssueJob).ConfigureAwait(false)) foreach (var detail in coatingIssueJob.Details)
{ {
foreach (var detail in coatingIssueJob.Details) var locationDto = await _locationAppService.GetByCodeAsync(detail.RecommendFromLocationCode)
.ConfigureAwait(false);
if (locationDto.Type == EnumLocationType.RAW)
{ {
var input = new TransferLibRequestEditInput(); if (!await IsMinRowAsync(coatingIssueJob).ConfigureAwait(false))
input.CallBusinessType = nameof(ICoatingIssueJobAppService); {
input.CallJobNumber = coatingIssueJob.Number; var input = new TransferLibRequestEditInput();
input.CallRequestNumber = coatingIssueJob.MaterialRequestNumber; input.CallBusinessType = nameof(ICoatingIssueJobAppService);
input.CallServerName = "Win_in.Sfs.Wms.Store.Application.CoatingIssueJobAppService"; input.CallJobNumber = coatingIssueJob.Number;
input.Type = "Transfer_Warehouse"; input.CallRequestNumber = coatingIssueJob.CoatingRequestNumber;
input.UseOnTheWayLocation = true; input.CallServerName = "Win_in.Sfs.Wms.Store.Application.CoatingIssueJobAppService";
input.Type = "Transfer_Warehouse";
var detailInput = new TransferLibRequestDetailInput(); input.UseOnTheWayLocation = true;
detailInput.CallBusinessType = nameof(ICoatingIssueJobAppService);
detailInput.CallRequestNumber = coatingIssueJob.MaterialRequestNumber; var detailInput = new TransferLibRequestDetailInput();
detailInput.CallServerName = "Win_in.Sfs.Wms.Store.Application.CoatingIssueJobAppService"; detailInput.CallBusinessType = nameof(ICoatingIssueJobAppService);
detailInput.CallJobNumber = coatingIssueJob.Number; detailInput.CallRequestNumber = coatingIssueJob.CoatingRequestNumber;
detailInput.CallServerName = "Win_in.Sfs.Wms.Store.Application.CoatingIssueJobAppService";
detailInput.JobStatus = EnumJobStatus.Open; detailInput.CallJobNumber = coatingIssueJob.Number;
detailInput.ItemCode = detail.ItemCode;
detailInput.StdPackQty = detail.StdPackQty; detailInput.JobStatus = EnumJobStatus.Open;
detailInput.Uom = detail.Uom; detailInput.ItemCode = detail.ItemCode;
detailInput.Status = detail.Status; detailInput.StdPackQty = detail.StdPackQty;
detailInput.Uom = detail.Uom;
detailInput.RecommendFromQty = detail.RecommendFromQty; detailInput.Status = detail.Status;
detailInput.RecommendFromLot = detail.RecommendFromLot;
detailInput.RecommendFromPackingCode = detailInput.RecommendFromPackingCode; detailInput.RecommendFromQty = detail.RecommendFromQty;
detailInput.RecommendToLot = detail.RecommendToLot; detailInput.RecommendFromLot = detail.RecommendFromLot;
detailInput.RecommendFromPackingCode = detailInput.RecommendFromPackingCode;
detailInput.RecommendFromArriveDate = detail.RecommendFromArriveDate; detailInput.RecommendToLot = detail.RecommendToLot;
detailInput.RecommendFromExpireDate = detail.RecommendFromExpireDate;
detailInput.RecommendFromProduceDate = detail.RecommendFromProduceDate; detailInput.RecommendFromArriveDate = detail.RecommendFromArriveDate;
detailInput.RecommendFromSupplierBatch = detail.RecommendFromSupplierBatch; detailInput.RecommendFromExpireDate = detail.RecommendFromExpireDate;
detailInput.RecommendFromProduceDate = detail.RecommendFromProduceDate;
detailInput.RecommendFromLocationCode = detail.RecommendFromLocationCode; detailInput.RecommendFromSupplierBatch = detail.RecommendFromSupplierBatch;
detailInput.RecommendFromLocationGroup = detail.RecommendFromLocationGroup;
detailInput.RecommendFromLocationArea = detail.RecommendFromLocationArea; detailInput.RecommendFromLocationCode = detail.RecommendFromLocationCode;
detailInput.RecommendFromLocationErpCode = detail.RecommendFromLocationErpCode; detailInput.RecommendFromLocationGroup = detail.RecommendFromLocationGroup;
detailInput.RecommendFromWarehouseCode = detail.RecommendFromWarehouseCode; detailInput.RecommendFromLocationArea = detail.RecommendFromLocationArea;
detailInput.RecommendFromLocationErpCode = detail.RecommendFromLocationErpCode;
detailInput.RecommendToQty = detail.RecommendToQty; detailInput.RecommendFromWarehouseCode = detail.RecommendFromWarehouseCode;
detailInput.RecommendToLot = detail.RecommendToLot;
detailInput.RecommendToPackingCode = detailInput.RecommendToPackingCode; detailInput.RecommendToQty = detail.RecommendToQty;
detailInput.RecommendToLot = detail.RecommendToLot; detailInput.RecommendToLot = detail.RecommendToLot;
detailInput.RecommendToPackingCode = detailInput.RecommendToPackingCode;
detailInput.RecommendToArriveDate = detail.RecommendToArriveDate; detailInput.RecommendToLot = detail.RecommendToLot;
detailInput.RecommendToExpireDate = detail.RecommendToExpireDate;
detailInput.RecommendToProduceDate = detail.RecommendToProduceDate; detailInput.RecommendToArriveDate = detail.RecommendToArriveDate;
detailInput.RecommendToSupplierBatch = detail.RecommendToSupplierBatch; detailInput.RecommendToExpireDate = detail.RecommendToExpireDate;
detailInput.RecommendToProduceDate = detail.RecommendToProduceDate;
detailInput.RecommendToLocationCode = detail.RecommendToLocationCode; detailInput.RecommendToSupplierBatch = detail.RecommendToSupplierBatch;
detailInput.RecommendToLocationGroup = detail.RecommendToLocationGroup;
detailInput.RecommendToLocationArea = detail.RecommendToLocationArea; detailInput.RecommendToLocationCode = detail.RecommendToLocationCode;
detailInput.RecommendToLocationErpCode = detail.RecommendToLocationErpCode; detailInput.RecommendToLocationGroup = detail.RecommendToLocationGroup;
detailInput.RecommendToWarehouseCode = detail.RecommendToWarehouseCode; detailInput.RecommendToLocationArea = detail.RecommendToLocationArea;
detailInput.RecommendToLocationErpCode = detail.RecommendToLocationErpCode;
await _transferLibRequestAppService.CreateAsync(input).ConfigureAwait(false); detailInput.RecommendToWarehouseCode = detail.RecommendToWarehouseCode;
input.Details = new EditableList<TransferLibRequestDetailInput>() { detailInput };
await _transferLibRequestAppService.CreateAsync(input).ConfigureAwait(false);
}
} }
} }
} }
@ -212,9 +216,9 @@ public class CoatingIssueJobEventHandler :
{ {
var detail = coatingIssueJob.Details.FirstOrDefault(); var detail = coatingIssueJob.Details.FirstOrDefault();
var loctionDto = await _locationAppService.GetByCodeAsync(detail.RecommendFromLocationCode) var locationDto = await _locationAppService.GetByCodeAsync(detail.RecommendFromLocationCode)
.ConfigureAwait(false); .ConfigureAwait(false);
if (loctionDto.RowCode == 1) if (locationDto.Type == EnumLocationType.RAW && locationDto.RowCode == 1)
{ {
return true; return true;
} }

0
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/CoatingIssueJobEventHandler.cs

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

@ -1,21 +1,20 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Threading.Tasks; using System.Threading.Tasks;
using AutoMapper;
using Castle.Components.DictionaryAdapter; using Castle.Components.DictionaryAdapter;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.AutoMapper;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Basedata.Application.Contracts;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Domain.Shared.Enums.Store; using Win_in.Sfs.Shared.Domain.Shared.Enums.Store;
using Win_in.Sfs.Shared.Event; 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.Inventory.Domain;
using Win_in.Sfs.Wms.Store.Application.Contracts; using Win_in.Sfs.Wms.Store.Application.Contracts;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Domain.Shared;
using Win_in.Sfs.Wms.Store.Jobs.IssueJobs;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;
@ -32,17 +31,22 @@ public class CoatingIssueRequestEventHandler
private readonly IProductionLineItemAppService _productionLineItemAppService; private readonly IProductionLineItemAppService _productionLineItemAppService;
private readonly ILocationAppService _locationAppService; private readonly ILocationAppService _locationAppService;
private readonly IBalanceAppService _balanceAppService; private readonly IBalanceAppService _balanceAppService;
private IMapper _mapper;
//private readonly ICoatingIssueRequestManager _coatingIssueRequestManager;
public CoatingIssueRequestEventHandler( public CoatingIssueRequestEventHandler(
ICoatingIssueJobAppService coatingIssueJobAppService, IProductionLineAppService productionLineAppService, ICoatingIssueJobAppService coatingIssueJobAppService, IProductionLineAppService productionLineAppService,
ILocationAppService locationAppService, ILocationAppService locationAppService,
IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService) IBalanceAppService balanceAppService, IProductionLineItemAppService productionLineItemAppService
//, ICoatingIssueRequestManager coatingIssueRequestManager
)
{ {
_coatingIssueJobAppService = coatingIssueJobAppService; _coatingIssueJobAppService = coatingIssueJobAppService;
_productionLineAppService = productionLineAppService; _productionLineAppService = productionLineAppService;
_locationAppService = locationAppService; _locationAppService = locationAppService;
_balanceAppService = balanceAppService; _balanceAppService = balanceAppService;
_productionLineItemAppService = productionLineItemAppService; _productionLineItemAppService = productionLineItemAppService;
//_coatingIssueRequestManager = coatingIssueRequestManager;
} }
/// <summary> /// <summary>
@ -51,7 +55,9 @@ public class CoatingIssueRequestEventHandler
/// <param name="eventData">Event data</param> /// <param name="eventData">Event data</param>
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<CoatingIssueRequest> eventData) public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<CoatingIssueRequest> eventData)
{ {
await Task.CompletedTask.ConfigureAwait(false); var entity = eventData.Entity;
await CreateAllCoatingIssueJobAsync(entity).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -60,6 +66,8 @@ public class CoatingIssueRequestEventHandler
/// <param name="eventData">Event data</param> /// <param name="eventData">Event data</param>
public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<List<CoatingIssueRequest>> eventData) public virtual async Task HandleEventAsync(SfsCreatedEntityEventData<List<CoatingIssueRequest>> eventData)
{ {
var entity = eventData.Entity;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
} }
@ -72,22 +80,7 @@ public class CoatingIssueRequestEventHandler
{ {
var entity = eventData.Entity; var entity = eventData.Entity;
List<CoatingIssueJobEditInput> coatingIssueJobs = new EditableList<CoatingIssueJobEditInput>(); await CreateAllCoatingIssueJobAsync(entity).ConfigureAwait(false);
//switch (entity.Type)
//{
// case nameof(EnumIssueType.BoxQty):
// coatingIssueJobs = await CreateCoatingIssueJobWithBoxQtyTypeAsync(entity).ConfigureAwait(false);
// break;
// case nameof(EnumIssueType.Qty):
// coatingIssueJobs = await CreateCoatingIssueJobWithQtyTypeAsync(entity).ConfigureAwait(false);
// break;
//}
if (coatingIssueJobs.Any())
{
await _coatingIssueJobAppService.CreateManyAsync(coatingIssueJobs).ConfigureAwait(false);
}
} }
/// <summary> /// <summary>
@ -118,194 +111,135 @@ public class CoatingIssueRequestEventHandler
#region 按数量叫料 #region 按数量叫料
/// <summary> /// <summary>
/// 创建注塑任务 /// 创建注塑任务-按数量
/// </summary> /// </summary>
/// <param name="coatingMaterialRequest"></param> /// <param name="coatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetails"></param>
/// <param name="recommendbalanceDtos"></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 coatingMaterialRequest) (CoatingIssueRequest coatingIssueRequest, List<CoatingIssueRequestDetail> coatingIssueRequestDetails,
List<BalanceDTO> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{ {
var jobs = new List<CoatingIssueJobEditInput>(); var jobs = new List<CoatingIssueJobEditInput>();
//用来临时存放所有未生成任务的发料集合 如果生成完了再这里去掉
var tempDetailDtos =
ObjectMapper.Map<List<CoatingIssueRequestDetail>, List<CoatingIssueRequestDetailDTO>>(
coatingIssueRequestDetails);
var toLocationCodes = coatingMaterialRequest.Details.Select(p => p.ToLocationCode).Distinct().ToList(); //所有发送库位的集合 var coatingIssueJobDetailInputs = new List<CoatingIssueJobDetailInput>();
var toLocations = await _locationAppService.GetByCodesAsync(toLocationCodes).ConfigureAwait(false); //所有库位的集合
var coatingMaterialRequestDetails = coatingMaterialRequest.Details.Where(p => p.ToBeIssuedQty > 0); //所有还没发送物品的集合 if (recommendbalanceDtos != null && recommendbalanceDtos.Count > 0)
foreach (var coatingMaterialRequestDetail in coatingMaterialRequestDetails) //如果有还有剩余未叫料的数量 则创建新的任务
{ {
var toLocation = var queue = new Queue<BalanceDTO>(recommendbalanceDtos);
toLocations.FirstOrDefault(p => p.Code == coatingMaterialRequestDetail.ToLocationCode); //判断目标库位是否存在 while (queue.TryDequeue(out var balanceDto))
Check.NotNull(toLocation, "库位代码", $"库位 {coatingMaterialRequestDetail.ToLocationCode} 不存在");
//创建详情
var jobDetails =
await CreateCoatingIssueJobDetailInputsWithQtyTypeAsync(coatingMaterialRequest, coatingMaterialRequestDetail,
toLocation.LocationGroupCode).ConfigureAwait(false);
if (!jobDetails.Any())
{ {
continue; var next = false;
}
var fromLocationCode = jobDetails[0].RecommendFromLocationCode; var temp = tempDetailDtos.ToList();
var fromLocation = await _locationAppService.GetByCodeAsync(fromLocationCode).ConfigureAwait(false);
var job = jobs.FirstOrDefault(p => p.WorkGroupCode == fromLocation?.WorkGroupCode);
if (job == null || job.Details.Any(p => p.RecommendToLocationCode != coatingMaterialRequestDetail.ToLocationCode))
{
job = await BuildCoatingIssueJobCreateInputWithQtyTypeAsync(coatingMaterialRequest, fromLocation)
.ConfigureAwait(false);
jobs.Add(job);
}
job.Details.AddRange(jobDetails); foreach (var tempDetailDto in tempDetailDtos)
if (coatingMaterialRequestDetail.ToBeIssuedQty < 0) {
{ //未发送的数量
coatingMaterialRequestDetail.Status = EnumStatus.Close; tempDetailDto.Qty = tempDetailDto.Qty - tempDetailDto.IssuedQty;
}
} if (tempDetailDto.Qty > balanceDto.Qty) //需求量大于 这条推荐库存的余额
{
jobs = jobs.Where(p => p.Details.Any()).ToList(); tempDetailDto.Qty -= balanceDto.Qty;
}
else if (tempDetailDto.Qty <= balanceDto.Qty)
{
temp.Remove(tempDetailDto);
balanceDto.Qty = tempDetailDto.Qty;
}
coatingIssueJobDetailInputs.Add(
await BuildCoatingIssueJobDetailWithQtyTypeAsync(tempDetailDto, balanceDto)
.ConfigureAwait(false));
useBalanceList.Add(balanceDto);
if (balanceDto.Qty <= 0)
{
next = true;
break;
}
}
var openRequestDetails = tempDetailDtos = temp;
coatingMaterialRequest.Details.Where(p => p.Status != EnumStatus.Close).ToList();
if (!openRequestDetails.Any()) if (next)
{ {
return jobs; }
}
} }
if (coatingIssueJobDetailInputs.Any())
var enableMultipleCreateCoatingIssueJob = await SettingManager
.IsTrueAsync(StoreSettings.MaterialRequest.EnableMultipleCreateIssueJob).ConfigureAwait(false);
if (enableMultipleCreateCoatingIssueJob)
{ {
//coatingMaterialRequest.Partial(); var coatingIssueJobEditInput = new CoatingIssueJobEditInput();
} coatingIssueJobEditInput = await BuildCoatingIssueJobCreateInputWithQtyTypeAsync(coatingIssueRequest,
else coatingIssueRequestDetails.First()).ConfigureAwait(false);
{ coatingIssueJobEditInput.Details = coatingIssueJobDetailInputs;
var sb = new StringBuilder(); jobs.Add(coatingIssueJobEditInput);
foreach (var openRequestDetail in openRequestDetails)
{
sb.AppendLine(
$"{openRequestDetail.ItemCode}请求数量 {openRequestDetail.Qty},可用库存数量 {openRequestDetail.IssuedQty}");
}
throw new UserFriendlyException($"{sb} 可用库存数量不足, 无法生成发料任务");
} }
return jobs; return jobs;
} }
/// <summary> /// <summary>
/// 构造注塑任务 /// 构造注塑任务-按数量
/// </summary> /// </summary>
/// <param name="coatingMaterialRequest"></param> /// <param name="coatingIssueRequest"></param>
/// <param name="fromLocation"></param> /// <param name="requestDetailInput"></param>
/// <returns></returns> /// <returns></returns>
private async Task<CoatingIssueJobEditInput> BuildCoatingIssueJobCreateInputWithQtyTypeAsync( private async Task<CoatingIssueJobEditInput> BuildCoatingIssueJobCreateInputWithQtyTypeAsync(
CoatingIssueRequest coatingMaterialRequest, CoatingIssueRequest coatingIssueRequest, CoatingIssueRequestDetail requestDetailInput)
LocationDTO fromLocation)
{ {
CoatingIssueJobEditInput job; var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(coatingIssueRequest);
job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(coatingMaterialRequest);
job.JobType = EnumJobType.IssueJob; job.JobType = EnumJobType.IssueJob;
job.JobStatus = EnumJobStatus.Open; job.JobStatus = EnumJobStatus.Open;
job.WorkGroupCode = fromLocation.WorkGroupCode; job.WorkGroupCode = requestDetailInput.ToLocationGroup;
job.WarehouseCode = fromLocation.WarehouseCode; job.WarehouseCode = requestDetailInput.ToWarehouseCode;
job.Worker = coatingMaterialRequest.Worker; job.Worker = coatingIssueRequest.Worker;
if (string.IsNullOrEmpty(job.Worker)) job.KittingRequestNumber = coatingIssueRequest.Number;
{ job.EnumIssueSendType = EnumIssueSendType.QtyType;
job.Worker = "admin";
}
job.MaterialRequestNumber = coatingMaterialRequest.Number;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return job; return job;
} }
/// <summary>
/// 创建注塑任务明细
/// </summary>
/// <param name="coatingMaterialRequest"></param>
/// <param name="coatingMaterialRequestDetail"></param>
/// <param name="toLocationGroupCode"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<List<CoatingIssueJobDetailInput>> CreateCoatingIssueJobDetailInputsWithQtyTypeAsync(
CoatingIssueRequest coatingMaterialRequest,
CoatingIssueRequestDetail coatingMaterialRequestDetail, string toLocationGroupCode)
{
var jobDetails = new List<CoatingIssueJobDetailInput>();
//获取推荐库存
var productionLineDto = await _productionLineAppService
.GetByLocationCodeAsync(coatingMaterialRequestDetail.ToLocationCode).ConfigureAwait(false);
var productionLineItemDtos = await _productionLineItemAppService
.GetByProductLineCodeAsync(productionLineDto.Code).ConfigureAwait(false);
if (productionLineItemDtos == null)
{
throw new UserFriendlyException($"物品代码【{coatingMaterialRequestDetail.ItemCode}】没有对应的【生产线物品关系】");
}
var productionLineItemDto =
productionLineItemDtos.FirstOrDefault(p => p.ItemCode == coatingMaterialRequestDetail.ItemCode);
var input = new RecommendBalanceRequestInput
{
ItemCode = coatingMaterialRequestDetail.ItemCode,
Qty = coatingMaterialRequestDetail.ToBeIssuedQty,
//LocationTypes = transactionType.OutLocationTypes, productionLineItemDto.RawLocationCodeListJson
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = JsonSerializer.Deserialize<List<string>>(productionLineItemDto.RawLocationCodeListJson)
};
var recommendList = await _balanceAppService.GetRecommendBalancesByLocationsAsync(input).ConfigureAwait(false);
//没有推荐库存时 跳过此明细 不生成任务
if (recommendList.Count != 0)
{
foreach (var recommend in recommendList)
{
//拿走需求量
var detail =
await BuildCoatingIssueJobDetailWithQtyTypeAsync(coatingMaterialRequestDetail, recommend,
toLocationGroupCode)
.ConfigureAwait(false);
if (coatingMaterialRequest.UseOnTheWayLocation)
{
//获取在途库
var locationDto = await _locationAppService.GetFirstByTypeAsync(EnumLocationType.TRANSPORT)
.ConfigureAwait(false);
detail.OnTheWayLocationCode = locationDto.Code;
}
jobDetails.Add(detail);
coatingMaterialRequestDetail.IssuedQty += recommend.Qty;
//await _coatingMaterialRequestManager.UpdateDetailsAsync(coatingMaterialRequest).ConfigureAwait(false);
}
}
return jobDetails;
}
/// <summary> /// <summary>
/// 构造注塑任务明细 /// 构造注塑任务明细-按数量
/// </summary> /// </summary>
/// <param name="coatingMaterialRequestDetail"></param> /// <param name="coatingIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <param name="toLocationGroupCode"></param>
/// <returns></returns> /// <returns></returns>
private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithQtyTypeAsync( private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithQtyTypeAsync(
CoatingIssueRequestDetail coatingMaterialRequestDetail, BalanceDTO balance, string toLocationGroupCode) CoatingIssueRequestDetailDTO coatingIssueRequestDetail, BalanceDTO balance)
{ {
//ProductionLineDTO prodLine = await _productionLineAppService.GetByLocationGroupCodeAsync(toLocationGroupCode).ConfigureAwait(false); var detail = new CoatingIssueJobDetailInput();
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode;
var detail = ObjectMapper.Map<BalanceDTO, CoatingIssueJobDetailInput>(balance); detail.PositionCode = coatingIssueRequestDetail.PositionCode;
detail.RequestLocationCode = coatingMaterialRequestDetail.ToLocationCode; detail.RecommendType = coatingIssueRequestDetail.RecommendType;
detail.PositionCode = coatingMaterialRequestDetail.PositionCode; detail.Uom = balance.Uom;
detail.RecommendType = coatingMaterialRequestDetail.RecommendType; detail.ItemCode = balance.ItemCode;
detail.ItemDesc2 = balance.ItemDesc2;
detail.ItemDesc1 = balance.ItemDesc1;
detail.ItemName = balance.ItemName;
detail.ProdLine = coatingIssueRequestDetail.ProdLine;
detail.RequestQty = balance.Qty;
detail.StdPackQty = coatingIssueRequestDetail.StdPackQty;
detail.Status = balance.Status;
detail.RequestLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RequestLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RequestWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RequestLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RecommendFromPackingCode = balance.PackingCode; detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendFromContainerCode = balance.ContainerCode; detail.RecommendFromContainerCode = balance.ContainerCode;
@ -315,21 +249,69 @@ public class CoatingIssueRequestEventHandler
detail.RecommendFromLot = balance.Lot; detail.RecommendFromLot = balance.Lot;
detail.RecommendFromProduceDate = balance.ProduceDate; detail.RecommendFromProduceDate = balance.ProduceDate;
detail.RecommendFromArriveDate = balance.ArriveDate; detail.RecommendFromArriveDate = balance.ArriveDate;
detail.RecommendFromQty = balance.Qty;
detail.RecommendFromContainerCode = balance.ContainerCode;
detail.RecommendFromPackingCode = balance.PackingCode;
detail.RecommendToPackingCode = balance.PackingCode;
detail.RecommendToContainerCode = balance.ContainerCode;
detail.RecommendToSupplierBatch = balance.SupplierBatch;
detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToExpireDate = balance.ExpireDate;
detail.RecommendToLot = balance.Lot;
detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToQty = balance.Qty;
detail.RecommendToContainerCode = balance.ContainerCode;
detail.RecommendToPackingCode = balance.PackingCode;
detail.RecommendFromLocationArea = balance.LocationArea; detail.RecommendFromLocationArea = balance.LocationArea;
detail.RecommendFromLocationCode = balance.LocationCode; detail.RecommendFromLocationCode = balance.LocationCode;
detail.RecommendFromLocationErpCode = balance.LocationErpCode; detail.RecommendFromLocationErpCode = balance.LocationErpCode;
detail.RecommendFromLocationGroup = balance.LocationGroup; detail.RecommendFromLocationGroup = balance.LocationGroup;
detail.RecommendFromWarehouseCode = balance.WarehouseCode; detail.RecommendFromWarehouseCode = balance.WarehouseCode;
detail.RecommendFromQty = balance.Qty;
detail.Uom = balance.Uom;
detail.RecommendToLocationCode = coatingMaterialRequestDetail.ToLocationCode; detail.RecommendToLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = coatingMaterialRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = coatingMaterialRequestDetail.ToLocationArea; detail.RecommendToLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = coatingMaterialRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibFromContainerCode = balance.ContainerCode;
detail.TransferLibFromSupplierBatch = balance.SupplierBatch;
detail.TransferLibFromProduceDate = balance.ProduceDate;
detail.TransferLibFromExpireDate = balance.ExpireDate;
detail.TransferLibFromLot = balance.Lot;
detail.TransferLibFromProduceDate = balance.ProduceDate;
detail.TransferLibFromArriveDate = balance.ArriveDate;
detail.TransferLibFromQty = balance.Qty;
detail.TransferLibFromContainerCode = balance.ContainerCode;
detail.TransferLibFromPackingCode = balance.PackingCode;
detail.TransferLibToPackingCode = balance.PackingCode;
detail.TransferLibToContainerCode = balance.ContainerCode;
detail.TransferLibToSupplierBatch = balance.SupplierBatch;
detail.TransferLibToProduceDate = balance.ProduceDate;
detail.TransferLibToExpireDate = balance.ExpireDate;
detail.TransferLibToLot = balance.Lot;
detail.TransferLibToProduceDate = balance.ProduceDate;
detail.TransferLibToArriveDate = balance.ArriveDate;
detail.TransferLibToQty = balance.Qty;
detail.TransferLibToPackingCode = balance.PackingCode;
detail.TransferLibFromLocationArea = balance.LocationArea;
detail.TransferLibFromLocationCode = balance.LocationCode;
detail.TransferLibFromLocationErpCode = balance.LocationErpCode;
detail.TransferLibFromLocationGroup = balance.LocationGroup;
detail.TransferLibFromWarehouseCode = balance.WarehouseCode;
detail.TransferLibToLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.TransferLibToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.TransferLibToLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.TransferLibToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.TransferLibToLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
//detail.ProdLine = prodLine == null ? toLocationGroupCode : prodLine.Code;
detail.ProdLine = toLocationGroupCode;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
} }
@ -339,72 +321,71 @@ public class CoatingIssueRequestEventHandler
#region 按箱叫料 #region 按箱叫料
/// <summary> /// <summary>
/// 创建注塑任务 /// 创建注塑任务 按箱叫料-按箱
/// </summary> /// </summary>
/// <param name="coatingMaterialRequest"></param> /// <param name="coatingIssueRequest"></param>
/// <param name="coatingIssueRequestDetailList"></param>
/// <param name="recommendbalanceDtos"></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 coatingMaterialRequest) (
CoatingIssueRequest coatingIssueRequest,
List<CoatingIssueRequestDetail> coatingIssueRequestDetailList,
List<SortBalance> recommendbalanceDtos,
List<BalanceDTO> useBalanceList)
{ {
var inputJobs = new List<CoatingIssueJobEditInput>(); var inputJobs = new List<CoatingIssueJobEditInput>();
var inputExpectOutEditInput = new ExpectOutEditInput();
//已用的库存的箱码集合
var useBalanceList = new List<string>();
var groupByItemCodeAndLocationCode = //已用的库存的集合
coatingMaterialRequest.Details.GroupBy(p => new { p.ItemCode, p.ToLocationCode }); useBalanceList = useBalanceList;
foreach (var locationCodeItemCodeGroup in groupByItemCodeAndLocationCode) foreach (var detail in coatingIssueRequestDetailList)
{ {
var inputDetails = coatingMaterialRequest.Details.Where(p => //当前零件的集合
p.ItemCode == locationCodeItemCodeGroup.Key.ItemCode && var inputDetails = coatingIssueRequestDetailList;
p.ToLocationCode == locationCodeItemCodeGroup.Key.ToLocationCode);
var inputDetailTemplate = inputDetails.First();
//获取请求下 这个零件和这个库位一个需要多少箱 //获取请求下 这个零件和这个库位一个需要多少箱
var sumBoxQty = inputDetails.Sum(p => p.BoxQty); var sumBoxQty = inputDetails.Sum(p => p.BoxQty - p.IssuedQty);
//获取生产线 //获取生产线
var productionLineDto = await _productionLineAppService var productionLineDto = await _productionLineAppService
.GetByLocationCodeAsync(inputDetails.First().ToLocationCode).ConfigureAwait(false); .GetByLocationCodeAsync(inputDetails.First().ToLocationCode).ConfigureAwait(false);
if (productionLineDto == null)
{
throw new UserFriendlyException($"库位【{inputDetailTemplate.ToLocationCode}】没有对应的【生产线】");
}
var productLineCodeAndItemCode = await _productionLineItemAppService var productLineCodeAndItemCode = await _productionLineItemAppService
.GetByProductLineCodeAndItemCodeAsync(productionLineDto.Code, inputDetailTemplate.ItemCode) .GetByProductLineCodeAndItemCodeAsync(productionLineDto.Code, detail.ItemCode)
.ConfigureAwait(false); .ConfigureAwait(false);
if (productLineCodeAndItemCode == null) if (productLineCodeAndItemCode == null)
{ {
throw new UserFriendlyException( throw new UserFriendlyException(
$"物品代码【{inputDetailTemplate.ItemCode}】在生产线【{productionLineDto.Code}】中没有对应的【生产线物品关系】"); $"物品代码【{detail.ItemCode}】在生产线【{productionLineDto.Code}】中没有对应的【生产线物品关系】");
} }
//获取可用库存 //可用库存
var input = new RecommendBalanceRequestInput var usableList = recommendbalanceDtos;
{ usableList = usableList.Where(p => !useBalanceList.Select(p => p.PackingCode).Contains(p.PackingCode))
ItemCode = locationCodeItemCodeGroup.Key.ItemCode, .ToList();
Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations = JsonSerializer.Deserialize<List<string>>(productLineCodeAndItemCode
.RawLocationCodeListJson)
};
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);
usableList = usableList.Where(p => !useBalanceList.Contains(p.PackingCode)).ToList();
if (usableList.Any()) if (usableList.Any())
{ {
for (var i = 0; i < sumBoxQty; i++) for (var i = 0; i < sumBoxQty; i++)
{ {
var firstUsable = usableList.First(); if (usableList.Any())
useBalanceList.Add(firstUsable.PackingCode); {
usableList.Remove(firstUsable); var firstUsable = usableList.First();
useBalanceList.Add((BalanceDTO)firstUsable);
var coatingIssueJobEditInput = usableList.Remove(firstUsable);
await BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(coatingMaterialRequest, inputDetailTemplate,
firstUsable) var coatingIssueJobEditInput =
.ConfigureAwait(false); await BuildCoatingIssueJobCreateInputWithBoxQtyTypeAsync(coatingIssueRequest,
detail, firstUsable)
inputJobs.Add(coatingIssueJobEditInput); .ConfigureAwait(false);
inputJobs.Add(coatingIssueJobEditInput);
}
else
{
break;
}
} }
} }
} }
@ -413,25 +394,26 @@ public class CoatingIssueRequestEventHandler
} }
/// <summary> /// <summary>
/// 构造注塑任务 /// 构造注塑任务-按箱
/// </summary> /// </summary>
/// <param name="coatingMaterialRequest"></param> /// <param name="coatingIssueRequest"></param>
/// <param name="coatingMaterialRequestDetail"></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 coatingMaterialRequest, CoatingIssueRequest coatingIssueRequest,
CoatingIssueRequestDetail coatingMaterialRequestDetail, BalanceDTO balanceDtos) CoatingIssueRequestDetail coatingIssueRequestDetail, BalanceDTO balanceDtos)
{ {
var job = ObjectMapper.Map<CoatingIssueRequest, CoatingIssueJobEditInput>(coatingMaterialRequest); 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 = coatingMaterialRequestDetail.ToLocationGroup; job.WorkGroupCode = coatingIssueRequestDetail.ToLocationGroup;
job.WarehouseCode = coatingMaterialRequestDetail.ToWarehouseCode; job.WarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
job.Worker = coatingMaterialRequest.Worker; job.Worker = coatingIssueRequest.Worker;
job.MaterialRequestNumber = coatingMaterialRequest.Number; job.KittingRequestNumber = coatingIssueRequest.Number;
job.EnumIssueSendType = EnumIssueSendType.BoxQtyType;
job.Details.Add(await BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(coatingMaterialRequestDetail, balanceDtos) job.Details.Add(await BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(coatingIssueRequestDetail, balanceDtos)
.ConfigureAwait(false)); .ConfigureAwait(false));
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
@ -440,30 +422,31 @@ public class CoatingIssueRequestEventHandler
} }
/// <summary> /// <summary>
/// 构造注塑任务明细 /// 构造注塑任务明细-按箱
/// </summary> /// </summary>
/// <param name="coatingMaterialRequestDetail"></param> /// <param name="coatingIssueRequestDetail"></param>
/// <param name="balance"></param> /// <param name="balance"></param>
/// <param name="toLocationGroupCode"></param> /// <param name="toLocationGroupCode"></param>
/// <returns></returns> /// <returns></returns>
private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithBoxQtyTypeAsync( private async Task<CoatingIssueJobDetailInput> BuildCoatingIssueJobDetailWithBoxQtyTypeAsync(
CoatingIssueRequestDetail coatingMaterialRequestDetail, BalanceDTO balance) CoatingIssueRequestDetail coatingIssueRequestDetail, BalanceDTO balance)
{ {
var detail = new CoatingIssueJobDetailInput(); var detail = new CoatingIssueJobDetailInput();
detail.RequestLocationCode = coatingMaterialRequestDetail.ToLocationCode; detail.RequestLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RequestLocationGroup = coatingMaterialRequestDetail.ToLocationGroup; detail.RequestLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
detail.RequestLocationArea = coatingMaterialRequestDetail.ToLocationArea; detail.RequestLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RequestLocationErpCode = coatingMaterialRequestDetail.ToLocationErpCode; detail.RequestLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RequestWarehouseCode = coatingMaterialRequestDetail.ToWarehouseCode; detail.RequestWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RequestQty = 1;
detail.PositionCode = coatingMaterialRequestDetail.PositionCode;
detail.RecommendType = coatingMaterialRequestDetail.RecommendType; detail.PositionCode = coatingIssueRequestDetail.PositionCode;
detail.ProdLine = coatingMaterialRequestDetail.ToLocationCode; detail.RecommendType = coatingIssueRequestDetail.RecommendType;
detail.ProdLine = coatingIssueRequestDetail.ToLocationCode;
detail.ItemCode = coatingMaterialRequestDetail.ItemCode;
detail.ItemName = coatingMaterialRequestDetail.ItemName; detail.ItemCode = coatingIssueRequestDetail.ItemCode;
detail.ItemDesc1 = coatingMaterialRequestDetail.ItemDesc1; detail.ItemName = coatingIssueRequestDetail.ItemName;
detail.ItemDesc2 = coatingMaterialRequestDetail.ItemDesc2; detail.ItemDesc1 = coatingIssueRequestDetail.ItemDesc1;
detail.ItemDesc2 = coatingIssueRequestDetail.ItemDesc2;
detail.Status = EnumInventoryStatus.OK; detail.Status = EnumInventoryStatus.OK;
detail.Uom = balance.Uom; detail.Uom = balance.Uom;
@ -498,11 +481,11 @@ public class CoatingIssueRequestEventHandler
detail.RecommendToProduceDate = balance.ProduceDate; detail.RecommendToProduceDate = balance.ProduceDate;
detail.RecommendToArriveDate = balance.ArriveDate; detail.RecommendToArriveDate = balance.ArriveDate;
detail.RecommendToLocationCode = coatingMaterialRequestDetail.ToLocationCode; detail.RecommendToLocationCode = coatingIssueRequestDetail.ToLocationCode;
detail.RecommendToLocationErpCode = coatingMaterialRequestDetail.ToLocationErpCode; detail.RecommendToLocationErpCode = coatingIssueRequestDetail.ToLocationErpCode;
detail.RecommendToLocationArea = coatingMaterialRequestDetail.ToLocationArea; detail.RecommendToLocationArea = coatingIssueRequestDetail.ToLocationArea;
detail.RecommendToWarehouseCode = coatingMaterialRequestDetail.ToWarehouseCode; detail.RecommendToWarehouseCode = coatingIssueRequestDetail.ToWarehouseCode;
detail.RecommendToLocationGroup = coatingMaterialRequestDetail.ToLocationGroup; detail.RecommendToLocationGroup = coatingIssueRequestDetail.ToLocationGroup;
await Task.CompletedTask.ConfigureAwait(false); await Task.CompletedTask.ConfigureAwait(false);
return detail; return detail;
@ -511,4 +494,210 @@ public class CoatingIssueRequestEventHandler
#endregion #endregion
#endregion #endregion
//创建任务
private async Task<List<CoatingIssueJobDTO>> CreateAllCoatingIssueJobAsync(
CoatingIssueRequest coatingIssueRequest)
{
var coatingIssueJobEditInputs = new List<CoatingIssueJobEditInput>();
//已用的库存的集合
var useBalanceList = new List<BalanceDTO>();
foreach (var groupbyItemCodeAndProdLine in coatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode }))
{
foreach (var coatingIssueRequestDetail in groupbyItemCodeAndProdLine)
{
var productionLineItemDto = await _productionLineItemAppService.GetByProductLineCodeAndItemCodeAsync(
coatingIssueRequestDetail.ProdLine,
groupbyItemCodeAndProdLine.Key.ItemCode).ConfigureAwait(false);
if (productionLineItemDto == null)
{
throw new UserFriendlyException(
$"未在生产线【{coatingIssueRequestDetail.ProdLine}】物品【{groupbyItemCodeAndProdLine.Key.ItemCode}】的关系,请查看【生产线物品关系】");
}
//原料
if (!string.IsNullOrEmpty(productionLineItemDto.RawLocationCodeListJson)) //因为一个零件 要不是原料 要不是半成品
{
var usableLocationCode =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto.RawLocationCodeListJson);
if (usableLocationCode.Any())
{
//获取可用库存
var input = new RecommendBalanceRequestInput
{
ItemCode = coatingIssueRequestDetail.ItemCode,
Qty = decimal.MaxValue,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto.RawLocationCodeListJson),
IsPackingCode = true
};
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);
var sortByFifoAsync = await SortByFifoAsync(usableList).ConfigureAwait(false);
//因为是按箱叫料 先把值赋值给箱数量上
coatingIssueRequestDetail.BoxQty = coatingIssueRequestDetail.Qty;
if (usableList.Any())
{
//因为是原料所以按箱叫料
coatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithBoxQtyTypeAsync(coatingIssueRequest,
new EditableList<CoatingIssueRequestDetail> { coatingIssueRequestDetail },
sortByFifoAsync,
useBalanceList).ConfigureAwait(false));
}
}
}
//半成品
if (!string.IsNullOrEmpty(productionLineItemDto.ProductLocationCodeListJson)) //因为一个零件 要不是原料 要不是半成品
{
var usableLocationCode =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto.ProductLocationCodeListJson);
if (usableLocationCode.Any())
{
//获取可用库存
var input = new RecommendBalanceRequestInput
{
ItemCode = groupbyItemCodeAndProdLine.Key.ItemCode,
Qty = coatingIssueRequestDetail.Qty,
Statuses = new EditableList<EnumInventoryStatus> { EnumInventoryStatus.OK },
Locations =
JsonSerializer.Deserialize<List<string>>(productionLineItemDto
.ProductLocationCodeListJson),
IsPackingCode = false
};
var usableList = await _balanceAppService.GetUsableListAsync(input).ConfigureAwait(false);
var temp = usableList.ToList();
foreach (var balanceDto in usableList) //计算已经用过的库存
{
var useBalanceDto = useBalanceList.Where(p =>
p.ItemCode == balanceDto.ItemCode && p.LocationCode == balanceDto.LocationCode &&
p.Lot == balanceDto.Lot && p.Status == balanceDto.Status &&
p.PackingCode == balanceDto.PackingCode);
if (useBalanceDto.Any()) //如果不为NULL,就是用过了的库存 需要减去使用量
{
balanceDto.Qty -= useBalanceDto.Sum(p => p.Qty);
if (balanceDto.Qty <= 0)
{
temp.Remove(balanceDto);
}
}
}
usableList = temp;
coatingIssueJobEditInputs.AddRange(
await CreateCoatingIssueJobWithQtyTypeAsync(coatingIssueRequest,
new List<CoatingIssueRequestDetail> { coatingIssueRequestDetail }, temp,
useBalanceList).ConfigureAwait(false));
}
}
}
}
if (coatingIssueJobEditInputs.Count > 0) //有库存 可以创建任务
{
//新增任务
var addCoatingIssueJobDtos = await _coatingIssueJobAppService.CreateManyAsync(coatingIssueJobEditInputs)
.ConfigureAwait(false);
await UpdateCoatingIssueRequestDetailQtyAsync(coatingIssueRequest, addCoatingIssueJobDtos)
.ConfigureAwait(false);
return addCoatingIssueJobDtos;
}
return new List<CoatingIssueJobDTO>();
}
/// <summary>
/// 修改请求的 已发 已收数量
/// </summary>
/// <param name="coatingIssueRequest"></param>
/// <param name="addCoatingIssueJobDtos"></param>
/// <returns></returns>
private async Task UpdateCoatingIssueRequestDetailQtyAsync(CoatingIssueRequest coatingIssueRequest,
List<CoatingIssueJobDTO> addCoatingIssueJobDtos)
{
//原有任务
var existCoatingIssueJobDtos = await _coatingIssueJobAppService
.GetByRequestNumberAsync(coatingIssueRequest.Number)
.ConfigureAwait(false);
//新增的任务和已有的任务总和
var allCoatingIssueJobDtos = new List<CoatingIssueJobDTO>();
allCoatingIssueJobDtos.AddRange(addCoatingIssueJobDtos);
allCoatingIssueJobDtos.AddRange(existCoatingIssueJobDtos);
var groupByItemCodeLocationCode = coatingIssueRequest.Details.GroupBy(p =>
new { p.ItemCode, p.ToLocationCode });
foreach (var group in groupByItemCodeLocationCode)
{
foreach (var requestDetail in group)
{
//所有已发数量
decimal allIssuedQty = 0;
//所有已发数量
decimal allReceivedQty = 0;
foreach (var allCoatingIssueJobDto in allCoatingIssueJobDtos)
{
var jobDetailDtos = allCoatingIssueJobDto.Details.Where(p =>
p.ItemCode == group.Key.ItemCode && p.RequestLocationCode == group.Key.ToLocationCode);
//所有已发数量
allIssuedQty += jobDetailDtos.Sum(p => p.RequestQty);
//所有已发数量
allReceivedQty += jobDetailDtos.Sum(p => p.HandledToQty);
}
requestDetail.IssuedQty += allIssuedQty;
requestDetail.ReceivedQty += allReceivedQty;
}
}
//await _coatingIssueRequestManager.UpdateAsync(coatingIssueRequest).ConfigureAwait(false);
}
/// <summary>
/// 排序规则 1.批次正序 2.底层 3.到货日期正序 4.数量倒序(整箱优先) 5.库位正序 6.箱码正序
/// </summary>
/// <param name="balances"></param>
/// <returns></returns>
public async Task<List<SortBalance>> SortByFifoAsync(List<BalanceDTO> balances)
{
var sortBalances = new List<SortBalance>();
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<BalanceDTO, SortBalance>()
.Ignore(x => x.LocationRow);
});
_mapper = new Mapper(config);
var resultBalances = _mapper.Map<List<BalanceDTO>, List<SortBalance>>(balances);
foreach (var resultBalance in resultBalances)
{
var locationDto = await _locationAppService.GetByCodeAsync(resultBalance.LocationCode).ConfigureAwait(false);
resultBalance.LocationRow = locationDto.RowCode;
}
resultBalances
.OrderBy(p => p.Lot)
.ThenBy(p => p.LocationRow)
.ThenBy(p => p.PutInTime)
.ThenBy(p => p.Qty)//2023-9-14 苑静雯 从小数开始发料
.ThenBy(p => p.LocationCode)
.ThenBy(p => p.PackingCode)
.ToList();
return resultBalances;
}
} }

4
be/Modules/Store/src/Win_in.Sfs.Wms.Store.Event/Requests/Note/CoatingIssueNoteEventHandler.cs

@ -6,10 +6,6 @@ using Volo.Abp.Uow;
using Win_in.Sfs.Shared.Domain.Shared; using Win_in.Sfs.Shared.Domain.Shared;
using Win_in.Sfs.Shared.Event; using Win_in.Sfs.Shared.Event;
using Win_in.Sfs.Wms.Store.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
using Win_in.Sfs.Wms.Store.Requests.MaterialRequests;
using static Win_in.Sfs.Wms.Store.Domain.Shared.StoreSettings;
using MaterialRequest = Win_in.Sfs.Wms.Store.Domain.MaterialRequest;
namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest; namespace Win_in.Sfs.Wms.Store.Event.BusinessRequest;

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

@ -9,7 +9,6 @@ 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.Domain; using Win_in.Sfs.Wms.Store.Domain;
using Win_in.Sfs.Wms.Store.Event.Transaction; using Win_in.Sfs.Wms.Store.Event.Transaction;
using Win_in.Sfs.Wms.Store.Notes.IssueNotes;
namespace Win_in.Sfs.Wms.Store.Event.Transactions; namespace Win_in.Sfs.Wms.Store.Event.Transactions;

Loading…
Cancel
Save