JBPM回退功能的实现
1:
我們知道JBPM系統,決定一個流程當前在什么環節的關鍵是task 和toker。他們在數據庫中的表分別是JBPM_TASKINSTANCE,JBPM_TOKEN。我的設計思想是,放棄JBPM自身的API,因為我看了一段時間的JBPM的API,沒有找到可以靈活操作taskinstance,和token的方法。于是自己寫sql語句自己操作這兩張表。
在項目中之所以使用回退功能,主要是可是在流程過程中的某個環節的辦理是發生了錯誤,所有客戶要求把流程退回到指定的環節重新辦理。
從理論上只要辦當前流程中活動的TASK,用我們的程序把它變成已辦理的狀態,把客戶想要回退到的環節的TASK從新激活,最后把TOKEN的節點ID指向到回退后的NODE。
所以只要我們自己操作這兩個表就OK了。
JBPM_TASKINSTANCE 表中有三個字段是表示這個任務是辦理完了還是沒有辦理。他們是:END_,ISOPEN_,ISSIGNALLING_,其中END_是一個日期類型表示這個任務什么時候辦完,ISOPEN_,ISSIGNALLING_這兩個字段為1時表示未辦完,0時表示辦完了。另外PROCINST_字段也很重要,他是維護的這個任務屬于的流程實例化ID。我在項目中是利用流程實例ID和業務表聯系,比如一個公文系統中,一定是有一個公文的信息表,里面放著這個文件的標題,文號等信息。其中有一個字段放著流程實例化ID,這樣每個公文可以和一個流程關聯。
還有一張表JBPM_NODE他存放著每個流程(注意是定義流程而不是實例化流程)的各個節點,我們需要把它列出來這樣才可以選擇流程回退到哪個環節。可是這個表里的各個環節是個流程定義ID關聯而不是實例流程ID關聯,所以只能是JBPM_NODE,JBPM_PROCESSDEFINITION,JBPM_PROCESSINSTANCE三張表關聯查詢。SQL語句如下:
Sql代碼?
表名前加了所有者,各位注意一下。另外我在項目中用的IBATIS所以變量前后加了##.
這樣我們把一個流程的所有節點都查出來了。在頁面上顯示就OK了。
第二步:
在JSP頁面上顯示是我顯示多個單選按鈕讓客戶選擇。大家看見我查出的結果是有一個ID,和一個NAME字段。
在JSP顯示
Html代碼?之所以頁面上的value的內容我用id,name的方式處理,因為我流程中的所有的節點和task的名字一樣,這樣后面的task表的任務計劃簡單一些。節點ID是以后操作TOKER表時候用的。
第三步:
我們顯示了用戶可以選擇的后退的環節后提交表單。action中把task表中的所有激活的記錄全部終止。
sql語句如下:
Sql代碼?接下來把客戶選擇的節點上的TASK重新激活
sql
Java代碼?這里的任務名稱就是上面的JSP頁面中的節點名稱,大家一定要注意這里的節點名稱和taskinstance表里的NAME_字段是兩個完全不同的東西。只是我在項目中的所有的環節的名字和這個環節的TASK的名字是一樣的所以才這么寫,如果不一樣各位只能自己再查。而且我建議各位在項目中把節點和TASK的名字設置成一樣。
第四步:
最后我們只要把token表中的NODE_設置成上面JSP頁面中傳過來的節點ID就OK了。
sql
Sql代碼?
?這里說明一下流程的實例ID和他的Token的ID是一樣的所以可以把它的流程實例ID當做令牌ID這么寫。
?
總結
以上是生活随笔為你收集整理的JBPM回退功能的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate3的配置参数汇总
- 下一篇: jbpm已办任务