介紹一個真正符合中國國情的工作流設(shè)計參考(包括PHP實現(xiàn))
Mar 24, 2017 am 10:27 AM?開源的工作流很少有讓人滿意的,即便是國內(nèi)用的比較多的jbpm,用起來也會覺得很便扭。再加上PHP中沒有什么好用的工作流,于是干脆自己設(shè)計一個,設(shè)計的原則如下:
1 根據(jù)80/20原則,只使用wfmc模型中最符合自身應(yīng)用的20%功能
2 充分吸收國內(nèi)使用jbpm開發(fā)BOSS中遇到的問題,工作流引擎只負(fù)責(zé)參數(shù)的收集和流程的流轉(zhuǎn),具體和業(yè)務(wù)的控制,交給每個流程定制的控制類去實現(xiàn)。
3 表單采用簡單的html+控制標(biāo)簽的方法實現(xiàn)
4 權(quán)限和模板引擎,以及其它輔助函數(shù)直接使用辦公系統(tǒng)自帶的框架
5 充分利用PHP語言的特點(diǎn),流程設(shè)計是基于數(shù)據(jù)庫的,程序上使用OO設(shè)計,但采用重對象的方法
6 不把可視化設(shè)計流程的工作交給最終客戶,而且由設(shè)計時完成,因此不考慮流程版本更新的問題
一、工作流數(shù)據(jù)表設(shè)計
tbl_workflow_defination:工作流定義表
defination_id |
流程id |
? |
defination_name |
流程名稱 |
? |
defination_handler |
流程處理輔助文件,每個工作流一個文件 |
自定義處理文件,及其對象。例如workflow-proporsal-handler.php,其中定義對象proposal |
tbl_workflow_node:流程結(jié)點(diǎn)步驟表
node_id |
結(jié)點(diǎn)id |
? |
defination_id |
流程id |
? |
node_index |
結(jié)點(diǎn)序號 |
結(jié)點(diǎn)的step |
node_name |
結(jié)點(diǎn)名稱 |
? |
node_type |
結(jié)點(diǎn)類型 |
1人為決策,2自動處理(直接執(zhí)行execute_function),3等待外部響應(yīng)(例如外部WS觸發(fā)),4分支,5匯總 6結(jié)束結(jié)點(diǎn)(此結(jié)點(diǎn)執(zhí)行時候自動終止進(jìn)程) |
init_function |
流程初始函數(shù) |
? |
run_function |
流程運(yùn)行函數(shù) |
? |
save_function |
流程保存函數(shù) |
? |
transit_function |
流程流轉(zhuǎn)函數(shù) |
? |
prev_node_index |
前結(jié)點(diǎn)序號 |
例如1。開始結(jié)點(diǎn)沒有 執(zhí)行前,通過此來校驗一下流程 |
next_node_index |
后結(jié)點(diǎn)序號 |
例如[同意]3,[不同意]4。尾結(jié)點(diǎn)或要結(jié)束的結(jié)點(diǎn)沒有,若沒有,直接調(diào)用end |
executor |
執(zhí)行角色,組,人 |
role[1,2] group[1,2] user[1,2],為空由運(yùn)行時決定 |
execute_type |
執(zhí)行類型 |
0需所有人執(zhí)行 1只需一人執(zhí)行 |
remind |
提醒 |
0不提醒 1郵件 2短信 3郵件和短信 |
field |
可編輯的字段 |
name,content |
max_day |
最長時間(天) |
? |
tbl_workflow_process:流程執(zhí)行進(jìn)程表
process_id |
進(jìn)程id |
? |
defination_id |
流程id |
? |
process_desc |
進(jìn)程描述 |
顯示在我的工作臺中 |
context |
上下文 |
存放上下文變量,例如業(yè)務(wù)表的id |
current_node_index |
當(dāng)前結(jié)點(diǎn)序號 |
? |
start_time |
流程啟動時間 |
如遇分支、匯合顯示為: 1=》3,4=》3,5=》6 |
finish_time |
流程完成時間 |
? |
state |
狀態(tài) |
1運(yùn)行 2結(jié)束 |
start_user |
發(fā)起人 |
發(fā)起人,用于顯示自己的流程 |
tbl_workflow_thread :流程執(zhí)行線程表
thread_id |
線程id |
? |
process_id |
進(jìn)程id |
? |
process_desc |
進(jìn)程描述 |
? |
node_id |
結(jié)點(diǎn)id |
? |
node_name |
結(jié)點(diǎn)名稱 |
? |
executor |
執(zhí)行人 |
? |
start_time |
線程生成時間 |
? |
receive_time |
線程接收時間 |
? |
finish_time |
線程完成時間 |
? |
max_time |
結(jié)點(diǎn)規(guī)定的最長時間 |
? |
state |
狀態(tài) |
0未接收 1已接收 2已處理 |
二、常見流程
人工決策
領(lǐng)導(dǎo)傳閱 |
部門領(lǐng)導(dǎo)審批 |
填寫表單 |
結(jié)束 |
放棄 |
提交 |
同意 |
重填(退回) |
不同意 |
完成 |
外部響應(yīng)
發(fā)送支付信息 |
接收支付成功響應(yīng)(外部WS觸發(fā)該流程) |
三、PHP設(shè)計
運(yùn)行的函數(shù)由結(jié)點(diǎn)在設(shè)計時候決定,如果沒有設(shè)定,就使用默認(rèn)的函數(shù)。利用了PHP語言的以下特性
<?php class 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 用戶輸入的和流程有關(guān)的變量
list_defination()
{
}
init_process(defination_id)
{? global user;
取得$defination,得到業(yè)務(wù)的handler,例如WorkflowProposalHandler
?? 建立$process行記錄
}
start_process()
{? 調(diào)用WorkflowProposalHandler->start($process)//新建業(yè)務(wù)對象,并把業(yè)務(wù)類的參數(shù)例如proposal_id放到$process[‘context’]里面
?? init_thread(1); ?//默認(rèn)調(diào)用第一個結(jié)點(diǎn)
}
?
list_ my_thread ()
{? global user;
}
?
init_thread(node_index)
{
? 取得$node
? 取得$process
? 修改$process為運(yùn)行到當(dāng)前結(jié)點(diǎn)
? Switch($node[‘node_type’])
?? Case 1: 人工決策
?????? 建立$thread
?????? WorkflowProposalHandler-> init_function ($process,$node,$thread)
?????? 發(fā)送提醒
Case 2: 自動處理
??? 建立$thread
??? WorkflowProposalHandler-> init_function ($process,$node,$thread)
?????? 調(diào)用run_thread(thread_id)
Case 3: 等待外部響應(yīng)
??? 建立$thread
??? WorkflowProposalHandler-> init_function ($process,$node,$thread)
Case 4: 分支
??? 取得所有分支的子結(jié)點(diǎn)
??? init_thread(子結(jié)點(diǎn))
Case 5: 匯總:
?? ?取得所有前結(jié)點(diǎn),如果所有前結(jié)點(diǎn)的Thread都結(jié)束了,調(diào)出下一結(jié)點(diǎn)
?????? 調(diào)用init_thread(子結(jié)點(diǎn))
Case 6: 結(jié)束:直接結(jié)束進(jìn)程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)
?????? 調(diào)用transit_thread(thread_id, $next_node_id)
Case 3: 等待外部響應(yīng)
??? 修改$thread為已接收
??? $next_node_id=WorkflowProposalHandler-> run_function ($process,$node,$thread)
??? transit_thread(thread_id, $next_node_id)
Case 4: 分支
Case 5: 匯總:
Case 6: 結(jié)束:
}
save_thread(thread_id)
{? //保存結(jié)點(diǎn)數(shù)據(jù)
取得$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: 等待外部響應(yīng)
Case 4: 分支
Case 5: 匯總:
Case 6: 結(jié)束:
}
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: 等待外部響應(yīng)
修改$thread為已完成
If($next_node_id < $ cur_node_id) { //回退
刪除所有大于$next_node_id的Thread
}
init _thread($next_node_id)
Case 4: 分支
Case 5: 匯總:
Case 6: 結(jié)束:
}
end_process()
list_my_process
view_process
workflow_proposal_handler.php
WorkflowProposalHandler
start()
prepare_input() 準(zhǔn)備用戶輸入變量,從$_POST收集
init_function () 線程建立后調(diào)用的默認(rèn)函數(shù),當(dāng)流程的執(zhí)行者由程序生成時,在此函數(shù)內(nèi)更改$thread的executor,例如直接賦值user[2]
run_function () 線程運(yùn)行化時候調(diào)用的默認(rèn)函數(shù)
save_function () 保存運(yùn)行信息
transit_function ()執(zhí)行流轉(zhuǎn)
sendmail 其它結(jié)點(diǎn)調(diào)用函數(shù)
workflow.php
switch(op)
case list_defination
參數(shù):無
WorkflowService->list_defination()
case start_process :啟動
?????? 參數(shù):defination_id
?????? WorkflowService->init_process(defination_id)
WorkflowService->start_process()
?? case list_ my_thread :待處理的列表
?????? WorkflowService->list_ my_thread()
?? case run_thread :
?????? 參數(shù):thread_id
?????? WorkflowService->run_thread(thread_id)
case save_thread :
??? 參數(shù):thread_id
?? ?把input收集起來(所有的變量以 f_開頭),賦給WorkflowService的Input,另外還要獲得thread_id
??? WorkflowService->save_thread(thread_id)
?? case transit_thread :
?? 參數(shù):thread_id
把input收集起來,賦給WorkflowService的Input,另外還要獲得thread_id
$next_node_id = 得到用戶選擇的下一結(jié)點(diǎn)id
WorkflowService-> transit _thread(thread_id,$next_node_id)
?? case list_my_process:所有我發(fā)起的流程
case list_all_process:所有我發(fā)起的流程
case view_process :
在其它程序中初始化流程
??? 1先自行建立好業(yè)務(wù)表單
2WorkflowService->init_process(defination_id)
3把建好的業(yè)務(wù)表單的ID放在process的context里面
4WorkflowService->init_thread(1)
WorkflowService->transit_thread(1,2)通過手動調(diào)用把前面的流程過掉
外部服務(wù)繼續(xù)流轉(zhuǎn)流程(只用于自動流程)
1 把input收集起來,賦給WorkflowService的Input,另外還要獲得thread_id
2 WorkflowService->run_thread(thread_id)
相關(guān)文章:

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Dengan populariti aplikasi Internet, kelajuan tindak balas laman web semakin menjadi tumpuan pengguna. Untuk bertindak balas dengan cepat kepada permintaan pengguna, tapak web sering menggunakan teknologi caching untuk menyimpan data cache, dengan itu mengurangkan bilangan pertanyaan pangkalan data. Walau bagaimanapun, masa tamat tempoh cache mempunyai kesan penting pada kelajuan tindak balas. Artikel ini akan membincangkan kaedah mengawal masa tamat tempoh cache untuk membantu pembangun PHP menggunakan teknologi caching dengan lebih baik. 1. Apakah masa tamat tempoh cache? Masa tamat cache merujuk kepada masa apabila data dalam cache dianggap tamat tempoh. Ia menentukan bila data dalam cache diperlukan

