WorkflowCountersign.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using Hotline.Share.Dtos.FlowEngine.Workflow;
  2. using Hotline.Share.Enums.FlowEngine;
  3. using SqlSugar;
  4. using XF.Domain.Entities;
  5. using XF.Domain.Exceptions;
  6. using XF.Domain.Repository;
  7. namespace Hotline.FlowEngine.Workflows
  8. {
  9. public class WorkflowCountersign : CreationEntity
  10. {
  11. public string WorkflowId { get; set; }
  12. #region 发起会签
  13. /// <summary>
  14. /// 发起会签节点id(从开始节点直接发起的会签,该id和code为start节点的id与code)
  15. /// </summary>
  16. public string StartStepId { get; set; }
  17. //冗余
  18. public string StartStepCode { get; set; }
  19. /// <summary>
  20. /// 业务属性
  21. /// </summary>
  22. public EBusinessType StartStepBusiType { get; set; }
  23. /// <summary>
  24. /// 发起人
  25. /// </summary>
  26. public string StarterId { get; set; }
  27. public string StarterName { get; set; }
  28. /// <summary>
  29. /// 发起人部门code
  30. /// </summary>
  31. public string StarterOrgId { get; set; }
  32. public string? StarterOrgName { get; set; }
  33. /// <summary>
  34. /// 发起人部门行政区划代码
  35. /// </summary>
  36. public string StarterOrgAreaCode { get; set; }
  37. /// <summary>
  38. /// 发起人部门行政区划名称
  39. /// </summary>
  40. public string StarterOrgAreaName { get; set; }
  41. #endregion
  42. #region 结束会签
  43. /// <summary>
  44. /// 会签汇总节点id
  45. /// 人工结束会签为null
  46. /// </summary>
  47. public string? EndStepId { get; set; }
  48. //冗余
  49. public string? EndStepCode { get; set; }
  50. /// <summary>
  51. /// 业务属性
  52. /// </summary>
  53. public EBusinessType EndStepBusiType { get; set; }
  54. /// <summary>
  55. /// 接办人
  56. /// </summary>
  57. public string? FinisherId { get; set; }
  58. public string? FinisherName { get; set; }
  59. /// <summary>
  60. /// 接办人部门code
  61. /// </summary>
  62. public string? FinisherOrgId { get; set; }
  63. public string? FinisherOrgName { get; set; }
  64. /// <summary>
  65. /// 接办人部门行政区划代码
  66. /// </summary>
  67. public string? FinisherOrgAreaCode { get; set; }
  68. /// <summary>
  69. /// 接办人部门行政区划名称
  70. /// </summary>
  71. public string? FinisherOrgAreaName { get; set; }
  72. /// <summary>
  73. /// 会签结束时间
  74. /// </summary>
  75. public DateTime? EndTime { get; set; }
  76. #endregion
  77. /// <summary>
  78. /// 会签嵌套会签场景记录上级会签Id
  79. /// </summary>
  80. public string? ParentId { get; set; }
  81. /// <summary>
  82. /// 会签类型(非工单办理为null)
  83. /// </summary>
  84. public ECounterSignType? CounterSignType { get; set; }
  85. /// <summary>
  86. /// 该会签参与成员数量
  87. /// </summary>
  88. // public int Members { get; set; }
  89. [Navigate(NavigateType.OneToMany, nameof(WorkflowCountersignMember.WorkflowCountersignId))]
  90. public List<WorkflowCountersignMember> Members { get; set; }
  91. /// <summary>
  92. /// 流程指派类型(冗余,非工单办理为null)
  93. /// </summary>
  94. public EFlowAssignType? FlowAssignType { get; set; }
  95. /// <summary>
  96. /// 超期时间(期满时间)
  97. /// </summary>
  98. public DateTime? ExpiredTime { get; set; }
  99. /// <summary>
  100. /// 是否超期
  101. /// </summary>
  102. public bool? IsExpired { get; set; }
  103. [SugarColumn(IsIgnore = true)]
  104. public List<WorkflowCountersign> Children { get; set; }
  105. #region method
  106. /// <summary>
  107. /// 会签是否完成(如有嵌套会签,表示下级所有会签都完成了)
  108. /// </summary>
  109. public bool IsCompleted() => EndTime.HasValue;
  110. /// <summary>
  111. /// 结束会签(需提前确认所有子集都已结束)
  112. /// </summary>
  113. public void End(
  114. string endStepId, string endStepCode, EBusinessType businessType,
  115. string userId, string? userName,
  116. string orgId, string? orgName,
  117. string? orgAreaCode, string? orgAreaName)
  118. {
  119. EndStepId = endStepId;
  120. EndStepCode = endStepCode;
  121. EndStepBusiType = businessType;
  122. FinisherId = userId;
  123. FinisherName = userName;
  124. FinisherOrgId = orgId;
  125. FinisherOrgName = orgName;
  126. FinisherOrgAreaCode = orgAreaCode;
  127. FinisherOrgAreaName = orgAreaName;
  128. EndTime = DateTime.Now;
  129. IsExpired = EndTime.HasValue && ExpiredTime.HasValue && EndTime > ExpiredTime;
  130. }
  131. public void MemberHandled(string userId, string orgId)
  132. {
  133. var member = FlowAssignType == EFlowAssignType.Org
  134. ? Members.FirstOrDefault(d => d.Key == orgId)
  135. : Members.FirstOrDefault(d => d.Key == userId);
  136. if (member is null)
  137. throw new UserFriendlyException($"未找到会签办理对象");
  138. member.IsHandled = true;
  139. }
  140. #endregion
  141. }
  142. }