jbpm4.4之待處理任務

      jbpm4中已有獲取待指定用戶處理的任務的方法,如下:
processEngine.getTaskService().findPersonalTasks(用戶ID);	//獲取個人任務
processEngine.getTaskService().findGroupTasks(用戶ID);	//獲取所在組任務

      也可以自己寫HQL通過hibernate來將個人任務和分組任務一起查詢:

select task from org.jbpm.pvm.internal.task.TaskImpl task left join task.participations
 pt where (task.assignee='用戶ID' or ( task.assignee is null and pt.type = 'candidate'
 and ((pt.userId='用戶ID') or (pt.groupId in ('分組1','分組2','分組3')))))

其中用戶ID和分組等參數可以通過?方式來傳入。

      然而如果系統中有多種業務用到jbpm工作流的話(比如OA中有請假、出差、公文收發等),jbpm4自帶的兩個方法是獲取到的是所有業務的任務,而無法獲得每個任務對應的是哪個業務,當然也有偏門的方法,比如通過task中的getExecutionId來判斷對應的哪個業務(可以看下附加信息)。

      這樣任務對應的業務還是好獲取到,系統中一般會將不同業務的任務設置成不同的模塊,並且一般獲取任務時還需要附帶一些對應的業務信息,比如請假任務能看到請假人、請假天數等信息,這些信息在我們通過上面的方法中獲取到的任務List中是獲取不到的,我們得想辦法將這些信息同任務一起展現出來。
      對於這個問題我之前用了一個很彆扭的方法,就是先獲取到待處理的任務,然後循環去查詢每個任務對應的業務信息,最後把任務和業務信息封裝在一起,存入List中返回,這樣每一次要經過很多的查詢,性能大大下降,如果要通過條件查詢或者分頁等需求就又很麻煩了。
      後來無意間又想到一個方法(知道用HQL查詢任務的方法後),何不在這個HQL上再改一下,把業務的表也關聯進來,那樣不就一次查詢就將任務和業務記錄綁定起來了,這樣通過業務信息進行條件查詢、分頁查詢都很好解決了。
      另外在最近做的一個功能中接觸到了優先級這個東東,用於在任務列表中按優先級排序,jbpm4的表中本來有PRIORITY_這個字段,但我沒找到合適的方法給它設值,所以我就直接將優先級直接放入業務表中了,正好這個優先級的問題也解決了。
      由於我這項目本身用的框架沒用hibernate,所以最終還是直接用SQL來獲取待處理任務了,最終的SQL大致如下:

select it.*,jt.DBID_ as task_id,jt.NAME_ as task_name from itsm_task it left join
 jbpm4_task jt on it.execution_id = jt.EXECUTION_ID_ left join jbpm4_participation
 jp on jt.DBID_ = jp.TASK_ where it.status<3 and (jt.ASSIGNEE_ = 'admin' or 
(jt.ASSIGNEE_ is null and jp.TYPE_ = 'candidate' and ((jp.USERID_ = 'admin') or 
(jp.GROUPID_ in('TECH_UNCERTAIN','UNCERTAIN_EMPLOYEE','TECH_EMPLOYEE','admin'))))) 
 group by jt.DBID_ 


附:
executionService().startProcessInstanceByKey(流程KEY,業務KEY);
在啓動流程時可以指定一個業務的KEY,比如:
executionService().startProcessInstanceByKey('INCIDENT','IN0001');
'INCIDENT'是流程定義的KEY,'IN0001'是業務的KEY,這樣啓動流程創建的Execution的ID則爲'INCIDENT-IN0001',如果沒有指定業務KEY,則jbpm會默認將Execution的主鍵(DBID_字段)作爲業務KEY。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章