狂奔 lion

自强不息

Javascript工作流引擎代码及实例

 

最近在学习jBPMJavascript,所以按照一些相关概念自己写了下面的200行代码的“工作流引擎”,工作流管理系统包含了流程定义,引擎,及应用系统三个主要部分,下面的代码实现了流程的分支合并,目前只支持一种环节上的迁移。拷贝到html,双击就可以跑起来。

 

var workflowDef = {
         start:{
                   fn:
"begin"//对应处理方法可以在内部定义,也可以在外部定义
                   next:[
"task1","task2"]
         },
         end:
"end",
         tasks:[{
                   id:
"task1",
                   fn:
function(){
                            alert(
"执行任务一");
                   },
                   before:
function(){
                            alert(
"执行任务一前");
                   },
                   after:
function(){
                            alert(
"执行任务一后");
                   },
                   next:[
"task4","task5"]
         },{
                   id:
"task2",
                   fn:
function(){
                            alert(
"执行任务二");
                   },
                   before:
function(){
                            alert(
"执行任务二前");
                   },
                   after:
function(){
                            alert(
"执行任务二后");
                   },
                   next:[
"task3"]
         },{
                   id:
"task3",
                   fn:
function(){
                            alert(
"执行任务三");
                   },
                   before:
function(){
                            alert(
"执行任务三前");
                   },
                   after:
function(){
                            alert(
"执行任务三后");
                   },
                   
//定义合并的数量
                   merge: 
3,
                   next:
"EOWF"
         },{
                   id:
"task4",
                   fn:
function(){
                            alert(
"执行任务四");
                   },
                   before:
function(){
                            alert(
"执行任务四前");
                   },
                   after:
function(){
                            alert(
"执行任务四后");
                   },
                   next:[
"task3"]
         },{
                   id:
"task5",
                   fn:
function(){
                            alert(
"执行任务五");
                   },
                   before:
function(){
                            alert(
"执行任务五前");
                   },
                   after:
function(){
                            alert(
"执行任务五后");
                   },
                   next:[
"task3"]
         }]
}

 

 

//////////定义引擎////////////

Yi 
= {};
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;i<this.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;i<this.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;i<this.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;i<this.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;i<task.next.length;i++){
                   
var tempTask = this.findTask(task.next[i]);
                   
if(!tempTask.inCurrentTasks)
                            
this.currentTasks.push(tempTask);
                   
if(tempTask.merge != undefined){
                            tempTask.merge
--;
                            tempTask.inCurrentTasks 
= true;
                   }
                   
else
                            Yi.Utils.execute(tempTask.before);
         }
}
//public获取当前的活动环节
Yi.Workflow.prototype.getCurrentTasks 
= function(){
         
return this.currentTasks;
}
//public获取流程定义
Yi.Workflow.prototype.getDef 
= function(){
         
return this.def;
}

 

////////应用系统///////////////
var wf = new Yi.Workflow(workflowDef);
alert(
"启动工作流");
wf.start();
alert(
"尝试手工执行任务3,返回工作流没有流转到这里");
wf.signal(
"task3");
alert(
"分支开始");
alert(
"手工执行任务1");
wf.signal(
"task1");
alert(
"手工执行任务2");
wf.signal(
"task2");
alert(
"手工执行任务4");
wf.signal(
"task4");
alert(
"手工执行任务5");
wf.signal(
"task5");
alert(
"手工执行任务3");
wf.signal(
"task3");
function begin(){
         alert(
"流程开始,该函数在外部定义");
}
function end(){
         alert(
"流程结束");
}


 @2008 杨一. 版权所有. 保留所有权利

posted on 2009-03-06 17:39 杨一 阅读(1549) 评论(1)  编辑  收藏 所属分类: Other Tech

评论

# re: Javascript工作流引擎代码及实例 2009-03-08 11:18 44you

不错,刚好也在用一个类似的东西,bz的这个有参考意义~  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

公告

本人在blogjava上发表的文章及随笔除特别声明外均为原创或翻译,作品受知识产权法保护并被授权遵从 知识分享协议:署名-非商业性使用-相同方式共享 欢迎转载,请在转载时注明作者姓名(杨一)及出处(www.blogjava.net/yangyi)
/////////////////////////////////////////
我的访问者

常用链接

留言簿(5)

随笔分类(55)

随笔档案(55)

相册

Java

其他技术

生活

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

自强不息


用心 - 珍惜时间,勇于创造