WorkflowStepHandler.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using Hotline.Share.Dtos;
  2. using SqlSugar;
  3. using XF.Domain.Entities;
  4. using XF.Domain.Exceptions;
  5. using XF.Domain.Repository;
  6. namespace Hotline.FlowEngine.Workflows;
  7. public class WorkflowStepHandler : CreationEntity
  8. {
  9. public string WorkflowId { get; set; }
  10. public string ExternalId { get; set; }
  11. public string WorkflowStepId { get; set; }
  12. /// <summary>
  13. /// 流程指派类型
  14. /// </summary>
  15. public EFlowAssignType FlowAssignType { get; set; }
  16. public string? UserId { get; set; }
  17. public string? Username { get; set; }
  18. public string? OrgId { get; set; }
  19. public string? OrgName { get; set; }
  20. public string? RoleId { get; set; }
  21. public string? RoleName { get; set; }
  22. /// <summary>
  23. /// 是否为实际办理者
  24. /// </summary>
  25. public bool IsActualHandler { get; set; }
  26. [Navigate(NavigateType.ManyToOne, nameof(WorkflowStepId))]
  27. public WorkflowStep WorkflowStep { get; set; }
  28. #region method
  29. public static WorkflowStepHandler Create(string workflowId, string externalId, EFlowAssignType flowAssignType, string? userId = null, string? username = null,
  30. string? orgId = null, string? orgName = null, string? roleId = null, string? roleName = null)
  31. {
  32. var handler = new WorkflowStepHandler
  33. {
  34. WorkflowId = workflowId,
  35. ExternalId = externalId,
  36. };
  37. handler.Assign(flowAssignType, userId, username, orgId, orgName, roleId, roleName);
  38. return handler;
  39. }
  40. public void Assign(EFlowAssignType assignType, string? userId, string? username,
  41. string? orgId, string? orgName, string? roleId, string? roleName)
  42. {
  43. FlowAssignType = assignType;
  44. switch (assignType)
  45. {
  46. case EFlowAssignType.Org:
  47. if (string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
  48. throw new ArgumentNullException(nameof(orgId));
  49. OrgId = orgId;
  50. OrgName = orgName;
  51. break;
  52. case EFlowAssignType.User:
  53. if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(username) ||
  54. string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
  55. throw new ArgumentNullException(nameof(userId));
  56. UserId = userId;
  57. Username = username;
  58. OrgId = orgId;
  59. OrgName = orgName;
  60. break;
  61. //case EFlowAssignType.Role:
  62. // if (string.IsNullOrEmpty(roleId) || string.IsNullOrEmpty(roleName))
  63. // throw new ArgumentNullException(nameof(roleId));
  64. // RoleId = roleId;
  65. // RoleName = roleName;
  66. // break;
  67. default:
  68. throw new ArgumentOutOfRangeException(nameof(assignType), assignType, null);
  69. }
  70. }
  71. public bool IsHandler(ICollection<string> roleIds, string? userId = null, string? orgId = null)
  72. {
  73. switch (FlowAssignType)
  74. {
  75. case EFlowAssignType.Org:
  76. if (string.IsNullOrEmpty(OrgId))
  77. throw new UserFriendlyException($"数据异常, {nameof(OrgId)}");
  78. return OrgId.Equals(orgId, StringComparison.OrdinalIgnoreCase);
  79. case EFlowAssignType.User:
  80. if (string.IsNullOrEmpty(UserId))
  81. throw new UserFriendlyException($"数据异常, {nameof(UserId)}");
  82. return UserId.Equals(userId, StringComparison.OrdinalIgnoreCase);
  83. //case EFlowAssignType.Role:
  84. // if (string.IsNullOrEmpty(RoleId))
  85. // throw new UserFriendlyException($"数据异常, {nameof(RoleId)}");
  86. // return roleIds.Any() && roleIds.Contains(RoleId, StringComparer.OrdinalIgnoreCase);
  87. default:
  88. throw new ArgumentOutOfRangeException();
  89. }
  90. }
  91. public Kv GetHandler()
  92. {
  93. return FlowAssignType switch
  94. {
  95. EFlowAssignType.Org => new Kv(OrgId, OrgName),
  96. EFlowAssignType.User => new Kv(UserId, Username),
  97. //EFlowAssignType.Role => new Kv(RoleId, RoleName),
  98. _ => throw new ArgumentOutOfRangeException()
  99. };
  100. }
  101. #endregion
  102. }