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