文章目录
- 前言
- 一、flowable是什么?
- 回答下之前的问题
- 二、flowable-modeler使用
- 1. 使用步骤
- 2.开始绘制
- 弄一个请假的流程
- 三 加载该流程
- 总结
前言
flowable有些晦涩难懂的东西:
我最开始接触的时候,还是用的activity,当时觉得好复杂,那么这次经过我自己在工作中的不断接触,总结下目前的学习成果; 我最初接触的时候,遇到过如下问题,不知道你是否也有同样的疑问;
- 工作流适合什么样的场景?
- 工作流中一些术语
- 工作流这个工作如何开始,从哪里开始?
- 模型如何绘制? 已有的模型如何修改?
- 工作流的模型绘制后,如何在项目中使用?
- 工作流如何和业务数据集成?
- 工作流中的表单是做什么的?
我用的idea 查看流程图需要安装插件
Flowable BPMN visualizer
一、flowable是什么?
可以参考我之前写的一篇文章: springboot集成flowable工作流
下载此文章项目
项目地址
回答下之前的问题
- 如果你接触过设计模式中的责任了模式,那么就更加理解这个东西了,它就是规定了一个事情的流转过程,流转条件,流转变量,流转分支等等这些具体细节,他最终是用xml来表示的
- 工作流中的术语和含义
## 1. 流程定义 (Process Definition)
- **定义**:流程定义是工作流的蓝图,描述了业务流程的各个步骤及其之间的关系。
- **示例**:一个请假申请流程的定义可能包括“提交申请”、“主管审批”、“人事审批”等步骤。
## 2. 流程实例 (Process Instance)
- **定义**:流程实例是流程定义的具体执行实例,表示一次具体的业务流程执行过程。
- **示例**:每次员工提交请假申请时,都会创建一个新的流程实例。
## 3. 任务 (Task)
- **定义**:任务是流程中的一个具体操作或活动,通常需要人工或系统执行。
- **示例**:在请假申请流程中,“提交申请”和“主管审批”都是任务。
## 4. 用户任务 (User Task)
- **定义**:用户任务是需要人工干预的任务,通常分配给特定的用户或用户组。
- **示例**:“主管审批”是一个用户任务,需要主管手动批准或拒绝申请。
## 5. 系统任务 (Service Task)
- **定义**:系统任务是由系统自动执行的任务,通常调用外部服务或执行某些计算逻辑。
- **示例**:发送电子邮件通知是一个系统任务,可以调用邮件服务API。
## 6. 事件 (Event)
- **定义**:事件是在流程中发生的特定情况,可以触发某些操作或改变流程的执行路径。
- **示例**:开始事件(Start Event)表示流程的开始,结束事件(End Event)表示流程的结束。
## 7. 条件表达式 (Condition Expression)
- **定义**:条件表达式用于控制流程的分支,根据某些条件决定流程的下一步。
- **示例**:在审批流程中,可以根据审批结果(“通过”或“不通过”)选择不同的路径。
## 8. 序列流 (Sequence Flow)
- **定义**:序列流连接流程中的不同任务和事件,表示任务之间的执行顺序。
- **示例**:从“提交申请”到“主管审批”的连线就是一个序列流。
## 9. 并行网关 (Parallel Gateway)
- **定义**:并行网关用于同时启动多个任务或路径,或等待多个任务完成后继续执行。
- **示例**:在项目启动流程中,可以同时进行“市场调研”和“技术评估”。
## 10. 排他网关 (Exclusive Gateway)
- **定义**:排他网关用于根据条件选择一个路径执行,其他路径被忽略。
- **示例**:在审批流程中,根据审批结果选择“通过”或“不通过”的路径。
## 11. 包含网关 (Inclusive Gateway)
- **定义**:包含网关用于根据条件选择多个路径执行,符合条件的路径都会被执行。
- **示例**:在项目启动流程中,根据项目类型选择需要进行的多个评估任务。
## 12. 多实例任务 (Multi-Instance Task)
- **定义**:多实例任务允许同一个任务多次执行,可以是并行的或顺序的。
- **示例**:在审批流程中,多个审批人需要依次或同时审批同一个申请。
## 13. 信号 (Signal)
- **定义**:信号是一种全局事件,可以在流程中的任意位置触发,用于中断或启动某些任务。
- **示例**:在项目管理流程中,可以使用信号来通知所有相关方项目已启动。
## 14. 消息 (Message)
- **定义**:消息是一种异步通信机制,用于在不同的流程实例或系统之间传递信息。
- **示例**:在订单处理流程中,可以使用消息来通知库存管理系统减少库存。
## 15. 变量 (Variable)
- **定义**:变量用于存储和传递流程中的数据,可以在任务之间共享。
- **示例**:在请假申请流程中,可以使用变量存储申请人的姓名、请假天数等信息。
## 16. 任务候选人 (Task Candidate)
- **定义**:任务候选人是指有权领取并完成某个用户任务的用户或用户组。
- **示例**:在审批流程中,可以将“主管审批”任务的候选人设置为所有主管。
## 17. 任务分配 (Task Assignment)
- **定义**:任务分配是指将任务指派给特定的用户或用户组。
- **示例**:在审批流程中,可以将“主管审批”任务指派给具体的主管。
## 18. 任务监听器 (Task Listener)
- **定义**:任务监听器是在任务生命周期的特定阶段执行的回调函数,用于执行自定义逻辑。
- **示例**:在任务创建时发送通知邮件,在任务完成时更新数据库记录。
- create 在任务触发的时候创建 userTask
- delete 任务被删除时触发。通常用于在任务删除时清理资源、记录日志等 userTask
- complete 事件在任务完成时触发。通常用于在任务完成时更新数据库记录、发送通知 userTask
- assignment 事件在任务被分配时触发。通常用于在任务分配时发送通知、记录日志 userTask
## 19. 流程监听器 (Process Listener)
- **定义**:流程监听器是在流程生命周期的特定阶段执行的回调函数,用于执行自定义逻辑。
- **示例**:在流程启动时记录日志,在流程结束时发送总结报告。
## 20. 事件监听器 (Event Listener)
- **定义**:事件监听器是在特定事件发生时执行的回调函数,用于执行自定义逻辑。
- **示例**:在流程实例创建时发送通知,在任务超时时发送提醒。
- start 当一个流程开始的时候 startEvent
- end 当一个流程结束的时候 endEvent
- take 当一个流程在节点之间流转的时候 sequenceFlow
- 一个工作流的开始,一定是从开始绘制bpmn20.xml这个文件开始,或者你已经有了一个这样的文件,然后需要部署,部署后启动这个工作流即可;
- 我们一般可以通过两种方式绘制工作流:
- 通过在idea/eclipse中的插件绘制
- 通过flowable提供的 flowable-modeler 绘制
- 绘制后需要部署使用,一般部署也有两种方式:
- 通过动态部署,在代码层面通过 repositoryService.createDeployment().addClasspathResource(bpmn20.xml文件路径)
- 通过静态部署,springboot项目,将bpmn20.xml文件放在 /resources/processes/ 文件下,启动的时候会自动部署
- 工作流的每一步审批,都会用到一个变量等信息,也会有唯一的任务id,我们可以根据业务id,作为与业务数据的关联关系,这些变量也可以作为业务数据在后续逻辑判断中的参数条件;
- 表单可以作为一个任务节点的展现形式,例如是一个报销的流程,那么我需要让提交报销的人,填写一些报销信息: 金额,出差地点,日期等信息。这些信息可以作为业务数据,与当前工作流绑定,作为后续业务处理的依据。
- 内置表单,就是在flowable-modeler 绘制的时候,可以选择新建表单,这里都是内置表单
- 非内置表单, 可以是一个项目的访问vue文件路径,这样可以达到业务与流程的深度集成
二、flowable-modeler使用
1. 使用步骤
flowable-modeler
- 导入flowable.sql数据,启动程序
- 访问需要先登录 http://127.0.0.1:8080/expense/idm/index.html
account: admin pwd : test
- 再访问: http://127.0.0.1:8080/expense 创建设计器
2.开始绘制
弄一个请假的流程
大概逻辑, 发起请假,组长审批,然后根据天数判断审批人,大于三天部门总结审批,小于三天部门经理审批,通过后请假结束
- 所有任务都必须有开始和结束
打开设计器>>> 流程 >>> 创建流程
- 开始丰富流程中的流转过程
选中开始>>> 点击任务
选中连线>>> 设置名称
- 丰富任务节点信息
选中该任务节点>>> 设置节点信息
编号,不设置默认生成uuid,这里可以设置下,由于这个节点是上级审批,所以设置 zzsp
名称,最好设置下,可以一眼看出当前节点的信息, 所以设置 组长审批
分配: 这个意思是,当流程到达这个节点的时候,谁可以处理这个任务,选择固定值>>> 1. 分配 2. 候选用户 3. 候选组
这里选择分配>>> ${zz}
这里可以是固定值 例如 admin1,这里选择一个类似mybatis取值的感觉,取审批时候的传递的用户变量 zz作为该节点的任务接收人
- 开启分支判断
选中组长审批任务节点,选择 高级分支
设置名称为: 判断天数
- 部门总监分支
选中高级分支>>>选择用户任务
- 丰富该任务节点
设置节点名称为: 部门总监
设置节点分配人,与上一个组长节点一样,设置一直流程变量 ${zj}
- 丰富该分支流信息
选中分支流,设置名称: 大于3天,设置流条件 ${day>3}
此为当前分支流的信息,以及进入该分支流的条件,当flowable中的变量day的值>3的时候,会进入该分支流
- 选择高级分支,继续创建用户任务
设置节点名称,设置分支流的名称以及条件 ${day<=3}
设置节点分配人,与上一个组长节点一样,设置一直流程变量 ${jl}
与上一个部门总监的设置同理
- 设置流程结束
选中部门总监,选择结束节点,选中部门经理节点,连接到刚刚的结束节点
设置结束节点名称为: 请假结束
选中部门经理到请假结束的流转,然后单机增加节点,可以调整该线段
- 驳回设置
选中部门经理节点,选择连线到组长审批,选中部门经理节点,选择连线到组长审批
设置新增的两个流转名换为 驳回
三 加载该流程
- 保存流程,导出为xml文件
重点key为 qingjia, 这个很重要,是流程图流程的唯一标识
- 导出
点击
导出
- 放入项目中
放在
resources/processes/
下
右键请假.bpmn20.xml ,选择View BPMN
- 启动项目,此流程会被自动加载到项目中
- 使用方式与之前的文章类似,这里不做演示 ,可以根据qingjia这个key 启动这个流程,然后逐步审批
总结
其实这个插件 Flowable BPMN visualizer 安装后,如果你项目中没有集成flowable的idm等模块,也是可以用这个插件绘制的,不过一般来说这个没有flowable自带的插件绘制起来方便;
邮件之后,其实和flowable自带的flowable-modler功能几乎一致
可以直接用这个绘制,还有eclipse中也有类似插件,也可以用,不过这个更美观;