亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

介紹一個真正符合中國國情的工作流設計參考(包括PHP實現)

2020-03-22 18:53:34
字體:
來源:轉載
供稿:網友
開源的工作流很少有讓人滿意的,即便是國內用的比較多的jbpm,用起來也會覺得很便扭。再加上PHP中沒有什么好用的工作流,于是干脆自己設計一個,設計的原則如下:

1 根據80/20原則,只使用wfmc模型中最符合自身應用的20%功能

2 充分吸收國內使用jbpm開發BOSS中遇到的問題,工作流引擎只負責參數的收集和流程的流轉,具體和業務的控制,交給每個流程定制的控制類去實現。

3 表單采用簡單的html+控制標簽的方法實現

4 權限和模板引擎,以及其它輔助函數直接使用辦公系統自帶的框架

5 充分利用PHP語言的特點,流程設計是基于數據庫的,程序上使用OO設計,但采用重對象的方法

6 不把可視化設計流程的工作交給最終客戶,而且由設計時完成,因此不考慮流程版本更新的問題

一、工作流數據表設計

tbl_workflow_defination:工作流定義表

defination_id

流程id

defination_name

流程名稱

defination_handler

流程處理輔助文件,每個工作流一個文件

自定義處理文件,及其對象。例如workflow-proporsal-handler.php,其中定義對象proposal

tbl_workflow_node:流程結點步驟表

node_id

結點id

defination_id

流程id

node_index

結點序號

結點的step

node_name

結點名稱

node_type

結點類型

1人為決策,2自動處理(直接執行execute_function),3等待外部響應(例如外部WS觸發),4分支,5匯總 6結束結點(此結點執行時候自動終止進程)

init_function

流程初始函數

run_function

流程運行函數

save_function

流程保存函數

transit_function

流程流轉函數

prev_node_index

前結點序號

例如1。開始結點沒有

執行前,通過此來校驗一下流程

next_node_index

后結點序號

例如[同意]3,[不同意]4。尾結點或要結束的結點沒有,若沒有,直接調用end

executor

執行角色,組,人

role[1,2] group[1,2] user[1,2],為空由運行時決定

execute_type

執行類型

0需所有人執行 1只需一人執行

remind

提醒

0不提醒 1郵件 2短信 3郵件和短信

field

可編輯的字段

name,content

max_day

最長時間(天)

tbl_workflow_process:流程執行進程表

process_id

進程id

defination_id

流程id

process_desc

進程描述

顯示在我的工作臺中

context

上下文

存放上下文變量,例如業務表的id

current_node_index

當前結點序號

start_time

流程啟動時間

如遇分支、匯合顯示為:

1=》3,4=》3,5=》6

finish_time

流程完成時間

state

狀態

1運行 2結束

start_user

發起人

發起人,用于顯示自己的流程

tbl_workflow_thread :流程執行線程表

thread_id

線程id

process_id

進程id

process_desc

進程描述

node_id

結點id

node_name

結點名稱

executor

執行人

start_time

線程生成時間

receive_time

線程接收時間

finish_time

線程完成時間

max_time

結點規定的最長時間

state

狀態

0未接收 1已接收 2已處理

二、常見流程

人工決策


領導傳閱


部門領導審批


填寫表單


結束


放棄


提交


同意


重填(退回)


不同意


完成

外部響應


發送支付信息


接收支付成功響應(外部WS觸發該流程)

三、PHP設計

運行的函數由結點在設計時候決定,如果沒有設定,就使用默認的函數。利用了PHP語言的以下特性

