Slickflow.NET核心开源工作流引擎

目录

介绍

背景

使用代码

I:简单顺序过程编码示例

1.创建流程图

2.流程启动和操作

3.流程撤回和回发

II:简单的并行分支处理代码编写示例

1.创建分支流程图

2.流程启动和操作

3.撤回和回发

III:简单或分支过程编码示例

1.创建或分支流程图

2.流程启动和操作

3.撤回和回发流程

开发工具

1)Slickflow流程设计器

2)Slickflow WebTest工具

GitHub项目

总结


介绍

对于渴望了解引擎功能的开发人员,在下载版本之后,他们想要尝试编写代码以完成流程的开发和测试。本文试图说明如何通过一个简单的过程快速理解引擎代码编写。

背景

带有完整源代码的.NET/.NET Core工作流引擎

GitHub https://github.com/besley/Slickflow

1、同时支持.NET.NET CORE版本Slickflow是一个基于.NET Framework 4.5.NET CORE 2的开源项目。易于将引擎产品用于跨平台应用程序。

2、BPMN图形样式流程图Slickflow使用BPMN表示法来描述流程图,Slickflow设计器是HTML5图形编辑器,对业务流程通信和业务分析非常友好。

3、Dapper.NET库具有高性能Dapper.NET的简单对象映射器,就速度而言,它拥有Micro ORM之王的称号,实际上与使用原始ADO.NET数据读取器一样快。ORM是对象关系映射器,它负责数据库和编程语言之间的映射。(参考https://dapper-tutorial.net/dapper

4、支持多个数据库Slickflow支持SQLSERVERORACLEMySQL等数据库,它由Dapper.NET扩展库实现。使用EF Core支持不同数据库产品的.NET Core版本。

5、支持的工作流程模式

Slickflow.NET核心开源工作流引擎_第1张图片

  1. 序列(Sequence):最常用的处理模式
  2. 拆分/合并(Split/Merge):支持and/or网关,例如and/or拆分and/or联接,以及过渡时的条件变量
  3. 子流程(Sub-process):在主流程中,子流程节点可以启动新的流程生命周期。
  4. 多实例(Multi-instance):多个执行者通过多个任务实例一起处理一个任务。所有执行者都在竞争他们的任务,然后可以继续进行该过程。有顺序并行模式,可以在其上设置百分比计数参数,以确保何时可以进行下一步。Slickflow.NET核心开源工作流引擎_第2张图片
  5. 事件互操作(Event interoperation):流程实例和活动实例事件委托服务,例如流程/活动的启动、执行和完成。还支持通过属性页面上节点的配置来调用外部方法的事件。例如WebApiSQLStoreProcedurePython脚本。
  6. 计时器(Timer):与HangFire库集成,并支持CRON表达式
  7. 电子邮件(Email):待办事项或过期任务的电子邮件通知
  8. 撤回 (Withdraw):仅在发送给下一步用户后才撤回任务。
  9. 回发(Sendback):发送回上一步用户,因为有一些异常。
  10. 重新发送(Resend):在回发后合并,然后将任务重新发送给原始回发用户。
  11. 反向(Reverse):完成处理后,还可以对流程实例进行实时反向处理。
  12. 跳转(Jump):向前或向后跳过几个步骤。

6、流程版本:由于业务流程已更改,流程具有版本属性以升级新定义。

7、XML缓存:运行时实例使用缓存来使XML流程图保持过期时间。

使用代码

I:简单顺序过程编码示例

前言:对于渴望了解引擎功能的开发人员,下载版本后,他们想要尝试编写代码以完成流程的开发和测试。本文试图说明如何从一个简单的流程快速理解引擎代码编写。

版本:.NET Core 2.1

1.创建流程图

序列用于创建顺序过程,节点是顺序生成的。

var pmb = ProcessModelBuilder.CreateProcess("BookSeller Process", "BookSeller Process Code");
var process = pmb.Start("Start")
      .Task("Package Books")
      .Task("Deliver Books")
      .End("End")
      .Store();

上面的代码创建了一个简单的序列过程,该过程具有四个节点,即起始节点,两个任务节点,并且该Store()方法用于数据库存储过程。流程图示例如下:

Slickflow.NET核心开源工作流引擎_第3张图片

2.流程启动和操作

启动和运行过程是两个最常用的API接口。

2.1 流程启动

启动需要处理流程实例的创建,以及启动节点之后的任务节点的创建。示例代码如下:

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack")
             .UseApp( "BS-100", "Delivery-Books", "BS-100-LX")
             .UseProcess( " BookSellerProcessCode ")
             .Start( );

流程记录清单:

2.2 流程运行

流程运行是从当前待办任务开始并运行到下一步的流程。解析流程时,下一步可能会有多个处理步骤,要求用户明确选择步骤列表(通常由弹出窗口中的前端用户指定)。在这里,可以使用一个示例作为一个简单的单步实例运行。

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack")
        .UseApp( "BS-100", "Delivery-Books", "BS-100-LX")
        .UseProcess( " BookSellerProcessCode ")
        .OnTask(8027) // TaskID
        .NextStepInt( "20", "Alice")
        .Run( );

流程记录清单:

3.流程撤回和回发

3.1 流程撤回

如果用户在完成待办任务并将其发送给下一个经销商时发现错误消息,则他可以自己发起吊销并撤回当前流程。撤消内部处理逻辑等效于返回处理,除了发起人位于不同的位置。代码示例如下:

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice")
           .UseApp( "BS-100", "Delivery-Books", "BS-100-LX")
           .UseProcess( " BookSellerProcessCode ")
           .OnTask( 8027) // TaskID
           .Withdraw( );

流程记录清单:

3.2处理回发

流程返回由当前的待办任务处理程序启动,并返回到流程的上一步。解析过程时,上一步可能有多个处理步骤,要求用户明确选择步骤列表(通常由前一步弹出时前端用户指定),该PrevStepInt()方法用于简化处理仅返回的处理步骤之一。

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice")
            .UseApp( "BS-100", "Delivery-Books", "BS-100-LX")
            .UseProcess( " BookSellerProcessCode ")
            .PrevStepInt()
            .OnTask( 8030) // TaskID
            .SendBack( );

流程记录清单:

II:简单的并行分支处理代码编写示例

前言:对于渴望了解引擎功能的开发人员,在下载版本之后,他们希望尝试编写代码以完成流程的开发和测试。本文试图说明如何通过最简单的并行分支过程快速理解引擎代码编写。

版本:.NET Core 2.1

1.创建分支流程图

分支过程是一个常见的决策过程。本文以汽车订购过程为例,说明并行分支过程。并行分支通常用于多个部门可以同时执行任务的场景,并且每个单独的分支也可以视为串行序列片段。最后,多个分支通过接收器节点合并。

var pmb = ProcessModelBuilder.CreateProcess(" LargeOrderProcess ", " LargeOrderProcessCode ");
var process = pmb.Start("Start")
           .Task( "Large Order Received")
           .AndSplit( " AndSplit ")
           .Parallels(
               () => pmb.Branch (
                    () => pmb.Task ( "Engineering Review")
                  )
                  , ( ) => pmb.Branch (
                    () => pmb.Task ( "Design Review")
                  )
                )
           .AndJoin( " AndJoin ")
           .Task( "Management Approve")
           .End( "End")
           .Store();

上面的代码创建带有两个分支的并行分支过程,分支为AndSplitAndJoin通过直接分配代码来设置图中节点的属性类型。流程图示例如下:

2.流程启动和操作

启动和运行过程是两个最常用的API接口。

2.1 流程启动

启动需要处理流程实例的创建,以及启动节点和启动节点之后的任务节点的创建。示例代码如下:

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack")
           .UseApp("PS-100", "Large-Car-Order", "PS-100-LX")
           .UseProcess("LargeOrderProcessCode")
           .Start( );

活动实例记录表如下:

2.2 流程运行

流程运行是从当前待办任务开始并运行到下一步的流程。并行分支表示多个分支被同时触发,如上面的流程图所示:并行网关节点(AndSplit)同时触发了Design ReviewEngineering Review ,因此在活动实例表中一次生成了两个新的活动记录。

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack")
         .UseApp( "PS-100", "Large-Car-Order", "PS-100-LX")
         .UseProcess( " LargeOrderProcessCode ")
         .OnTask( 8033)
         .NextStepInt( "20", "Alice")
         .Run( );

活动实例记录表如下:

3.撤回和回发

3.1 流程撤回

如果用户在完成待办任务并将其发送给下一个经销商时发现错误消息,则他可以自己发起吊销并撤回当前流程。撤消并行分支时,两个并行分支也同时撤回并撤销,这表明该分支是两个强相关类型的活动。

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "Jack")
         .UseApp( "PS-100", "Large-Car-Order", "PS-100-LX")
         .UseProcess( " LargeOrderProcessCode ")
         .OnTask( 8033) // TaskID
         .Withdraw ( );

   活动实例记录表如下:

