使用 OSWorkflow 已經(jīng)有段時間了,現(xiàn)在看來實際需求不是請假條流程原型這么簡單。
有這樣的需求:OA 系統(tǒng)中的公文審批共有六個 step,采用單點(不牽涉 split 和 join)逐級審核方式,不同角色登陸時,由同一頁面處理,為了便于收發(fā)文統(tǒng)計,必須知道下一個接收人是哪個。
由于在觸發(fā)當前 action 的同時就要設置好下一接收者,遂需要引進新的協(xié)作表。當 action 時要調(diào)用另外的 save 方法,而這一過程當然不能在表現(xiàn)層進行。最開始的做法是用一個輔助 service 來取出每個 action 的下一接收者,如下:
public List getLeader(int type,int companyId) { switch (type) { case 1: return docSendDao.getThisFaculty(companyId); case 2: return docSendDao.getOffice(); case 3: return docSendDao.getSecGroup(); case 4: return docSendDao.getOfficeLead(); case 5: return docSendDao.getSecFaculty(); default : return new ArrayList(); } } |
這種做法在開發(fā)的前期還覺得不錯,隨著需求的進一步詳細,發(fā)現(xiàn)當新增、修改流程時,也許我們要在這個 service 中滿山遍野的找尋到底代碼在哪里。更糟糕的是產(chǎn)品提交用戶后,用戶不會花費這么大的耐心讓你這樣維護。在經(jīng)過短暫的思考后,決定利用 OSWorkflow 的 FunctionProvider 接口和 script 做文章。
一個比較成熟的想法是(如各位有更好的方案不妨交流):每個流程都可能面臨修改,那就把流程的每個 action 要做的事抽取出來,這樣修改起來相對獨立,比如要把下一默認接收者改成其他人;另一個目的是快速響應用戶對新流程的需求,在提出需求后,生成相應的流程文件及每個 action 要做的事,提交到服務器,重啟就可以用了,而不是在已有代碼基礎上新增。這里的“每個 action 要做的事”就是 OSWorkflow 的 FunctionProvider 接口,實現(xiàn)這個接口,就可以為所欲為了。
代碼片斷如下:
流程定義 FacultyLea public class FacultyLea implements FunctionProvider{ |
function 只是 OSWorkflow 為我們提供眾多功能中的一個,如果可能,我會把另外的使用心得寫出來。
請注意!引用、轉(zhuǎn)貼本文應注明原作者:Rosen Jiang 以及出處:http://www.aygfsteel.com/rosen