1.Activiti中个人任务分配
1.1分配任务负责人:
1.1.1 固定分配,每一个任务都是固定的人进行执行
1.1.2 表达式分配:
UEL表达式,统一表达式语言,在activiti当中支持两种形式,一种是value,另外一种是method形式
1.1.3 创建流程图,给每一个环节制定assignee值,通过UEL表达式分配任务负责人
1.1.4 流程部署
1.1.5 创建流程实例,制定任务执行人
/**
* 启动一个流程实例
*/
@Test
public void getInstance(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//定义一个Map集合,存放assignee的值
Map<String,Object> assMap=new HashMap<>();
assMap.put("assignee01","zhuyuan");
assMap.put("assignee02","jingjie");
assMap.put("assignee03","guangge");
assMap.put("assignee04","chaoge");
//启动一个流程实例
ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday", assMap);
System.out.println("流程实例Name:"+holiday.getName());
}
2.流程变量
2.1 流程变量的含义:我们可以在业务系统和流程系统当中,通过流程变量来制定对应的分支,如:员工请假
请假天数<=3那么部门经理审批后交给人事,如果>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务
2.2 流程变量的数据类型:
string,duble,boolean,short,long,Integer,binary,date日期
serializable,如果流程变量需要用到pojo当中的属性字段,则该pojo需要实现序列化接口
2.3 流程变量的作用域
1.默认情况下,流程变量存在整个流程实例当中,每一个环节都可以获取到该变量,称之为global,类似于Java全局变量
2.任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,称为local 变量。类似于Java局部变量
3.流程变量案例:
请假天数<=3那么部门经理审批后交给人事,如果>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务
3.1 定义流程图,在流程线上设置流程变量的条件
3.2 定义POJO,要去实现serializable接口
3.2 流程部署
3.3 启动流程实例
/**
* 启动流程实例
*/
@Test
public void startInstance() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量
Holiday holiday = new Holiday();
holiday.setNum(5);
//定义一个Map集合,存放流程变量的值
Map<String, Object> assMap = new HashMap<>();
assMap.put("holiday", holiday);
1.1分配任务负责人:
1.1.1 固定分配,每一个任务都是固定的人进行执行
1.1.2 表达式分配:
UEL表达式,统一表达式语言,在activiti当中支持两种形式,一种是value,另外一种是method形式
1.1.3 创建流程图,给每一个环节制定assignee值,通过UEL表达式分配任务负责人
1.1.4 流程部署
1.1.5 创建流程实例,制定任务执行人
/**
* 启动一个流程实例
*/
@Test
public void getInstance(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//定义一个Map集合,存放assignee的值
Map<String,Object> assMap=new HashMap<>();
assMap.put("assignee01","zhuyuan");
assMap.put("assignee02","jingjie");
assMap.put("assignee03","guangge");
assMap.put("assignee04","chaoge");
//启动一个流程实例
ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday", assMap);
System.out.println("流程实例Name:"+holiday.getName());
}
2.流程变量
2.1 流程变量的含义:我们可以在业务系统和流程系统当中,通过流程变量来制定对应的分支,如:员工请假
请假天数<=3那么部门经理审批后交给人事,如果>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务
2.2 流程变量的数据类型:
string,duble,boolean,short,long,Integer,binary,date日期
serializable,如果流程变量需要用到pojo当中的属性字段,则该pojo需要实现序列化接口
2.3 流程变量的作用域
1.默认情况下,流程变量存在整个流程实例当中,每一个环节都可以获取到该变量,称之为global,类似于Java全局变量
2.任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,称为local 变量。类似于Java局部变量
3.流程变量案例:
请假天数<=3那么部门经理审批后交给人事,如果>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务
3.1 定义流程图,在流程线上设置流程变量的条件
3.2 定义POJO,要去实现serializable接口
3.2 流程部署
3.3 启动流程实例
/**
* 启动流程实例
*/
@Test
public void startInstance() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量
Holiday holiday = new Holiday();
holiday.setNum(5);
//定义一个Map集合,存放流程变量的值
Map<String, Object> assMap = new HashMap<>();
assMap.put("holiday", holiday);
//启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday-var", assMap);
System.out.println("流程实例启动成功~");
}
3.4 测试流程执行
2.4 任务执行时,设置流程变量
/**
* 任务执行时,设置流程变量
*/
@Test
public void runTask() {
}
3.4 测试流程执行
2.4 任务执行时,设置流程变量
/**
* 任务执行时,设置流程变量
*/
@Test
public void runTask() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程
/**
* taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn文件中定义的值
* taskAssignee匹配规则:1.Assigned
*/
/*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();*/
List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("holiday-var").list();
//分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);
for (Task task : list) {
System.out.println("任务名称:" + task.getName());
System.out.println("任务执行人:" + task.getAssignee());
System.out.println("任务ID:" + task.getId());
//设置流程变量
Holiday holiday = new Holiday();
holiday.setNum(5);
//定义一个Map集合,存放流程变量的值
Map<String, Object> assMap = new HashMap<>();
assMap.put("holiday", holiday);
//处理任务
taskService.complete(task.getId(),assMap);
System.out.println("流程实例ID:" + task.getProcessInstanceId());
}
}
2.5 通过流程实例ID设置流程变量的值
/**
* 获取到流程实例ID,跟据流程实例设置流程变量的值
*/
@Test
public void getInstanceVar(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量
Holiday holiday = new Holiday();
holiday.setNum(3);
//设置流程变量
runtimeService.setVariable("37501","holiday",holiday);
}
2.6 根据任务ID,设置流程变量
/**
* 根据任务ID,设置流程变量
*/
@Test
public void runTask() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程
/**
* taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn文件中定义的值
* taskAssignee匹配规则:1.Assigned
*/
/*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();*/
List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("holiday-var").list();
//分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);
for (Task task : list) {
System.out.println("任务名称:" + task.getName());
System.out.println("任务执行人:" + task.getAssignee());
System.out.println("任务ID:" + task.getId());
//设置流程变量
Holiday holiday = new Holiday();
holiday.setNum(5);
taskService.setVariable(task.getId(),"holiday",holiday);
//处理任务
taskService.complete(task.getId());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
}
}
注意问题:
1、如果UEL 表达式中流程变量名不存在则报错。
2、如果UEL 表达式中流程变量值为空NULL,流程不按UEL 表达式去执行,而流程结束 。
3、如果UEL 表达式都不符合条件,流程结束
4、如果连线不设置条件,会走flow 序号小的那条线