一、流程圖
二、配置設定個人任務方式一(直接指定辦理人)
1、流程圖中任務節點的配置
2、測試代碼
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定義,啟動流程執行個體
@Test
public void testTask() throws Exception {
// 1 釋出流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");
processEngine.getRepositoryService()//
.createDeployment()//
.addInputStream("userTask.bpmn", inputStreamBpmn)//
.addInputStream("userTask.png", inputStreamPng)//
.deploy();
// 2 啟動流程
//啟動流程執行個體的同時,設定流程變量
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey("taskProcess");
System.out.println("pid:" + pi.getId());
}
//查詢我的個人任務清單
@Test
public void findMyTaskList(){
String userId = "張三豐";
List<Task> list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(userId)//指定個人任務查詢
.list();
for(Task task:list ){
System.out.println("id="+task.getId());
System.out.println("name="+task.getName());
System.out.println("assinee="+task.getAssignee());
System.out.println("createTime="+task.getCreateTime());
System.out.println("executionId="+task.getExecutionId());
}
}
//完成任務
@Test
public void completeTask(){
String taskId = "3209";
processEngine.getTaskService()//
.complete(taskId);//
System.out.println("完成任務");
}
3、說明
1) 張三豐是個人任務的辦理人
2) 但是這樣配置設定任務的辦理人不夠靈活,因為項目開發中任務的辦理人不要放置XML檔案中。
三、配置設定個人任務方式二(使用流程變量)
1、流程圖中任務節點的配置
2、測試代碼
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class TaskTest
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//建立一個部署對象
.name("任務")//添加部署的名稱
.addInputStream("task.bpmn", inputStreamBpmn)//
.addInputStream("task.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程執行個體*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "task";
/**啟動流程執行個體的同時,設定流程變量,使用流程變量用來指定任務的辦理人,對應task.pbmn檔案中#{userID}*/
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userID", "周芷若");
ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程執行個體和執行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的key啟動流程執行個體,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
System.out.println("流程執行個體ID:"+pi.getId());//流程執行個體ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢目前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "周芷若";
List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
.createTaskQuery()//建立任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程執行個體ID查詢
// .executionId(executionId)//使用執行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用建立時間的升序排列
/**傳回結果集*/
// .singleResult()//傳回惟一結果集
// .count()//傳回結果集的數量
// .listPage(firstResult, maxResults);//分頁查詢
.list();//傳回清單
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務ID:"+task.getId());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的建立時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程執行個體ID:"+task.getProcessInstanceId());
System.out.println("執行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "5505";
processEngine.getTaskService()//與正在執行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:"+taskId);
}
}
說明:
1) 周芷若是個人任務的辦理人
2) 在開發中,可以在頁面中指定下一個任務的辦理人,通過流程變量設定下一個任務的辦理人
四、配置設定個人任務方式三(使用類)
1、流程圖中任務節點的配置
此時流程圖的XML檔案,如圖:
2、TaskListenerImpl類,用來設定任務的辦理人
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
@SuppressWarnings("serial")
public class TaskListenerImpl implements TaskListener
/**用來指定任務的辦理人*/
@Override
public void notify(DelegateTask delegateTask) {
//指定個人任務的辦理人,也可以指定組任務的辦理人
//個人任務:通過類去查詢資料庫,将下一個任務的辦理人查詢擷取,然後通過setAssignee()的方法指定任務的辦理人
delegateTask.setAssignee("滅絕師太");
}
}
3、測試代碼
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class TaskTest
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//建立一個部署對象
.name("任務")//添加部署的名稱
.addInputStream("task.bpmn", inputStreamBpmn)//
.addInputStream("task.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程執行個體*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "task";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程執行個體和執行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程執行個體,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
System.out.println("流程執行個體ID:"+pi.getId());//流程執行個體ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢目前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "張翠山";
List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
.createTaskQuery()//建立任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程執行個體ID查詢
// .executionId(executionId)//使用執行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用建立時間的升序排列
/**傳回結果集*/
// .singleResult()//傳回惟一結果集
// .count()//傳回結果集的數量
// .listPage(firstResult, maxResults);//分頁查詢
.list();//傳回清單
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務ID:"+task.getId());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的建立時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程執行個體ID:"+task.getProcessInstanceId());
System.out.println("執行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "5804";
processEngine.getTaskService()//與正在執行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:"+taskId);
}
//可以配置設定個人任務從一個人到另一個人(認領任務)
@Test
public void setAssigneeTask(){
//任務ID
String taskId = "5804";
//指定的辦理人
String userId = "張翠山";
processEngine.getTaskService()//
說明:
1) 在類中使用delegateTask.setAssignee(assignee);的方式配置設定個人任務的辦理人,此時滅絕師太是下一個任務的辦理人
2) 通過processEngine.getTaskService().setAssignee(taskId, userId);将個人任務從一個人配置設定給另一個人,此時滅絕師太不再是下一個任務的辦理人,而換成了張翠山
3) 在開發中,可以将每一個任務的辦理人規定好,例如張三的上司是李四,李四的上司是王五,這樣張三送出任務,就可以查詢出張三的上司是李四,通過類的方式設定下一個任務的辦理人
五、小結
個人任務及三種配置設定方式:
- 在taskProcess.bpmn中直接寫 assignee=“張三豐”
-
使用流程變量指定辦理人
在taskProcess.bpmn中寫 assignee=“#{userID}”,變量的值要是String的。
- 使用TaskListener接口,要使類實作該接口,在類中定義:
delegateTask.setAssignee(assignee);// 指定個人任務的辦理人
使用任務ID和辦理人重新指定辦理人:
.getTaskService()//
.setAssignee(taskId, userId);