Activiti 學習筆記12:分配個人任務
一、流程圖
二、分配個人任務方式一(直接指定辦理人)
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()//
.setAssignee(taskId, userId);
}
}
說明:
1) 在類中使用delegateTask.setAssignee(assignee);的方式分配個人任務的辦理人,此時滅絕師太是下一個任務的辦理人
2) 通過processEngine.getTaskService().setAssignee(taskId, userId);將個人任務從一個人分配給另一個人,此時滅絕師太不再是下一個任務的辦理人,而換成了張翠山
3) 在開發中,可以將每一個任務的辦理人規定好,例如張三的領導是李四,李四的領導是王五,這樣張三提交任務,就可以查詢出張三的領導是李四,通過類的方式設定下一個任務的辦理人
五、小結
個人任務及三種分配方式:
- 在taskProcess.bpmn中直接寫 assignee=“張三丰”
- 使用流程變數指定辦理人
在taskProcess.bpmn中寫 assignee=“#{userID}”,變數的值要是String的。 - 使用TaskListener介面,要使類實現該介面,在類中定義:
delegateTask.setAssignee(assignee);// 指定個人任務的辦理人
使用任務ID和辦理人重新指定辦理人:
processEngine.getTaskService()//
.setAssignee(taskId, userId);
演示程式碼下載:http://download.csdn.net/detail/xunzaosiyecao/9627675
本文部分內容整理自itcast講義,在此表示感謝。
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
相關文章
- activiti學習筆記二筆記
- activiti學習筆記(四)managementService筆記
- Linux 學習筆記--任務計劃 crontabLinux筆記
- Activiti工作流基礎學習筆記筆記
- activiti學習記錄
- 《聯邦學習》——個人筆記(二)聯邦學習筆記
- 開通個人學習隨筆記錄筆記
- 強化學習-學習筆記12 | Dueling Network強化學習筆記
- 2018-11-12學習筆記筆記
- Flutter學習筆記(12)--列表元件Flutter筆記元件
- substrate學習筆記12:Relay Chain筆記AI
- 【機器學習】支援向量機(個人筆記)機器學習筆記
- 學習筆記 - 微服務筆記微服務
- 機器學習個人筆記(三)之無監督學習機器學習筆記
- tensorflow 學習筆記使用CNN做英文文字分類任務筆記CNN文字分類
- 撤銷操作 —— Git 學習筆記 12Git筆記
- Django學習筆記(12)——分頁功能Django筆記
- Activiti工作流學習筆記(四)——工作流引擎中責任鏈模式的建立與應用原理筆記模式
- 【Java學習筆記】垃圾收集器和記憶體分配策略Java筆記記憶體
- 【JVM學習筆記】垃圾收集器與記憶體分配策略JVM筆記記憶體
- 記憶體分配策略學習記憶體
- Linux 學習筆記(二):搭建個人Git伺服器Linux筆記Git伺服器
- 鴻蒙 NEXT 開發之後臺任務開發服務框架學習筆記鴻蒙框架筆記
- Solidity語言學習筆記————12、陣列Solid筆記陣列
- Adaptive AUTOSAR 學習筆記 12 - 通訊管理APT筆記
- 爬蟲學習日記(六)完成第一個爬蟲任務爬蟲
- fastapi個人學習記錄ASTAPI
- Kubernetes學習筆記(四):服務筆記
- django rest framework個人學習筆記(三)————Tutorial1.SerializationDjangoRESTFramework筆記
- swoole學習手記(四)非同步任務task非同步
- 個人筆記筆記
- Activiti 學習(三)—— Activiti 流程啟動並完成
- Consul 學習筆記-服務註冊筆記
- django rest framework個人學習筆記(四)————Tutorial2.Request and ResponseDjangoRESTFramework筆記
- Java個人學習筆記-資料型別及取值範圍Java筆記資料型別
- JVM記憶體分配機制與回收策略選擇-JVM學習筆記(2)JVM記憶體筆記
- numpy的學習筆記\pandas學習筆記筆記
- FreeRTOS學習記錄--任務建立函式詳解函式
- 烏托邦漂流者的Java學習筆記12Java筆記