一种业务系统与工作流系统数据交换的方式
工作流系统作为业务系统的业务流程驱动支撑,提供必要的工作流基本功能,如任务提交,撤回,挂起,终止,获取待办事项,路由计算等等。除此之外,还提供流程图设计,参与人指定等流程定义功能。以上工作不可避免地用到业务系统的数据,比如根据业务数据(借款单)的数据进行路由判断,计算审核人等。工作流引擎如何获取业务系统的数据呢?
独立的工作流系统
一个设计良好的工作流系统应该是和业务系统的低耦合的,是独立于业务系统的。因此要定义双方的数据交换协议和规则。
独立的含义是,一方面要提供标准或默认的流程设计界面,比如路由条件定义界面,参与人(审核人)指定条件。另一方面在需要时,可以根据约定的协议和规则访问业务系统的数据。
协议的类型有很多种,web服务,RPC,文件系统,比较实用并简单的是数据库访问协议。直白讲就是让工作流系统直接访问业务系统的数据库,约定数据库表的格式。并通过自定义函数和流程变量来增加系统的易用性,使得直接用户可以定义工作流。
流程变量和函数
流程变量和函数同编程语言中的变量类似,稍有不同的是这里的变量会对应一段计算逻辑。这个计算逻辑可能是一段SQL语句,Java代码。
函数有参数,同变量类似,也有一段代码,不同的是,函数有参数,变量没有。变量的值和函数由流程引擎负责解释。在实战中,实施人员定义流程变量和函数,屏蔽数据复杂性,用户使用函数和变量定义路由逻辑和参与者逻辑。在实际中,流程变量一般用来存放单据上的数据项,函数可以用来计算流程参与者。
记录类型的流程变量
考虑到流程变量的值大多来自某个表的同一条记录,我们可以设计一种叫“记录”的结构(数据类型),记录的每个成员可以对应表的某个列。具体实现时,一个sql语句,就可以把所有的成员(列)的值取过来,这样可以提高系统的性能。
流程变量和函数的作用域
变量和函数分两个作用范围:系统级和流程级。前者在所有流程中都可使用,后者只能在定义它的流程中使用。
内置变量
流程系统有几个内置变量,交易号,业务系统ID。前者用来获得业务系统的交易实例数据,计算流程变量时使用。交易号的例子:单据号。业务系统ID用来区分不同的外部业务系统,因为流程系统是独立的,可以同时为多个外部系统提供工作流服务,有必要通过业务系统id进行区分。
业务系统在调用工作流服务时,必须传入这两个变量的值。
变量和函数的属性
变量的属性有:类型,计算逻辑,变量说明。类型可以是简单类型,如字符串,数字,也可以是业务类型,如借款单号,员工号。
函数的属性:函数名,返回值类型,参数,逻辑。
函数参数的属性:数据类型。
定义数据类型的目的有两个,一是在定义路由表达式或参与者表达式时根据类型匹配变量,提高易用性,二是可以做表达式校验。
下面是流程变量的例子:
作用范围 | 变量名称 | 变量类型 | 变量说明 | 计算逻辑 |
流程 | 申请人工号 | 工号 | 借款单申请人编号。 | select app_emp from hr_loan_request where req_id = :tran_id |
流程 | 申请金额 | 数字 | 借款申请金额。 | select app_amount from hr_loan_request where req_id = :tran_id |
系统 | 交易ID | 字符串 | 内置变量,流程实例关联的业务系统交易号。 | 业务系统在启用流程时传入 |
系统 | 系统ID | 字符串 | 内置变量,业务系统的代号。当工作流系统独立部署时,用于区分服务的业务系统。 | 业务系统在启用流程时传入,不可修改 |
系统 | 用户ID | 字符串 | 内置变量 | 业务系统在启用流程时传入,不可修改 |
流程函数的例子
作用范围 | 函数名称 | 返回值类型 | 函数说明 | 计算逻辑 |
流程 | biz_role | user | 根据传入的业务角色名称和组织机构,返回用户编号,以逗号分隔 | select user_no from hr_pr_biz_role where role_name =:p_rolename and org= :p_org |
变量和函数定义
流程系统提供变量和函数定义功能,该功能的使用对象是实施人员。这是工作流系统的标准功能。在这个功能里,提供可视化的界面,供实施人员定义变量和函数,以及其属性。
变量和函数的逻辑支持多种,比如SQL,webService,RPC,程序集内部调用等等。我们可以先实现最简单的:SQL。
定义路由条件和参与者条件
工作流引擎另外一个比较重要的功能就是定义路由条件,和参与者表达式。
路由条件定义在“边”上,决定流程的走向。路由条件是个逻辑表达式(logical-exp),它的返回时是 true 或者 false;
参与者表达式用来运算某个节点上的活动(activity)由谁参与,参与者表达式的结果是用户集合或者角色集合。流程引擎根据运算结果,生成用户的待办任务,业务系统通过工作流接口取得某个用户的待办任务。
工作流系统提供可视化的定义界面。无论是路由条件还是参与者表达式,都只能是使用流程变量和函数作为表达式项。系统可以提供表达式编辑器,函数表达式编辑器,流程变量和函数枚举界面,提高易用性。
这个功能的目标用户是直接用户和实施人员。
表达式解析和函数运算
表达式的项除了流程变量就是流程函数,解析自然不成为问题,求值也是毛毛雨了。