SequenceFlow
属性:
skip expression 跳过表达式 。到当前任务时自动跳过任务
condition可设置表达式决定走哪个分支
前提:给第一个需要跳过的任务中也添加一个ExecutionListener
import com.edu.hart.modules.constant.ActivitiConstanct;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import java.util.Map;
/**
* 任务跳过监听器
*/
public class SkipListenner implements ExecutionListener {
/**
* 序列化
*/
private static final long serialVersionUID = 3599293834301636975L;
@Override
public void notify(DelegateExecution execution) {
// 获取流程变量
Map<String, Object> variables = execution.getVariables();
// 开启支持跳过表达式 ActivitiConstanct.getSkipExpression()就是"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
variables.put(ActivitiConstanct.getSkipExpression(), true);
// 将修改同步到流程中
execution.setTransientVariables(variables);
// 这种方式也行。直接设置流程变量
// execution.setVariable(ActivitiConstanct.getSkipExpression(),true);
}
}
在上面的流程图中,我们发现和之前不同的是,用户任务【部门经理】审批,下面有两个连线,我们之前的例子都是只有一条连线,那么如果是这种情况的话我们如何进行流程的选择呢?我们这里是用的是通过设置流程变量的方式来对连线的属性进行区分。
设置连线属性
假如我们对流程有规定,如果事件不重要,流程直接由部门经理审批结束;如果事件重要,部门经理审批之后,还有有总经理进行审批之后才可以结束。那么我们就可以这样这设置我们的连线,首先得选中我们要设置的连线:
1.为连线命名
2.为连线设置条件
message表示流程变量的名称,‘不重要’表示流程变量的值,${}中间的内容要使用boolean类型的表达式,用来判断应该执行的连线。
/**完成任务*/
@Test
public void completeTask(){
//任务ID
String taskId = "2048";
//完成任务的同时,设置流程变量,让流程变量判断连线该如何执行
Map<String, Object> variables = new HashMap<String, Object>();
//其中message对应sequenceFlow.bpmn中的${message=='不重要'},不重要对应流程变量的值
variables.put("message", "不重要");
processEngine.getTaskService()//
.complete(taskId,variables);
System.out.println("完成任务:"+taskId);
}
在这里,我们也可以在完成任务的同时,设置流程变量,来告诉我们的流程接下来流转到哪里。我们在这个例子中设置的message的值为'不重要',所以流程应该直接结束,不会流程【总经理】审批这一步。
Activiti中国社区交流群:839915498