這篇博客要給大家介紹一下分配組任務的三種方式:
組任務分配方式一:直接指定組任務任務辦理人
組任務分配方式二:使用流程變量
組任務分配方式三:使用類
下面呢將具體介紹這三種不同的方法:
一、流程圖:
圖: 配組任務的三種方式
1.在任務節點設置辦理人
2.測試代碼
public class group {
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
/**部署流程定義*/
@Test
public void deployementProcessDefinition(){
String resourceNamebpmn = "group.bpmn";
String resourceNamepng = "group.png";
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("group.png");
/**部署流程定義*/
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()//創建部署對象
.name("組任務")
.addInputStream(resourceNamebpmn, inputStreamBpmn)//部署加載資源文件
.addInputStream(resourceNamepng, inputStreamPng)
.deploy();
System.out.println("部署ID:"+deployment.getId());
}
@Test
public void startProcessInstance() {
//啓動流程實例
String processDefinitionKey ="group";
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程實例ID:"+pi.getId());
System.out.println("流程定義的ID:"+pi.getProcessDefinitionId());
}
/**查看小A當前的個人任務,未查詢出結果*/
@Test
public void findPersonTask(){
String assignee = "小A";
List<Task> list =processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(assignee)//指定個人任務,指定辦理人
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務ID:"+task.getId());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的創建時間:"+task.getCreateTime());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
/**查看小A當前的組任務*/
@Test
public void findGroupTask(){
String candidateUser = "小A";
List<Task> list =processEngine.getTaskService()
.createTaskQuery()
.taskCandidateUser(candidateUser)//指定組任務
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務ID:"+task.getId());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的創建時間:"+task.getCreateTime());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
/*
* 查詢結果:
任務ID:132504
任務的辦理人:null
任務名稱:審覈
任務的創建時間:Mon Jul 04 14:14:38 GMT+08:00 2016
流程實例ID:132501
#######################################
注意:任務辦理人爲null的話有兩種可能1是沒有辦理人,2是組任務
*/
}
/**查詢正在執行的任務的辦理人*/
@Test
public void findRunPersonTask(){
String taskId ="132504";
List<IdentityLink> list = processEngine.getTaskService()
.getIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
for(IdentityLink idLink:list){
System.out.println("UserID:"+idLink.getUserId());
System.out.println("類型(參與者或者候選者):"+idLink.getType());
System.out.println("任務ID:"+idLink.getTaskId());
System.out.println("流程實例ID:"+idLink.getProcessInstanceId());
System.out.println("#######################################");
}
}
/*
*查詢結果:
UserID:小C
類型(參與者或者候選者):candidate
任務ID:132504
流程實例ID:null
#######################################
UserID:小B
類型(參與者或者候選者):candidate
任務ID:132504
流程實例ID:null
#######################################
UserID:小D
類型(參與者或者候選者):candidate
任務ID:132504
流程實例ID:null
#######################################
UserID:小A
類型(參與者或者候選者):candidate
任務ID:132504
流程實例ID:null
#######################################
*/
//注意:由查詢結果,我們可以看出組任務的辦理人都有兩種類型,一種是參與者類型(participant),一種是候選者類型
//候選者類型(candidate)的記錄會指定任務ID,但是不會指定流程實例ID ,參與者類型不會指定任務ID,但是會指定流程實例ID
//候選者不一定參與了任務
}
/**查詢歷史任務的辦理人表*/
@Test
public void findHistoryPersonTask(){
String processInstanceId ="132501";
List<HistoricIdentityLink> list= processEngine.getHistoryService()
.getHistoricIdentityLinksForProcessInstance(processInstanceId);//使用流程實例查(查詢的參與者)
//.getHistoricIdentityLinksForTask(taskId);//使用任務ID查詢(查詢的候選者)
if(list!=null && list.size()>0){
for(HistoricIdentityLink hil:list){
System.out.println("UserID:"+hil.getUserId());
System.out.println("類型(參與者或者候選者):"+hil.getType());
System.out.println("任務ID:"+hil.getTaskId());
System.out.println("流程實例ID:"+hil.getProcessInstanceId());
System.out.println("#######################################");
}
}
/*
* 查詢結果:
UserID:小C
類型(參與者或者候選者):participant
任務ID:null
流程實例ID:132501
#######################################
UserID:小B
類型(參與者或者候選者):participant
任務ID:null
流程實例ID:132501
#######################################
UserID:小D
類型(參與者或者候選者):participant
任務ID:null
流程實例ID:132501
#######################################
UserID:小A
類型(參與者或者候選者):participant
任務ID:null
流程實例ID:132501
#######################################
*/
// 注意:當使用getHistoricIdentityLinksForProcessInstance()查詢的時候查詢的是參與者
}
/**候選者不一定真正的參與任務的辦理,所以我們需要拾取任務,將組任務分配給個人任務,即指定任務辦理人字段*/
@Test
public void cliam(){
//將組任務分配給個人任務
//任務ID
String taskId ="132504";
//分配的個人任務(可以是組任務中的成員,也可以是非組任務的成員)
String userId ="大F";
processEngine.getTaskService()
.claim(taskId, userId);
//當執行完之後查詢正在執行的任務表(act_ru_task)可以發現ASSIGNEE_字段(指定任務辦理人字段)值爲'大F'
//此時任務就指定給了大F,在用小A或者下B等在去查個人組任務的話,就查詢不出來任何任務【組任務最終也是需要指定一個人辦理的,所以需要拾取任務】
}
/**將個人任務回退到組任務,前提:之前一定是一個組任務*/
@Test
public void setAssigee(){
//將組任務分配給個人任務
//任務ID
String taskId ="132504";
processEngine.getTaskService()
.setAssignee(taskId, null);
//當執行完之後查詢正在執行的任務表(act_ru_task)可以發現ASSIGNEE_字段(指定任務辦理人字段)值由'大F'變爲了null,
//將本來指定給大F的任務又回退成爲組任務,這時就可以重新拾取任務將任務分配給組成員小A或者小B等
}
/**向組任務中添加組成員*/
@Test
public void addGroupUser(){
//任務ID
String taskId ="132504";
//成員辦理人
String userId ="大H";
processEngine.getTaskService()
.addCandidateUser(taskId, userId);
//當執行完之後查詢正在執行的任務表(act_ru_identitylink`)可以發現大H添加進去了
}
/**刪除組任務中的成員*/
@Test
public void deleteGroupUser(){
//任務ID
String taskId ="132504";
//成員辦理人
String userId ="小B";
processEngine.getTaskService()
.deleteCandidateUser(taskId, userId);
//當執行完之後查詢正在執行的任務表(act_ru_identitylink`)可以發現小B類型爲候選者類型(candidate)的那條記錄被刪除了
}
/**拾取任務給小A*/
@Test
public void cliamA(){
//將組任務分配給個人任務
//任務ID
String taskId ="132504";
//分配的個人任務(可以是組任務中的成員,也可以是非組任務的成員)
String userId ="小A ";
processEngine.getTaskService()
.claim(taskId, userId);
//當執行完之後查詢正在執行的任務表(act_ru_task)可以發現ASSIGNEE_字段(指定任務辦理人字段)值爲'小A'
//此時任務就指定給了小A
}
/**小A完成任務*/
@Test
public void completeTask(){
String taskId ="132504";
processEngine.getTaskService()
.complete(taskId);
}
}
二、分配組任務方式二:使用流程變量
1.在任務節點設置變量
2、測試代碼
public class group {
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
/**部署流程定義*/
@Test
public void deployementProcessDefinition(){
String resourceNamebpmn = "group.bpmn";
String resourceNamepng = "group.png";
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("group.png");
/**部署流程定義*/
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()//創建部署對象
.name("組任務")
.addInputStream(resourceNamebpmn, inputStreamBpmn)//部署加載資源文件
.addInputStream(resourceNamepng, inputStreamPng)
.deploy();
System.out.println("部署ID:"+deployment.getId());
}
/**
* 啓動流程實例的同時,設置流程變量,使用流程變量的方式設置下一個任務的辦理人
* 流程變量的名稱,就是在group.bpmn中定義activiti:candidateUsers="#{userIDs}"的userIDs
* 流程變量的值,就是任務的辦理人(組任務)
*/
@Test
public void startProcessInstance() {
//啓動流程實例
String processDefinitionKey ="group";
//設置流程變量
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userIDs", "大大,小小,中中");
//啓動流程實例的時候設置流程變量
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey, variables);//使用流程定義的key的最新版本啓動流程
System.out.println("流程實例ID:"+pi.getId());
System.out.println("流程定義的ID:"+pi.getProcessDefinitionId());
}
/**查看大大當前的組任務*/
@Test
public void findGroupTask(){
String candidateUser = "大大";
List<Task> list =processEngine.getTaskService()
.createTaskQuery()
.taskCandidateUser(candidateUser)
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務ID:"+task.getId());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的創建時間:"+task.getCreateTime());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
/*
* 查詢結果:
任務ID:162505
任務的辦理人:null
任務名稱:審覈
任務的創建時間:Mon Jul 04 16:53:15 GMT+08:00 2016
流程實例ID:162501
#######################################
注意:任務辦理人爲null的話有兩種可能1是沒有辦理人,2是組任務
*/
}
三、分配組任務方式三:使用類
1.編寫類
public class TaskListenerImpl implements TaskListener {
/**
* 可以設置任務的辦理人(個人組人和組任務)
*/
@Override
public void notify(DelegateTask delegateTask) {
//指定組任務
delegateTask.addCandidateUser("郭靖");
delegateTask.addCandidateUser("huangr");
}
}
2.設置任務監聽
3.測試代碼
public class TaskTest {
//流程引擎對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義+啓動流程實例*/
@Test
public void deployementAndStartProcess(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream(group.png");
Deployment deployment = processEngine.getRepositoryService()//
.createDeployment()//創建部署對象
.addInputStream("group.bpmn", inputStreamBpmn)//部署加載資源文件
.addInputStream("group.png", inputStreampng)//
.deploy();
System.out.println("部署ID:"+deployment.getId());
//啓動流程實例
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey("group");//使用流程定義的key的最新版本啓動流程
System.out.println("流程實例ID:"+pi.getId());
System.out.println("流程定義的ID:"+pi.getProcessDefinitionId());
}
/**查詢我的個人任務*/
@Test
public void findPersonalTaskList(){
//任務辦理人
String assignee = "郭靖";
List<Task> list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(assignee)//個人任務的查詢
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務ID:"+task.getId());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的創建時間:"+task.getCreateTime());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
/**查詢組任務*/
@Test
public void findGroupTaskList(){
//任務辦理人
String candidateUser = "郭靖";
List<Task> list = processEngine.getTaskService()//
.createTaskQuery()//
.taskCandidateUser(candidateUser)//參與者,組任務查詢
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務ID:"+task.getId());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的創建時間:"+task.getCreateTime());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
/**完成任務*/
@Test
public void completeTask(){
//任務ID
String taskId = "6308";
processEngine.getTaskService()//
.complete(taskId);
System.out.println("完成任務:"+taskId);
}
/**查詢正在執行的組任務列表*/
@Test
public void findGroupCandidate(){
//任務ID
String taskId = "5909";
List<IdentityLink> list = processEngine.getTaskService()//
.getIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
for(IdentityLink identityLink:list){
System.out.println("任務ID:"+identityLink.getTaskId());
System.out.println("流程實例ID:"+identityLink.getProcessInstanceId());
System.out.println("用戶ID:"+identityLink.getUserId());
System.out.println("工作流角色ID:"+identityLink.getGroupId());
System.out.println("#########################################");
}
}
}
/**查詢歷史的組任務列表*/
@Test
public void findHistoryGroupCandidate(){
//流程實例ID
String processInstanceId = "5905";
List<HistoricIdentityLink> list = processEngine.getHistoryService()
.getHistoricIdentityLinksForProcessInstance(processInstanceId);
if(list!=null && list.size()>0){
for(HistoricIdentityLink identityLink:list){
System.out.println("任務ID:"+identityLink.getTaskId());
System.out.println("流程實例ID:"+identityLink.getProcessInstanceId());
System.out.println("用戶ID:"+identityLink.getUserId());
System.out.println("工作流角色ID:"+identityLink.getGroupId());
System.out.println("#########################################");
}
}
}
/**將組任務指定個人任務(拾取任務)*/
@Test
public void claim(){
//任務ID
String taskId = "6308";
//個人任務的辦理人
String userId = "郭靖";
processEngine.getTaskService()//
.claim(taskId, userId);
}
/**將個人任務再回退到組任務(前提:之前這個任務是組任務)*/
@Test
public void setAssignee(){
//任務ID
String taskId = "6308";
processEngine.getTaskService()//
.setAssignee(taskId, null);
}
/**向組任務中添加成員*/
@Test
public void addGroupUser(){
//任務ID
String taskId = "6308";
//新增組任務的成員
String userId = "李浩";
processEngine.getTaskService()//
.addCandidateUser(taskId, userId);
}
/**向組任務中刪除成員*/
@Test
public void deleteGroupUser(){
//任務ID
String taskId = "6308";
//新增組任務的成員
String userId = "黃蓉";
processEngine.getTaskService()//
.deleteCandidateUser(taskId, userId);
}
}
說明:
1)在類中使用delegateTask.addCandidateUser(userId);的方式分配組任務的辦理人,此時郭靖和黃蓉是下一個任務的辦理人。
2)通過processEngine.getTaskService().claim(taskId,userId);將組任務分配給個人任務,也叫認領任務,即指定某人去辦理這個任務,此時有郭靖去辦理任務。
注意:認領任務的時候,可以是組任務成員中的人,也可以不是組成員中的人。此時通過type的類型
爲participant來指定任務辦理人。
3)addCandidateUser()即向組任務添加成員,deleteCandidateUser()即刪除組任務成員。
4)在開發中,可以將每一個任務的辦理人規定好,例如張三的領導是李四和王五,這樣張三
提交任務,由李四或者王五去查詢組任務,可以看到對應張三的申請,李四或者王五在通過任務認領(claim)
的方式,由某個人去完成這次任務。
四、總結