Appearance
还是拿请假流程举例,请假流程:填写申请单→部门经理审核→CTO审核→财务审核,其中部门经理、财务可能有多个,那么如果是组任务,Activiti的执行流程是什么呢?
- Candidate Users:制定可处理的任务负责人
- 查询组任务:查询该候选人当前的待办任务,此时候选人不能立即办理任务
- 拾取(claim)任务:该组任务的所有候选人都能拾取,将候选人的组任务,变成个人任务,如果李老师拾取了任务,那么此时Assignee就变成了李老师
- 如果拾取后不想办理该任务?需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
- 查询个人任务:查询方式同个人任务部分,根据assignee查询用户负责的个人任务。
- 最后办理任务
准备工作
按上图方式填写Candidate Users后,创建流程,方式和以前一样
java
public void testDeploy() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/holiday-group.bpmn20.xml").name("holiday-group").deploy();
System.out.println("部署id" + deployment.getId()); // 47501
}
创建流程
java
public void testStartProcess() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动实例
ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday-group");
System.out.println("Id" + holiday.getId());
}
完成任务
我是在第二步创建的组任务,因此需要先完成任务,在接下来的步骤处理组任务
java
public void completeTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processDefinitionKey("holiday-group").taskId("52505").singleResult();
System.out.println(task);
// 完成任务
taskService.complete(task.getId());
}
处理组任务
1.拾取任务
java
public void claimTask() {
String taskId = "87502"; //要拾取的任务id
String userId = "朱老师"; //任务候选人
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
// 查询可拾取的任务,即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
Task task = taskService.createTaskQuery().taskId(taskId)
.taskCandidateUser(userId)//根据候选人查询
.singleResult();
if (task != null) {
//拾取任务
taskService.claim(taskId, userId);
System.out.println("任务拾取成功");
} else {
System.err.println("任务拾取失败");
}
}
2.查询个人待办任务
java
public void findPersonalTaskList() {
String processDefinitionKey = "holiday-group2"; // 流程定义key
String assignee = "朱老师"; // 任务负责人
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : list) {
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
3.办理个人任务
java
public void completeTask(){
String taskId = "85001";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService().complete(taskId);
System.out.println("完成任务:"+taskId);
}
4.归还组任务
java
public void setAssigneeToGroupTask() {
String taskId = "6004"; // 当前待办任务
String userId = "朱老师"; // 任务负责人
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
// 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult();
if (task != null) {
// 如果设置为null,归还组任务,该任务没有负责人
taskService.setAssignee(taskId, null);
}
}
5.任务交接
java
public void setAssigneeToCandidateUser() {
String taskId = "6004"; // 当前待办任务
String userId = "朱老师"; // 任务当前负责人
String candidateuser = "itsongls"; // 将此任务交给其它候选人办理该任务
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();、
// 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
Task task = taskService、.createTaskQuery().taskId(taskId)、.taskAssignee(userId).singleResult();
if (task != null) {
taskService.setAssignee(taskId, candidateuser);
}
}