Activiti(三)流程变量和流程实例
请假的大致流程图
如果请假的人的天数小于等于三天的话可以直接绕过领导,请假人和各种角色都不是固定的,这样的流程实现方式如下
一:人员不固定
Assignee属性的设置使用UEL表达式进行设置,assignee01(自己定义)代表请假人,assignee02代表部门经理等等
二:流程分支判断
点击流程线 添加UEL表达式
三:进行流程的部署
前置方法
ProcessEngine processEngine; @Before public void connection() { ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); processEngine = processEngineConfigurationFromResource.buildProcessEngine(); }
流程部署
//1.流程部署 @Test public void createDeployment() { System.out.println(processEngine); RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bpmn2/holiday.bpmn") .addClasspathResource("bpmn2/holiday.png") .name("请假流程-人员未绑定-流程有分支") .key("myHoliday") .deploy(); System.out.println(deployment.getName()); System.out.println(deployment.getKey()); System.out.println(deployment.getId()); }
创建流程实例并预先绑定map集合
//2.创建流程实例 @Test public void startProcessInstance() { RuntimeService runtimeService = processEngine.getRuntimeService(); //动态指定任务执行人 Map assigneesMap=new HashMap(); //分别设置四个执行人 assigneesMap.put("assignee01","tianyan"); assigneesMap.put("assignee02","douying"); assigneesMap.put("assignee03","guo"); assigneesMap.put("assignee04","xiediao"); //设置请假天数 Detail detail=new Detail(); //请假天数小于等于3跳过总经理流程 detail.setDay(3); detail.setName("tianyan"); assigneesMap.put("details",detail); //赋值并启动 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1",assigneesMap); System.out.println(processInstance.getName()); System.out.println(processInstance.getDeploymentId()); System.out.println(processInstance.getActivityId()); }
任务的查询和处理
//3.任务查询 @Test public void findPersonalTaskList(){ TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.createTaskQuery() .processDefinitionKey("myProcess_1") .taskAssignee("tianyan").list(); Iterator<Task> iterator = list.iterator(); while (iterator.hasNext()){ Task next = iterator.next(); System.out.println(next); //4.处理任务 processEngine.getTaskService().complete(next.getId()); System.out.println("完成任务"); } }
使用UEL表达式的注意事项
1、如果UEL 表达式中流程变量名不存在则报错。
2、如果UEL 表达式中流程变量值为空NULL,流程不按UEL 表达式去执行,而流程结束 。
3、如果UEL 表达式都不符合条件,流程结束
4、如果连线不设置条件,会走flow 序号小的那条线