Activiti(四)任务组

一:需求

在流程定义中在任务结点的  assignee  固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。

针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。

流程简介

第一步:查询组任务

  指定候选人,查询该候选人当前的待办任务。候选人不能办理任务。

第二步:拾取(claim)任务

  该组任务的所有候选人都能拾取。

  将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。

    如果拾取后不想办理该任务?

    需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。

第三步:查询个人任务

  查询方式同个人任务部分,根据assignee 查询用户负责的个人任务。第四步:办理个人任务

二:设置任务候选人

 

三:实现

3.1前置方法

    ProcessEngine processEngine;

    @Before
    public void connection() {
        ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
        processEngine = processEngineConfigurationFromResource.buildProcessEngine();
    }

3.2流程部署

//1.流程部署
    @Test
    public void createDeployment() {
        System.out.println(processEngine);
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("holiday.bpmn")
                .name("请假流程-组任务")
                .key("myHoliday")
                .deploy();
        System.out.println(deployment.getName());
        System.out.println(deployment.getKey());
        System.out.println(deployment.getId());
    }

3.3创建流程实例

 //2.创建流程实例
    @Test
    public void startProcessInstance() {
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //动态指定任务执行人
        Map assigneesMap = new HashMap();
        //请假人
        assigneesMap.put("tianyan", "tianyan");
        //部门经理
        assigneesMap.put("douying", "douying");
        assigneesMap.put("guo", "guo");
        assigneesMap.put("xuediao", "xuediao");
        //人事
        assigneesMap.put("fenghe", "fenghe");
        //设置请假天数

        //赋值并启动
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", assigneesMap);
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getDeploymentId());
        System.out.println(processInstance.getActivityId());
    }

3.4单人任务查询和处理任务

 //3.单人任务查询和处理任务
    @Test
    public void findPersonalTaskList() {
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("myProcess_1")
                .taskAssignee("fenghe").list();

        Iterator<Task> iterator = list.iterator();
        while (iterator.hasNext()) {
            Task next = iterator.next();
            System.out.println(next);
            //4.处理任务
            processEngine.getTaskService().complete(next.getId());
            System.out.println("完成任务");
        }
    }

3.5.组任务查询

@Test
    public void findGroupTaskList() {
        TaskService taskService = processEngine.getTaskService();
        //任务没被拾取之前,任何候选人都可以查看
        List<Task> list = taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskCandidateUser("douying").list();
        Iterator<Task> iterator = list.iterator();
        while (iterator.hasNext()) {
            Task next = iterator.next();
            System.out.println(next);
        }

    }

3.6任务拾取

@Test
    //5.任务拾取
    public void claimTask() {
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()//
                .taskId("7502")
                .taskCandidateUser("douying")//douying拾取任务
                .singleResult();
        if (task != null) {
            taskService.claim("7502", "douying");
            System.out.println("任务拾取成功");
        }
    }

3.7归还任务or交接任务

 //6.归还任务or交接任务
    @Test
    public void setAssigneeToGroupTask() {
        // 查询任务使用TaskService
        TaskService taskService = processEngine.getTaskService();
        // 当前待办任务
        String taskId = "7502";
        // 任务负责人
        String userId = "douying";
        // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskAssignee(userId).singleResult();
        if (task != null) {
            // 如果设置为null,归还组任务,该任务没有负责人,可以指定给其他的候选人(不存在的候选人也可以)
            taskService.setAssignee(taskId, null);
        }
    }

 

 

posted @ 2020-04-07 18:30  天戈  阅读(386)  评论(0编辑  收藏  举报