NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# **带条件流程** ***** 带条件的流程会稍微复杂一点。如下图。 ![](https://img.kancloud.cn/ff/06/ff0670724527806afbd44543bcce4dca_844x427.png) ***** ## **1、设置监听器** 首先我在 **【开始】** 节点加了一个执行监听器,监听节点的开始执行事件,使用委托表达式的方式调用。 该监听器的目的是为了注入之后流转条件所需的变量值。 如下图。 ![](https://img.kancloud.cn/cd/e3/cde3a5c4d4188a4414425b984216df58_1001x775.png) 我在除了默认流程线的其他流程线上设置的流转条件样式是: `${user.departmentId == '1302088232433639424'}` 意思是只要当前节点用户的部门 id 等于某个值的时候,走这条路线。 接下来我们看看监听器的代码要如何写,该如何注入流程中所需要的各种变量。 监听器的代码: ``` @Component public class MyExecutionListener implements ExecutionListener { @Override public void notify(DelegateExecution delegateExecution) { // 获取关联业务表ID变量(启动流程代码里已存入tableId,此处直接获取即可) String tableId = (String) delegateExecution.getVariable("tableId"); log.info(tableId); LeaveService leaveService = SpringUtil.getBean(LeaveService.class); SecurityUtil securityUtil = SpringUtil.getBean(SecurityUtil.class); Leave leave = leaveService.get(tableId); delegateExecution.setVariable("user", securityUtil.getCurrUser()); } } ``` * [ ] 使用`@Component`注解将该监听器注入Spring,使Activiti可以用委托表达式调用到。 * [ ] 自定义的执行监听器必须要实现`ExecutionListener `接口,并且实现`notify()`方法。 * [ ] 在`notify()`方法中,我们可以拿到`DelegateExecution`对象。这个对象可以让我们操作Activiti引擎里的一些东西,在【其他开发详解】中会列举一些`DelegateExecution`对象常用的调用方法。 * [ ] 调用`delegateExecution.setVariable()`方法,用于设置流程流转中所需要的参数。所有在流程中设置的参数都存储在`act_ru_variable`这张表中。获取参数可以用`delegateExecution.getVariable()`方法。可以看到,在代码中我设置了一个名叫`user`的实体变量参数,这个参数在后面设置条件的时候会用到。 设置代码是:` delegateExecution.setVariable("user", securityUtil.getCurrUser());` > 另外,有一点需要注意的是,**在监听器中直接使用注解的方式获取Bean是获取不到的。** > 如下代码,`securityUtil `获取到的值为`null`: > ``` > @Resource > SecurityUtil securityUtil; > ``` > 所以需要使用`getBean()`方法来手动获取所需要的`Bean`: > ``` > SecurityUtil securityUtil = SpringUtil.getBean(SecurityUtil.class); > ``` ***** ## **2、互斥网关** 接下来是互斥网关。 互斥网关只能选择其中一条路线前进,而选择哪一条路取决于输出路线上的条件决定。也就是说从互斥网关输出的路线上都是需要设置条件的: 1. 如果只有一条路线满足条件,则走这一条路 2. 如果有多条路线满足条件,则选择定义在流程文件中靠前的那条路线。 3. 如果没有路线满足条件,则会抛出异常。 > 注:互斥网关最好设置都设置一条【默认流转】,在所有条件都不符合的情况下走默认路线,防止流程抛出异常。【默认流转】设置只需要在属性配置栏中勾选这一项配置就行。 点击选择其中一条路线,会看到地下属性配置栏中有一条【流转条件】一项,需要在其中配置好流转条件。返回值必须为`true`或`false`。 流转条件用` UEL表达式`进行编写。 ![](https://img.kancloud.cn/da/0e/da0e9e599d07ddf2da31520fa3f4eb2b_1243x770.png) > Activiti支持两中`UEL`表达式:`UEL-value` 和 `UEL-method`。格式是:`${message}` #### **UEL-value** 例子:`${departmentId == '1302088232433639424'}` 设置的参数`value`不仅仅可以是一个`String`类型,还可以是一个`Object`对象(序列化的)、`Map`、`List`、`Array`。 在这个例子中,我是这么写表达式的: `${user.departmentId == '1302088232433639424'}` `user`参数就是之前在监听器中注入的实体变量参数的名字,这样`user.departmentId`就可以直接获取到当前用户的所属部门id。 #### **UEL-method** 例子:`${method.getUserName(Id)}` 其中`method`方法是我们注入到Spring中的一个类,`Id`是设置的全局变量。这一种方式我还没有测试过可行性,暂不解说。 ***** 以上两个主要配置设置完之后,就可以保存流程并退出,进行下一步操作了。