Activiti 6.0 之SkipExpression

​还是先说一下业务场景吧。在工作流中,我们难免会遇到这样的情况,即一个流程的发起者的身份问题。举个详细的例子。就拿一个公司的报销流程来讲。可能是这样的。

  1. 没有优化过的流程图(实在不想画了,太费劲了)

    Activiti 6.0 之SkipExpression-LMLPHP

  2. 优化过的流程图

    Activiti 6.0 之SkipExpression-LMLPHP

    ​怎么样?看起来是不是清爽了很多?那怎么执行呢?首先,这篇说的是SkipExpression,所以审批不通过的驳回不在这篇说。


  1. 流程启动之后,第一个任务节点就是发起任务的节点。

  2. 在后续任务中加入一个跳过表达式,比如说代表当前用户的职责组编号:${execution.getVariable('gId')==2}

    Activiti 6.0 之SkipExpression-LMLPHP

    之后就可以部署流程图了。在任务进行的途中将当前处理人的身份组ID以流程变量的形式设置进流程,这样就可以做到任务执行到当前任务时自动跳过任务了。嗯。理想是美好的,现实是骨感的,WTF!!!Skip Expression竟然没有工作????

Question:Skip Expression 设置了但是没有起作用

​哎,上面的想法是好的,因为看到了Skip Expression,顾名思义,就是跳过表达式的意思嘛,怎么就不起作用呢?好在在github中下载了一份源码来看。

​在源码的测试方法中可以看到在设置流程变量前先设置了一个这东西:_ACTIVITI_SKIP_EXPRESSION_ENABLED

Activiti 6.0 之SkipExpression-LMLPHP

​什么玩意???Activiti 跳过 表达式 开启?咦,英语还凑合哈,对就是启用跳过表达式模式。那么问题又来了。怎么呢??这么多的任务节点,你让我每次都去加这么一句流程变量么??!!闹呢??别急,我是这样做的。

给第一个需要跳过的任务中也添加一个ExecutionListener

import com.edu.hart.modules.constant.ActivitiConstanct;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener; import java.util.Map; /**
* 任务跳过监听器
* <p>
* create by 叶云轩 at 2017/12/26 - 16:03
* contact by [email protected]
*/
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);
}
}

之后在process的properties中设置Listeners

Activiti 6.0 之SkipExpression-LMLPHP

这样就可以了,亲测可行的哦~~~~


总结:

1. 看源码不认真,注意到_ACTIVITI_SKIP_EXPRESSION_ENABLED了但是没有用,就去测试了。最后结果不行,又来看源码。浪费时间。
2. Activiti还是很好用的~~~~
3. 下章写驳回的实现逻辑,完成任意节点的驳回,即去掉所有的审批网关。精简设计和开发。
05-11 01:10