3.2 处理回发

流程返回由当前的待办任务处理程序启动,并返回到流程的上一步。如果返回并行分支的一个分支,则默认值为仅将当前分支之前的任务节点返回到网关,而不会影响另一个分支。

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice")
          .UseApp( "PS-100", "Large-Car-Order", "PS-100-LX")
          .UseProcess( " LargeOrderProcessCode ")
          .PrevStepInt()
          .OnTask( 8038) // TaskID
          .SendBack( );

活动实例记录表如下:

Slickflow.NET核心开源工作流引擎_第4张图片

由于对相邻分支的处理,并行分支的撤消和回退在引擎中很特殊。这里,仅描述退货后的结果记录,并且将安排退货的内部处理逻辑以供将来要专门介绍的另一篇文章。

III:简单或分支过程编码示例

前言:对于渴望了解引擎功能的开发人员,下载版本后,他们想尝试编写代码以完成流程的开发和测试。本文试图从离开流程或分支模式快速了解引擎代码的编写。

版本:.NET CORE 2.1

1.创建或分支流程图

Or分支过程是一个常见的决策过程,用于处理不同决策场景中的业务处理,其中每个分支都可以视为序列过程的一部分。以下是leave过程的创建代码:

var pmb = ProcessModelBuilder.CreateProcess(" LeaveRequest ", " LeaveRequestCode ");
var process = pmb.Start("Start")
         .Task( "Fill Leave Days")
         .OrSplit( " OrSplit ")
         .Parallels(
                  () => pmb.Branch (
                     () => pmb.Task (
                              VertexBuilder.CreateTask( "CEO Evaluate"),
                              LinkBuilder.CreateTransition( "days>=3")
                                 .AddCondition( ConditionTypeEnum.Expression , "Days> =. 3")
                              )
                      )
                 , () => pmb.Branch (
                     () => pmb.Task(
                              VertexBuilder.CreateTask ( "Manager Evaluate"),
                              LinkBuilder.CreateTransition ( "days<3")
                                 .AddCondition( ConditionTypeEnum.Expression , "Days <. 3")
                              )
                      )
                  )
          .OrJoin( " OrJoin ")
          .Task( "the Notify HR")
          .End( "End")
          .Store( );