Cara menggunakan PHP untuk melaksanakan penyesuaian mudah alih dan reka bentuk responsif Penyesuaian mudah alih dan reka bentuk responsif ialah amalan penting dalam pembangunan tapak web moden. Ia boleh memastikan kesan paparan tapak web yang baik pada peranti yang berbeza. Dalam artikel ini, kami akan memperkenalkan cara menggunakan PHP untuk melaksanakan penyesuaian mudah alih dan reka bentuk responsif, dengan contoh kod. 1. Fahami konsep penyesuaian mudah alih dan reka bentuk responsif Penyesuaian mudah alih merujuk kepada menyediakan gaya dan reka letak yang berbeza untuk peranti berbeza berdasarkan ciri dan saiz peranti yang berbeza. Reka bentuk responsif merujuk kepada penggunaan

Cara menggunakan PHP untuk melaksanakan fungsi pendaftaran pengguna Dalam aplikasi rangkaian moden, fungsi pendaftaran pengguna adalah keperluan yang sangat biasa. Melalui fungsi pendaftaran, pengguna boleh membuat akaun mereka sendiri dan menggunakan fungsi yang sepadan. Artikel ini akan melaksanakan fungsi pendaftaran pengguna melalui bahasa pengaturcaraan PHP dan memberikan contoh kod terperinci. Pertama, kita perlu mencipta borang HTML untuk menerima maklumat pendaftaran pengguna. Dalam borang, kita perlu memasukkan beberapa medan input, seperti nama pengguna, kata laluan, e-mel, dll. Medan borang boleh disesuaikan mengikut keperluan sebenar.

