工作流设计.docx
- 文档编号:30714379
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:19
- 大小:102.95KB
工作流设计.docx
《工作流设计.docx》由会员分享,可在线阅读,更多相关《工作流设计.docx(19页珍藏版)》请在冰豆网上搜索。
工作流设计
SevenStarWorkflowEnginee
简单就是美。
IT领域向来是名词、概念泛滥,正所谓一流公司做标准,经过这些大公司炒作之后,简单问题复杂化,EJB、EAI、ESB、SOA、工作流等等概莫如是。
稳定可靠的系统建立在简单的结构之上,简单带来的是全面的优势,性能、可维护性、可控性、可扩展性等等。
在清晰的明白所要解决的问题以及如何解决之后,便会发现,其实并没有那么复杂。
引擎只是工作流系统中的一部分,其他还有流程设计工具等,在这里我们只对引擎做简单介绍.
1问题的提出
在有工作流引擎之前,不外乎是借助状态字段来完成流程性功能。
示例代码如下:
publicvoiddoFlow(Stringsts){
if(“A”.equals(sts)){
intresult=do业务代码1。
。
。
if(result>0){
doFlow(“B”);
}else{
doFlow(“C”);
}
}
if(“B”.equals(sts)){
intresult=do业务代码2。
。
。
if(result>0){
doFlow(“C”);
}else{
doFlow(“D”);
}
}
if(“C”.equals(sts)){
intresult=do业务代码3。
。
。
if(result>0){
doFlow(“A”);
}else{
doFlow(“B”);
}
}
if(“D”.equals(sts)){
业务代码4。
。
return;//结束
}
}
如上代码所示,复杂的并不是业务逻辑代码,而是代码承担了过多的职责,夹杂了复杂的流程逻辑判断。
显然,我们将这段代码进行职责分离能够降低代码复杂性。
合适的架构来自于Refector,工作流引擎亦来源于流程逻辑从业务逻辑中的分离。
目标明确了,当然我们需要归纳分析具体有哪些流程逻辑,之后才能升华。
。
。
抛开工作流、流程、节点、任务等已被定义的概念,按照自己的思路去思考引擎所要解决的系列逻辑问题如下:
Ø工作流核心逻辑
1)处理先后顺序。
2)谁能处理。
3)是否可以处理了。
4)如何处理。
5)在哪里处理。
6)处理完后如何切换状态。
Ø工作流考虑问题
1)版本问题。
工作流的逻辑是会变化的,自然是老的走老的,新的走新的。
2)每次的处理顺序记录。
需要引入流程定义与实例的概念,显然每次的处理逻辑都可能是不一样的。
3)子流程问题。
父流程,子流程如何交互?
4)聚合分支问题。
5)动态人员分配问题,即无法在流程定义的时候定义谁来处理这个问题,只有在运行时才能确定。
比如考核,只有在运行时,根据被考核人,才能确认它的考核人是谁(被考核人的上级)。
6)流程事件
Ø工作流与应用系统整合的问题
1)如何整合应用系统与工作流系统的权限。
2)如何让用户直接查询到需要处理的流程主体列表,比如合同列表、申请列表等。
3)如何整合应用系统与工作流系统的事务。
4)应用系统与工作流系统如何交互。
基于以上考虑,参考各大流行工作流引擎,我们设计了SevenStarWorkflowEngine
可以说它未必是规范、完美的,但一定是相当实用的,没有丝毫学院派味道。
2引擎模型
图2-1-1引擎模型图
引擎将工作流的定义与运行完全分离,这样可以在运行时改变流程。
ØDefinition
1.流程定义:
功能为区分不同的流程,需要考虑的主要是版本问题,主要属性如下
序号
名称
列名
类型
备注
1
流程名称
id
number(12)
2
流程版本
name
varchar2(200)
3
流程主体类型
mainpart_type
varchar2(200)
流程处理的主体类型,比如说合同/申请/审批/请假等
2.节点定义:
流程定义与节点定义为1对多关系,节点需要考虑的主要问题
1)聚合分叉,即串并行问题
2)节点执行条件,特殊情况下要考虑节点是否能启动
序号
名称
列名
类型
备注
1
id
id
number(12)
2
节点名称
name
varchar2(100)
3
显示名称
display_name
varchar2(100)
4
流程定义
proc_def_id
number(12)
5
节点类型
type
varchar2(10)
start起始节点
startfork起始分叉
end结束节点
endjoin结束聚合
fork分叉节点
join聚合节点
joinfork分叉聚合
plain普通
6
节点执行条件类型
condition_type
varchar2(10)
如果是shell,则value为脚本id
如果是action,则为实现类
主要在于实现join的节点,只有判断所有的节点都到了才能执行
7
节点执行条件
condition_value
varchar2(20)
3.任务定义:
节点定义与任务定义为一对多关系,任务需要考虑的主要问题
1)任务的类型,任务可能是表单/工单、动态表单,也可能是java代码、脚本、启子流程等
2)任务可能是必须执行的,也可能是可选的,比如OA中的[办]与[阅]的任务
3)任务的完成,可以执行此任务的可能有多个人员分配,可能中间一个人完成了就可以了,也可能需要所有人一起完成,也可能是认领模式,当然也可能是更灵活的模式
序号
名称
列名
类型
备注
1
id
id
number(12)
2
任务名称
name
varchar2(200)
3
任务显示名称
display_name
varchar2(200)
4
节点
node_def_id
number(12)
5
任务类型
action_type
varchar2(20)
form表单执行(人工任务),填url
dynamic动态表单
action后台任务
shell脚本
subflow子流程
6
任务值
action_value
varchar2(1000)
看action_type的值
如果是form,则填入表单页面
如果是dynamic,则填入动态表单id
如果是action,则填入实现类
如果是shell,则填入beanshell调用脚本id
如果是subflow,则填入子流程id
7
是否必须完成
is_must
varchar2
(1)
Y/N
如果必须完成的话,只有完成,节点才能往后走
8
是否必须每个人都完成
is_all
varchar2
(1)
Y/N
如果必须全部完成,只有分配的人员每个人都完成了,任务才能完成,节点才能往后走
9
是否打开认领模式
is_claim
varchar2
(1)
Y/N
如果是认领模式,分配人员必须先认领,才能开始做任务
人员分配定义:
即任务上的人员分配定义,哪些人可以执行此任务,需要考虑的问题
1)与现有权限架构的整合
2)运行时才能确认可以执行人员的问题
序号
名称
列名
类型
备注
1
id
id
number(12)
2
分配类型
assign_type
varchar2(200)
user/role/dept/group。
。
。
action/shell如果是action/shell的话那就是根据脚本确定执行人,比如人员是根据创建人动态确定的
3
分配值
assign_value
varchar2(200)
如果是user,则为user_id
dept则为dept_id
4
分配名称
assign_name
varchar2(200)
5
任务定义表
task_def_id
number(12)
7
状态
sts
varchar2
(1)
任务事件定义:
即任务的Action监听事件
序号
名称
列名
类型
备注
1
id
id
number(12)
2
事件名称
name
varchar2(100)
3
事件显示名称
display_name
varchar2(200)
4
事件类型
type
varchar2(100)
start/end/error/finally/back
5
关联类型
target_type
varchar2(100)
node/task
6
关联值
target_value
varchar2(200)
7
动作类型
action_type
varchar2(100)
action/shell
8
动作值
action_value
varchar2(200)
9
状态
sts
varchar2
(1)
Y/N
4.路径定义:
即节点之间走向,状态切换,主要考虑的问题
1)动态路径问题,即目标节点是运行时确认的
2)路径执行的条件问题,即是否可以走这条路径
序号
名称
列名
类型
备注
1
id
id
number(12)
2
节点定义
node_def_id
number(12)
3
转移名称
name
varchar2(200)
4
显示名称
display_name
varchar2(200)
5
转移条件类型
condition_type
varchar2(200)
action/shell
如果有条件的话,只有满足条件的才能走这条路径
6
转移条件值
condition_value
varchar2(200)
如果condition_type是action,则放实现WokflowAction接口的类路径,如果是shell,放s_flow_script表的id
7
转移类型
to_type
varchar2(200)
plain正常的路径
action通过action选择目标路径
script通过脚本选择目标路径
8
转移值
to_value
varchar2(200)
如果to_type是plain的话,则为目标路径定义的id,如果是action,则为实现TransitionAction接口的action类路径,如果为script,则为s_flow_script表的id
5.节点事件定义:
即节点的Action事件监听
序号
名称
列名
类型
备注
1
id
id
number(12)
2
事件名称
name
varchar2(100)
3
事件显示名称
display_name
varchar2(200)
4
事件类型
type
varchar2(100)
start/end/error/finally/back
5
关联类型
target_type
varchar2(100)
node/task
6
关联值
target_value
varchar2(200)
7
动作类型
action_type
varchar2(100)
action/shell
8
动作值
action_value
varchar2(200)
9
状态
sts
varchar2
(1)
Y/N
ØRuntime
1.流程实例:
主要考虑问题
1)流程主体,即此流程实例所处理的合同或者申请或者审批等.
2)子流程问题
序号
名称
列名
类型
备注
1
id
id
number(12)
2
流程定义
def_id
number(12)
流程定义id
3
父流程任务实例
task_instance_id
number(12)
父流程开启子流程的任务实例id
4
父流程实例
parent_id
number(12)
5
流程主体类型
mainpart_type
varchar2(200)
流程处理的主体类型,比如说合同/申请/审批/请假等
6
流程主体值
mainpart_value
varchar2(200)
流程处理的主体的id,比如说合同id/申请id/审批id/请假id等
2.节点实例:
序号
名称
列名
类型
备注
1
id
id
number(12)
2
当前节点
node_def_id
number(12)
4
流程实例
proc_instance_id
number(12)
5
子流程实例
sub_proc_instance_id
number(12)
3.任务实例:
序号
名称
列名
类型
备注
1
id
id
number(12)
2
任务定义
task_def_id
number(12)
3
流程定义名称
proc_def_name
varchar2(200)
4
流程实例
proc_instance_id
number(12)
5
节点实例
node_instance_id
number(12)
4.人员分配实例:
序号
名称
列名
类型
备注
1
id
id
number(12)
2
任务分配
swimlane_id
number(12)
3
分配类型
assign_type
varchar2(100)
user/role/dept/group。
。
。
action/shell如果是action/shell的话那就是根据脚本确定执行人,比如人员是根据创建人动态确定的
4
分配值
assign_value
varchar2(100)
如果是user,则为user_id
dept则为dept_id
5
分配名称
assign_name
varchar2(200)
6
任务实例
task_instance_id
number(12)
5.路径实例:
序号
名称
列名
类型
备注
1
id
id
number(12)
2
转移定义
tran_def_id
number(12)
3
当前节点实例
node_instance_id
number(12)
4
下个节点实例
next_node_instance_id
number(12)
5
创建时间
create_date
date
3应用系统集成
3.1集成的核心问题
1)列表查询问题,我们需要得到的是等待办理的申请列表或者审批列表等,而不是纯粹的任务列表,在我们这里通过应用表与人员分配实例表做关联查询来完成
2)事务问题,工作流的事务需要与应用逻辑代码统一事务,在我们这里,工作流引擎一样使用我们自己的Persistent层框架,所以没有这个问题.
3)框架问题,工作流引擎也需要数据库存储,也就需要相应的Persistent层框架,如果使用其他引擎,往往意味着我们在一个应用里面有两个Persistent层框架.在我们这里,工作流引擎一样使用我们自己的Persistent层框架,所以没有这个问题.
3.2流程启动
importorg.sevenstar.wf.WorkflowEngine;
importorg.sevenstar.wf.engine.instance.S_flow_process_instanceDomain;
S_flow_process_instanceDomainprocInstanceDomain=WorkflowEngine.instance.getProcessManager().start(proc_def_name,
mainpart_value);
Øproc_def_name为流程名
Ømainpart_value为流程主体值,即流程要管理的
3.3流程主体列表查询
流程主体表(比如合同表/申请表)与任务人员分配实例表(s_flow_swimlane_instance)的联合查询
3.4结束任务
首先关闭人员分配实例,再关闭任务,参数由页面传来
WorkflowEngine.instance.getSwimlaneManager().end(swimlane_instance_id);
WorkflowEngine.instance.getTaskManager().end(task_instance_id);
在任务结束后,引擎会调度继续走
3.5事务
注意,所有的工作流API调用都必须放在一个事务里面,即在Action方法上加上@SSTransaction
4流程配置Sample
4.1办件/阅件
oa中经常有办件和阅件之分,区别在于办件必须处理掉后,流程才能继续,阅件则不必。
Ø办件见4.3.5TaskDefination里面将is_must设置为Y
Ø阅件见4.3.5TaskDefination里面将is_must设置为N
在流程编辑的时候,编辑一个任务,编辑相应的是否必须完成下拉框,如下图所示例
注意,必须写任务名称,否则引擎不会生成这个任务
4.2会签
oa中有会签的概念,即一个任务,必须所有人做完后才能结束
如下图所示,在流程编辑时,编辑任务的是否必须全部完成,选择是
4.3循环审批
循环审批的任务执行人只能在运行时确定,如图所示,在任务编辑选择处理时,选择自己定义选择类型为java代码,然后在自己定义选择值里面填上实现org.sevenstar.wf.action.WorkflowAction接口的实现类,在实现类中将数据插入任务分配任意运行时表s_flow_swimlane_instance,引擎会在走到这个节点时执行任务时执行这个java类,如果没有人员被分配,那么引擎会结束任务往下走
WorkflowAction代码如下所示:
packageorg.sevenstar.wf.engine.action;
importorg.sevenstar.wf.engine.WorkflowContext;
publicinterfaceWorkflowAction{
publicvoidexecute(WorkflowContextwc);
}
其中WorkflowContext为当前运行时环境
4.4子流程
SevenStarworkflowEngine的子流程是在任务中启动的,如下图所示,选择任务类型为子流程,任务值填上子流程
在子流程结束后,引擎会结束父流程开启子流程的任务,然后父流程继续往下走
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工作流 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)