activiti入门学习二
二、单机演示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);
}
}