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入门学习二的主要内容,如果未能解决你的问题,请参考以下文章