前言:对于急切想了解引擎功能的开发人员,在下载版本后,就想尝试编写代码,完成一个流程的开发和测试。本文试图从请假流程,或分支模式来快速了解引擎代码的编写。

1. 创建或分支流程图形

        或分支流程是常见的决策类的流程,用于处理不同决策场景出现的业务处理,其中每个分支又可以看成是一个串行流程的片段。下面是请假流程的创建代码:

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("HR Notify")
				 .End("End")
				 .Store();

  上述代码创建了一个并行分支流程,有两个分支,而且分支是或分支(Orplit-OrJoin),流程图示例如下:

         或分支是两个伴随条件表达式的转移(Transition),在或分支网关节点时候,流程会根据传入的条件变量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();

      活动实例记录表如下:

        同样按照请假流程为例进行说明,第一个任务节点可以视为“提交请假单”,当员工填写完请假单,提交后,则可以视为启动流程。

 2.2 流程运行

      流程运行是由当前待办任务开始办理,并且运行到下一步的过程。因为是或分支网关,所以需要明确指定条件变量的名称和数值,用于确定下一步的分支路径。此处,请假天数days作为条件变量,需要传入。代码示例如下:

            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();

  活动实例记录表如下:

   4. 总结

      以上代码,可以帮助开发人员快速熟悉引擎组件的接口和简单分支的实用功能,完整功能需要在企业版以上版本获取。并行分支的撤销和退回因为要考虑相邻分支的处理,所以在引擎内部的处理也是比较特殊。此处,只描述退回后的结果记录,退回的内部处理逻辑今后也会安排另外的文章专门再去介绍。

02-10 14:19