目录
介绍
背景
使用代码
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支持SQLSERVER,ORACLE,MySQL等数据库,它由Dapper.NET扩展库实现。使用EF Core支持不同数据库产品的.NET Core版本。
5、支持的工作流程模式:
6、流程版本:由于业务流程已更改,流程具有版本属性以升级新定义。
7、XML缓存:运行时实例使用缓存来使XML流程图保持过期时间。
前言:对于渴望了解引擎功能的开发人员,下载版本后,他们想要尝试编写代码以完成流程的开发和测试。本文试图说明如何从一个简单的流程快速理解引擎代码编写。
版本:.NET Core 2.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()方法用于数据库存储过程。流程图示例如下:
启动和运行过程是两个最常用的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.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( );
流程记录清单:
前言:对于渴望了解引擎功能的开发人员,在下载版本之后,他们希望尝试编写代码以完成流程的开发和测试。本文试图说明如何通过最简单的并行分支过程快速理解引擎代码编写。
版本:.NET Core 2.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();
上面的代码创建带有两个分支的并行分支过程,分支为AndSplit- AndJoin。通过直接分配代码来设置图中节点的属性类型。流程图示例如下:
启动和运行过程是两个最常用的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 Review和Engineering 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.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( );
活动实例记录表如下:
由于对相邻分支的处理,并行分支的撤消和回退在引擎中很特殊。这里,仅描述退货后的结果记录,并且将安排退货的内部处理逻辑以供将来要专门介绍的另一篇文章。
前言:对于渴望了解引擎功能的开发人员,下载版本后,他们想尝试编写代码以完成流程的开发和测试。本文试图从离开流程或分支模式快速了解引擎代码的编写。
版本:.NET CORE 2.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( );
上面的代码创建了一个OrSplit- OrJoin流程,其中有两个分支代表实际业务流程中的请假流程。完整流程图的示例如下:
Or分支是两个条件表达式的过渡。对于分支网关节点,该过程将根据传入的条件变量days的值来决定采用哪个分支。此过程可以视为休假过程中休假天数的分支选择。例如,如果请假天数少于3天,则部门经理将审批它。如果请假天数超过(包括)3天,则总经理将要求审批。审批决策可以通过分支模式或分支模式来实现。
启动和运行过程是两个最常用的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.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( );
活动实例记录表如下: