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

		}
	}

}

参考

posted @ 2022-10-11 21:59  harrychinese  阅读(444)  评论(0编辑  收藏  举报