<?phpclass Foo{    function Variable()    {        $name = 'Bar';        $this->$name(); // This calls the Bar() method    }        function Bar()    {        echo "This is Bar";    }}$foo = new Foo();$funcname = "Variable";$foo->$funcname();  // This calls $foo->Variable()?>

使用前可以用method_exists來檢查

WorkflowService.php

WorkflowService

$defination

$process

$node

$thread

$input 用戶輸入的和流程有關的變量

list_defination()

{

}

init_process(defination_id)

{ global user;

取得$defination,得到業務的handler,例如WorkflowProposalHandler

建立$process行記錄

}

start_process()

{ 調用WorkflowProposalHandler->start($process)//新建業務對象,并把業務類的參數例如proposal_id放到$process[‘context’]里面

init_thread(1); //默認調用第一個結點

}

list_ my_thread ()

{ global user;

}

init_thread(node_index)

{

取得$node

取得$process

修改$process為運行到當前結點

Switch($node[‘node_type’])

Case 1: 人工決策

建立$thread

WorkflowProposalHandler-> init_function ($process,$node,$thread)

發送提醒

Case 2: 自動處理

建立$thread

WorkflowProposalHandler-> init_function ($process,$node,$thread)

調用run_thread(thread_id)

Case 3: 等待外部響應

建立$thread

WorkflowProposalHandler-> init_function ($process,$node,$thread)

Case 4: 分支

取得所有分支的子結點

init_thread(子結點)

Case 5: 匯總:

取得所有前結點,如果所有前結點的Thread都結束了,調出下一結點

調用init_thread(子結點)

Case 6: 結束:直接結束進程process

end_process()

}

run_thread(thread_id)

{

取得$node

取得$process

取得$thread

Switch($node[‘node_type’])

Case 1: 人工決策

修改$thread為已接收

WorkflowProposalHandler-> run_function ($process,$node,$thread)顯示表單

Case 2: 自動處理

修改$thread為已接收

$next_node_id=WorkflowProposalHandler-> run_function ($process,$node,$thread)

調用transit_thread(thread_id, $next_node_id)

Case 3: 等待外部響應

修改$thread為已接收

$next_node_id=WorkflowProposalHandler-> run_function ($process,$node,$thread)

transit_thread(thread_id, $next_node_id)

Case 4: 分支

Case 5: 匯總:

Case 6: 結束:

}

save_thread(thread_id)

{ //保存結點數據

取得$node

取得$process

取得$thread

Switch($node[‘node_type’])

Case 1: 人工決策

WorkflowProposalHandler-> save_function ($process,$node,$thread)保存表單

WorkflowProposalHandler-> run_function ($process,$node,$thread)顯示表單

Case 2: 自動處理

Case 3: 等待外部響應

Case 4: 分支

Case 5: 匯總:

Case 6: 結束:

}

transit_thread(thread_id, $next_node_id)

{ 取得$node

取得$process

取得$thread

Switch($node[‘node_type’])

Case 1: 人工決策

WorkflowProposalHandler->transit_function($process,$node,$thread,$next_node_id)

修改$thread為已完成

If($next_node_id < $ cur_node_id) { //回退

刪除所有大于$next_node_id的Thread

}

init_thread($next_node_id)

Case 2: 自動處理

修改$thread為已完成

If($next_node_id < $ cur_node_id) { //回退

刪除所有大于$next_node_id的Thread

}

init _thread($next_node_id)

Case 3: 等待外部響應

修改$thread為已完成

If($next_node_id < $ cur_node_id) { //回退

刪除所有大于$next_node_id的Thread

}

init _thread($next_node_id)

Case 4: 分支

Case 5: 匯總:

Case 6: 結束:

}

end_process()

list_my_process

view_process

workflow_proposal_handler.php

WorkflowProposalHandler

start()

prepare_input() 準備用戶輸入變量,從$_POST收集

init_function () 線程建立后調用的默認函數,當流程的執行者由程序生成時,在此函數內更改$thread的executor,例如直接賦值user[2]

run_function () 線程運行化時候調用的默認函數

save_function () 保存運行信息

transit_function ()執行流轉

sendmail 其它結點調用函數

workflow.php

switch(op)

case list_defination

參數:無

WorkflowService->list_defination()

case start_process :啟動

參數:defination_id

WorkflowService->init_process(defination_id)

WorkflowService->start_process()

case list_ my_thread :待處理的列表

WorkflowService->list_ my_thread()

case run_thread :

參數:thread_id

WorkflowService->run_thread(thread_id)

case save_thread :

參數:thread_id

把input收集起來(所有的變量以 f_開頭),賦給WorkflowService的Input,另外還要獲得thread_id

WorkflowService->save_thread(thread_id)

case transit_thread :

參數:thread_id

把input收集起來,賦給WorkflowService的Input,另外還要獲得thread_id

$next_node_id = 得到用戶選擇的下一結點id

WorkflowService-> transit _thread(thread_id,$next_node_id)

case list_my_process:所有我發起的流程

case list_all_process:所有我發起的流程

case view_process :

在其它程序中初始化流程

1先自行建立好業務表單

2WorkflowService->init_process(defination_id)

3把建好的業務表單的ID放在process的context里面

4WorkflowService->init_thread(1)

WorkflowService->transit_thread(1,2)通過手動調用把前面的流程過掉

外部服務繼續流轉流程(只用于自動流程)

1 把input收集起來,賦給WorkflowService的Input,另外還要獲得thread_id

2 WorkflowService->run_thread(thread_id)

相關文章:

PHP 工作流 自定義表單解決方案

怎么簡單實現工作流?

通達OA2015版工作流插件和列表控件數據解析

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国模视频一区二区三区| 一本大道亚洲视频| 热久久这里只有| 欧美亚洲午夜视频在线观看| 亚洲欧美成人一区二区在线电影| 国产一区在线播放| 久久久久久国产精品美女| 日韩国产高清污视频在线观看| 欧美中文字幕第一页| 精品在线小视频| 色婷婷久久av| 欧美精品福利在线| 一区二区三区 在线观看视| 精品福利樱桃av导航| 国产精品久久综合av爱欲tv| 午夜精品久久久久久99热软件| 欧美精品久久久久a| 日韩三级成人av网| 亚洲人成在线观看网站高清| 欧美日韩国产一中文字不卡| 亚洲第一免费播放区| 亚洲天堂网站在线观看视频| 亚洲丝袜在线视频| 亚洲欧美一区二区三区四区| 亚洲精品国产美女| 久青草国产97香蕉在线视频| 色噜噜亚洲精品中文字幕| 91精品国产一区| 51ⅴ精品国产91久久久久久| 久久久999成人| 美日韩精品免费观看视频| 亚洲性日韩精品一区二区| 国产福利精品av综合导导航| 最好看的2019的中文字幕视频| 亚洲在线免费视频| 91亚洲va在线va天堂va国| 欧美激情综合色综合啪啪五月| 日韩亚洲第一页| 日韩亚洲欧美成人| 欧美中文在线免费| 亚洲精品一区二区三区婷婷月| 成人写真福利网| 久久中文字幕国产| 国产精品久久久久久久天堂| 国产一区二区动漫| 亚洲a∨日韩av高清在线观看| 亚洲欧洲美洲在线综合| 精品人伦一区二区三区蜜桃网站| 欧美精品18videosex性欧美| 亚洲综合色av| 精品在线观看国产| 日韩黄在线观看| 97久久精品人人澡人人爽缅北| 国产精品国产三级国产aⅴ9色| 亚洲视频在线免费看| 正在播放欧美一区| 欧美视频中文在线看| 欧美大秀在线观看| 在线视频日本亚洲性| 亚洲精品国产综合久久| 成人黄色激情网| 97精品久久久| 欧美成人午夜激情视频| 亚洲综合中文字幕68页| 懂色av一区二区三区| 亚洲全黄一级网站| 国产视频在线观看一区二区| 精品少妇一区二区30p| 欧美色欧美亚洲高清在线视频| 91久久在线播放| 亚洲欧美日韩精品久久奇米色影视| 亚洲欧洲日韩国产| 欧美专区国产专区| 亚洲午夜女主播在线直播| 欧美精品videosex牲欧美| 日本不卡免费高清视频| 久久97久久97精品免视看| 日韩av日韩在线观看| 一区二区在线视频| 日韩hd视频在线观看| 欧美精品videosex牲欧美| 亚洲va久久久噜噜噜久久天堂| 97人人爽人人喊人人模波多| 岛国av在线不卡| 综合国产在线视频| 欧美日韩999| 亚洲欧美自拍一区| 精品一区二区三区电影| 国产日本欧美在线观看| 欧美日韩亚洲成人| 国产偷国产偷亚洲清高网站| 欧美极品xxxx| 久久久999国产精品| 69久久夜色精品国产69| 色噜噜国产精品视频一区二区| 欧美另类第一页| 一本一本久久a久久精品综合小说| 国内精品视频一区| 亚洲美女www午夜| 亚洲的天堂在线中文字幕| 91在线视频免费| 美女性感视频久久久| 在线国产精品视频| 久久久中精品2020中文| 欧美裸体xxxx极品少妇| 国产亚洲精品久久久优势| 国产91在线播放九色快色| 色综合久久88| 97精品国产aⅴ7777| 久久视频在线免费观看| 国产日韩欧美日韩| 国产精品久久久久久亚洲影视| 日韩av一区在线| 欧美激情小视频| 中文字幕日韩av| 成人免费在线网址| 国产精品免费视频xxxx| 国内精品一区二区三区| 国产精品va在线| 久久国产精品电影| 成人福利网站在线观看| 亚洲欧美自拍一区| 亚洲精品按摩视频| 欧美黄色www| 国产一区二区三区三区在线观看| 日本久久久久久久久久久| 国产九九精品视频| 国产噜噜噜噜久久久久久久久| 亚洲xxx自由成熟| 韩国日本不卡在线| 6080yy精品一区二区三区| 国产精品视频成人| 精品国产一区二区三区在线观看| 欧美日韩激情网| 日韩av电影中文字幕| 最近2019中文字幕第三页视频| 中文字幕日韩在线播放| 国产99久久精品一区二区 夜夜躁日日躁| 大桥未久av一区二区三区| 亚洲精品一区二区三区婷婷月| 久久精品视频免费播放| 亚洲男女自偷自拍图片另类| 亚洲97在线观看| 国产国产精品人在线视| 日韩亚洲第一页| 国产欧美日韩精品专区| 欧美激情亚洲激情| 91chinesevideo永久地址| 日韩最新av在线| 欧美裸体男粗大视频在线观看| 88xx成人精品| 成人av番号网| 国产精品亚洲激情| 国产婷婷97碰碰久久人人蜜臀| 欧美在线观看日本一区| 亚洲精品福利视频| 在线视频亚洲欧美| 欧美精品18videos性欧美| 欧美亚洲伦理www| 色噜噜狠狠狠综合曰曰曰88av| 亚洲最大av网| 国产精品久久久精品| 欧美电影第一页| 国内精品久久久久久久久|