activiti入门学习二

Posted yangk1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activiti入门学习二相关的知识,希望对你有一定的参考价值。

一、上一篇入门学习的地址

https://www.cnblogs.com/yangk1996/p/10878449.html

二、单机演示Demo

 12、使用UEL表达式动态增加流程处理人

技术图片

  从新创建一个流程,使其Assignee变成表达式的。然后从新创建流程。

* @Description: 启动流程实例,动态设置assignee
 * @date: 2019/6/23 20:28
 */
public class AssigneeUel 
    public static void main(String[] args) 
    //创建ProcessEngine 对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 
    //得到RuntimeService
    RuntimeService runtimeService = processEngine.getRuntimeService();
    Map<String,Object> map =new HashMap<String,Object>();
        map.put("assignee","张三");
        map.put("assignee1","李四");
        map.put("assignee2","王五");
        //启动流程实例,同时定义assignee的值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday2", map);
        System.out.println(processEngine.getName());
    

  然后在执行流程

public class ActivitiCompleteTask 
    public static void main(String[] args) 
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取TaskService对象
        TaskService taskService = processEngine.getTaskService();
 
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("holiday2")
                .taskAssignee("zhangsan")
                .singleResult();
 
        taskService.complete(task.getId());
    

技术图片

 13、流程变量

  13.1什么是流程变量

  流程变量在 activiti 中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和 activiti结合时少不了流程变量,流程变量就是 activiti 在管理工作流时根据管理需要而设置的变量。比如在请假流程流转时如果请假天数大于 3 天则由总经理审核,否则由人事直接审核,请假天数就可以设置为流程变量,在流程流转时使用。

  13.2流程变量的类型

技术图片

注意:如果使用的是pojo,必须实现serializable,需要生成serialVersionUID。

  13.3流程变量的作用域

  流程变量的作用域默认是一个流程实例(processInstance),也可以是一个execution),这三个作用域流程实例的范围最大,可以称为global变量,任一个任务和一个执行实例范围,范围没有流程实例大,称为local变量。

  13.4学习使用流程变量

  • 流程绘制

技术图片

技术图片

技术图片   技术图片

技术图片

  • POJO
/**
* 请假单(zhangsan) 部门经理(lisi),总经理(wanwu) 人事(zhaoliu) * 请假实体类: * 注意POJO类型,一定要实现Serializable接口,否则在存储这个pojo时就会报异常 */ public class Holiday implements Serializable private Integer id; private String holidayName;//申请人的名字 private Date beginDate;//开始时间 private Date endDate;//结束日期 private Float num;//请假天数 private String reason;//事由 private String type;//请假类型 public Integer getId() return id; public void setId(Integer id) this.id = id; public String getHolidayName() return holidayName; public void setHolidayName(String holidayName) this.holidayName = holidayName; public Date getBeginDate() return beginDate; public void setBeginDate(Date beginDate) this.beginDate = beginDate; public Date getEndDate() return endDate; public void setEndDate(Date endDate) this.endDate = endDate; public Float getNum() return num; public void setNum(Float num) this.num = num; public String getReason() return reason; public void setReason(String reason) this.reason = reason; public String getType() return type; public void setType(String type) this.type = type;
  • 流程部署
    public static void main1(String[] args) 
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday4.bpmn")
                .addClasspathResource("diagram/holiday4.png")
                .name("请假流程-流程变量")
                .deploy();
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
    
  • 启动流程,设置流程变量的值

 

    //启动流程实例,同时还要设置流程变量的值
    // 影响的表 act_ge_bytearray,act_ru_variable
    public static void main(String[] args) 
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RuntimeService
        RuntimeService runtimeService =  processEngine.getRuntimeService();
        //3.流程定义的key
        String key = "myProcess_1";
        Map<String ,Object> map = new HashMap<>();
        Holiday holiday = new Holiday();
        //定义的变量是holiday.num
        holiday.setNum(1F);
        map.put("holiday",holiday);
        //4.启动流程实例,并且设置流程变量的值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map);
        //5.输出实例信息
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getProcessDefinitionId());
    
  • 执行流程
    //依次执行,当部门经理审批完(lisi)会判断流程的请假天数,1天就是人事经理存档(zhaoliu)
    public static void main3(String[] args) 
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService
        TaskService taskService = processEngine.getTaskService();
        //3.查询当前用户是否有任务
        String key = "myProcess_1";
        Task task = taskService.createTaskQuery().processDefinitionKey(key)
                .taskAssignee("zhaoliu").singleResult();
        //4.判断task!=null,说明当前用户有任务
        if(task!=null)
            taskService.complete(task.getId());
            System.out.println("任务执行完毕");
        
    
  • 任务办理的时候设置流程变量
    public static void main(String[] args) 
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户是否有任务
        String key = "myProcess_1";
        Task task = taskService.createTaskQuery().processDefinitionKey(key)
                .taskAssignee("zhangsan").singleResult();
        //初始化一些参数
        Map<String ,Object> map = new HashMap<>();
        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        map.put("holiday",holiday);
        //4.判断task!=null,说明当前用户有任务
        if(task!=null)
            //完成任务时,设置流程变量的值
            taskService.complete(task.getId(),map);
            System.out.println("任务执行完毕");
        
    
  • 通过当前流程实例设置
    public static void main(String[] args) 
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RuntimeService
        RuntimeService runtimeService =  processEngine.getRuntimeService();
        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        //4.通过实例id,来设置流程变量
        //第一个参数:流程实例的id
        //第二个参数:流程变量名
        //第三个变量:流程变量名,所对应的值
        runtimeService.setVariable("2501","holiday",holiday);
    

 14、组任务

  14.1什么是组任务

  给任务设置多个候选人,可以从候选人中选择参与者来完成任务。

  14.2组任务学习

  • 绘制流程

  在上面的基础上修改就OK了

