<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    狂奔 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 楊一 閱讀(1990) 評論(1)  編輯  收藏 所屬分類: Other Tech

    評論

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

    不錯,剛好也在用一個類似的東西,bz的這個有參考意義~  回復  更多評論   

    <2009年3月>
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導航

    公告

    本人在blogjava上發表的文章及隨筆除特別聲明外均為原創或翻譯,作品受知識產權法保護并被授權遵從 知識分享協議:署名-非商業性使用-相同方式共享 歡迎轉載,請在轉載時注明作者姓名(楊一)及出處(www.tkk7.com/yangyi)
    /////////////////////////////////////////
    我的訪問者

    常用鏈接

    留言簿(5)

    隨筆分類(55)

    隨筆檔案(55)

    相冊

    Java

    其他技術

    生活

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    自強不息


    用心 - 珍惜時間,勇于創造
    主站蜘蛛池模板: 亚洲色大成WWW亚洲女子| 在线观看亚洲人成网站| 亚洲av无码一区二区三区在线播放| 人与禽交免费网站视频| 亚洲影院在线观看| 日本免费中文字幕| 亚洲人成网www| 麻豆高清免费国产一区| 亚洲欧洲日韩不卡| 国产在线观看片a免费观看| 亚洲欧美自偷自拍另类视| 国产成人免费a在线资源| 免费观看四虎精品成人| 亚洲人成人网站色www| 久久国产精品萌白酱免费| 亚洲精品一区二区三区四区乱码| 日本高清在线免费| 国产成人高清亚洲一区久久| 亚洲国产成人久久笫一页| 久久国产精品2020免费m3u8 | 免费不卡中文字幕在线| 一个人免费观看www视频| 久久亚洲AV无码精品色午夜麻| **aaaaa毛片免费| 精品韩国亚洲av无码不卡区| 国产亚洲精品激情都市| 久久国产乱子免费精品| 亚洲免费福利在线视频| 亚洲综合色成在线播放| 亚洲一区二区三区免费观看 | a级毛片视频免费观看| 亚洲国产高清视频在线观看| 午夜私人影院免费体验区| 国产精品一区二区三区免费 | 黄色片网站在线免费观看| 人人狠狠综合久久亚洲88| 无码一区二区三区免费视频| 一级毛片免费在线| 亚洲制服丝袜第一页| 精品亚洲综合在线第一区| 成人激情免费视频|