xf 1 anno fa
parent
commit
61074b4232

+ 1 - 48
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -19,6 +19,7 @@ using XF.Domain.Exceptions;
 using XF.Domain.Extensions;
 using XF.Utility.EnumExtensions;
 using XF.Domain.Repository;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Api.Controllers;
 
@@ -443,54 +444,6 @@ public class WorkflowController : BaseController
         return _mapper.Map<WorkflowDto>(workflow);
     }
 
-    /// <summary>
-    /// 查询被督办/催办部门
-    /// </summary>
-    /// <param name="workflowId"></param>
-    /// <returns></returns>
-    [HttpGet("{workflowId}/urge")]
-    public async Task<IReadOnlyList<Kv>> GetUrgeOrgs(string workflowId)
-    {
-        //var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: HttpContext.RequestAborted);
-        //var stepBoxes = workflow.Steps.Where(d => d.StepType != EStepType.Start && d.StepType != EStepType.End).ToList();
-        //var steps = stepBoxes.SelectMany(d => d.Steps);
-
-        //var orgs = new List<Kv>();
-        //foreach (var step in steps)
-        //{
-        //    var orgCode = step.HandlerOrgId ?? step.AcceptorOrgId;
-        //    var orgName = step.HandlerOrgName ?? step.AcceptorOrgName;
-        //    if (string.IsNullOrEmpty(orgCode))
-        //    {
-        //        switch (step.HandlerType)
-        //        {
-        //            case EHandlerType.Role:
-        //            case EHandlerType.AssignedUser:
-        //                //todo
-        //                var users = await _userRepository.Queryable()
-        //                    .Includes(d => d.Organization)
-        //                    .Where(d => step.Handlers.Select(x => x.Key).Contains(d.Id))
-        //                    .ToListAsync(HttpContext.RequestAborted);
-        //                orgs.AddRange(users.Select(d => new Kv(d.OrgId, d.Organization.Name)));
-        //                break;
-        //            case EHandlerType.OrgLevel:
-        //            case EHandlerType.OrgType:
-        //            case EHandlerType.AssignedOrg:
-        //                orgs.AddRange(step.Handlers);
-        //                break;
-        //            default:
-        //                throw new ArgumentOutOfRangeException();
-        //        }
-        //    }
-        //    else
-        //    {
-        //        orgs.Add(new Kv(orgCode, orgName));
-        //    }
-        //}
-        //return orgs.DistinctBy(d => d.Key).ToList();
-        throw new NotImplementedException();
-    }
-
     [HttpGet("base-data")]
     public async Task<dynamic> BaseData()
     {

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/EndWorkflowHandler.cs

@@ -8,7 +8,7 @@ using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Orders;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Mq;

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs

@@ -7,7 +7,7 @@ using Hotline.KnowledgeBase;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Orders;
 using Hotline.Settings;
-using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Mq;

+ 1 - 0
src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs

@@ -1,6 +1,7 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Mapster;
 
 namespace Hotline.Application.Mappers;

+ 1 - 4
src/Hotline/FlowEngine/Workflows/StepSimple.cs → src/Hotline.Share/Dtos/FlowEngine/Definition/StepSimple.cs

@@ -1,7 +1,4 @@
-using Hotline.FlowEngine.Definitions;
-using Hotline.Share.Dtos.FlowEngine.Definition;
-
-namespace Hotline.FlowEngine.Workflows;
+namespace Hotline.Share.Dtos.FlowEngine.Definition;
 
 public class StepSimple : StepDefineSimple
 {

+ 7 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/CountersignStep.cs

@@ -0,0 +1,7 @@
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
+
+public class CountersignStep
+{
+    public string StepId { get; set; }
+    public bool Completed { get; set; }
+}

+ 106 - 23
src/Hotline.Share/Dtos/FlowEngine/Workflow/StepBasicDto.cs

@@ -4,57 +4,140 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
 {
     public class StepBasicDto
     {
-        public string Name { get; set; }
+        public string WorkflowId { get; set; }
 
         /// <summary>
-        /// 模板内唯一
+        /// 该节点指派办理对象(依据不同指派方式可能为:orgId或userId),该字段subStep才会存在,stepBox不存在
+        /// 采用list类型,兼容多个办理对象可以办理同一个节点的场景
         /// </summary>
-        public string Code { get; set; }
+        public List<Kv> Handlers { get; set; } = new();
 
-        public EStepType StepType { get; init; }
+        /// <summary>
+        /// 办理时间限制(如:24小时、7个工作日)
+        /// </summary>
+        public string? TimeLimit { get; set; }
 
         /// <summary>
-        /// 办理者类型
+        /// 上一节点办理时,nextStepCode下拉框中选中的值
+        /// config模式:当前节点的difinition.code, dynamic模式:x级部门办理的x:int
         /// </summary>
-        public EHandlerType HandlerType { get; set; }
+        public string? PrevChosenStepCode { get; set; }
+
+        #region 接办
 
         /// <summary>
-        /// 业务属性
+        /// 接办人
         /// </summary>
-        public EBusinessType BusinessType { get; set; }
+        public string? AcceptorId { get; set; }
+
+        public string? AcceptorName { get; set; }
 
         /// <summary>
-        /// 办理者分类(或是直接保存办理者)
+        /// 接办人部门code
+        /// </summary>
+        public string? AcceptorOrgId { get; set; }
+
+        public string? AcceptorOrgName { get; set; }
+
+        /// <summary>
+        /// 接办人部门行政区划代码
+        /// </summary>
+        public string? AcceptorOrgAreaCode { get; set; }
+
+        /// <summary>
+        /// 接办人部门行政区划名称
+        /// </summary>
+        public string? AcceptorOrgAreaName { get; set; }
+
+        /// <summary>
+        /// 接办时间
+        /// </summary>
+        public DateTime? AcceptTime { get; set; }
+
+        #endregion
+
+        #region 办理
+
+        /// <summary>
+        /// 办理人
+        /// </summary>
+        public string? HandlerId { get; set; }
+
+        public string? HandlerName { get; set; }
+
+        /// <summary>
+        /// 办理人部门code
+        /// </summary>
+        public string? HandlerOrgId { get; set; }
+
+        /// <summary>
+        /// 办理人部门名称
+        /// </summary>
+        public string? HandlerOrgName { get; set; }
+
+        /// <summary>
+        /// 办理人部门行政区划代码
+        /// </summary>
+        public string? HandlerOrgAreaCode { get; set; }
+
+        /// <summary>
+        /// 办理人部门行政区划名称
+        /// </summary>
+        public string? HandlerOrgAreaName { get; set; }
+
+        /// <summary>
+        /// 办理完成时间
+        /// </summary>
+        public DateTime? HandleTime { get; set; }
+
+        #endregion
+
+        #region 办理参数
+
+        /// <summary>
+        /// (下一节点办理人)根据审批者类型不同,此字段为不同内容
         /// <example>
-        /// 根据类型可能为:roles, orgLevels, orgTypes, orgCodes, userIds
+        /// 部门等级/分类为:orgCodes, 角色为:userIds
         /// </example>
         /// </summary>
-        public List<Kv> HandlerClassifies { get; set; } = new();
+        public List<Kv> NextHandlers { get; set; } = new();
+
+        /// <summary>
+        /// 下一节点主办,(NextHandlers其中一个, 如果不是会签则只有一个)
+        /// </summary>
+        public string? NextMainHandler { get; set; }
 
-        ///// <summary>
-        ///// 会签模式
-        ///// </summary>
-        //public ECountersignMode CountersignMode { get; set; }
+        /// <summary>
+        /// 下一节点code(stepBox无值)
+        /// </summary>
+        public string? NextStepCode { get; set; }
+
+        /// <summary>
+        /// 是否回到会签发起节点汇总
+        /// </summary>
+        public bool BackToCountersignEnd { get; set; }
 
         /// <summary>
-        /// 发起会签节点code(不支持发起会签节点无此字段)
+        /// 是否短信通知
         /// </summary>
-        public string? CountersignStartStepCode { get; set; }
+        public bool IsSms { get; set; }
 
         /// <summary>
-        /// 会签汇总节点code(不支持发起会签节点无此字段)
+        /// 办理意见
         /// </summary>
-        public string? CountersignEndStepCode { get; set; }
+        public string? Opinion { get; set; }
 
         /// <summary>
-        /// 节点属性配置
+        /// 附件
         /// </summary>
-        public List<string> Components { get; set; } = new();
+        public List<string> Additions { get; set; } = new();
 
         /// <summary>
-        /// 自动路径策略
+        /// 节点期满时间
         /// </summary>
-        public EPathPolicy PathPolicy { get; set; }
+        public DateTime? StepExpiredTime { get; set; }
+
+        #endregion
 
     }
 }

+ 2 - 1
src/Hotline.Share/Dtos/FlowEngine/WorkflowDto.cs → src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowDto.cs

@@ -2,7 +2,7 @@
 using Hotline.Share.Enums.FlowEngine;
 using XF.Utility.EnumExtensions;
 
-namespace Hotline.Share.Dtos.FlowEngine
+namespace Hotline.Share.Dtos.FlowEngine.Workflow
 {
     public class WorkflowDto
     {
@@ -79,6 +79,7 @@ namespace Hotline.Share.Dtos.FlowEngine
         public List<WorkflowTraceDto> Traces { get; set; }
 
         public List<WorkflowSupplementDto> Supplements { get; set; }
+
         public List<WorkflowAssignDto> Assigns { get; set; }
 
     }

+ 161 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowStepDto.cs

@@ -0,0 +1,161 @@
+using Hotline.Share.Dtos.FlowEngine.Definition;
+using Hotline.Share.Enums.FlowEngine;
+
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
+
+public class WorkflowStepDto
+{
+    public string Id { get; set; }
+
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 配置下一步节点 & 谁被选中
+    /// </summary>
+    public List<StepSimple> NextSteps { get; set; } = new();
+
+    /// <summary>
+    /// 前一级节点Id(stepBox此字段为上级stepBoxId,step为上级stepId),汇总节点无此字段(因可能有多个上级来源)
+    /// </summary>
+    public string? PrevStepId { get; set; }
+    public string? PrevStepCode { get; set; }
+
+    /// <summary>
+    /// 主办
+    /// </summary>
+    public bool IsMain { get; set; }
+
+    /// <summary>
+    /// 节点办理状态
+    /// </summary>
+    public EWorkflowStepStatus Status { get; set; }
+
+    /// <summary>
+    /// 原生节点(区别动态生成)
+    /// </summary>
+    public bool IsOrigin { get; set; }
+
+
+    #region 会签
+    
+    /// <summary>
+    /// 会签id(或外层会签的id)
+    /// </summary>
+    public string? CountersignId { get; set; }
+
+    /// <summary>
+    /// 节点处于会签流程中的位置(区别直接办理会签和会签内非会签节点)
+    /// 最顶层的发起会签节点为none
+    /// </summary>
+    public ECountersignPosition CountersignPosition { get; set; }
+
+    #region 发起会签节点特有
+
+    /// <summary>
+    /// 发起会签生成会签Id(不发起会签节点无此字段)
+    /// </summary>
+    public string? StartCountersignId { get; set; }
+
+    /// <summary>
+    /// 会签直属办理节点
+    /// </summary>
+    public List<CountersignStep> CountersignSteps { get; set; } = new();
+
+    /// <summary>
+    /// 发起的会签是否汇总
+    /// </summary>
+    public bool IsStartedCountersignEnd { get; set; }
+
+    #endregion
+
+    #region 会签汇总节点特有
+
+    /// <summary>
+    /// 是否为会签汇总节点
+    /// </summary>
+    public bool IsCountersignEndStep { get; set; }
+
+    /// <summary>
+    /// 开启会签节点id(会签汇总节点对应会签发起节点id)
+    /// </summary>
+    public string? CountersignStartStepId { get; set; }
+
+    #endregion
+
+    #endregion
+
+    #region Definition
+
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 模板内唯一
+    /// </summary>
+    public string Code { get; set; }
+
+    public EStepType StepType { get; init; }
+
+    /// <summary>
+    /// 节点业务类型
+    /// </summary>
+    public EBusinessType BusinessType { get; set; }
+
+    /// <summary>
+    /// 办理人类型
+    /// </summary>
+    public EHandlerType HandlerType { get; set; }
+
+    /// <summary>
+    /// 是否有否决按钮
+    /// </summary>
+    public bool CanReject { get; set; }
+
+    /// <summary>
+    /// 执行模式(自动与否)
+    /// 只有普通节点支持自动,会签、动态节点均不支持自动
+    /// </summary>
+    public EExecuteMode ExecuteMode { get; set; }
+
+    #region 会签相关配置
+
+    /// <summary>
+    /// 是否支持发起会签(即使支持发起,当下一节点为汇总或结束节点时亦不可发起)
+    /// </summary>
+    public bool CanStartCountersign { get; set; }
+
+    /// <summary>
+    /// 会签策略
+    /// </summary>
+    public EDynamicPolicy? CountersignPolicy { get; set; }
+
+    #endregion
+
+    #region 依据配置生成节点的方式
+
+    /// <summary>
+    /// 实例化模式
+    /// </summary>
+    public EInstanceMode InstanceMode { get; set; }
+
+    /// <summary>
+    /// 动态实例化策略(多次模式才有)
+    /// </summary>
+    public EDynamicPolicy? InstancePolicy { get; set; }
+
+    /// <summary>
+    /// 到此标记终止动态实例化(多次模式才有)
+    /// <remarks>
+    /// 按直属部门重复既保存orgLevel:int
+    /// </remarks>
+    /// </summary>
+    public string? TerminalDynamicMark { get; set; }
+
+    #endregion
+
+    /// <summary>
+    /// 标签
+    /// </summary>
+    public string? Tag { get; set; }
+
+    #endregion
+}

+ 10 - 7
src/Hotline.Share/Dtos/FlowEngine/WorkflowTraceDto.cs → src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowTraceDto.cs

@@ -2,17 +2,20 @@
 using Hotline.Share.Enums.FlowEngine;
 using XF.Utility.EnumExtensions;
 
-namespace Hotline.Share.Dtos.FlowEngine;
+namespace Hotline.Share.Dtos.FlowEngine.Workflow;
 
-public class WorkflowTraceDto : WorkflowStepDto
+public class WorkflowTraceDto : StepBasicDto
 {
+    /// <summary>
+    /// 节点Id
+    /// </summary>
     public string StepId { get; set; }
-    
+
     /// <summary>
     /// 流转记录状态
     /// </summary>
     public EWorkflowTraceStatus Status { get; set; }
-
+    
     public string StatusText => Status.GetDescription();
 
     /// <summary>
@@ -34,13 +37,13 @@ public class WorkflowTraceDto : WorkflowStepDto
     {
         get
         {
-            if (CompleteTime.HasValue)
+            if (HandleTime.HasValue)
             {
-                return CompleteTime.Value < ExpiredTime ? ExpiredStatus.Completed : ExpiredStatus.Expired;
+                return HandleTime.Value < StepExpiredTime ? ExpiredStatus.Completed : ExpiredStatus.Expired;
             }
             else
             {
-                return DateTime.Now < ExpiredTime ? ExpiredStatus.Handling : ExpiredStatus.Expired;
+                return DateTime.Now < StepExpiredTime ? ExpiredStatus.Handling : ExpiredStatus.Expired;
             }
         }
     }

+ 0 - 145
src/Hotline.Share/Dtos/FlowEngine/WorkflowStepDto.cs

@@ -1,145 +0,0 @@
-using Hotline.Share.Enums.FlowEngine;
-
-namespace Hotline.Share.Dtos.FlowEngine;
-
-public class WorkflowStepDto
-{
-    public string Id { get; set; }
-
-    public DateTime CreationTime { get; set; }
-
-    public string WorkflowId { get; set; }
-
-    public string Name { get; set; }
-
-    /// <summary>
-    /// 模板内唯一
-    /// </summary>
-    public string Code { get; set; }
-
-    public EStepType StepType { get; init; }
-
-    /// <summary>
-    /// 办理者类型
-    /// </summary>
-    public EHandlerType HandlerType { get; set; }
-
-    /// <summary>
-    /// 办理者分类(或是直接保存办理者)
-    /// <example>
-    /// 根据类型可能为:roles, orgLevels, orgTypes, orgCodes, userIds
-    /// </example>
-    /// </summary>
-    public List<Kv> HandlerClassifies { get; set; } = new();
-
-    ///// <summary>
-    ///// 会签模式
-    ///// </summary>
-    //public ECountersignMode CountersignMode { get; set; }
-
-    public EWorkflowStepStatus Status { get; set; }
-
-    /// <summary>
-    /// 被指派办理对象(依据不同指派方式可能为:orgCode或userId),该字段subStep才会存在,stepBox不存在
-    /// 采用list类型,兼容多个办理对象可以办理同一个节点的场景
-    /// </summary>
-    public List<Kv> Handlers { get; set; } = new();
-
-    #region 办理参数
-
-    /// <summary>
-    /// (下一节点办理人)根据审批者类型不同,此字段为不同内容
-    /// <example>
-    /// 部门等级/分类为:orgCodes, 角色为:userIds
-    /// </example>
-    /// </summary>
-    public List<Kv> NextHandlers { get; set; } = new();
-
-    /// <summary>
-    /// 下一节点主办,(NextHandlers其中一个, 如果不是会签则只有一个)
-    /// </summary>
-    public string? NextMainHandler { get; set; }
-
-    /// <summary>
-    /// 下一节点code
-    /// </summary>
-    public string NextStepCode { get; set; }
-
-    /// <summary>
-    /// 是否短信通知
-    /// </summary>
-    public bool AcceptSms { get; set; }
-
-    /// <summary>
-    /// 办理意见
-    /// </summary>
-    public string Opinion { get; set; }
-
-    /// <summary>
-    /// 附件
-    /// </summary>
-    public List<string> Additions { get; set; } = new();
-
-    #endregion
-
-    #region 办理
-
-    /// <summary>
-    /// 办理人
-    /// </summary>
-    public string? UserId { get; set; }
-
-    public string? UserName { get; set; }
-
-    /// <summary>
-    /// 办理人部门code
-    /// </summary>
-    public string? OrgCode { get; set; }
-
-    /// <summary>
-    /// 办理人部门名称
-    /// </summary>
-    public string? OrgName { get; set; }
-
-    /// <summary>
-    /// 办理人部门行政区划代码
-    /// </summary>
-    public string? OrgAreaCode { get; set; }
-
-    /// <summary>
-    /// 办理人部门行政区划名称
-    /// </summary>
-    public string? OrgAreaName { get; set; }
-
-    /// <summary>
-    /// 办理完成时间
-    /// </summary>
-    public DateTime? CompleteTime { get; set; }
-
-    #endregion
-
-    #region 接办
-
-    /// <summary>
-    /// 接办人
-    /// </summary>
-    public string? AcceptUserId { get; set; }
-
-    public string? AcceptUserName { get; set; }
-
-    /// <summary>
-    /// 接办人部门code
-    /// </summary>
-    public string? AcceptOrgCode { get; set; }
-
-    public string? AcceptOrgName { get; set; }
-
-    /// <summary>
-    /// 接办时间
-    /// </summary>
-    public DateTime? AcceptTime { get; set; }
-
-    #endregion
-
-    public List<WorkflowStepDto> Steps { get; set; }
-}

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -1,5 +1,5 @@
 using Hotline.Share.Dtos.File;
-using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Hotspots;
 using Hotline.Share.Dtos.Org;
 using Hotline.Share.Dtos.Users;

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderFlowDto.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 
 namespace Hotline.Share.Dtos.Order
 {

+ 1 - 1
src/Hotline/FlowEngine/Workflows/ECountersignPosition.cs → src/Hotline.Share/Enums/FlowEngine/ECountersignPosition.cs

@@ -1,4 +1,4 @@
-namespace Hotline.FlowEngine.Workflows;
+namespace Hotline.Share.Enums.FlowEngine;
 
 /// <summary>
 /// 节点处于会签流程中的位置

+ 0 - 32
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -12,20 +12,6 @@ public abstract class StepBasicEntity : CreationEntity
 {
     public string WorkflowId { get; set; }
 
-    // /// <summary>
-    // /// 审批者分类(或是直接保存处理者)
-    // /// <example>
-    // /// 根据类型可能为:roles, depLevels, depTypes, depCodes, userIds
-    // /// </example>
-    // /// </summary>
-    // [SugarColumn(ColumnDataType = "json", IsJson = true)]
-    // public List<Kv> HandlerClassifies { get; set; } = new();
-
-    // /// <summary>
-    // /// 当前环节会签模式
-    // /// </summary>
-    // public ECountersignMode CountersignMode { get; set; }
-
     /// <summary>
     /// 该节点指派办理对象(依据不同指派方式可能为:orgId或userId),该字段subStep才会存在,stepBox不存在
     /// 采用list类型,兼容多个办理对象可以办理同一个节点的场景
@@ -38,24 +24,6 @@ public abstract class StepBasicEntity : CreationEntity
     /// </summary>
     public string? TimeLimit { get; set; }
 
-    // /// <summary>
-    // /// 节点属性配置
-    // /// </summary>
-    // [SugarColumn(ColumnDataType = "json", IsJson = true)]
-    // public List<string> Components { get; set; } = new();
-    //
-    // /// <summary>
-    // /// 扩展信息
-    // /// </summary>
-    // [SugarColumn(ColumnDataType = "json", IsJson = true)]
-    // public StepExtension Extension { get; set; } = new();
-    //
-    // /// <summary>
-    // /// 自动路径策略
-    // /// </summary>
-    // [SugarColumn(DefaultValue = "0")]
-    // public EPathPolicy PathPolicy { get; set; }
-
     /// <summary>
     /// 上一节点办理时,nextStepCode下拉框中选中的值
     /// config模式:当前节点的difinition.code, dynamic模式:x级部门办理的x:int

+ 2 - 6
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -1,4 +1,6 @@
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.FlowEngine.Definition;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Enums.FlowEngine;
 using SqlSugar;
 using XF.Domain.Exceptions;
@@ -303,12 +305,6 @@ public class WorkflowStep : StepBasicEntity
     #endregion
 }
 
-public class CountersignStep
-{
-    public string StepId { get; set; }
-    public bool Completed { get; set; }
-}
-
 /*
 获取开始节点下一步待选节点:
   是否属于多次实例化配置(dynamic动态实例化配置:结合办理人动态生成待办节点)