使用activiti总结--发布,办理,查询

2023-05-16

接上一篇文章,使用创建好的流程图,总结一下activiti发布到查询使用的方法和测试代码

流程图

1. 引用配置文件 activiti.cfg.xml ,不引用或者引用失败的话在创建流引擎的时候会报空指针异常,解决方法:

idea中右键文件夹,选Mark Directory As里的ReSources Root ,将resources设置成Resources Root类型文件夹,将activiti.cfg.xml直接放在resources下

2.引用activiti所需要的jar 我使用的是5.18

    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-engine</artifactId>
      <version>5.18.0</version>
    </dependency>
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-spring</artifactId>
      <version>5.18.0</version>
    </dependency>

3.创建一个测试类,开始测试

首先要创建流程引擎,如果配置文件引用出错,这个地方就会报错

/*创建流程引擎*/
    private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

 布署流程

/*部署流程定义*/
    @Test
    public void test1() {
        Deployment deployment = processEngine.getRepositoryService()// 获取部署相关Service
                .createDeployment()//创建部署
                .name("产品审核流程")//声明流程的名称
                .addClasspathResource("process/testGroup.bpmn")//加载资源文件
                .deploy();
        System.out.println("流程部署ID:" + deployment.getId());
        System.out.println("流程部署Name:" + deployment.getName());
    }

 执行后可以查询下面表

流程定义:act_re_procdef 

所有流程:act_re_deployment

文件保存表:act_ge_bytearray

启动流程

先把流程逻辑粘出来

<process id="termTest" isClosed="false" isExecutable="true" name="termTest" processType="None">
    <startEvent id="start_1" name="StartEvent"/>
    <endEvent id="_8" name="EndEvent"/>
    <userTask activiti:candidateUsers="${productUsers}" activiti:exclusive="true" id="_9" name="产品审核"/>
    <userTask activiti:candidateGroups="${requireGroup}" activiti:exclusive="true" id="_10" name="需求审核"/>
    <userTask activiti:assignee="张三" activiti:exclusive="true" id="_11" name="财务审核"/>
    <userTask activiti:assignee="${user}" activiti:exclusive="true" id="_12" name="发起人测试"/>
    <sequenceFlow id="_13" sourceRef="start_1" targetRef="_9"/>
    <sequenceFlow id="_14" sourceRef="_9" targetRef="_10"/>
    <sequenceFlow id="_15" sourceRef="_10" targetRef="_11"/>
    <sequenceFlow id="_16" sourceRef="_11" targetRef="_12"/>
    <sequenceFlow id="_17" sourceRef="_12" targetRef="_8"/>
  </process>

第一个节点是产品审核,需要指定参数productUsers,所以启动的时候我们就需要设置上

