使用流程引擎整体解决方案

  前面对流程引擎个方面已经有了比较详细的介绍,本篇将最后介绍流程调用的整体解决方案。

  在具体项目调用流程引擎之前,我们需要做的是先把流程引擎以及可视化的流程设计器嵌入到自己的项目中,具体的嵌入方式请参考:流程引擎及流程设计器的嵌入方式

  欢迎加入流程交QQ流群:251834323。

  一、根据具体项目扩展相关接口

  在进行流程调用之前,首先需要根据具体的项目扩展流程引擎公开的相关接口(IPersonList)。此接口的作用为:把具体项目相关的人员信息、部门信息、角色信息等提供给流程引擎调用。

  IPersonList接口包含两个方法。GetPersonList及GetGlobalKeyValue,前者扩展的目的为:让流程引擎可以通过调用此方法,获得人员类型ID对应的所有的人员列表。后者扩展的目的为:使具体的人员类型对流程引擎透明化(角色,具体有那些角色、部门,具体有哪些部门等),以便可视化流程设计中对相关人员类型处理。

 1 using System.Collections.Generic;
 2 using Workflow.Abstract;
 3 
 4 namespace Workflow.Concrete
 5 {
 6     /// <summary>
 7     /// 接口实现实例
 8     /// </summary>
 9     public class TestMode : IPersonList
10     {
11         /// <summary>
12         /// 获取人员列表
13         /// </summary>
14         /// <param name="processingpersonnel">逗号分割的多记录</param>
15         /// <returns></returns>
16         List<string> IPersonList.GetPersonList(string processingpersonnel)
17         {
18             //定义返回人员列表
19             var lst = new List<string>();
20 
21             //循环逗号分割的多个人员类型ID
22             foreach (var str in processingpersonnel.Split(','))
23             {
24                 //根据具体的人员类型ID以及项目的具体情况,返回包含在此人员类型ID下的所有人员列表
25                 //foreach (var p in GetAllPerson(str))
26                 //{
27                     //循环组中的所有人员,利用下面代码加入到返回列表中。
28                     lst.Add("具体人员");
29                 //}
30             }
31 
32             return lst;
33         }
34 
35         /// <summary>
36         /// 实现接口的具体类,获取其对应的键值对列表
37         /// </summary>
38         /// <returns></returns>
39         IDictionary<string, string> IPersonList.GetGlobalKeyValue()
40         {
41             //定义返回类型列表
42             IDictionary<string, string> d = new Dictionary<string, string>();
43             //将具体的键值对加入到返回列表中
44             d.Add("键(如部门ID)", "值(如部门名称)");
45             return d;
46         }
47     }
48 }
IPersonList接口实现实例

  实现相关接口后即可根据具体的业务逻辑利用可视化流程设计器进行流程的设计。

  二、方法调用,推动公文流转

  由于此流程引擎并未嵌入表单设计相关事项(后期可能加入表单设计引擎),所以如果想使用此流程引擎,还需要自行设计相关流转表单。当设计好表单后,可调用流程引擎相关方法达到公文流转。

  以下提到的方法具体说明请参考:通用流程相关方法说明及调用事例

  1.调用WorkflowOperation中的方法IsExistTask或GetCurrentStep判断表单针对某流程的任务是否已经发送。

  2.如果任务未发送,调用WorkflowOperation中的SendWorkflow方法,发起公文的流转。

  3.如果任务已发送,调用TaskListOperation中的GetPersonTask或GetByFormTaskList方法获取待处理的任务列表。

  4.调用WorkflowOperation中的IsHereafter方法,判断待处理任务的节点步骤的处理人类型是否为将来指定,如果为将来指定,需弹出人员选择框选择具体的处理人,然后进入步骤5。

  5.调用TaskListOperation中的TaskListUpdate方法,对待处理任务进行处理。

  6.再次调用WorkflowOperation中的SendWorkflow方法,推动公文的流转。

  7.判断6中的方法的返回值,确定推动状态,如果未到达结束节点步骤,重复步骤3-6,否则对表单做后续的相关处理,如改变表单状态等。

  三、特殊情况的处理

  在公文的正常流转中,难免会出现许许多多的特殊情况,例如,审批人的更换、添加、移除等。在此流程引擎中,也有相关的解决方案。即,通过如下方法对处理人进行增删。

  TaskListOperation类中的AddHandlePerson方法对处理人的增加。

  TaskListOperation类中的RemoveHandlePerson方法对处理人的移除。

以上既是,包含流转发起、流转推动、任务列表获取等在内的基本流程应用。

注:流程引擎正在不断的努力完善中,同时希望有相同爱好的人能加入QQ群251834323,共同为开源软件做一份微薄之力。

相关文章连接:

  通用流程设计http://www.cnblogs.com/qidq/p/workflow.html

  可视化流程设计——流程设计器演示(基于Silverlight)http://www.cnblogs.com/qidq/p/Workflow_Silverlight.html

  流程引擎及流程设计器的嵌入方式http://www.cnblogs.com/qidq/p/3499769.html

  通用流程相关方法说明及调用事例http://www.cnblogs.com/qidq/p/3504061.html

原文地址:https://www.cnblogs.com/qidq/p/3505112.html