.net工作流系统之扩展性
最近为用户做工作流实施时,都无一例外的提出工作流系统的扩展性问题。
事件一:eworkflow工作流系统预置了一些系统的条件,前置后置函数等。如果这些不能满足业务需要,用户需要定制自己的业务规则,业务过程,该如何做?
解决方案:eworkflow系统预置了很多系统的条件类,前置后置函数类。简单一些的业务规则,可以用自定义脚本,写个表达式来实现。
如条件类的:判断用户是否有某个角色 cn.com.fcsoft.workflow.util.UserHasRoleCondition
判断是否是竞争型任务的签收人 cn.com.fcsoft.workflow.util.CompetitionTaskCondition
....
事件类:将指定步骤的执行人保存到mostRecentCaller变量中 cn.com.fcsoft.workflow.util.MostRecentCaller
...
打开我们的任意一个条件类 ,可以看到,条件类必须实现Condition接口,实现passesCondition()方法
/// <summary> 判断调用者caller是否属于role参数所指的角色
/// caller: userid role: roleid
/// </summary>
public class UserHasRoleCondition : Condition
{
//~ Methods
public virtual bool passesCondition(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps)
....
流程的上下文、相关的业务参数、数据库连接、当前操作员id等,均可以在passesCondition的三个参数中获得。
因此在需要扩展业务规则的时候,可以扩展这种条件类,只需要在用户的应用系统中引用eworkflow.dll(java版的就是引入eworkflow.jar),新建业务规则类,实现Condition接口,在passesCondition方法中写业务规则就可以了,所有和流程相关的信息,节点定义的属性,业务参数,均可以从passesCondition方法的三个参数中获得。
将写好的条件类注册到 WF_DSN_CLASS表中,在流程定义的时候,从节点的属性页中选择出这些扩展的业务规则,挂接到流程的节点上。在流程实例运行到此节点的时候,就会执行这些节点上定义的业务规则类,作出规则判断。
下面是一个判断 当前操作员用户,是否属于某个区域的业务规则的判断
-----------------------------------------条件和事件的分隔线-----------------------------------------------
打开任意一个事件函数类,可以看到,事件函数类的,必须实现FunctionProvider接口,实现execute()方法
public class MostRecentCaller : FunctionProvider
{
//~ Methods
public virtual void execute(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps)
和条件类的接口一样,流程的上下文、相关的业务参数、数据库连接、当前操作员id等,均可以在execute的三个参数中获得。集成开发文档中会有这三个参数的详细描述。
在需要扩展业务事件,业务过程的时候,只需要在用户的应用系统中引用eworkflow项目或者eworkflow.dll((java版的就是引入eworkflow.jar),新建这种事件类,实现FunctionProvider接口,在execute()方法中写业务实现,所有和流程相关的信息,节点定义的属性,业务参数,均可以从execute方法的三个参数中获得。
将写好的类注册到 WF_DSN_CLASS 表中,在流程定义的时候,从节点的属性页中选择出这些扩展的业务事件类,挂接到流程上。这样流程实例运行的时候,流转到相应的节点,就会执行节点上定义的这些业务事件。
例如将当前操作员信息保存到流程的上下文中:
事件二:我们的eworkflow工作流系统的 待办任务列表 只有流程相关的信息,业务信息部分较少,集成到用户系统时,用户希望能自定义一些业务列信息。
解决方案:
eworkflow工作流系统的任务表中,任务名称,是支持表达式的,在表达式中可以引入业务信息。例如任务名称为:审核 业务部 李明 的报销单。 业务部 李明 这两个信息均来自表达式,获取的是报销单中的记录信息。
如果这样还是不能满足用户的需要,用户需要扩展列出多列业务表中的记录值。那就只能通过调用流程的获取待办任务列表的api函数来做了。
具体过程如下:
先通过调用工作流的api函数,获取待办任务列表
ArrayList getCurrentTasks(System.String type, System.String wfId, System.String stepId);
得到的是一个list,list的每一条是对应一条任务表的一个 IDictionary对象(java版的就是map对象),任务表的字段名为key,记录值为value。
任务表中会记录任务信息关联的流程实例id, 通过流程实例id获得 和业务表的关联,找到业务表的记录,然后取出业务表中的多列信息,和任务信息 一起返回到页面显示,这样就获得了一个 包含多列具体业务信息的待办任务列表了。