/*
    * 启动流程
    * 两种启动方式1 通过key  2 通过id
    * 我们通过key的方式启动 key为act_re_procdef表中的key字段值
    * */
    @Test
    public void startTask() {
        try {
            /*定义参数*/
            Map<String, Object> variables = new HashMap<String, Object>();
            variables.put("productUsers", "zhangsan,lisi");//为candidateUsers的参数productUsers 指定值,用英文逗号分隔
            ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("termTest",variables);
            System.out.println("流程实例ID:" + pi.getId());
            System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

节点待办任务表 :act_ru_task 会增加一条待办任务

现在待办任务已经形成,此条待办任务属于组任务的一种,通过组任务方法查询该任务

根据用户查询组待办任务

@Test
    public void test3() {
        String candidateUser = "zhangsan";
        List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
                .createTaskQuery()// 创建任务查询对象
                /** 查询条件(where部分) */
                .taskCandidateUser(candidateUser)// 组任务的办理人查询,不是组成员,查询不到
                /** 排序 */
                .orderByTaskCreateTime().asc()// 使用创建时间的升序排列
                /** 返回结果集 */
                .list();
        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务的创建时间:" + task.getCreateTime());
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("执行对象ID:" + task.getExecutionId());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }

结果:

        任务ID:37505
        任务名称:产品审核
        任务的创建时间:Mon Oct 08 18:52:33 CST 2018
        任务的办理人:null
        流程实例ID:37501
        执行对象ID:37501
        流程定义ID:termTest:1:35004
        ########################################################

我们可以看到任务办理人是为null,那么我们就可以在介绍一下组待办任务的认领,我现在指定了zhangsan,lisi两个审核人,但是此节点只需要一个人审批就可以了,组任务需要先认领,在办理

组待办任务认领,和解除认领

/** 组代办任务认领*/
    @Test
    public void claim() {
        //任务ID
        String taskId = "37505";
        //认领人
        String userId = "zhangsan";
        processEngine.getTaskService()
                .claim(taskId, userId);
    }

/** 解除任务认领*/
    @Test
    public void setAssignee() {
        //任务ID
        String taskId = "37505";
        processEngine.getTaskService()//
                .setAssignee(taskId, null);

    }

组代办任务被认领,变成个人任务,在根据用户查询组待办任务将将查询不到,使用个人待办任务查询方法可以查询到

查询个人待办任务

/** 查询当前人的个人任务 */
    @Test
    public void test4() {
        String assignee = "zhangsan";
        List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
                .createTaskQuery()//创建任务查询对象
                /** 查询条件(where部分) */
                .taskAssignee(assignee)// 指定个人任务查询,指定办理人
                /** 排序 */
                .orderByTaskCreateTime().asc()// 使用创建时间的升序排列
                /** 返回结果集 */
                .list();// 返回列表
        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务的创建时间:" + task.getCreateTime());
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("执行对象ID:" + task.getExecutionId());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }

结果:

         任务ID:37505
         任务名称:产品审核
         任务的创建时间:Mon Oct 08 18:52:33 CST 2018
         任务的办理人:zhangsan
         流程实例ID:37501
         执行对象ID:37501
         流程定义ID:termTest:1:35004
         ########################################################

可以发现,任务办理人已经变成zhangsan了

完成待办任务

完成任务时我们需要考虑下一个节点任务信息,根据流程图,产品审核的下一节点是需求审核,需求审核指定的是组审核

candidateGroups="${requireGroup},需要指定组去办理,candidateUsers和candidateGroups区别已经说过,前者是人,后者是组。

/**
     * 完成任务
     */
    @Test
    public void test5() {
        TaskService taskService = processEngine.getTaskService();
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("requireGroup", "requireGroup");//用户组,requireGroup
        //添加完成任务信息,可以不要
        //taskId,processInstance,message
        taskService.addComment("37505", "37501", "产品审核同意--zhangsan");
        //完成任务方法
        taskService.complete("37505", variables);
    }

 现在act_ru_task表中产品审核节点已经不存在,新增需求审核节点数据

因为我们有了组,所以需要把用户和组的信息添加进去

用户信息表:act_id_user

用户组信息表:act_id_group

用户与用户组对应信息表:act_id_membership

我只把zhangsan,wangwu添加到requireGroup组中,所以可以根据用户查询组待办任务,但是需要先认领呦

也可以根据用户组名查询待办任务

根据用户组查询待办任务

/*
    * 根据用户组名查询
    * */
    @Test
    public void test6() {
        //组代办
        List<Task> list = processEngine.getTaskService().createTaskQuery().taskCandidateGroup("requireGroup").list();
        for (Task task : list) {
            System.out.println("任务ID:" + task.getId());
            System.out.println("任务名称:" + task.getName());
            System.out.println("任务创建时间:" + task.getCreateTime());
            System.out.println("任务委派人:" + task.getAssignee());
            System.out.println("流程实例ID:" + task.getProcessInstanceId());
            System.out.println("########################################################");
        }
    }

结果:

        任务ID:40004
        任务名称:需求审核
        任务创建时间:Mon Oct 08 19:41:21 CST 2018
        任务委派人:null
        流程实例ID:37501
        ########################################################

 

先把文件上传了

https://download.csdn.net/download/qq_35463719/10706949

今天就到这了,有时间在总结下面的

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用activiti总结--发布,办理,查询 的相关文章

随机推荐

  • 服务器总线协议_第二章----I2C总线协议进阶

    敬请期待 xff0c 预计8月1日发布 xff0c 需要请加个关注
  • 服务器总线协议_第三章----SVID电源管理协议

    目录 一 概述 二 SVID协议组成方式 三 SVID协议拓扑要求 四 SVID如何判别读写 Master读操作 Master写操作 五 问与答 1 xff09 SVID有没有特殊的要求 xff1f 一 概述 首先先了解一下SVID的全称
  • PM_Sync的作用

    目录 一 先来了解一下PM Sync的全称 xff1a 一 PM Sync简介 PM Sync xff1a Power Management synchronization 同步电源管理 在知道这个信号的作用之前需要先来了解一下 ADR 二
  • si4438使用stm32f103配置调试成功!

    刚拿到si4438时候在网上找了一大波资源 xff0c 发现能使用的并没有多少 xff0c 于是自己配置一发 经过不懈努力配置成功 xff0c 现在将一些配置过程分享给大家 xff01 源码已上传 尽情下载 xff01 1 首先打开工程文件
  • 教你如何使用stm32发送一帧数据(结构体中的数据)

    在这篇文章中我介绍一下如何通过串口发送一帧存在结构体中的数据 通过串口接受一帧数据请参考的我博客中的文章 教你如何使用stm32接收一帧数据 xff01 一 xff1a 在 h首先定义一个结构体 typedef struct uint8 t
  • 浅谈线性稳压电源和开关稳压电源(开关电源)

    目前现有电源主要分为两大类 xff1a 线性稳压电源和开关稳压电源 xff08 开关电源 xff09 线性稳压电源 线性稳压电源经过变压 整流 滤波 稳压实现电源稳压 优点 xff1a 稳定性好 xff0c 瞬态响应速度快 xff0c 可靠
  • c++ #define 用法

    1 用于表示将两个参数连在一起 xff0c 其中宏的 前后空格会被省略 define CONNA a b a b define CONNB a b a b int main string a 61 CONNA 34 one 34 34 tw
  • MySQL第五课 Table has no partition for value

    场景 MySQL由于安全性要求 xff0c 版本升级之后 xff0c 执行插入数据出现Table has no partition for value 错误 已有版本5 7 20 log升级到5 7 26 log 说明 建表过程中 xff0
  • DSP数据安全平台

    数据安全平台 xff08 DSP xff0c Data Security Platforms xff09 的概念来源于Gartner的 2021数据安全技术成熟度曲线 xff0c DSP定义为以数据安全为中心的产品和服务 xff0c 旨在跨
  • c++ 数学库

    链接 link
  • vscode使用restClient实现各种http请求

    vscode使用restClient实现各种http请求 一 xff0c 安装插件 首先 xff0c 我们要在vscode的扩展中 xff0c 搜索rest Client xff0c 然后安装它 xff0c 这里我已经安装过了 安装后 xf
  • K210和STM32串口通信(亲测有效)

    声明 最近想做一个K210数字识别和寻迹 xff0c 方便完成2021年电赛F题 xff0c 完成了数字训练和脱机运行就想赶紧进行一次通信 xff0c 调了好几天 郁闷 xff0b 自闭几天 按照官方的历程看 xff0c 配置的没问题但是会
  • 简单Rabbitmq 发送消息和接收消息

    简单Rabbitmq 发送消息和接收消息 1 先在Rabbitmq配置文件中预先创建好交换器 xff0c 队列 xff0c 路由等信息 2 创建生产者发送消息 64 Autowired private RabbitTemplate rabb
  • Elasticsearch(ES6)------(4) ES设置用户名密码访问

    Elasticsearch ES xff08 1 xff09 下载 安装 43 kibana 下载 xff08 2 xff09 本机多节点启动 43 ElasticSearch head插件使用 xff08 3 xff09 索引 文档概念和
  • Elasticsearch(ES6) --根据条件修改字段值

    POST index name doc update by query 34 query 34 34 match 34 34 version 34 34 12 22 34 34 script 34 34 inline 34 34 ctx s
  • redis限流使用lua脚本

    lua脚本 xff0c 计数器限流 5秒内限流10次 64 param key 64 return public boolean acquire String key long now 61 System currentTimeMillis
  • ES6分页from+size、search_after两种查询

    1 from 43 size 分页查询 64 RequestMapping value 61 34 get 34 method 61 RequestMethod GET public BaseResponse lt List lt Obje
  • 使用activiti总结--bpmn画流程图

    假期结束 xff0c 赶紧总结一下前几天使用的Activiti工作流的一些方法 简单介绍一下Activiti Activiti一套完整的方便的业务流程管理 xff08 BPM xff09 框架 xff0c 它是覆盖了业务流程管理 工作流 服
  • clock函数 使用以及问题

    使用 clock 函数是一个计算程序运行时间 xff08 其实简略的理解为占用CPU的使用时间 xff09 其实如果使用sleep函数 xff0c 程序是放弃CPU的使用权 xff0c 直到某个时间的到来 xff0c 当然就不会存在占用CP
  • 使用activiti总结--发布,办理,查询

    接上一篇文章 xff0c 使用创建好的流程图 xff0c 总结一下activiti发布到查询使用的方法和测试代码 流程图 1 引用配置文件 activiti cfg xml xff0c 不引用或者引用失败的话在创建流引擎的时候会报空指针异常