流程变量

是activiti中比较重要的角色
例如:请假三天以内经理审核,三天以上需要总经理审核,这个时候就需要使用流程变量了

流程变量中尽量不要放太多的业务参数,让工作流和业务流区分开
按照map的形式传递参数

作用域

  • Global 默认,在整个流程实例中存在,变量名不可重复,如果存在相同,会进行覆盖操作
  • Local,局部使用,只针对流程实例或者具体的一个流程节点任务,变量名称可以重复,不会存在影响

使用方法

使用UEL表达式
${} 进行使用
image.png
image.png
在bpmn文件中使用UEL表达式进行使用,
需要保证所有的UEL表达式能够正常运行
如果task之间的连线上没有设置UEL表达式条件,则会优先走序号小的那一条
所有的变量都会插入act_ru_variable表中
在启动的时候传递参数
定义相关参数传递实体对象的时候一定要进行序列化
image.png

1、启动实例

  1. /**
  2. * 启动流程实例,传递流程变量 请假天数<3
  3. */
  4. @Test
  5. void testStartProcessVariables1() {
  6. // 创建ProcessEngine
  7. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  8. // 获取RuntimeService
  9. RuntimeService runtimeService = processEngine.getRuntimeService();
  10. // 根据流程定义id进行启动流程
  11. String key = "evection-variable";
  12. //设置流程变量
  13. Map<String, Object> variables = new HashMap<>();
  14. Evection evection = new Evection();
  15. //设置出差日期
  16. evection.setNum(2);
  17. //设置任务执行人
  18. variables.put("evection", evection);
  19. variables.put("assignee0", "李四");
  20. variables.put("assignee1", "王经理");
  21. variables.put("assignee2", "张财务");
  22. variables.put("assignee3", "杨总经理");
  23. //启动流程
  24. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key,variables);
  25. // 输出启动信息
  26. log.info("流程定义id:{}", processInstance.getProcessDefinitionId());
  27. log.info("流程实例id:{}", processInstance.getId());
  28. log.info("当前活动id:{}", processInstance.getActivityId());
  29. }
  30. /**
  31. * 启动流程实例,传递流程变量 请假天数>=3
  32. */
  33. @Test
  34. void testStartProcessVariables2() {
  35. // 创建ProcessEngine
  36. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  37. // 获取RuntimeService
  38. RuntimeService runtimeService = processEngine.getRuntimeService();
  39. // 根据流程定义id进行启动流程
  40. String key = "evection-variable";
  41. //设置流程变量
  42. Map<String, Object> variables = new HashMap<>();
  43. Evection evection = new Evection();
  44. //设置出差日期
  45. evection.setNum(4);
  46. //设置任务执行人
  47. variables.put("evection", evection);
  48. variables.put("assignee0", "李四1");
  49. variables.put("assignee1", "王经理1");
  50. variables.put("assignee2", "张财务1");
  51. variables.put("assignee3", "杨总经理1");
  52. //启动流程
  53. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key,variables);
  54. // 输出启动信息
  55. log.info("流程定义id:{}", processInstance.getProcessDefinitionId());
  56. log.info("流程实例id:{}", processInstance.getId());
  57. log.info("当前活动id:{}", processInstance.getActivityId());
  58. }

image.png

image.png

2、查询任务

  1. private final String key = "evection-variable";
  2. private final String assignee_user = "李四";
  3. /**
  4. * 查询任务
  5. */
  6. @Test
  7. void variableQuery() {
  8. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  9. TaskService taskService = processEngine.getTaskService();
  10. List<Task> taskList = taskService.createTaskQuery()
  11. .processDefinitionKey(key)
  12. //.taskAssignee(assignee_user)
  13. .list();
  14. if(taskList != null && taskList.size() > 0) {
  15. for(Task task : taskList) {
  16. log.info("任务id:{}", task.getId());
  17. log.info("任务名称:{}", task.getName());
  18. }
  19. }
  20. }

image.png

3、任务处理

依次按照节点进行任务执行

  1. /**
  2. * 处理第一个流程实例 请假天数<3
  3. */
  4. @Test
  5. void testTaskCompleteByUser1() {
  6. String assignee0 = "李四";
  7. String assignee1 = "王经理";
  8. String assignee2 = "张财务";
  9. String assignee3 = "杨总经理";
  10. // 获取processEngine
  11. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  12. // 获取TaskService
  13. TaskService taskService = processEngine.getTaskService();
  14. // 根据流程定义key和用户名查询任务,返回一个任务对象
  15. Task task = taskService.createTaskQuery()
  16. .processDefinitionKey(key)
  17. .taskAssignee(assignee0)
  18. .singleResult();
  19. if(task == null) {
  20. log.info("无待执行任务");
  21. return;
  22. }
  23. // 根据任务id完成任务
  24. taskService.complete(task.getId());
  25. log.info("编号{}任务完成", task.getId());
  26. }
  27. /**
  28. * 处理第二个流程实例 请假天数>=3
  29. */
  30. @Test
  31. void testTaskCompleteByUser2() {
  32. String assignee0 = "李四1";
  33. String assignee1 = "王经理1";
  34. String assignee2 = "张财务1";
  35. String assignee3 = "杨总经理1";
  36. // 获取processEngine
  37. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  38. // 获取TaskService
  39. TaskService taskService = processEngine.getTaskService();
  40. // 根据流程定义key和用户名查询任务,返回一个任务对象
  41. Task task = taskService.createTaskQuery()
  42. .processDefinitionKey(key)
  43. .taskAssignee(assignee0)
  44. .singleResult();
  45. if(task == null) {
  46. log.info("无待执行任务");
  47. return;
  48. }
  49. // 根据任务id完成任务
  50. taskService.complete(task.getId());
  51. log.info("编号{}任务完成", task.getId());
  52. }

4、查询任务处理历史

  1. /**
  2. * 查询当前的流程定义中有几个流程实例运行 历史记录
  3. */
  4. @Test
  5. void queryHistoryInfo() {
  6. //evection-variable
  7. String instanceId = "30001";
  8. //String instanceId = "32501";
  9. String processDefinitionId = "evection-variable:1:25004";
  10. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  11. HistoryService historyService = processEngine.getHistoryService();
  12. //获取actinst的查询对象
  13. HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
  14. //查询act_hi_actinst 表 根据InstanceId 进行查询,查询一个流程的所有历史信息
  15. instanceQuery.processInstanceId(instanceId);
  16. //查询act_hi_actinst 表 根据DefinitionId进行查询,查询一个流程的所有历史信息
  17. instanceQuery.processDefinitionId(processDefinitionId);
  18. //排序 根据开始时间排序
  19. instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
  20. //查询所有的list
  21. List<HistoricActivityInstance> historicProcessInstanceList = instanceQuery.list();
  22. //输出信息
  23. for(HistoricActivityInstance instance : historicProcessInstanceList) {
  24. log.info("当前活动标识:{}", instance.getActivityId());
  25. log.info("当前活动名称:{}", instance.getActivityName());
  26. log.info("所属流程定义id:{}", instance.getProcessDefinitionId());
  27. log.info("所属流程实例id:{}", instance.getProcessInstanceId());
  28. System.out.println("==============================================");
  29. }
  30. }

对于流程实例1 请假天数<3
分支进入财务审批——》结束
image.png
对于流程实例2 请假天数>=3
分支进入总经理审批——》结束
image.png

流程变量设置

  • 可以在流程实例启动的时候进行设置 runtimeService
  • 可以在节点任务处理的时候进行设置 taskService
    • 设置下一节点任务的执行人