日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JBPM回退功能的实现

發布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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代碼
  • SELECT?node.ID_,node.NAME_?FROM? ??
  • tjsoadba.JBPM_NODE?node,tjsoadba.JBPM_PROCESSINSTANCE?instance, ??
  • tjsoadba.JBPM_PROCESSDEFINITION?definition? ??
  • WHERE?instance.PROCESSDEFINITION_??=?definition.ID_? ??
  • and?definition.ID_=node.PROCESSDEFINITION_?and?instance.ID_=#流程實例化ID#??
  • SELECT node.ID_,node.NAME_ FROM tjsoadba.JBPM_NODE node,tjsoadba.JBPM_PROCESSINSTANCE instance, tjsoadba.JBPM_PROCESSDEFINITION definition WHERE instance.PROCESSDEFINITION_ = definition.ID_ and definition.ID_=node.PROCESSDEFINITION_ and instance.ID_=#流程實例化ID#

    ?

    表名前加了所有者,各位注意一下。另外我在項目中用的IBATIS所以變量前后加了##.

    這樣我們把一個流程的所有節點都查出來了。在頁面上顯示就OK了。

    第二步:

    在JSP頁面上顯示是我顯示多個單選按鈕讓客戶選擇。大家看見我查出的結果是有一個ID,和一個NAME字段。

    在JSP顯示

    Html代碼
  • <input?type="radio"?name="node"?value="<%=節點ID%>,<%=節點名稱%>"/><%=節點名稱?%>??
  • <input type="radio" name="node" value="<%=節點ID%>,<%=節點名稱%>"/><%=節點名稱 %>

    ?之所以頁面上的value的內容我用id,name的方式處理,因為我流程中的所有的節點和task的名字一樣,這樣后面的task表的任務計劃簡單一些。節點ID是以后操作TOKER表時候用的。

    第三步:

    我們顯示了用戶可以選擇的后退的環節后提交表單。action中把task表中的所有激活的記錄全部終止。

    sql語句如下:

    Sql代碼
  • update????tjsoadba.JBPM_TASKINSTANCE???set?ISOPEN_=0,ISSIGNALLING_=0,END_=?#當前日期#? ??
  • ?where??PROCINST_?=#流程實例ID#??and?END_?is?null??
  • update tjsoadba.JBPM_TASKINSTANCE set ISOPEN_=0,ISSIGNALLING_=0,END_= #當前日期# where PROCINST_ =#流程實例ID# and END_ is null

    ?接下來把客戶選擇的節點上的TASK重新激活

    sql

    Java代碼
  • update????tjsoadba.JBPM_TASKINSTANCE?? ??
  • ?set?ISOPEN_=1,ISSIGNALLING_=1,END_=?null?? ??
  • ?where??PROCINST_?=?#流程實例ID#?and?NAME_=?#任務名稱#??
  • update tjsoadba.JBPM_TASKINSTANCE set ISOPEN_=1,ISSIGNALLING_=1,END_= null where PROCINST_ = #流程實例ID# and NAME_= #任務名稱#

    ?這里的任務名稱就是上面的JSP頁面中的節點名稱,大家一定要注意這里的節點名稱和taskinstance表里的NAME_字段是兩個完全不同的東西。只是我在項目中的所有的環節的名字和這個環節的TASK的名字是一樣的所以才這么寫,如果不一樣各位只能自己再查。而且我建議各位在項目中把節點和TASK的名字設置成一樣。

    第四步:

    最后我們只要把token表中的NODE_設置成上面JSP頁面中傳過來的節點ID就OK了。

    sql

    Sql代碼
  • update???tjsoadba.JBPM_TOKEN???set?NODE_?=?#節點ID#??where??ID_?=?#流程實例ID#??
  • update tjsoadba.JBPM_TOKEN set NODE_ = #節點ID# where ID_ = #流程實例ID#

    ?

    ?這里說明一下流程的實例ID和他的Token的ID是一樣的所以可以把它的流程實例ID當做令牌ID這么寫。

    ?

    總結

    以上是生活随笔為你收集整理的JBPM回退功能的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。