《Activiti/Flowable 深入BPM工作流》-組任務的辦理流程是什麼?
一. 問題
組任務的辦理流程是什麼?
二. 詳情
第一步:查詢組任務
指定候選人,查詢該候選人當前的待辦任務。
候選人不能辦理任務。
第二步:讓候選人去拾取(claim)任務
該組任務的所有候選人都能拾取。
將候選人的組任務,變成個人任務。原來候選人就變成了該任務的負責人。
問題: 如果拾取後不想辦理該任務怎麼辦?
解答: 需要將已經拾取的個人任務歸還到組裏邊,將個人任務變成了組任務。
第三步:查詢個人任務
查詢方式同個人任務部分,根據 assignee 查詢用戶負責的個人任務。
第四步:辦理個人任務
1. 部署流程定義
// 新的請假流程定義的部署
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 得到 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("holiday.bpmn")
// .addClasspathResource("studentHoliday.png")
.name("請假流程2020-5-20")
.deploy();
System.out.println(deploy.getId());
System.out.println(deploy.getName());
System.out.println(deploy.getKey());
}
2. 啓動流程定義
// 啓動流程實例,同時還要設置流程變量的值
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3.流程定義的key問題並進行啓動
String processDefinitionKey = "myProcess_1";
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
// 4.輸出實例信息;
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessDefinitionId());
System.out.println(processInstance.getId());
}
3. 處理任務,到下一步,部門經理
// 處理任務: 任務查詢是否存在再執行
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 TaskService
TaskService taskService = processEngine.getTaskService();
// 3. 查詢當前用戶是否有任務
String key = "myProcess_1";
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.singleResult();
// 4. 判斷task!=null,說明當前用戶有任務
if (task != null) {
taskService.complete(task.getId());
System.out.println("用戶任務執行完成");
System.out.println(task.getId());
}
}
任務成功執行完畢如下:
4. 查詢候選用戶的組任務
// 4.根據候選人查詢組任務
public void findGroupTaskList() {
// 流程定義key
String key = "myProcess_1";
// 任務候選人
String candidateUser = "zhangsan";
// 創建 TaskService
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
// 查詢任務
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidateUser)
.list();
// 流程信息的輸出展示
if (!list.isEmpty()) {
for (Task task : list) {
System.out.println("===============================");
System.out.println("流程實例id:" + task.getProcessInstanceId());
System.out.println("任務id:" + task.getId());
System.out.println("任務負責人:" + task.getAssignee());
System.out.println("任務名稱:" + task.getName());
}
}
}
成功運行結果如下:
5. 讓候選人去拾取(claim)任務
// 5. 讓候選人去拾取(claim)任務
public static void claimTask() {
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
String key = "myProcess_1";
String candidateUsers = "zhangsan";
// 先查詢是否有任務,校驗用戶是否有資格
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidateUsers)
.singleResult();
if (task != null) {
// 拾取主任務
taskService.claim(task.getId(), candidateUsers);
System.out.println("該任務拾取成功!");
}
}
如果任務拾取成功顯示如下:
查看部門經理的assignee,之前是空, 目前已經確認,給 "zhansan" 了. "zhansan"由候選人變成了執行人.
任務拾取的核心: TaskService.claim(taskId, candidateUser); 目的就是將候選人轉化爲執行人, 讓assignee有值.
6. 用戶查詢個人代辦任務(候選人查詢自己的任務,候選人已經轉換成執行人了.)
這裏的核心是用taskAssignee(userId);進行查詢, userId還是candidateUser, 但是candidateUser實際已經編程執行人了, 所以查詢的時候方法是用taskAssignee()來進行查詢.
// 6. 用戶查詢個人代辦任務
public static void findPersonalTaskList(){
// 流程定義key
String key = "myProcess_1";
// 任務候選人
String candidateUser = "zhangsan";
// 創建 TaskService
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
// 查詢任務
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(candidateUser)
.list();
// 流程信息的輸出展示
if (!list.isEmpty()) {
for (Task task : list) {
System.out.println("===============================");
System.out.println("流程實例id:" + task.getProcessInstanceId());
System.out.println("任務id:" + task.getId());
System.out.println("任務負責人:" + task.getAssignee());
System.out.println("任務名稱:" + task.getName());
}
}
}
7. 用戶辦理個人任務.
// 7.用戶辦理個人任務
public static void completeTask() {
// 任務Id
String taskId = "";
ProcessEngines.getDefaultProcessEngine().getTaskService()
.complete(taskId);
System.out.println("完成任務:" + taskId);
}
優化--(判斷有沒有權限)
// 7. 當前用戶完成自己的任務
public static void completeTask() {
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
String key = "myProcess_1";
String candidateUsers = "zhangsan";
// 先查詢是否有任務,校驗用戶是否有資格
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(candidateUsers)
.singleResult();
if (task != null) {
// 完成任務
taskService.complete(task.getId());
System.out.println("完成任務:" + task.getId());
}
小結:
組任務的辦理流程和任務的交接流程如下:
第一步:查詢組任務
指定候選人,查詢該候選人當前的待辦任務。
第二步:讓候選人去拾取(claim)任務
第三步:查詢個人任務
第四步:辦理個人任務