流程变量
是activiti中比较重要的角色
例如:请假三天以内经理审核,三天以上需要总经理审核,这个时候就需要使用流程变量了
流程变量中尽量不要放太多的业务参数,让工作流和业务流区分开
按照map的形式传递参数
作用域
- Global 默认,在整个流程实例中存在,变量名不可重复,如果存在相同,会进行覆盖操作
- Local,局部使用,只针对流程实例或者具体的一个流程节点任务,变量名称可以重复,不会存在影响
使用方法
使用UEL表达式
${} 进行使用
在bpmn文件中使用UEL表达式进行使用,
需要保证所有的UEL表达式能够正常运行
如果task之间的连线上没有设置UEL表达式条件,则会优先走序号小的那一条
所有的变量都会插入act_ru_variable表中
在启动的时候传递参数
定义相关参数传递实体对象的时候一定要进行序列化
1、启动实例
/**
* 启动流程实例,传递流程变量 请假天数<3
*/
@Test
void testStartProcessVariables1() {
// 创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根据流程定义id进行启动流程
String key = "evection-variable";
//设置流程变量
Map<String, Object> variables = new HashMap<>();
Evection evection = new Evection();
//设置出差日期
evection.setNum(2);
//设置任务执行人
variables.put("evection", evection);
variables.put("assignee0", "李四");
variables.put("assignee1", "王经理");
variables.put("assignee2", "张财务");
variables.put("assignee3", "杨总经理");
//启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key,variables);
// 输出启动信息
log.info("流程定义id:{}", processInstance.getProcessDefinitionId());
log.info("流程实例id:{}", processInstance.getId());
log.info("当前活动id:{}", processInstance.getActivityId());
}
/**
* 启动流程实例,传递流程变量 请假天数>=3
*/
@Test
void testStartProcessVariables2() {
// 创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根据流程定义id进行启动流程
String key = "evection-variable";
//设置流程变量
Map<String, Object> variables = new HashMap<>();
Evection evection = new Evection();
//设置出差日期
evection.setNum(4);
//设置任务执行人
variables.put("evection", evection);
variables.put("assignee0", "李四1");
variables.put("assignee1", "王经理1");
variables.put("assignee2", "张财务1");
variables.put("assignee3", "杨总经理1");
//启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key,variables);
// 输出启动信息
log.info("流程定义id:{}", processInstance.getProcessDefinitionId());
log.info("流程实例id:{}", processInstance.getId());
log.info("当前活动id:{}", processInstance.getActivityId());
}
2、查询任务
private final String key = "evection-variable";
private final String assignee_user = "李四";
/**
* 查询任务
*/
@Test
void variableQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey(key)
//.taskAssignee(assignee_user)
.list();
if(taskList != null && taskList.size() > 0) {
for(Task task : taskList) {
log.info("任务id:{}", task.getId());
log.info("任务名称:{}", task.getName());
}
}
}
3、任务处理
依次按照节点进行任务执行
/**
* 处理第一个流程实例 请假天数<3
*/
@Test
void testTaskCompleteByUser1() {
String assignee0 = "李四";
String assignee1 = "王经理";
String assignee2 = "张财务";
String assignee3 = "杨总经理";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取TaskService
TaskService taskService = processEngine.getTaskService();
// 根据流程定义key和用户名查询任务,返回一个任务对象
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee0)
.singleResult();
if(task == null) {
log.info("无待执行任务");
return;
}
// 根据任务id完成任务
taskService.complete(task.getId());
log.info("编号{}任务完成", task.getId());
}
/**
* 处理第二个流程实例 请假天数>=3
*/
@Test
void testTaskCompleteByUser2() {
String assignee0 = "李四1";
String assignee1 = "王经理1";
String assignee2 = "张财务1";
String assignee3 = "杨总经理1";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取TaskService
TaskService taskService = processEngine.getTaskService();
// 根据流程定义key和用户名查询任务,返回一个任务对象
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee0)
.singleResult();
if(task == null) {
log.info("无待执行任务");
return;
}
// 根据任务id完成任务
taskService.complete(task.getId());
log.info("编号{}任务完成", task.getId());
}
4、查询任务处理历史
/**
* 查询当前的流程定义中有几个流程实例运行 历史记录
*/
@Test
void queryHistoryInfo() {
//evection-variable
String instanceId = "30001";
//String instanceId = "32501";
String processDefinitionId = "evection-variable:1:25004";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
//获取actinst的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//查询act_hi_actinst 表 根据InstanceId 进行查询,查询一个流程的所有历史信息
instanceQuery.processInstanceId(instanceId);
//查询act_hi_actinst 表 根据DefinitionId进行查询,查询一个流程的所有历史信息
instanceQuery.processDefinitionId(processDefinitionId);
//排序 根据开始时间排序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//查询所有的list
List<HistoricActivityInstance> historicProcessInstanceList = instanceQuery.list();
//输出信息
for(HistoricActivityInstance instance : historicProcessInstanceList) {
log.info("当前活动标识:{}", instance.getActivityId());
log.info("当前活动名称:{}", instance.getActivityName());
log.info("所属流程定义id:{}", instance.getProcessDefinitionId());
log.info("所属流程实例id:{}", instance.getProcessInstanceId());
System.out.println("==============================================");
}
}
对于流程实例1 请假天数<3
分支进入财务审批——》结束
对于流程实例2 请假天数>=3
分支进入总经理审批——》结束