技术图片

  • 流程部署,启动实例,填写请假单
//1.流程部署   
public static void main(String[] args) 
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday5.bpmn")  //添加bpmn资源
                //这个不是必须的
                // .addClasspathResource("diagram/holiday5.png")
                .name("请假申请单流程")
                .deploy();
        //4.输出部署的一些信息
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    

//2.启动实例
    public static void main(String[] args) 
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //2.得到RunService对象
            RuntimeService runtimeService = processEngine.getRuntimeService();
            //3.创建流程实例  流程定义的key需要知道 holiday
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
            //4.输出实例的相关信息
            System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
            System.out.println("流程实例ID"+processInstance.getId());//2501
    
       //3.填写请假单的任务要执行完成
 public static void main(String[] args) 
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //3.查询当前用户的任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myProcess_1")
                .taskAssignee("xiaozhang")
                .singleResult();
        //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
        if(task!=null)
            taskService.complete(task.getId());
            System.out.println("用户任务执行完毕...");
        
        //5.输出任务的id
        System.out.println(task.getId());
    
  • 查询候用户组任务,将候选者转换成真正任务的负责人
    //4.查询候选用户的组任务
    public static void main(String[] args) 
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //3.设置一些参数,流程定义的key,候选用户
        String key = "myProcess_1";
        String candidate_users="zhangsan";
        //4.执行查询
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidate_users)//设置候选用户
                .list();
        //5.输出
        for(Task task :list)
            System.out.println(task.getProcessInstanceId());
            System.out.println(task.getId());
            System.out.println(task.getName());
            System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
        
    

    //抽取任务的过程就是将候选用户转化为真正任务的负责人(让任务的assignee有值)
   public static void main(String[] args) 
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //3.设置一些参数,流程定义的key,候选用户
        String key = "myProcess_1";
        String candidate_users="zhangsan";
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidate_users)//设置候选用户
                .singleResult();
        if(task!=null)
            taskService.claim(task.getId(),candidate_users);//第一个参数任务ID,第二个参数为具体的候选用户名
            System.out.println("任务拾取完毕!");
        
    
    //6.当前的用户查询自己的任务
    public static void main(String[] args) 
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //3.设置一些参数,流程定义的key,用户
        String key = "myProcess_1";
        String assignee="zhangsan";
        //4.执行查询
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .list();
        //5.输出
        for(Task task :list)
            System.out.println(task.getProcessInstanceId());
            System.out.println(task.getId());
            System.out.println(task.getName());
            System.out.println(task.getAssignee());//任务的执行人
        
    
    //7.当前用户完成自己的任务
    public static void main(String[] args) 
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //3.设置一些参数,流程定义的key,用户
        String key = "myProcess_1";
        String assignee="zhangsan";
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        //5.执行当前的任务
        if(task!=null)
            taskService.complete(task.getId());
            System.out.println("任务执行完毕!");
        
    
  • 任务转交
    //步骤1-2-3-4-5  当前人不想做这个任务转交给别人
    //8.任务交接,前提要保证当前用户是这个任务的负责人,这时候他才可以有权限去将任务交接给其他候选人
    public static void main9(String[] args) 
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //3.设置一些参数,流程定义的key,用户
        String key = "myProcess_1";
        String assignee="zhangsan";
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        //5.判断是否有这个任务
        if(task!=null)
            taskService.setAssignee(task.getId(),"lisi");//交接任务为lisi  ,交接任务就是一个候选人拾取用户的过程
            System.out.println("交接任务完成~!");
        
    
  • 归还组任务
    public static void main(String[] args) 
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        // 当前待办任务
        String taskId = "6004";
        // 任务负责人
        String userId = "zhangsan";
    // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskAssignee(userId).singleResult();
        if (task != null) 
    // 如果设置为null,归还组任务,该任务没有负责人
            taskService.setAssignee(taskId, null);
        
    

 

  

 

 

  

 

以上是关于activiti入门学习二的主要内容,如果未能解决你的问题,请参考以下文章

新手入门深度学习 | 3-2:激活函数activation

Activiti学习之一Activiti入门

工作流学习2----入门

Activiti 入门学习笔记

Activiti 入门学习笔记

入门Android 四大开发组件学习