流程变量
是activiti中比较重要的角色
例如:请假三天以内经理审核,三天以上需要总经理审核,这个时候就需要使用流程变量了
流程变量中尽量不要放太多的业务参数,让工作流和业务流区分开
按照map的形式传递参数
作用域
- Global 默认,在整个流程实例中存在,变量名不可重复,如果存在相同,会进行覆盖操作
- Local,局部使用,只针对流程实例或者具体的一个流程节点任务,变量名称可以重复,不会存在影响
使用方法
使用UEL表达式
${} 进行使用

在bpmn文件中使用UEL表达式进行使用,
需要保证所有的UEL表达式能够正常运行
如果task之间的连线上没有设置UEL表达式条件,则会优先走序号小的那一条
所有的变量都会插入act_ru_variable表中
在启动的时候传递参数
定义相关参数传递实体对象的时候一定要进行序列化
1、启动实例
/*** 启动流程实例,传递流程变量 请假天数<3*/@Testvoid testStartProcessVariables1() {// 创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 获取RuntimeServiceRuntimeService 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*/@Testvoid testStartProcessVariables2() {// 创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 获取RuntimeServiceRuntimeService 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 = "李四";/*** 查询任务*/@Testvoid 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*/@Testvoid testTaskCompleteByUser1() {String assignee0 = "李四";String assignee1 = "王经理";String assignee2 = "张财务";String assignee3 = "杨总经理";// 获取processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 获取TaskServiceTaskService 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*/@Testvoid testTaskCompleteByUser2() {String assignee0 = "李四1";String assignee1 = "王经理1";String assignee2 = "张财务1";String assignee3 = "杨总经理1";// 获取processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 获取TaskServiceTaskService 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、查询任务处理历史
/*** 查询当前的流程定义中有几个流程实例运行 历史记录*/@Testvoid queryHistoryInfo() {//evection-variableString 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();//查询所有的listList<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
分支进入总经理审批——》结束