Perlindungan privasi pengguna sistem pengundian dalam talian yang dilaksanakan dalam PHP Dengan pembangunan dan popularisasi Internet, semakin banyak aktiviti pengundian telah mula dipindahkan ke platform dalam talian. Kemudahan sistem pengundian dalam talian membawa banyak faedah kepada pengguna, tetapi ia juga menimbulkan kebimbangan mengenai kebocoran privasi pengguna. Perlindungan privasi telah menjadi aspek penting dalam reka bentuk sistem pengundian dalam talian. Artikel ini akan memperkenalkan cara menggunakan PHP untuk menulis sistem pengundian dalam talian, dan menumpukan pada isu perlindungan privasi pengguna. Apabila mereka bentuk dan membangunkan sistem pengundian dalam talian, prinsip berikut perlu dipatuhi untuk memastikan

Prinsip Pelaksanaan Algoritma Hash Konsisten untuk Cache Data PHP Algoritma Hashing Konsisten (ConsistentHashing) ialah algoritma yang biasa digunakan untuk cache data dalam sistem teragih, yang boleh meminimumkan bilangan migrasi data apabila sistem berkembang dan mengecut. Dalam PHP, melaksanakan algoritma pencincangan yang konsisten boleh meningkatkan kecekapan dan kebolehpercayaan caching data Artikel ini akan memperkenalkan prinsip algoritma pencincangan yang konsisten dan memberikan contoh kod. Prinsip asas algoritma pencincangan yang konsisten Algoritma pencincangan tradisional menyebarkan data ke nod yang berbeza, tetapi apabila nod