上面的代码创建了一个OrSplitOrJoin流程,其中有两个分支代表实际业务流程中的请假流程。完整流程图的示例如下:

Or分支是两个条件表达式的过渡。对于分支网关节点,该过程将根据传入的条件变量days的值来决定采用哪个分支。此过程可以视为休假过程中休假天数的分支选择。例如,如果请假天数少于3天,则部门经理将审批它。如果请假天数超过(包括)3天,则总经理将要求审批。审批决策可以通过分支模式或分支模式来实现。

2.流程启动和操作

启动和运行过程是两个最常用的API接口。

2.1 流程启动

启动需要处理流程实例的创建,以及启动节点和启动节点之后的任务节点的创建。示例代码如下:

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack")
          .UseApp( "DS-100", "Leave-Request", "DS-100-LX")
          .UseProcess( " LeaveRequestCode ")
          .Start( );

活动实例记录表如下:

类似地,以leave过程为例,可以将第一任务节点视为提交休假表格,当员工填写休假表格时,可以将其视为开始流程。

2.2 流程运行

流程运行是从当前待办任务开始并运行到下一步的流程。因为它是分支网关还是分支网关,所以必须指定条件变量的名称和值来确定下一个分支路径。在此,需要传递作为条件变量的请假天数。当请假天数为3天时,网关将决定执行长批准节点,因此将仅选择一个分支进行路由。代码示例如下:

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack")
      .UseApp( "DS-100", "Leave-Request", "DS-100-LX")
      .UseProcess( " LeaveRequestCode ")
      .OnTask( 8017)
      .IfCondition( "Days", "3")
      .NextStepInt( "20", "Alice")
      .Run( );

活动实例记录表如下:

3.撤回和回发流程

3.1 流程撤回

如果用户在完成待办任务并将其发送给下一个经销商时发现错误消息,则他可以自己发起吊销并撤回当前流程。

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "Jack")
         .UseApp( "DS-100", "Leave-Request", "DS-100-LX")
         .UseProcess( " LeaveRequestCode ")
         .OnTask( 8017) // TaskID
         .Withdraw ( );

活动实例记录表如下:

3.2 处理回发

流程返回由当前的待办任务处理程序启动,并返回到流程的上一步。如果返回并行分支的一个分支,则默认值为仅将当前分支之前的任务节点返回到网关,而不会影响另一个分支。

IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice")
      .UseApp( "DS-100", "Leave-Request", "DS-100-LX")
      .UseProcess( " LeaveRequestCode ")
      .PrevStepInt()
      .OnTask( 8020) // TaskID
      .SendBack( );

活动实例记录表如下:

Slickflow.NET核心开源工作流引擎_第5张图片

开发工具

1Slickflow流程设计器

  • http://demo.slickflow.com/sfd/

2Slickflow WebTest工具

  • http://demo.slickflow.com/sfw2/

GitHub项目

  • Https://github.com/besley/Slickflow

总结

  1. 上面的代码可以帮助开发人员快速熟悉引擎组件的界面以及简单或分支的实用功能。完整功能需要在企业版或更高版本中获取。
  2. 助手开发工具中的Process DesignerWeb测试工具,可以为用户提供直观的体验操作,也适合不同类型的业务用户;
  3. 代码创建过程和测试过程方便开发人员学习和快速入门,这是提高工作效率的有效途径。

你可能感兴趣的:(架构及框架)