最近在学习jBPM和Javascript,所以按照一些相关概念自己写了下面的200行代码的“工作流引擎”,工作流管理系统包含了流程定义,引擎,及应用系统三个主要部分,下面的代码实现了流程的分支合并,目前只支持一种环节上的迁移。拷贝到html,双击就可以跑起来。
var workflowDef = {
start:{
fn:"begin", //对应处理方法可以在内部定义,也可以在外部定义
next:["task1","task2"]
},
end:"end",
tasks:[{
id:"task1",
fn:function(){
alert("执行任务一");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)before:function(){
alert("执行任务一前");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)after:function(){
alert("执行任务一后");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)next:["task4","task5"]
},{
id:"task2",
fn:function(){
alert("执行任务二");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)before:function(){
alert("执行任务二前");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)after:function(){
alert("执行任务二后");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)next:["task3"]
},{
id:"task3",
fn:function(){
alert("执行任务三");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)before:function(){
alert("执行任务三前");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)after:function(){
alert("执行任务三后");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)//定义合并的数量
merge: 3,
next:"EOWF"
},{
id:"task4",
fn:function(){
alert("执行任务四");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)before:function(){
alert("执行任务四前");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)after:function(){
alert("执行任务四后");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)next:["task3"]
},{
id:"task5",
fn:function(){
alert("执行任务五");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)before:function(){
alert("执行任务五前");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)after:function(){
alert("执行任务五后");
},
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)next:["task3"]
}]
}
//////////定义引擎////////////
Yi = {};
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)Yi.Utils = {};
Yi.Utils.execute = function(o){
if(typeof o != 'function')
eval(o)();
else
o();
}
//工作流类
Yi.Workflow = function(workflowDef){
this.def = workflowDef;
this.tasks = this.def.tasks;
}
//public按照环节id查找查找
Yi.Workflow.prototype.findTask = function(taskId){
for(var i=0;ithis.tasks.length;i++){
if(this.tasks[i].id == taskId)
return this.tasks[i];
}
}
//public启动工作流
Yi.Workflow.prototype.start = function(){
this.currentTasks = [];
Yi.Utils.execute(this.def.start.fn);
for(var i=0;ithis.def.start.next.length;i++){
this.currentTasks[i] = this.findTask(this.def.start.next[i]);
Yi.Utils.execute(this.currentTasks[i].before);
}
}
//private
Yi.Workflow.prototype.findCurrentTaskById = function(taskId){
for(var i=0;ithis.currentTasks.length;i++){
if(this.currentTasks[i].id == taskId)
return this.currentTasks[i];
}
return null;
}
//private
Yi.Workflow.prototype.removeFromCurrentTasks = function(task){
var temp = [];
for(var i=0;ithis.currentTasks.length;i++){
if(!(this.currentTasks[i] == task))
temp.push(this.currentTasks[i]);
}
this.currentTasks = temp;
temp = null;
}
//public触发当前环节
Yi.Workflow.prototype.signal = function(taskId){
//只处理当前活动环节
var task = this.findCurrentTaskById(taskId);
if(task == null){
alert("工作流未流转到此环节!");
return;
}
//对于合并的处理
if(task.merge != undefined){
if(task.merge != 0){
alert("工作流流转条件不充分!");
return;
}else{
Yi.Utils.execute(task.before);
}
}
//触发当前环节
Yi.Utils.execute(task.fn);
//触发后动作
Yi.Utils.execute(task.after);
//下一步如果工作流结束
if(task.next === "EOWF"){
Yi.Utils.execute(this.def.end);
delete this.currentTasks;
return;
}
//遍历下一步环节
this.removeFromCurrentTasks(task);
for(var i=0;itask.next.length;i++){