Cara menggunakan PHP untuk melaksanakan penukaran fail dan fungsi penukaran format 1. Pengenalan Dalam proses membangunkan aplikasi web, kita selalunya perlu melaksanakan penukaran fail dan fungsi penukaran format. Sama ada anda menukar fail imej kepada format lain atau menukar fail teks daripada satu pengekodan kepada yang lain, operasi ini adalah keperluan biasa. Artikel ini akan menerangkan cara melaksanakan fungsi ini menggunakan PHP, dengan contoh kod. 2. Penukaran fail 2.1 Tukar fail imej kepada format lain Dalam PHP, kita boleh gunakan

Dengan pembangunan berterusan program mini WeChat, semakin ramai pengguna mula memilih program mini WeChat untuk log masuk. Untuk meningkatkan pengalaman log masuk pengguna, program mini WeChat mula menyokong log masuk cap jari. Dalam artikel ini, kami akan memperkenalkan cara menggunakan PHP untuk melaksanakan log masuk cap jari untuk program mini WeChat. 1. Fahami log masuk cap jari program mini WeChat Berdasarkan program mini WeChat, pembangun boleh menggunakan fungsi pengecaman cap jari WeChat untuk membolehkan pengguna log masuk ke program mini WeChat melalui cap jari, dengan itu meningkatkan keselamatan dan kemudahan pengalaman log masuk. 2. Kerja-kerja penyediaan dilaksanakan menggunakan PHP

Model besar 3.0 yang dibangunkan sendiri oleh Meitu telah dikeluarkan secara rasmi! Dan ia digunakan sepenuhnya dalam produk pengimejan dan reka bentuk Meitu. Gambar Ini adalah lelaran terbaru model Meitu 100 hari selepas dikeluarkan. Berbanding dengan versi asal, versi 3.0 boleh menghasilkan butiran gambar yang lebih realistik dan halus. Keupayaan penjanaan gambar yang ditunjukkan di atas boleh dialami secara langsung pada Meitu Xiuxiu. Permainan AIGC yang popular baru-baru ini boleh didapati dalam gambar. Wu Xinhong, pengasas, pengerusi dan Ketua Pegawai Eksekutif Meitu, mendedahkan bahawa kebanyakan produk Meitu telah menggabungkan model besar yang dibangunkan sendiri Sebagai tambahan kepada bidang pengimejan dan reka bentuk, model besar yang dibangunkan sendiri oleh Meitu juga akan digunakan dalam e-dagang dan. pengiklanan. Lima industri utama , permainan, animasi, dan filem dan televisyen sedang berkembang. Meitu Xiuxiu boleh mengalami secara langsung model besar yang dibangunkan sendiri oleh Meitu yang dipanggil MiracleVi
