camunda_18_user_task_assignment
Camunda 后臺數據庫內建有幾個人員/組織數據表, 但在User task assignment方便, 并不強制我們要將自己的人員/組織數據導入到這些table中. 舉例講, 我們需要將某個user task指派給 demo123 這個用戶, 直接在該user task設定 assignee 為 demo123 即可, 就這么簡單.
指定 Assignment 的幾種形式:
- Assignee: 直接指派到人.
- Candidate Users, 指派多個人, 按逗號分隔.
- Candidate Groups, 指派到多個組, 按逗號分隔.
說明: 在TaskList應用中, 對于后兩種形式的指派, 操作人員在執行user task之前, 還需要先做任務認領, 誰認領任務, 誰就獲得執行權.
但如果是自己的流程引擎的應用, 其實可以設計認領過程, 也可以省略認領步驟.
Assignment 的設定時機
- 流程設計時設定. 在流程設計時即使用固定值指定任務執行人, 比如設定 demo123.
- 流程啟動時設定. Assignee/CandidateUsers/CandidateGroups, 都支持表達式設定, 我們可以在流程設計時, 指定user task的執行人為 ${user} , 在流程啟動時間, 設定這些流程變量, 即完成人員指派.
- 流程流轉過程中設定. 流程設計時通過變量設定執行人, 然后在流程流轉時, 在前置節點代碼指定后續節點的執行人, 或者在本user task的 executionListener的 start 事件或 taskListener 的 create 事件中動態設定執行人. 下圖executionListener 和 taskListener 常用event的執行順序圖:

通過create TaskListener 指派人員的示例代碼
public class MyUserTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
if (delegateTask.getEventName().equals("create")) {
//直接指派人
delegateTask.setAssignee("demo123");
//或者, 設定流程變量userId
delegateTask.setVariable("userId","demo123");
}
}
}
User task 任務處理
SpringBoot 的引擎項目, DI 容器可以直接注入 TaskService 實例, 然后就可以按照process 和當前用戶UserId/group 遍歷到要 todo 清單, 進而完成業務處理.
下面是一個簡單的代碼示例:
@SpringBootApplication
@EnableProcessApplication
public class WebappExampleProcessApplication {
@Autowired
TaskService taskService;
public static void main(String... args) {
SpringApplication.run(WebappExampleProcessApplication.class, args);
}
public void doTask() {
List<Task> tasks = null;
tasks = taskService.createTaskQuery().taskAssignee("demo123").processInstanceBusinessKey("procKey").list();
tasks = taskService.createTaskQuery().taskCandidateUser("demo123").processInstanceBusinessKey("procKey").includeAssignedTasks().list();
tasks = taskService.createTaskQuery().taskCandidateGroup("Group1").processInstanceBusinessKey("procKey").includeAssignedTasks().list();
if (tasks != null && tasks.size() > 0) {
Task task= tasks.get(0) ;
String taskId = task.getId();
// 業務處理代碼省略
// 如果原來分配到group或candidateUsers, 可設定具體執行人
taskService.setAssignee(taskId, "demo123");
// 提交task
taskService.complete(taskId);
taskService.handleBpmnError(taskId, "some error"); // 拋出 Bpmn 異常
}
}
}

浙公網安備 33010602011771號