在Activiti流程设计中,为了使流程展示的更加完善,经常会将流程图的第一步任务设计成“提交任务”,例如:
申请人启动流程后,流程就会到达“提交任务”,而“提交任务”的办理人还是该申请人,这个时候就需要通过代码跳过(自动处理)该任务节点,让流程流转到下一任务节点。有两种方法可以处理这个问题。
第一种方式:在启动流程后,获取当前流程实例申请人的待办任务,并执行当前流程实例的下一步任务
1 Task task = null; 2 TaskQuery query = taskService.createTaskQuery().taskCandidateOrAssigned(empId).active(); 3 List<Task> todoList = query.list();//获取申请人的待办任务列表 4 for (Task tmp : todoList) { 5 if(tmp.getProcessInstanceId().equals(processInstance.getId())){ 6 task = tmp;//获取当前流程实例,当前申请人的待办任务 7 break; 8 } 9 } 10 variables.put(ProcessConstants.KEY_DEPT_LEADER_ID, employeeId);//设置下一步办理人的流程变量 11 taskService.complete(task.getId(),variables);
第二种方式:使用监听器处理(推荐)
spring配置文件
1 <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> 2 ... 3 <!-- 添加的自定义监听器 --> 4 <property name="postBpmnParseHandlers"> 5 <list> 6 <bean class="com.eazytec.common.activiti.listener.ProxyUserTaskBpmnParseHandler"> 7 <property name="taskListenerId" value="postTaskListener"/> 8 </bean> 9 </list> 10 </property> 11 ... 12 </bean> 13 <!-- 在记录history之后执行的TaskListener --> 14 <bean id="postTaskListener" class="com.eazytec.common.activiti.listener.ProxyTaskListener"> 15 <property name="taskListeners"> 16 <list> 17 <bean class="com.eazytec.common.activiti.listener.AutoCompleteFirstTaskListener"/> 18 </list> 19 </property> 20 </bean>