# **带条件流程**
*****
带条件的流程会稍微复杂一点。如下图。

*****
## **1、设置监听器**
首先我在 **【开始】** 节点加了一个执行监听器,监听节点的开始执行事件,使用委托表达式的方式调用。
该监听器的目的是为了注入之后流转条件所需的变量值。
如下图。

我在除了默认流程线的其他流程线上设置的流转条件样式是:
`${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表达式`进行编写。

> 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`是设置的全局变量。这一种方式我还没有测试过可行性,暂不解说。
*****
以上两个主要配置设置完之后,就可以保存流程并退出,进行下一步操作了。
- 一、 开发环境
- 二、系统开发规范
- 1. 工程目录规范
- 1.1根目录规范
- 1.2.通用组件目录规范
- 1.3.自定义模块、项目目录规范
- 1.4.资源目录规范
- 1.5.文件命名规范
- 1.6.变量命名规范(小写驼峰)
- 1.7.函数命名规范(小写驼峰)
- 1.8.代码规范
- 1.9.参考文档
- 2. 前端编码规范
- 2.1.代码检查工具及常见规范
- 2.2.结构规范及编码逻辑
- 3. 后端编码规范
- 3.1.代码检测工具及常见规范
- 3.2.结构规范及编码逻辑
- 4. 数据库设计规范
- 4.1.参考文档
- 4.2.主流数据库字段命名长度限制
- 4.3.命名规范
- 4.4.使用规范
- 5. 系统运维规范
- 6. 安装部署规范
- 7. 组件版本规范
- 1.目标
- 2.组件概念
- 3.文件格式
- 4.组件规范
- 5.Vue 中函数的使用
- 6.提供组件 API 文档
- 7.使用 mixins
- 8、表单设计规范
- 三、自定义表单组件
- 1.设计思路
- 1.1 解决了哪些痛点
- 1.2 核心思路
- 2.1全局配置
- 2.2双向绑定
- 1.3 如何快速上手
- 2.gis-plugin基础使用说明
- 2.1 观前须知
- 2.2 基础配置
- 3. Form组件
- 3.1 基本使用
- 3.2 API说明
- 2.1 props
- 2.2 events
- 3.3 示例代码
- 3.4 常见问题
- 4.1 gis-tag-form的使用
- 4.2 gis-form配套组件的使用
- 4.2.1 gis-form-table 表单内置表格
- 4.2.2 gis-form-editor 表单内置富文本编辑器
- 4.2.3 gis-form-upload 表单内置上传组件
- 4.3 表单初始化常见问题
- 4.Table组件
- 4.1 基本使用
- 4.2 API说明
- 2.1 props
- 2.2 events
- 4.3 示例代码
- 4.4 常见问题
- 4.1 我有隐藏的查询条件,不在查询框上显示,该怎么办?
- 4.2 通过接口获取到的数据我要进一步做处理,该怎么办?
- 4.3 我使用了render,为什么字典值(dict)就无效了?
- 5.Model组件
- 5.1 基本使用
- 5.2 API说明
- 2.2 prop
- 2.2 events
- 5.3 示例代码
- 5.4 常见问题
- 6.附件上传
- 6.1 附件上传组件
- 6.2 图片上传组件
- 7. 文档处理
- Excel组件(基于POI实现)
- Word组件(基于POI实现)
- Pdf组件(基于POI实现)
- 8. 级联选择表单
- 四、自定义ArcGIS通用工具Exe
- 01. EXE接口说明
- 02. CAD转JSON接口
- 03. SHAPE转JSON接口
- 04. 从工作空间中导出文件
- 05. 从ESRIJSON导出文件
- 06. 坐标转换-ESRIJSON
- 07. 坐标转换-文件
- 08. 数据编辑-ESRIJSON
- 09. 数据编辑-新增-从CAD文件导入
- 10. 数据编辑-删除
- 11. 数据编辑-编辑-从CAD文件编辑
- 12. 面积&长度计算
- 13. 空间分析-ESRIJSON
- 14. 空间分析-工作空间
- 15. 数据编辑-从工作空间中导入
- 16. 空间分析-地图服务(一维)
- 17. 空间分析-地图服务(二维)
- 18. 空间分析-地图服务(多个)
- 19.数据编辑-从CAD文件导入(92坐标系CAD,双图层)
- 20.空间分析-验证是否闭合、是否自相交
- 21.WMF转PDF
- 22.数据统计-地图服务
- 五、项目建设规范
- 六、注意事项
- 七、常见问题
- 八、 WebGIS核心组件库
- 01.后台管理端
- 02.图形端
- 03.移动端
- 04.接口
- 九、工作流开发
- 1.前期工作
- 1.1 禁用Activiti自带登录验证
- 1.2 设置应用部署域名
- 2.流程审批步骤
- 2.1.创建模型
- 2.2.在线流程设计
- 2.3.部署发布
- 2.4.流程配置
- 2.5.流程申请
- 2.6.流程审核
- 3.流程设计demo
- 3.1.一般流程
- 3.2.带条件流程
- 3.3.会签流程
- 4.其他一些开发详解
- 4.1.关于内嵌Activiti在线流程设计器
- 4.2.关于对原框架中流程设计代码的调优
- 4.3.关于DelegateExecution对象的常用方法
- 5.工作流接入文档
- 十、框架更新日志
- 其它
- 代码生成器
- 短信平台管理与接口
- 单据编码管理与接口
- 定时任务管理与接口
- 文件管理与接口
- 地图打印管理与接口
- Excel文件导出接口
- 经典SQL语句
- 多实例运行Redis
- 多数据库操作
- 消息通知管理与接口
- 工作流数据清理
- 其他技术总结
- 发布/订阅功能使用说明
- 学习资料
- 十一、多数据源-dynamic-datasource
- 基础必读
- 连接池集成
- 连接池必读
- 集成Druid
- 集成HikariCP
- 集成BeeCP
- 集成DBCP2
- 集成Jndi
- 第三方集成
- 集成MybatisPlus
- 集成P6spy
- 集成Quartz
- 集成ShardingJdbc
- 进阶使用
- 动态添加移除数据源
- 动态解析数据源
- 数据库加密
- 启动初始化执行脚本
- 自动读写分离
- 懒启动数据源
- 无数据源启动
- 手动切换数据源
- 自定义
- 自定义注解
- 自定义数据源来源
- 自定义负载均衡策略
- 自定义切面
- 事务专栏
- 基础知识
- 本地事务
- seata事务
- 调试源码
- 常见问题
- 不可用版本
- 注意事项
- dynamic-datasource参考资料
