Activiti7 组任务

需求:在流程定义中在任务节点的assignee固定设置任务负责人,这种情况不是很好,如果有天任务负责人请假了,你想请假,等着吧..没人审批,针对这种情况,可以给任务设置多个候选人,可以从候选中选择参与者来完成任务

 

设置候选人:画图

 

 

 候选人 采用Candidate Users字段设置 多人使用逗号隔开

画完图之后,部署,然后启动流程实例,提交zhangsan的任务,接下来的看代码注释吧

复制代码
package com.itheima.test;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class ActivitiGroupTest {

    ProcessEngine processEngine;
    TaskService taskService;
    String candidateUser = "lisan";
    static String  KEY = "holiday";

    @Before
    public void init() {
        processEngine = ProcessEngines.getDefaultProcessEngine();
        taskService = processEngine.getTaskService();
    }

    /**
     * 部署流程定义
     */
    @Test
    public void deployment(){

        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("pic/holidayGroup.bpmn")
                .addClasspathResource("pic/holidayGroup.png")
                .name("请假流程")
                .deploy();

        System.out.println(deploy);
    }

    /**
     * 启动流程实例
     */
    @Test
    public void startProcessInstance(){

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActivitiGroupTest.KEY);

        System.out.println(processInstance);

    }

    /**
     * 查询组任务
     */
    @Test
    public void queryGroupTask() {

        queryTaskByCandidateUser(candidateUser, null, false).forEach(task -> {
            System.out.println(task);
        });

    }

    /**
     * 用户拾取组任务
     */
    @Test
    public void claimTask() {

        queryTaskByCandidateUser(candidateUser, null, false).forEach(task -> {
            taskService.claim(task.getId(), candidateUser);
            System.out.println(candidateUser + "用户拾取了[" + task.getName() + "]任务");
        });
    }

    /**
     * 用户归还组任务
     */
    @Test
    public void unClaimTask(){
        queryTaskByCandidateUser(null, candidateUser, true).forEach(task -> {
            taskService.setAssignee(task.getId(),null);
            System.out.println(candidateUser + "用户丢弃了[" + task.getName() + "]任务");
        });
    }

    /**
     * 用户任务交接,委托
     */
    @Test
    public void toAssignee(){
        queryTaskByCandidateUser(null,candidateUser,true).forEach(task -> {
            taskService.setAssignee(task.getId(),"lisi");
            System.out.println(candidateUser+"用户将["+task.getName()+"]任务交接给了lisi用户");
        });
    }

    /**
     * 查询并处理自己的任务
     */
    @Test
    public void queryCompletTask() {

        queryTaskByCandidateUser(null, "lisi", true).forEach(task -> {
            taskService.complete(task.getId());
            System.out.println(candidateUser+"处理了["+task.getName()+"]任务");
        });
    }

    /**
     * 根据候选人查询任务
     *
     * @param candidateUser 候选人
     * @param assignee 指定人
     * @param isAssignee 是否是指定人
     * @return 任务列表
     */
    public List<Task> queryTaskByCandidateUser(String candidateUser, String assignee, Boolean isAssignee) {

        TaskQuery taskQuery = taskService.createTaskQuery().processDefinitionKey(ActivitiGroupTest.KEY);

        if (isAssignee) {
            taskQuery.taskAssignee(assignee);
        } else {
            taskQuery.taskCandidateUser(candidateUser);
        }

        return taskQuery.list();

    }


}
复制代码

作者:彼岸舞

时间:2020\09\06

内容关于:Activiti工作流

本文来源于网络,只做技术分享,一概不负任何责任

posted @   彼岸舞  阅读(551)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示