Skip to content

还是拿请假流程举例,请假流程:填写申请单→部门经理审核→CTO审核→财务审核,其中部门经理、财务可能有多个,那么如果是组任务,Activiti的执行流程是什么呢?

  1. Candidate Users:制定可处理的任务负责人
  2. 查询组任务:查询该候选人当前的待办任务,此时候选人不能立即办理任务
  3. 拾取(claim)任务:该组任务的所有候选人都能拾取,将候选人的组任务,变成个人任务,如果李老师拾取了任务,那么此时Assignee就变成了李老师
    • 如果拾取后不想办理该任务?需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
  4. 查询个人任务:查询方式同个人任务部分,根据assignee查询用户负责的个人任务。
  5. 最后办理任务

image-20230630194513828

准备工作

按上图方式填写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);
    }
}