# **在线流程设计**
*****
点击 **【在线设计】** 按钮,会打开 **流程在线设计器** ,对流程的设计都将在该设计器上进行。

可以看到流程设计器由四部分组成:
* ①:基本操作工具栏
* ②:节点、任务、事件类型列表
* ③:流程设计画布
* ④:节点属性配置
*****
## **① 基本操作工具栏**

从左到右分别是:
【保存】、【剪切】、【复制】、【粘贴】、【删除】、【重复】、【撤销】、【垂直对齐】、【水平对齐】、【相同大小】、【放大】、【缩小】、【实际大小】、【适应屏幕】、【为选定的流程连线添加弯曲点】、【为选定的流程连线删除弯曲点】。
*****
## **② 节点、任务、事件类型列表**
`Activiti `是一个非常强大的工作流组件,它内置了很多任务和事件,但我们一般常用的,就是以下几个。包括:
**事件(开始事件)、用户活动(用户任务节点)、互斥网关、并行网关、结束任务(结束事件)**。
每个流程都需要**开始事件**和**结束事件**;中间是多个**用户节点**;**互斥网关**用于开发带条件的流程;**并行网关**用于开发会签(其实直接用多实例更简单,之后的例子会此进行举例)。

*****
## **③ 流程设计画布**
工作流程图的设计都在画布上进行展示。
在左侧列表中选择需要的流程节点或事件,拖动到画布上,节点与节点之间用流程线连接。

*****
## **④ 节点属性配置**
在工作流程中每个节点都有一些属性配置,在必要``的情况下需要进行配置。一起来了解一下这些配置的作用。
以 **【一级审核】** 节点为例。

* **id:** 流程定义中节点的唯一标识。
* **名称:** 节点的名称
* **描述:** 字面意思
* **异步(`Asynchronous`):** 同步情况下,完成节点任务和验证下一节点的地址是在同一事务中进行,所以当中如果发生异常,就会回滚当前事务,回滚已完成的任务,重新开始执行。如果勾选了异步,则一个节点完成了就提交事务,不依赖于下一个节点。也就是说不管下一个节点发生了什么,都不关已完成节点的事。完成任务在一个事务中进行,验证下一个节点的地址操作交给定时任务异步来完成。也就是说, **如果设置任务是同步的,则发生异常后,会直接回滚;如果设置异步,则会单独执行和回滚。**
* **单独:** 5.9版本之后都默认该配置。即默认情况下,所有的任务都是独占的,确保单个流程实例永远不会并发执行。
* **执行监听器:** 可以监听流程中的所有节点和连线。 
**事件:** 有三个事件可以进行选择监听:`start`(开始事件)、`end`(结束事件)、`take`(连线事件)
**类:** 输入框应输入实现了监听器的类全名地址,如上图。
**表达式:** 使用`UEL表达式`,输入框中输入的是实现了监听器的类中自定义的方法。表达式填写格式是: **`${bean名.方法名}`**
**委托表达式:** 格式 **`${bean名}`** ,此时不用写方法名,会自动调用 `notify() `方法。
**字段:** 可以为每个监听器配置字段属性。字段有名称、字符串、表达式几个可输入值,在代码中,根据name的名称相应获取配置值。代码中定义的成员变量名称必须和监听器中定义的字段名称一致才能获取到值。
会优先获取两个字符串的值,只有在两个字符串没有值的情况下才会去获取表达式的值。
> 【注】
> 事件方法的执行是有优先级的,也就是说,在类、表达式、委托表达式有重复填写的情况下,只会执行其中一个。
> 执行优先级为:类 > 表达式 > 委托表达式
> 同样字段属性也只会取其中一个值进行赋值。优先级为:小文本字符串值 > 大文本字符串值 > 表达式
* **任务监听器:** 对任务节点的事件进行监听。事件类型有四个:`Create`(任务被创建时触发)、`Assignment`(任务被委派给某个人后触发)、`Delete`(任务被执行完之后就会删除此任务,这时触发)、`All`(任务的所有事件都会触发)。
其他对于事件和字段的设置,同 **【执行监听器】**
* **多实例类型:** 也就是多人审批方式,`Paraller `并行,`Sequential `串行。在进行会签多人审批的时候可以对此进行配置。
* **基数(多实例):** 定义多实例生成的实例数,该基数只能小于等于 **集合(多实例)** 的大小,否则执行出错。
* **集合(多实例):** 审批人集合,只能设置为变量,不能直接设置值。变量只能传 `List<String> ` 。集合内有多少个元素就会生成多少个任务。
* **元素变量(多实例):** 审批人,集合中每一个元素的变量,可作为流程变量使用。
* **完成条件(多实例):** 一个 `UEL表达式`,如果返回值为`true `则该多实例自动结束。这里关系到Activiti几个重要的内置变量,用于写表达式。
> `nrOfInstances`:实例总数。
> `nrOfCompletedInstances`:已经完成的实例个数。
> `nrOfActiveInstances`:当前活动的,也就是还没有完成的实例数。对于一个顺序的多实例,这个值总为1。
> `loopCounter`:已经循环的次数。
> 举例:有一个完成条件是这样的:`${ nrOfCompletedInstances / nrOfInstances >= 0.5 }`
> 意思就是,当完成的实例数大于等于实例总数的一半时,则该多实例任务结束。
* **是否为补偿:** 是否对已经完成的流程做回退处理。(暂时不知道怎么用)
* **代理:** 设置节点处理人,可以写死也可以动态指定,有三个值可以进行设置。设置的是`Activiti`内置的用户和用户组,当前框架用不到。
> `Assignment`:办理人,指定唯一一个。
> `Candidate User`:候选人,可以选定多个,只要一个人认领了任务,其他人就不能再重复处理。
> `Candidate Groups`:候选组,可以制定多个组。可以把很多人绑定到一个组中,只要把任务指派给某一组,那么这个组下面的人都可以看到这个任务,同样也只能一个人认领任务。
* **自定义表单:** 用来填写外置表单`form`文件的路径。当前框架用不到。
* **到期时间:** 每个任务都有一个这样的字段,指示该任务的截止日期。可以使用查询 API 用于查询在特定日期之前或之后到期的任务。举几个例子:
```
// 查询当前还没有过期的任务:
List<Task> listTask = taskService.createTaskQuery().taskDueAfter(new Data()).list();
// 查询当前已过期的任务:
List<Task> listTask = taskService.createTaskQuery().taskDueBefore(new Data()).list();
// 查询某个时间点过期的任务:
SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
ParsePosition pos = new ParsePosition(0);
List<Task> listTask = taskService.createTaskQuery().taskDueDate(“2020-09-03 14:25:07”, pos)).list();
// 可以通过代码来修改任务的过期时间,也可以通过TaskListener的DelegateTask来修改:
taskService.setDueDate(“taskId”, new Date());
```
* **优先级(Priority):** 获取任务列表时可以用此属性来排序,获取优先级高的任务先执行。
`List listTask =taskService.createTaskQuery().orderByTaskPriority().list();`
* **动态表单属性:** 和自定义表单配合使用,当前框架用不到。
*****
**【在流程设计完之后,不要忘记点击左上角的保存按钮】**
- 一、 开发环境
- 二、系统开发规范
- 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参考资料
