工作流框架引擎设计.docx
- 文档编号:7039699
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:42
- 大小:63.57KB
工作流框架引擎设计.docx
《工作流框架引擎设计.docx》由会员分享,可在线阅读,更多相关《工作流框架引擎设计.docx(42页珍藏版)》请在冰豆网上搜索。
工作流框架引擎设计
工作流框架(引擎)概要设计
修订历史
日期
版本
说明
作者
2011.02.19
1.00
初始正式版本
杨纲
2011.02.21
1.01
杨纲
2011.02.28
1.02
节点元素添加了state-code属性;转换元素添加了operationoperation-codeoperation-label等属性,删除了task-summarize属性;并修改相关的数据库和类设计
杨纲
设计目的及背景
1、现有的工作流框架有何弊端和风险?
就目前的设计而言,流程事项的各状态节点和流转路径相对固定,虽然使用了状态机的框架,但是流程的实现依然过度依赖硬编码(表现为用户界面的数量和内容以及触发状态变化的操作对固有流程的依赖度过大),因此当固有流程变化时,程序维护量比较大,不直观。
然而当我们的系统在广东、东莞、商务部、湖南等各个独立的平台运行时,用户对固有流程变化的需求将不断出现。
目前系统对各个用户的个性化工作流需求采用无约束的自流转来实现,即事项当前的处理人可以批复意见,但对事项的流程不产生强制性影响,同时可以自由的选择下一个处理人,这就好比我们提供一个数据录入界面,但不提供任何数据逻辑校验一样,必须完全由用户去判断操作的正确性。
这样必然增加了用户无意出错或有意出错的机会和增加用户的工作量;作为一个临时的解决方案,可以让用户按照实际的工作流程将业务勉强进行下去,但长期如此,必然会被用户垢病。
在审批系统及后续的发证系统中,工作流的概念将在很多地方出现,例如项目预审批、项目审批、项目审查、发证审批等等,我们需要一个简易、方便使用,易于扩展,贴近我们的应用类型的工作流框架来简化我们的开发和维护,提升系统的用户满意度。
2、为什么不使用开源的工作流引擎?
经过对现有主流的一些开源工作流框架的考察,其中重点考察了jpbm,有以下感受:
开源工作流框架过于通用,考虑了太多我们应用类型以外的需求,导致了如果我们要使用他,必须接受不必要的复杂性和过长的学习周期。
开源工作流框架未必能满足我们未来对工作流灵活性和易维护性的要求,例如,某些工作流框架是基于标准状态图的,但标准状态图是不擅长并行的,所以在定义并签、会签等模式时,会遇到困难。
某些工作流框架是基于标准活动图的,但标准活动图是会导致定义某些循环流程非常复杂,不够直观。
Jpbm使用的是扩展的状态图,定义相对比较灵活,但考察其API后,依然发现了不少问题;例如待办事项的列表,无法按照流程的类型+用户进行待办事项查询,只能得到某个用户所有的代办事项,而不区分是项目预审还是项目审查或是项目审批。
也许以上问题通过深入的研究或是复杂的扩展,间接的设计后都可以解决,但是我觉得通过对jpbm的借鉴,定制一个贴近应用,使用简单,规模有限的工作流引擎是更好的选择。
3、自主开发引擎的目标?
A、能够使用扩展的状态图(XML格式)定义工作流程。
B、在某个状态下,可以定义一个或多个任务(task),可以根据其执行结果(未执行也是一种结果)的任意组合来决定下一状态(处理并签、会签)。
C、一个任务的所属用户可以充分使用上下文用户、绝对用户、用户组、用户关系等灵活模式。
D、可以定义事项在在某个状态下,可用的其他资源。
E、支持在xml定义中使用脚本语言(BeanShell),以便工作流程定义取得更大的灵活性。
减少因流程变化对硬编码和系统升级的需求。
F、同工作流的界面开发有一个简单明确的接口(包括程序接口、数据库接口)。
G、支持一系统包含多个流程,一个流程支持多个单位版本,一个单位包含多个历史版本(确保流程定义升级不会有问题)。
用户定义扩展
A、用户组,定义一组有相同特性的用户,例如科长组,局长组等,建立专用数据表存储。
B、用户关系,定义同用户A具有特定关系的用户B,例如A的科长是B,建立专用数据表存储。
C、替代用户,当某个用户零时不在岗位时,可由管理员定义这个用户的替代用户,替代用户可操做这个用户的待办事项,建立专用数据表存储。
流程定义格式(XML)
一个状态图例:
开始
如上图,一个流程图定义的节点(Node)共有三种类型,即《开始节点》、《任务节点》和《结束节点》,必须包含且只包含一个《开始节点》,0到N个《任务节点》,1到N个《结束节点》,并且流程必须以《开始节点》开始,以《结束节点》结束。
节点间的有向连线叫转换(transition),表示从一种状态节点变化到另一种状态节点。
下边介绍xml格式及含义:
先看一个不完整的例子,帮助理解:
ok
……
01
02
……
……..
……
……
……
以下是完整的元素定义,分别定义每个元素可包含的属性和子元素
process-definition元素
名称
类型
个数
描述
name
attribute
required
流程定义的唯一名称
description
attribute
required
流程定义的文字描述
event-handler
attribute
required
流程事件处理类的全名,是一个实现了ProcessEventHandler接口的类,流程引擎会使用反射来实例化流程事件处理类。
具体参见类设计
start-node
element
[1…1]
开始节点
end-node
element
[1…N]
结束节点
task-node
element
[0…N]
任务节点
start-node元素
名称
类型
个数
描述
name
attribute
required
节点的唯一标志
state
attribute
required
节点代表的内部状态
state-code
attribute
required
节点代表的外部状态编码
state-label
attribute
required
状态的文字标签
task
element
[1…N]
当前节点的相关任务,当其中任何任务完成时将触发离开节点的请求,引擎会判断能否离开当前节点及离开的路径(transition)
transition
element
[1…1]
转换,指明开始节点的流向的节点
resources
element
[0…1]
定义事项处于当前节点时,待办事项界面(或其他)可用的资源集合
end-node元素
名称
类型
个数
描述
name
attribute
required
节点的唯一标志
state
attribute
required
节点代表的内部状态
state-code
attribute
required
节点代表的外部状态编码
state-label
attribute
required
状态的文字标签
task-node元素
名称
类型
个数
描述
name
attribute
required
节点的唯一标志
state
attribute
required
节点代表的内部状态
state-code
attribute
required
节点代表的外部状态编码
state-label
attribute
required
状态的文字标签
task
element
[1…N]
当前节点的相关任务,当其中任何任务完成时将触发离开节点的请求,引擎会判断能否离开当前节点及离开的路径(transition)
transition
element
[1…N]
转换,指向下一个节点
resources
element
[0…1]
定义事项处于当前节点时,待办事项界面(或其他)可用的资源集合
transition元素
名称
类型
个数
描述
name
attribute
required
转换的唯一标志
to
attribute
required
指向下一个任务或结束节点的唯一标志name
operation
attribute
required
转换所代表的内部操作
operation-code
attribute
optional
转换所代表的外部操作编码
operation-label
attribute
required
对当前节点的所有任务的执行结果的总结性概述文字
condition-script
stringelement
[0…1]
选择此转换的必须条件。
只有当此script执行的结果返回true,引擎才会选择此转换离开当前节点;如果没有定义此元素,则无条件转换
resources元素
名称
类型
个数
描述
resource
stringelement
[0…N]
可用的资源ID,ID的具体含义由具体的流程实现者或本框架的使用者定义
task元素
名称
类型
个数
描述
name
attribute
required
任务的唯一标志
type
attribute
required
数值型,0表示普通任务,1为外部任务(通常不在用户界面上完成)
action
attribute
required/optional
任务对应的处理程序地址(例如对应代办事项界面上任务按钮触发的url),当任务类型是0普通任务时,本属性是必须的,当任务类型是1外部任务时,本属性可以不提供
action-label
attribute
required
任务处理程序的文字标签
results
element
[1…1]
任务完成的可能结果及其描述
tags
element
[0…1]
任务对应的其他信息,具体含义由具体的流程实现者或本框架的使用者定义
user-list
element
[0…1]
可以执行本任务的用户列表,如果没有指定user-list元素,则表示这个任务所有人都可以执行
enable-script
stringelement
[0…1]
在引擎创建新节点时被调用,用来确定本节点是否创建本任务,返回true则创建,返回false不创建,如果没有定义本元素,那么本任务将被无条件创建
results元素
名称
类型
个数
描述
result
element
[1…1]
结果编码及其描述信息
result元素
名称
类型
个数
描述
code
stringelement
[1…1]
结果编码
description
stringelement
[1…1]
结果描述信息
enable-script
stringelement
[0…1]
用来确定本节点的本任务在这一刻是否允许使用本结果,返回true则允许,返回false不允许,如果没有定义本元素,那么本结果将允许使用
tags元素
名称
类型
个数
描述
tag
element
[0…1]
键值对信息
tag元素
名称
类型
个数
描述
key
stringelement
[1…1]
唯一标志
value
stringelement
[1…1]
标志对应的值
user-list元素
名称
类型
个数
描述
empty-is-all
attribute
optional
0表示正常(缺省)
1表示当用户列表为空时(没有用户),则相当于不限制用户
owner-user
null
element
[0…1]
流程实例的属主用户
absolute-user
stringelement
[0…N]
包含绝对用户名称
group-user-list
stringelement
[0…N]
包含用户组名,囊括了组定义的所有用户
task-user-list
string
element
[0…N]
内容为指定任务的唯一名称;如果流程实例已经流经过指定任务的父节点,并且在指定节点有一个或多个用户执行过该任务,则返回这些用户
relative-user-list
element
[0…N]
同某些用户有特定关系的用户
relative-user-list元素
名称
类型
个数
描述
relationship
attribute
required
定义关系类别,例如科长,主管等等
owner-user
null
element
[0…1]
流程实例的属主用户(如果有的话)
absolute-user
stringelement
[0…N]
包含绝对用户名称
group-user-list
stringelement
[0…N]
包含用户组名,囊括了组定义的所有用户
task-user-list
string
element
[0…N]
内容为指定任务的唯一名称;如果流程实例已经流经过指定任务的父节点,并且在指定节点有一个或多个用户执行过该任务,则返回这些用户
relative-user-list
element
[0…N]
同某些用户有特定关系的用户
数据库设计
用户信息扩展类表:
T_GROUP用户组定义表
字段
名称
类型
描述
GROUP_ID
用户组ID
VARCHAR2(36)
主键
GROUP_CODE
用户组编码
VARCHAR2(20)
GROUP_NAME
用户组名称
VARCHAR2(50)
DESCRIPTION
用户组描述
VARCHAR2(256)
注1:
DEPT_IDGROUP_CODE建唯一复合索引
T_GROUP_USER组用户映射表
字段
名称
类型
描述
GROUP_USER_ID
用户和组映射ID
VARCHAR2(36)
主键
GROUP_ID
用户组ID
VARCHAR2(36)
外键连接T_GROUP表的GROUP_ID
USER_ID
用户ID
VARCHAR2(36)
外键连接T_USER表的USER_ID
注1:
GROUP_IDUSER_ID建唯一复合索引
T_RELATION关系定义表
字段
名称
类型
描述
RELATION_ID
关系ID
VARCHAR2(36)
主键
RELATION_CODE
关系编码
VARCHAR2(20)
RELATION_NAME
关系名称
VARCHAR2(50)
DESCRIPTION
关系描述
VARCHAR2(256)
T_RELATION_USER关系用户映射表
字段
名称
类型
描述
RELATION_USER_ID
唯一ID
VARCHAR2(36)
主键
USER_ID
用户ID
VARCHAR2(36)
外键连接T_USER表的USER_ID
RELATION_ID
关系ID
VARCHAR2(36)
外键连接T_RELATION表的RELATION_ID
RELATIVE_USER_ID
关系用户ID
VARCHAR2(36)
外键连接T_USER表的USER_ID
注1:
USER_IDRELATION_IDRELATIVE_USER_ID建唯一复合索引
T_REPLACER替代人定义表
字段
名称
类型
描述
REPLACER_ID
替代ID
VARCHAR2(36)
主键
PROC_TYPE_ID
流程类型ID
VARCHAR2(36)
外键连接T_PROC_TYPE表的PROC_TYPE_ID
USER_ID
用户ID
VARCHAR2(36)
外键连接T_USER表的USER_ID
REPLACER_USER_ID
替代用户ID
VARCHAR2(36)
外键连接T_USER表的USER_ID
注1:
PROC_TYPE_IDUSER_IDREPLACER_USER_ID建唯一复合索引
流程定义信息存储表:
T_PROC_TYPE流程类型表
字段
名称
类型
描述
PROC_TYPE_ID
流程类型ID
VARCHAR2(36)
主键
PROC_TYPE_NAME
流程类型唯一标志
VARCHAR2(20)
流程类型的唯一ID
DESCRIPTION
流程类型描述
VARCHAR2(50)
SHOW_NO
显示序号
INT
注1:
PROC_TYPE_NAME建唯一索引
T_PROC_DEFINE流程定义表
字段
名称
类型
描述
PROC_DEFINE_ID
流程定义ID
VARCHAR2(36)
主键
PROC_DEFINE_NAME
流程定义唯一标志
VARCHAR2(20)
流程定义唯一ID
PROC_TYPE_ID
流程类型ID
VARCHAR2(36)
外键连接T_PROC_TYPE表的PROC_TYPE_ID
VERSION
流程定义版本
INT
0,1,2,……N
EVENT_HANDLER
流程事件处理者
VARCHAR2(256)
流程事件处理类的全名,是一个实现了ProcessEventHandler接口的类,流程引擎会使用反射来实例化流程事件处理类。
具体参见类设计
DEFINE_DATE
流程定义日期
DATE
DESCRIPTION
流程定义描述
VARCHAR2(50)
DEFAULT_FLAG
缺省版本标记
INT
0非缺省版本
1缺省版本(参见表T_DEPT_PROC的备注3)
注1:
PROC_TYPE_IDVERSION建唯一复合索引
注2:
PROC_DEFINE_NAME建唯一索引
T_DEPT_PROC部门流程类型映射表
字段
名称
类型
描述
DEPT_PROC_ID
部门流程定义ID
VARCHAR2(36)
主键
DEPT_ID
部门ID
VARCHAR2(36)
外键连接T_DEPARTMENT表的DEPT_ID
PROC_TYPE_ID
流程类型ID
VARCHAR2(36)
VERSION
流程定义版本
INT
注1:
DEPT_IDPROC_TYPE_ID建唯一复合索引
注2:
PROC_TYPE_ID+VERSION同T_PROC_DEFINE表的PROC_TYPE_ID+VERSION建立引用关系
注3:
如果某个部门没有在本表定义使用的流程定义版本,则确省使用缺省版本(DEFAULT_FLAG=1)的流程定义
T_PROC_NODE流程节点表
字段
名称
类型
描述
PROC_NODE_ID
流程节点ID
VARCHAR2(36)
主键
PROC_NODE_NAME
流程节点唯一标志
VARCHAR2(20)
节点的唯一ID
PROC_DEFINE_ID
流程定义ID
VARCHAR2(36)
外键连接T_PROC_DEFINE表的PROC_DEFINE_ID
TYPE
流程节点类型
INT
0开始节点1任务节点2结束节点
STATE
流程节点状态
VARCHAR2(20)
STATE_CODE
流程节点外部状态
VARCHAR2(20)
STATE_LABEL
状态文本标签
VARCHAR2(50)
SHOW_NO
显示序号
INT
注1:
PROC_DEFINE_IDPROC_NODE_NAME建唯一复合索引
T_PROC_TRANS流程转换表
字段
名称
类型
描述
PROC_TRANS_ID
流程转换ID
VARCHAR2(36)
主键
PROC_TRANS_NAME
流程转换的唯一标志
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工作流 框架 引擎 设计