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

接上一篇文章,使用创建好的流程图,总结一下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.youkuaiyun.com/download/qq_35463719/10706949

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

 

 

 

 

 

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值