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 异常
}
}
}